Iq Ԁ2?Hello everybody, Well enclosed is the COMBINED SPRING (Dallas) and FALL (San Fransisco) RSTS SIG Tape. Instead of 2 1/3 full tapes, this tape is 2/3 full, alot more 'bang for the buck'. I hope it proves useful. See you later, Phil Hunt, Moderator, Ex-Decus person, Now DEC person Iq 2? The following programs from Erskine College's PDP-11/84 RSTS/E system are submitted to the 1986 San Francisco Fall DECUS RSTS tape: (All programs work in RSTS V9.2. All programs should work in RSTS V7 or V8 but, for example, DCL .COM files will have to be converted to ATPK .CMD files or OPSER based batch .CTL files, etc.) 1. BIGBRO.MAC + BIGBRO.TSK Big Brother performs two tasks for a RSTS system. 1) It dynamically regulates job priorities for users logged into the system. 2) It keeps up to 15 of your "favorite" files open. You get all of this from a single 1K ...RSX program! The list of files to open is stored in a file (FILES2.OPN) and can be easily updated during timesharing. BIGBRO can be signaled to open or close its files during timesharing. (Keeping files open is helpful in V7 only if you sysgenned LARGE FILES. It is always helpful in V8 or V9!) See BIGBRO.MAC for additional information. Thanks go to Jeff Corbett, the author of DYNPRI.MAC - from which BIGBRO stems, and to Dr. James B. Wilkinson, MACRO wizzard, for their work and permission to submit BIGBRO to the RSTS SIG. 2. MENU.BAS A simple menu program that saves your RSTS system from extra CCLs and/or DCL LOGIN.COM overhead. For example, a user may type "ME/7" in order to run the 7th item in his or her menu instead of having to type something like "RUN DM3:[112,203]AR04AK.SAV". 3. TIMECH.BAS Time change is a BASIC-PLUS program that switches the RSTS system time from standard time to daylight-savings time, or from daylight- savings time to standard time, at the right time! Once started, it takes care of this twice-a-year chore forever. 4. STRSW.BAS + .COMs Student Terminal Room Switcher disables the terminals (after issuing warnings) in Erskine's Student Terminal Room at the proper closing time and enables these terminals at the next Student Terminal Room opening time. See the program listing and .COM files for additional details. 5. SAVBCK + .COMs + .CMDs SAVBCK is a BASIC-PLUS program with associated .COM and .CMD files that allows Erskine's third-party back-up package to automatically perform two tape back-ups per day Monday through Friday. Each batch job queues itself either to run tomorrow on Monday through Thursday, or to run on Monday if it's Friday. A person must feed the tape drive some tapes, the rest is automatic. This program set will be useful to anyone who wants to use batch jobs to automate any repeating task, not just back-up. 6. SLIDE.BAS SLIDE is a BASIC-PLUS program that is used to produce lecture slides on a VT220 or VT100 terminal from information that is stored in a text file. Various special symbols in the text file instruct SLIDE to display the text in double-wide/double-high characters, in double- wide characters, or in normal characters. The text of "RSTS HINTS" (San Francisco DECUS session RS004) is included as "DECUS.TXT" so you can test SLIDE.BAS as well as have a copy of the "RSTS HINTS" information. See the program listing for more information. (This program was submitted to the Spring '86 Dallas RSTS SIG tape copy. Only the file DECUS.TXT has changed since then.) 7. CALL.BAS CALL is a BASIC-PLUS program that "hooks" to CONNEC for "reaching out and touching someone's" CPU. CALL is a simple version of DIALER. CALL expects a "smart" modem on a particular KBn: line. CONNEC.BAS and DIALER.BAS are on RSTS distribution tapes/disks with the un- supported programs. (This program was submitted to the Spring '86 Dallas RSTS SIG tape copy. One minor bug has been fixed since then.) 8. EC's TYPE TYPE.RTS is a run-time system that only takes 1K plus 1K per user in order to type out text files on one's terminal. Included are TYPE.RTS and all .MAC sources as well as ATPK command files for compiling and linking TYPE. See TYPE.DOC for further details. Thanks go to TYPE's author, Dr. James B. Wilkinson, for its release to DECUS. (This program was submitted to the Spring '86 Dallas RSTS SIG tape copy.) Questions and comments are welcome. Send them to: W. Franklin Mitchell, Jr. Director of Computer Services Erskine College S1G Box 86 Due West, SC 29639  _kQ2? .PSECT DYNPRI .ENABL LC .LIST BEX TITLE BIGBRO,,05,11-Aug-86,*M ;+ ; BIG BROther watches over your system. BIGBRO combines both DYNPRI ; and an OPENF file open program. ; ; DYNPRI is modeled after DYNPRI.BAS which appeared in the RSTS SIG ; newsletter. DYNPRI scans the jobs on the system looking for CPU-bound ; jobs. CPU-bound jobs have their priority lowered. Once a job is ; no longer CPU-bound, its priority is raised to PRIOR1 (top priority). ; Non-CPU bound jobs are run at top priority while CPU-bound jobs drop ; in priority. This keeps the interactive user happy. ; ; OPENF keeps from 0 to 15 of your favorite files open. RSTS maintains ; information about files that are already open in memory. Additional ; users gain quick access to these open files since memory, not disk, is ; used to open the already open files. OPENF reads the list of files to ; open from the file FILES2.OPN. This allows one to modify the list of ; files to open by editing FILES2.OPN. BIGBRO can be signaled to open ; and/or close its list of files during timesharing. (See OPNCLO ; subroutine.) ; ; BIGBRO = DYNPRI + OPENF ; V9 Privileges required: TUNE, JOBCTL, and WREAD ; DYNPRI.MAC's original author: ; ; Jeff Corbett ; ; Revised for RSTS/E V9.x & added open files routine by ; ; James B. Wilkinson College of Charleston, SC ; and ; W. Franklin Mitchell, Jr. Erskine College, Due West, SC ; ; COPYRIGHT: ; ; This software may be copied by anyone, anywhere, for any reason, ; provided that the author's name and this lack of copyright notice ; is included. No one assumes any responsiblity for the use or ; reliability of this software, nor do they make any commitment for ; its support. ;- ; EDIT: ; 2-Dec-82 JMC Originial Version ; ; 23-Mar-83 *M Fixed up a bit ; ; 15-May-84 *M Add Priority/Burst 4 and remove HB handler. ; ; 07-Aug-86 *M Replace PEEKs with UU.SYS sys calls for RSTS V9.x ; ; 09-Aug-86 *M Added open files routine ; ASSEMBLY INSTRUCTIONS: ; ; MAC BIGBRO,BIGBRO=LB:COMMON,SY:BIGBRO ; ; TKB/SI:32 ; BIGBRO,BIGBRO=BIGBRO ; / ; STACK=0 ; // ; DEBUGING (DEBUG = 1) ASSEMBLY INSTRUCTIONS: ; ; MAC BIGBRO,BIGBRO=LB:COMMON,SY:BIGBRO ; ; TKB/SI:32 ; BIGBRO/DA,BIGBRO=BIGBRO ; // DEBUG = 0 ;0 = No debugging, 1 = debugging! SETBTS = 177777 ;A few masks WAITBT = 077776 FRSTJB = 6. ;Don't deal with jobs below this job # JOBMAX = 63. ;Reserve table space for this many jobs SLEEP = 30. ;Time between passes (in seconds) PERCENT = 15. ;Maximum fraction of CPU time to stay ; at PRIOR1 PRIOR1 = -8. ;Priorities PRIOR2 = -16. PRIOR3 = -24. PRIOR4 = -32. BURST1 = 6. ;Runbursts BURST2 = 8. BURST3 = 12. BURST4 = 3. L1TCKS = PERCENT * SLEEP/10. ;percent/100. * sleep * 10. ;fraction * seconds * ticks/sec L2TCKS = 90. L2CYCL = L2TCKS / SLEEP ;Drop from PRIOR2 to PRIOR3 after ; RN @ PRIOR2 for L2CYCLs L3CYCL = L2CYCL * 4. ;Ditto for PRIOR3 to PRIOR4 => L3CYCL RDRGLS = 110000 ;Open mode for read regardless IOSTS = FIRQB ;IO error status = 1st byte of FIRQB PRVIOL = 12 ;Protection violation error code ; Main Code Area (DYNPRI) BIGBRO: .IF EQ DEBUG MOV #400, SP ;Use the default stack area .IFF NOP NOP .ENDC CALL CLRFQB ;Clear the FIRQB (R4 => FIRQB+FQFUN) MOVB #UU.SYS,(R4)+ ;Return Job Status .UUO ;Get it MOVB FIRQB+FQJOB,R0 ;Move our job number * 2 to R0 BIC #177400,R0 ;Mask off high byte ASR R0 ;Divide by two MOV R0, MYJBNR ;Remember my job number CALL CLRXRB ;Clear XRB with R4 => XRB+0 MOV #MSGLEN,(R4) ;Set message length MOV (R4)+, (R4)+ ; here too MOV #DETMSG,(R4) ;Announce that we are detaching .WRITE CALL CLRFQB ;Clear the FIRQB (Returns: R4 => FIRQB+FQFUN) MOVB #UU.DET,(R4) ;Detach .IF EQ DEBUG .UUO ;Detach ourselves .IFF NOP .ENDC CLR R5 ;Make sure we open the files on 1st pass ; Main Processing loop CYSTRT: CALL CLRXRB ;Clear the XRB (Returns: R4 => XRB+0) MOV #SLEEP,(R4) ;Sleep time .IF EQ DEBUG .SLEEP .IFF NOP .ENDC CALL OPNCLO ;Do we need to open or close our files? MOV #FRSTJB,R0 ;Start with first job MOV R0, R3 ASL R3 ;R3 = job number * 2 LOOP: CALL CLRFQB ;Clear FIRQB (R4 => FIRQB+FQFUN) MOVB #UU.SYS,(R4)+ ;Return job status MOVB R0, (R4)+ ;Of job number R0 MOVB #1, (R4)+ ;Subfunction 1 .UUO MOVB IOSTS, R1 ;Any errors? BEQ 5$ ;No, continue CMPB #PRVIOL, R1 ;Which error? BNE CYSTRT ;BADFUO = End of job table MOV #0, CPUTIM ;Reset CPU Time - this job's gone JMP RCDTME ;Error PRVIOL = No such job 5$: MOVB FIRQB+FQMODE,R1 ;Get the job's priority BIT #4,R1 ;Is the special runbit set? BNE EOLOOP ;Yes, skip it CMP R1,#PRIOR1 ;Is is above PRIOR1? BGT EOLOOP ;Yes, skip it CMP R1,#PRIOR4 ;Is it below PRIOR4? BLT EOLOOP ;Yes, skip it BIT #2,R1 ;Did this job type a CTRL/C? BEQ 10$ ;No, keep going CMP R1,#PRIOR1 ;Yes, is it below PRIOR1? BEQ RCDTME ;No, record its time and go on BR RAISE ;Yes, raise it to PRIOR1 and go on 10$: MOV FIRQB+12,JBSTAT ;Remember the job status word MOV FIRQB+14,JBWAIT ;Remember the wait status word CALL CLRFQB ;Clear the FIRQB (R4 => FIRQB+FQFUN) MOVB #UU.SYS,(R4)+ ;Return job status MOVB R0, (R4)+ ;Of job number R0 MOVB #0, (R4)+ ;Subfunction 0 .UUO TSTB IOSTS ;Any errors? BNE EOLOOP ;If so, the job logged out on us MOV FIRQB+FQNAM1,CPUTIM ;Record LSB of current CPU time BIT JBWAIT,JBSTAT ;Running? BNE 20$ ;Yes, STATE = 0 BIT JBWAIT,#WAITBT ;Waiting on Disk? BEQ 20$ ;Yes, as bad as running! STATE = 0 MOV #-1,STATE ;Job's not doing anything harsh BR 30$ 20$: CLR STATE ;Job's running or waiting on disk 30$: CMP #PRIOR1,R1 ;Is it PRIOR1? BEQ LEVEL1 ;Yes, handle it CMP #PRIOR2,R1 ;Is it PRIOR2? BEQ LEVEL2 ;Yes, handle it CMP #PRIOR3,R1 ;Is it PRIOR3? BEQ LEVEL3 ;Yes, handle it BR LEVEL4 ;No, must be PRIOR4, handle it. ;+ ; PRIOR1 - Jobs that did not use more than PERCENT % of the CPU since last ; cycle are left at this priority ;- LEVEL1: MOV CPUTIM,R1 ;Get this CPU time SUB TIMUSD(R3),R1 ;Subtract that of last time CMP R1,#L1TCKS ;Are we less than BUSY ticks? BLE RCDTME ;Yes, record time and go on TST STATE ;No, but is job doing anything now? BNE RCDTME ;No, record time and go on CLR CYCLES(R3) ;Yes, clear its LEVEL2 residency count and MOV #PRIOR2,PRIOR ; drop it to PRIOR2 MOV #BURST2,BURST BR SCHED ;Go schedule ;+ ; PRIOR2 - A job is lowered to this priority from PRIOR1. ; It will stay at PRIOR2 until it is detected in some I/O wait ; state (raised to PRIOR1) or stays "compute bound" for L2CYCL ; cycles (lowered to PRIOR3). ;- LEVEL2: TST STATE ;Is job doing anything now? BNE RAISE ;No, jump it to level 1 INC CYCLES(R3) ;Yes, increment the nr of busy cycles counter CMP CYCLES(R3),#L2CYCL ;Has it used its quota of Level 2 cycles? BLE EOLOOP ;No, go on CLR CYCLES(R3) ;Yes, clear level 3 count and MOV #PRIOR3,PRIOR ; drop it to Level 3 MOV #BURST3,BURST ; BR SCHED ;Go schedule ;+ ; PRIOR3 - A job is lowered to this priority from PRIOR2. ; It will stay at PRIOR3 until it is detected in some I/O wait ; state (raised to PRIOR1) or stays "compute bound" for L3CYCL ; cycles (lowered to PRIOR4). ;- LEVEL3: TST STATE ;Is job doing anything now? BNE RAISE ;No, jump it to level 1 INC CYCLES(R3) ;Yes, increment the nr of busy cycles counter CMP CYCLES(R3),#L3CYCL ;Has it used its quota of Level 3 cycles? BLE EOLOOP ;No, go on MOV #PRIOR4,PRIOR ;Drop it to Level 4 MOV #BURST4,BURST ; BR SCHED ;Go schedule ;+ ; PRIOR4 - A job is lowered to this priority from PRIOR3. ; It will remain at PRIOR4 until it is detected in some I/O ; wait state when it will be raised to PRIOR1. ;- LEVEL4: TST STATE ;Is job doing anything now? BEQ EOLOOP ;Yes, leave it here ;No, raise it to PRIOR1 RAISE: MOV #PRIOR1,PRIOR ;Raise job to PRIOR1 MOV #BURST1,BURST SCHED: CALL SETPRI ;Change the Priority, Run burst RCDTME: MOV CPUTIM,TIMUSD(R3) ;Record the current CPU time EOLOOP: INC R0 TST (R3)+ ;Next job slot JMP LOOP ;+ ; CLRXRB Clear the XRB and return a pointer to XRLEN. ; ; CALL: CALL CLRXRB ; ; Input: None ; ; Output: R4 => XRB + 0 ;- CLRXRB: MOV #XRB+XRBSIZ,R4 ;Point to end of XRB 2$: CLR -(R4) ;Clear the previous word CMP R4,#XRB ;Is the entire XRB clear BHI 2$ ;No, keep clearing RETURN ;+ ; CLRFQB Clear the FIRQB and return a pointer to FQFUN. ; ; CALL: CALL CLRFQB ; ; Input: None ; ; Output: R4 => FIRQB + FQFUN ;- CLRFQB: MOV #FIRQB+FQBSIZ,R4 ;Point to end of FIRQB 2$: CLR -(R4) ;Clear the previous word CMP R4,#FIRQB ;Is the entire FIRQB clear? BHI 2$ ;No, keep clearing MOV #FIRQB+FQFUN,R4 ;Point to FQFUN RETURN ;+ ; SETPRI Set the priority and runburst for a job ; ; Call: MOV #job nr,R0 ; MOV ,PRIOR ; MOV ,BURST ; CALL SETPRI ; ; Input: R0 job number to set ; ; PRIOR new priority for job ; ; BURST new runburst for job ; ; Output: None ; ; (Destroys R1,R4) ;- SETPRI: CALL CLRFQB ;Clear the FIRQB, (R4 => FIRQB+FQFUN) MOVB #UU.PRI,(R4)+ ;Change Priority/Run Burst/Size MOV R0,R1 ;Copy Job nr MOVB R1,(R4)+ ;Place in FIRQB MOVB #377,(R4)+ ;Flag to Change Priority MOVB PRIOR,(R4)+ ;New Priority MOVB #377,(R4)+ ;Flag to Change Run Burst MOVB BURST,(R4)+ ;New Run Burst ; CLRB (R4)+ ;Flag NOT to change size .UUO ;Do the work RETURN ;+ ; OPNCLO Open or close our 15 favorite files. ; ; CALL: CALL OPNCLO ; ; Input: R5 ; R5 = -1 ==> Close the files ; ; R5 = 0 ==> Open the files ; ; If our job's priority has the special run bit set (priority ; -4) then just RETURN else set priority -4 and open or close ; our files, whichever was not done last time. ; ; This allows one to SET JOB/PRIORITY=-8 n (where n is this ; program's job number) in order to signal BIGBRO to open or ; close its files. ;- OPNCLO: CALL CLRFQB ;Clear the FIRQB (R4 => FIRQB+FQFUN) MOVB #UU.SYS,(R4)+ ;Return job status MOVB MYJBNR, (R4)+ ;of my job MOVB #1, (R4)+ ;subfunction 1 .UUO MOVB FIRQB+FQMODE,R1 ;What's our priority? BIT #4, R1 ;Is the special run bit set? BNE NOMORE ;No, just RETURN = noting new to do. MOV #PRIOR1,PRIOR ;Put Highest Priority in PRIOR MOV #BURST1,BURST ;Put burst1 in BURST CALL SETPRI ;Set our priority to PRIOR1 CALL CLRXRB ;Clear XRB with R4 => XRB+0 MOV #400,(R4) ;Set special run priority bit .SET ;Set it COM R5 ;Flip-flop the open/close switch BEQ CLOSES OPENS: CALL CLRXRB ;Must gain 1K for file names buffer space MOV #2, (R4) .IF EQ DEBUG .CORE .IFF NOP .ENDC CALL CLRFQB ;Clear the FIRQB and XRB CALL CLRXRB MOV #FNLEN, (R4) ;Set up to open FILNAM MOV (R4)+, (R4)+ MOV #FILNAM,(R4) .FSS MOV #FIRQB+FQFUN,R4 ;Open FILNAM on channel 1 MOVB #OPNFQ, (R4)+ MOVB #1*2, (R4)+ CALFIP TSTB IOSTS ;Any errors? BNE NOMORE ;Yes, give up. CALL CLRXRB ;No, continue... Clear the XRB MOV #512., (R4)+ CLR (R4)+ ;Read one block from FILNAM into BUFFER MOV #BUFFER,(R4)+ MOVB #1*2, (R4) .READ CALL CLOSES ;Close FILNAM MOV #15.*2, R0 ;Start with channel 15 MOV #BUFFER,R1 ;Start our scan of BUFFER at its top LOOP1: MOV #SKIPS, R2 ;Point R2 to the list of chrs to skip 1$: CMPB (R2), (R1) ;Move R1 over any SKIP characters BNE 2$ INC R1 CMP R1, #BUFFER+512. ;Don't get out of the buffer BGE NOMORE BR LOOP1 2$: TSTB (R2)+ ;Have we checked all the SKIP characters? BNE 1$ ;No, check it MOV R1, R3 ;Yes, copy R1 into R3 LOOP2: MOV #SKIPS, R2 1$: CMPB (R2), (R3) ;Move R3 up the buffer until we find a SKIP chr BEQ 2$ TSTB (R2)+ BNE 1$ INC R3 BR LOOP2 2$: MOV R3, R2 ;Now we know were the file name starts & ends SUB R1, R2 ;Compute the file name's length CALL CLRFQB CALL CLRXRB MOV R2, (R4) ;Set up the file name in the XRB MOV (R4)+, (R4)+ MOV R1, (R4) .FSS MOV #FIRQB+FQFUN,R4 ;Open the file MOVB #OPNFQ, (R4)+ MOVB R0, (R4) MOV #RDRGLS,FIRQB+FQMODE ;Read regardless CALFIP MOV R3, R1 ;Set R1 to the start of the next file spec SUB #2, R0 ;Set up next channel number BGT LOOP1 ;Go again if we haven't done 15 channels NOMORE: CALL CLRXRB ;We do not need our file names buffer until MOV #1, (R4) ; the next open so we can shed 1K .IF EQ DEBUG .CORE .IFF NOP .ENDC RETURN CLOSES: CALL CLRFQB ;Close all channels MOVB #RSTFQ, (R4) CALFIP RETURN .SBTTL Data Section MYJBNR: .BLKW 1 JBWAIT: .BLKW 1 JBSTAT: .BLKW 1 PRIOR: .BLKW 1 BURST: .BLKW 1 STATE: .BLKW 1 CPUTIM: .BLKW 1 TIMUSD: .BLKW JOBMAX * 2 CYCLES: .BLKW JOBMAX * 2 DETMSG: .ASCII \BigBro detaching...\<15><12> MSGLEN = .-DETMSG FILNAM: .ASCII/[1,28]Files2.Opn/ ;Adjust [P,Pn] here so BIGBRO can FNLEN = .-FILNAM ; find its list of files to open SKIPS: .ASCII <15><12><40><0> ;Delimiting characters between file ; names in FILES2.OPN .EVEN BUFFER: .BLKB 512. ;The FILES2.OPN buffer .END BIGBRO  _ File to patch? BIGBRO.TSK File found in account [1,28] Base address? 0 Offset address? 3110 Base Offset Old New? 000000 003110 000006 ? 8. ; New 1st job to regulate (Include ".") 000000 003112 010003 ? ^Z ; CTRL/Z for new offset Offset address? 5323 Base Offset Old New? 000000 005323 133 ? \' ;Display characters (Backslash, single quote) 000000 005323 '[ ? 000000 005324 '1 ? '2 ;(Single quote, 2), etc. 000000 005325 ', ? '5 000000 005326 '2 ? ', ;Changed PPN from [1,28] to [25,7] 000000 005327 '8 ? '7 000000 005330 '] ? ^C ;Uparrow "C" to install the patch. Patch complete 1 patch installed Command file name? ^Z ;CTRL/Z if done.  _2?,$$ VSYSYSYSYTICLz  zVx̴ ԕ6E 7 ^ \̕6 B x :ԕԕ6 Tw5|W yW v5W mdpl ԕԕ6J^L==7 %%%&5W -9 63 + " ,'3    , lh  d XT .P w0$ !""$ ! ԕTԕԝ ԕԝ6 ԕԝԕ6@5c E Z  t4ԕԕ; P ̕ j W #ҋCҋ B  L4ԕ ~  ̕BigBro detaching... [1,28]Files2.Opn &X"N`2?HELP$:HELP.TSK $TKB.TSK $UTLMGR.TSK $ACTMGR.TSK $DCLUTL.TSK $DCLAUX.TSK $FILCOM.TSK $SWITCH.TSK LB:EDTHEL.HLP EDT$:EDIT.COM EDT$:EDT.TSK $SYSTAT $PIP.SAV $LOGOUT.TSK $LOGIN.TSK R@ 2?1000 EXTEND & ! & ! 03-Jul-81 Erskine MENU program & ! & ! 19-Sep-86 last edit *M & ! & ! Author: W. Franklin Mitchell, Jr. & ! Director of Computer Services & ! Erskine College, Due West, South Carolina & ! & ! Copyright (c) 1986 & ! Erskine College, Due West, South Carolina & ! & ! *********************************************************************** & ! * This software is furnished without charge by Erskine College and * & ! * may be copied only with the inclusion of the author's name and * & ! * copyright notice. No title to or ownership of this software is * & ! * hereby transmitted. Neither Erskine College nor the author assumes * & ! * any responsibility for the use or reliability of this software. The * & ! * author welcomes comments and/or bug reports mailed to Franklin * & ! * Mitchell, Erskine College, Box 86M, Due West, South Carolina 29639. * & ! *********************************************************************** & 1008 ! FOR RSTS V7 or V8: & ! & ! Add the following CCL to your startup files: & ! & ! CCL ME-NU=[p,pn]MENU.BAC;30000 & 1009 ! FOR RSTS V9: & ! & ! Put the following into [0,1]LOGIN.COM: (DCL MERGE command must be & ! typed MER[GE]). & ! & ! ME-NU == "_CCL MENU" & ! & ! Put the following into [0,1]START.COM: & ! & ! DEFINE/COMMAND/SYSTEM ME-NU [p,pn]MENU.BAC /LINE_NUMBER=30000 & 1010 ! Examples: & ! & ! ME Display my account's MENU.DAT choices. (If & ! my account has no MENU.DAT, use #MENU.DAT if & ! present). & ! & ! ME/3 Do option three (without screen display). & ! & ! ME/G[n] [Do option n from the] Group's menu. & ! & ! ME/U[n] [Do option n from the] Utilities' menu. & 1020 ! MENU.DAT file format: & ! & ! program to chain[,...]One to 23 character prompt & ! or & ! *DCL/CCL command[,...]One to 23 character prompt & ! & ! & Example MENU.DAT: & ! & ! DU1:[1,3]DMSYS Data management system & ! AR04 Billing program & ! AR05 End-of-period A/R summary & ! AR06 Transaction tracking report & ! ARINIT Initialize Accounts Receivable & ! *$@ ALL TOM Create billing record file & ! *$@ ALL NOW Create billing record file now & ! AUXLIB$:GRIPE Send a message to system manager & ! *SYS/SDF Display system status & 1030 DIM PROGRAM$(48%) & 1040 ACCT$ = '' & \ OPTION% = 0% & 1060 ON ERROR GOTO 1380 & \ FORM$ = '##) ' & \ LF$ = CHR$(10%) & \ TAB.CHR$ = CHR$(9%) & \ CLEAR$ = CHR$(155%) + "[H" + CHR$(155%) + "[J" & ! & ! VT100 type clear screen & 1180 PRINT CLEAR$; & \ PRINT 'Menu V9.2 '; TIME$(0%); ' '; DATE$(0%) & 1200 OPEN ACCT$ + 'MENU.DAT' FOR INPUT AS FILE 1%, MODE 8192% & \ X% = 0% & 1220 X% = X% + 1% 1240 INPUT LINE #1%, INFO$ & \ I% = INSTR(1%, INFO$, TAB.CHR$) & \ GOTO 1240 IF I% = 0% & \ PROGRAM$(X%) = CVT$$(LEFT(INFO$, I%-1%), 156%) & \ IF OPTION% & THEN & IF X% < OPTION% & THEN & 1220 & ELSE & 1340 & 1260 IF X%/2%*2% = X% & THEN & PRINT TAB(39%); & ELSE & PRINT & 1280 PRINT USING FORM$, X%; & \ PRINT CVT$$(RIGHT(INFO$, I% + 1%), 140%); & \ GOTO 1220 & 1300 X% = X% - 1% & \ CLOSE 1% & 1320 PRINT IF POS(0%) & \ PRINT & \ INPUT 'Which option <1>'; OPTION% & \ OPTION% = 1% IF OPTION% <= 0% & \ GOTO 32767 IF OPTION% = 99% & \ GOTO 1320 IF OPTION% > X% & 1340 PRINT CLEAR$; 'Working...' & \ PRINT & 1360 IF LEFT(PROGRAM$(OPTION%), 1%) <> '*' & THEN & CHAIN PROGRAM$(OPTION%) & ELSE & DO.CCL$ = SYS( CHR$(14%) + RIGHT(PROGRAM$(OPTION%), 2%) ) & \ GOTO 1400 & 1380 RESUME 1120 IF ERR= 5% AND ERL = 1100% & \ RESUME 1420 IF ERR= 5% AND ERL = 1200% & \ RESUME 1300 IF ERR = 11% AND ERL = 1240% & \ RESUME 1320 IF ERR = 50% AND ERL = 1320% & \ RESUME 1400 IF ERL = 1360% & \ RESUME 32767 IF ERR = 11% AND ERL = 1320% & \ RESUME 30100 IF ERL = 30040% & \ PRINT & \ PRINT "?Unexpected MENU error"; ERR & \ PRINT & \ ON ERROR GOTO 0 & 1400 PRINT & \ PRINT "?MENU can't "; & \ IF LEFT(PROGRAM$(OPTION%), 1%) <> '*' & THEN & PRINT 'chain to "'; PROGRAM$(OPTION%); '".' & ELSE & PRINT 'execute command/CCL "'; RIGHT(PROGRAM$(OPTION%),2%); '".' 1410 PRINT & \ GOTO 32767 & 1420 IF ACCT$ = '' & THEN & ACCT$ = '#' & \ GOTO 1200 & ! & ! Try for a account menu, a group menu, then give up. & 1440 PRINT & \ PRINT "?Sorry, but I can't find the needed [#]MENU.DAT file." & \ GOTO 32767 & 30000 ON ERROR GOTO 1380 & \ CORE.COMMON$ = SYS(CHR$(7%)) & \ I% = INSTR(1%, CORE.COMMON$, 'MENU') & \ IF I% = 0% & THEN & PRINT & \ PRINT '?Illegal MENU CCL entry ==> "'; CORE.COMMON$; '".' & \ GOTO 32767 & 30020 ACCT$ = '' & \ INFO$ = RIGHT(CORE.COMMON$, I% + 5%) & \ I% = INSTR(1%, INFO$, 'U') & \ IF I% & THEN & ACCT$ = 'W:' & \ INFO$ = LEFT(INFO$, I%-1%) + RIGHT(INFO$, I% + 1%) & ! & ! Utilities Menu is in W:MENU.DAT & 30030 I% = INSTR(1%, INFO$, 'G') & \ IF I% & THEN & ACCT$ = '#' & \ INFO$ = LEFT(INFO$, I%-1%) + RIGHT(INFO$, I% + 1%) & ! & ! Group menu (instead of our account's menu). & 30040 OPTION% = VAL(INFO$) & \ GOTO 1060 & ! & ! CCL entry & 30100 PRINT & \ PRINT '?Illegal MENU option.' & 32767 END u~ 2?1000 EXTEND & 1010 ! T I M E C H a n g e & ! & ! Change the RSTS clock from standard time to daylight savings time & ! or from daylight savings time to standard time. This program will & ! automatically queue a batch job to run itself on the first Sunday & ! of April or the last Sunday of October, whichever is next. & ! & ! This program requires the following privileges: DATES + READMEM; & ! plus any required by the PBS batch job queue. & ! & ! Test by changing TESTING% to -1% in line 1040 & ! & ! Start TIMECH the first time by typing "SW BASIC, OLD TIMECH, & ! 1040 TESTING%=-1%, 1205 TESTING%=0%, and RUN". Enter the previous & ! time change date/time. For example, enter F86 if you are starting & ! the program from 27-Oct-86 to 4-Apr-87. Enter S87 from 6-Apr-87 & ! to 24-Oct-87. Etc. & 1020 ! Author: W. Franklin Mitchell, Jr. & ! Director of Computer Services & ! Erskine College, Due West, South Carolina & ! & ! Copyright (c) 1986, Erskine College, Due West, South Carolina & ! & ! *********************************************************************** & ! * This software is furnished without charge by Erskine College and * & ! * may be copied only with the inclusion of the author's name and * & ! * copyright notice. No title to or ownership of this software is * & ! * hereby transmitted. Neither Erskine College nor the author assumes * & ! * any responsibility for the use or reliability of this software. The * & ! * author welcomes comments and/or bug reports mailed to Franklin * & ! * Mitchell, Erskine College, Box 86S, Due West, South Carolina 29639. * & ! *********************************************************************** & 1030 ! 20-Apr-80 F. Mitchell Erskine College & ! & ! 19-Sep-86 last edit *M & 1040 TESTING% = 0% & ! & ! Set TESTING% to -1% to test this program. & 1050 ON ERROR GOTO 1270 & 1060 DEF* FNLEAP%(Y%) & \ IF Y%/4%*4% = Y% AND ( Y%/100%*100% <> Y% OR Y%/400%*400% = Y% ) & THEN & FNLEAP% = 1% & ELSE & FNLEAP% = 0% 1070 FNEND & ! & ! Leap years are every 4 years except centuries except every 4 centuries & 1080 HOME.PPN$ = "[1,12]" & \ BATCH.FILE$ = HOME.PPN$ + "TIMECH.COM" & ! & ! Put TIMECH.BAC in HOME.ACCT$ & 1090 SET.TIME$ = CHR$(6%) + CHR$(-14%) & \ TWO.AM = 2. * 60. * 60. & 1100 TODAYS.DATE% = PEEK(512%) & \ YEAR% = TODAYS.DATE%/1000% & \ DAY.OF.THE.YEAR% = TODAYS.DATE% - YEAR% * 1000% & \ YEAR% = 1970% + YEAR% & \ GOTO 1220 IF TESTING% & \ WEEK% = (DAY.OF.THE.YEAR% - 1%)/7% + 1% & \ SPRING% = [WEEK% < 52%/2%] & 1110 IF SPRING% & THEN & OFFSET% = -60% & ELSE & OFFSET% = +60% & ! & ! Spring forward (2 AM ==> 3 AM), Fall back (2 AM ==> 1 AM) & ! & ! The +60 and -60 may seem reversed but they are correct since the TIME$() & ! format is in minutes before midnight. & 1120 S = TWO.AM - TIME(0%) & \ SLEEP S IF (S > 0.) AND (NOT TESTING%) & ! & ! No sleeping if we are late! (Some other batch job could have tied us & ! up until after 2:00 AM.) & 1130 NEW.DATE% = PEEK(512%) & \ CURRENT.TIME% = PEEK(514%) & \ NEW.TIME% = CURRENT.TIME% + OFFSET% & \ IF NEW.TIME% <= 0% & THEN & NEW.TIME% = NEW.TIME% + (24% * 60%) & \ NEW.DATE% = NEW.DATE% + 1% & \ GOTO 1150 & ! & ! Has some other batch job delayed us so that springing forward & ! will cross a day boundary. & 1140 IF NEW.TIME% > (24% * 60%) & THEN & NEW.TIME% = NEW.TIME% - (24% * 60%) & \ NEW.DATE% = NEW.DATE% - 1% & ! & ! Has some other batch job delayed us so that falling back & ! will cross a day boundary. & 1150 SET.EM$ = SYS( SET.TIME$ & + CHR$(NEW.DATE%) + CHR$(SWAP%(NEW.DATE%)) & + CHR$(NEW.TIME%) + CHR$(SWAP%(NEW.TIME%)) ) IF NOT TESTING% & \ PRINT & \ PRINT "Time changed from "; & \ PRINT TIME$(CURRENT.TIME%); " "; DATE$(TODAYS.DATE%); " to "; & \ PRINT TIME$(NEW.TIME%); " "; DATE$(NEW.DATE%); "." & 1160 OPEN BATCH.FILE$ FOR OUTPUT AS FILE 1%, MODE 128% & \ PRINT #1%, "$ ! Command file for TIME CHange program" & \ PRINT #1%, "$_RUN "; HOME.PPN$; "TIMECH" & \ PRINT #1%, "$_EXIT" & \ CLOSE 1% & ! & ! Make the batch job control file if necessary. & 1170 ! When do we queue ourselves for the next time change? & 1180 IF SPRING% & THEN & DATE% = 304% + FNLEAP%(YEAR%) & ELSE & YEAR% = YEAR% + 1% & \ DATE% = 97% + FNLEAP%(YEAR%) & ! & ! The 304th day (+ 1 if leap year) is 31-Oct-yy, the week that contains & ! the last Sunday in October. & ! & ! We encounter a new year when going from Oct to Apr. & ! The 97th day (+ 1 if leap year) is 07-Apr-yy, the week that contains & ! the first Sunday of April. & ! & ! Change the 97 to 120 if we're supposed to switch from standard time & ! to daylight savings time on the last Sunday of April. The 120th day & ! (+ 1 if leap year) is 30-Apr-yy, the week that contains the last & ! Sunday of April. & 1190 YR% = YEAR% - 1% & \ Y% = YR% + YR%/4% - YR%/100% + YR%/400% + 1% & \ FIRST.DAY% = Y% - Y%/7%*7% & \ WEEK.DAY% = DATE% - 7*((DATE%-1%)/7%) & \ WEEK.DAY% = WEEK.DAY% + FIRST.DAY% & \ WEEK.DAY% = WEEK.DAY% - 7% IF WEEK.DAY% > 7% & \ QUE.DATE% = (YEAR% - 1970%) * 1000% + DATE% - (WEEK.DAY% - 1%) & ! & ! WEEK.DAY% is 1 if DATE% (in YEAR%) is a Sunday, 2 = Mon, 3 = Tue, & ! 4 = Wed, 5 = Thu, 6 = Fri, 7 = Sat. & ! & ! QUE.DATE% = the last Sunday of Oct or the first Sunday in April & ! in DATE$() format. & 1200 QUE$ = "$_SUBMIT/QUEUE=ADMIN/PRIORITY=220/AFTER:" & + DATE$(QUE.DATE%) + ":01:58 " + BATCH.FILE$ & \ PRINT & \ PRINT QUE$ & 1210 GOTO 1230 IF TESTING% & \ DO.IT$ = SYS(CHR$(14%) + QUE$) & \ GOTO 32767 & 1220 SEASON$ = "F" & \ YEAR% = YEAR% - 1% & \ PRINT & \ PRINT & \ PRINT "Program testing shows the direction of the time change (+1 "; & \ PRINT "hour or -1" & \ PRINT "hour) and the queue command that includes the first Sunday of"; & \ PRINT "April or" & \ PRINT "the last Sunday of October, whichever is next." & 1230 IF SEASON$ = "S" & THEN & SEASON$ = "F" & ELSE & SEASON$ = "S" & 1240 PRINT & \ PRINT & \ PRINT "Enter Spring or Fall and a year <"; & \ PRINT SEASON$; RIGHT(NUM1$(YEAR%), 3%); ">"; & \ INPUT ANS$ & \ ANS$ = CVT$$(ANS$, 2% + 32%) & \ ANS$ = SEASON$ + NUM1$(YEAR%) IF LEN(ANS$) = 0% & \ SEASON$ = LEFT(ANS$, 1%) & \ SPRING% = [ ASCII(SEASON$) = ASCII("S") ] 1250 YEAR% = VAL( RIGHT(ANS$, 2%) ) 1260 YEAR% = 1900% + YEAR% IF YEAR% < 1900% & \ GOTO 1110 & 1270 RESUME 1180 IF ERR = 16% AND ERL = 1160% & \ RESUME 1240 IF ERL = 1250% & \ PRINT & \ PRINT "?Unexpected TIMECH error"; ERR & \ PRINT & \ ON ERROR GOTO 0 & 32767 END yXz 2?1000 EXTEND & ! & ! 28-Aug-84 STRSW.BAS & ! & ! 30-Aug-86 last edit *M & ! & ! Scans the system and makes sure the terminal lines that are to be & ! cut off are inactive. & ! & ! Author: W. Franklin Mitchell, Jr. & ! Director of Computer Services & ! Erskine College, Due West, South Carolina & ! & ! Copyright (c) 1986 & ! Erskine College, Due West, South Carolina & ! & ! *********************************************************************** & ! * This software is furnished without charge by Erskine College and * & ! * may be copied only with the inclusion of the author's name and * & ! * copyright notice. No title to or ownership of this software is * & ! * hereby transmitted. Neither Erskine College nor the author assumes * & ! * any responsibility for the use or reliability of this software. The * & ! * author welcomes comments and/or bug reports mailed to Franklin * & ! * Mitchell, Erskine College, Box 86S, Due West, South Carolina 29639. * & ! *********************************************************************** & 1020 ON ERROR GOTO 10000 & \ DIM M%(30%) & 1030 PRINT & \ PRINT "STRSW V1.1" & \ TODAY$ = DATE$(0%) & \ KBS$ = "" & \ KBS$ = KBS$ + "KB" + NUM1$(X%) + ":" FOR X% = 12% TO 20% & \ FIP$ = CHR$(6%) & \ BELL$ = CHR$(7%) & \ KILL.JOB$ = CHR$(8%) & \ DO.CCL$ = CHR$(14%) & \ LOGINS.2$ = CHR$(-19%) + CHR$(2%) & \ LOGINS$ = CHR$(-1%) & \ BROADCAST$ = CHR$(-5%) & \ CR.LF$ = CHR$(13%) + CHR$(10%) & \ FILL$ = STRING$(512%, 0%) & \ LAST.PASS% = 4% & 1040 OPEN "STRSW.COM" AS FILE 1% & \ FIELD #1%, 512% AS BUF$ & 1050 OPEN "NL:BUFF.BUF" AS FILE 2%, RECORDSIZE 30% & \ FIELD #2%, 30% AS RETURN.JOB.STATUS$ & \ FIELD #2%, 2% AS UU.SYS$, 1% AS JOB$, 27% AS NULLS$ & \ LSET UU.SYS$ = FIP$ + CHR$(26%) & \ LSET NULLS$ = FILL$ & 1080 DATE% = PEEK(512%) & \ WEEK.DAY%, YEAR% = DATE%/1000% & \ JULIAN% = DATE% - YEAR%*1000% & \ YEAR% = 1970% + YEAR% & \ YR% = YEAR% - 1% & \ Y% = YR% + YR%/4% - YR%/100% + YR%/400% + 1% & \ FIRST.DAY% = Y% - 7%*(Y%/7%) & \ WEEK.DAY% = JULIAN% - 7%*((JULIAN% - 1%)/7%) & \ WEEK.DAY% = WEEK.DAY% + FIRST.DAY% & \ WEEK.DAY% = WEEK.DAY% - 7% IF WEEK.DAY% > 7% & 1120 SLEEP 5% * 60% & \ V$ = SYS(FIP$ + LOGINS$) & \ NR.LOGINS% = ASCII( MID(V$, 3%, 1%) ) & \ V$ = SYS(FIP$ + LOGINS.2$) & 1140 FOR PASS% = 1% TO LAST.PASS% & \ PRINT IF POS(0%) & \ PRINT & \ PRINT "Pass"; PASS% & \ PRINT & \ ZZZ% = 0% & \ READ MSG$ & \ JOB% = 5% & ! & ! Start with job 6 = skip detached system jobs. & 1160 JOB% = JOB% + 1% & \ LSET JOB$ = CHR$(JOB%) & \ CHANGE SYS(RETURN.JOB.STATUS$) TO M% & \ KB% = M%(4%) & \ KB$ = "KB" + NUM1$(KB%) + ":" & \ GOTO 1160 IF INSTR(1%, KBS$, KB$) = 0% & \ V$ = SYS(FIP$ + BROADCAST$ + CHR$(KB%) + BELL$ + MSG$ + CR.LF$) & \ PRINT KB$, 1170 IF PASS% <> LAST.PASS% & THEN & ZZZ% = 30% & ELSE & V$ = SYS(FIP$ + KILL.JOB$ + CHR$(JOB%) & + STRING$(24%, 0%) + CHR$(255%) + STRING$(2%, 0%)) & 1180 GOTO 1160 & 1200 GOTO 1240 IF ZZZ% = 0% & \ SLEEP ZZZ% 1220 NEXT PASS% & 1240 CMD$ = "$ @OFF" & \ THR% = 5% & \ FRI% = 6% & \ SAT% = 7% & \ QU$ = "$_SUBMIT/QUEUE=ADMIN/PRIORITY:200/AFTER:" & \ D$ = "" & \ D$ = "+1DAY" IF TODAY$ = DATE$(0%) & \ THR$ = QU$ + "06:58" + D$ + " STRON" + CR.LF$ & + QU$ + "21:55" + D$ + " STROFF" & \ FRI$ = QU$ + "08:58" + D$ + " STRON" + CR.LF$ & + QU$ + "16:55" + D$ + " STROFF" & \ SAT$ = QU$ + "12:58" + D$ + " STRON" + CR.LF$ & + QU$ + "23:55" + D$ + " STROFF" & \ OTH$ = QU$ + "06:58" + D$ + " STRON" + CR.LF$ & + QU$ + "23:55" + D$ + " STROFF" & \ IF WEEK.DAY% = THR% & THEN & QUEUE$ = THR$ & ELSE & IF WEEK.DAY% = FRI% & THEN & QUEUE$ = FRI$ & ELSE & IF WEEK.DAY% = SAT% & THEN & QUEUE$ = SAT$ & ELSE & QUEUE$ = OTH$ & 1260 LOGINS$ = "$_SET SYSTEM/LOGINS=" + NUM1$(NR.LOGINS% - 1%) & \ LSET BUF$ = QUEUE$ + CR.LF$ & + CMD$ + CR.LF$ & + LOGINS$ + CR.LF$ & + FILL$ & \ PUT #1%, RECORD 1% & \ CLOSE 1%, 2% & \ COM$ = "$ @STRSW" & \ PRINT IF POS(0%) & \ PRINT & \ PRINT COM$ & \ V$ = SYS(DO.CCL$ + COM$) & ! & ! Keep one job in reserve & ! Write into commdand file buffer & ! Do command file & 9000 DATA "The student terminal room is closed. Please log off." 9020 DATA "This terminal will be switched off. PLEASE LOG OFF!!" 9040 DATA "Last chance! Log off now or your job will be killed!" 9060 DATA "Job killed... Bye." & 10000 RESUME 1160 IF ERL = 1170% & \ RESUME 1160 IF ERR = 10% AND ERL = 1160% & \ RESUME 1200 IF ERR = 18% AND ERL = 1160% & \ V$ = SYS(FIP$ + CHR$(-1%)) IF NR.LOGINS% & \ CLOSE 1%, 2% & \ PRINT & \ PRINT "?Unexpected STRSW error: "; ERR & \ PRINT & \ ON ERROR GOTO 0 & ! & ! Enable logins if we have shut logins down and we have an error & 32767 END yXz%2?$_SUBMIT/QUEUE=ADMIN/PRIORITY:200/AFTER:06:58 STRON $_SUBMIT/QUEUE=ADMIN/PRIORITY:200/AFTER:23:55 STROFF $ @OFF $_SET SYSTEM/LOGINS=62 y^%2?$ ! STROFF.COM Close the Student Terminal Room $ KB = 12 $ LOOP: $_BROADCAST/BELL KB'KB': The student terminal room will close soon. Please log off, ** turn off all equipment, and cut off the lights. Thank you. ** $ KB = KB + 1 $_IF KB .LE. 20 THEN _GOTO LOOP $_RUN STRSW.BAC $_EXIT y_%2?$ ! STRON.COM Open the Student Terminal Room $ KB = 12 $ SP = 300 $ LOOP: $_set terminal KB'KB':/permanent/speed='SP' $_broadcast/bell KB'KB': The student terminal room is now open... You may log in. ** $ KB = KB + 1 $_if SP .EQ. 300 then _if KB .GT. 13 then SP = 4800 $_if KB .LE. 20 then _goto LOOP $_exit ^%2?$ ! STROFF.CMD Disable the terminals in the STR $ KB = 12 $ LOOP: $_set terminal kb'kb':/permanent/speed=0 $ KB = KB + 1 $_if KB .LE. 20 then _goto LOOP $_exit v 2?1000 EXTEND & ! & ! Run SAVER* automatically twice each day, Monday - Friday. & ! & ! *SAVER is a backup software product from Data Processing Design, Inc., & ! 1400 N. Brasher St., Anaheim, CA 92807 & ! & ! Author: W. Franklin Mitchell, Jr. & ! Director of Computer Services & ! Erskine College, Due West, South Carolina & ! & ! Copyright (c) 1986 & ! Erskine College, Due West, South Carolina & ! & ! *********************************************************************** & ! * This software is furnished without charge by Erskine College and * & ! * may be copied only with the inclusion of the author's name and * & ! * copyright notice. No title to or ownership of this software is * & ! * hereby transmitted. Neither Erskine College nor the author assumes * & ! * any responsibility for the use or reliability of this software. The * & ! * author welcomes comments and/or bug reports mailed to Franklin * & ! * Mitchell, Erskine College, Box 86S, Due West, South Carolina 29639. * & ! *********************************************************************** & ! & ! 18-Jul-86 F. Mitchell Erskine College & ! & ! 11-Sep-86 last edit *M & 1020 DIM DATE%(30%) & \ CHANGE SYS(CHR$(6%) + CHR$(-3%)) TO DATE% & \ DATE% = DATE%(27%) + SWAP%(DATE%(28%)) & \ FRI% = 6% & 1030 PRINT & \ PRINT "SAVBCK V1.0" & \ PRINT & \ PRINT "AM or PM"; & \ INPUT LINE AM.PM$ & \ AM.PM$ = CVT$$(AM.PM$, -1%) & \ IF INSTR(1%, "AM" + CHR$(1%) + "PM", AM.PM$) = 0% & THEN & PRINT & \ PRINT '?Expecting "AM" or "PM", got '; AM.PM$ & \ GOTO 32767 & 1040 WEEK.DAY%, YEAR% = DATE%/1000% & \ JULIAN% = DATE% - YEAR%*1000% & \ WEEK% = (JULIAN%-1%)/7% + 1% & \ WEEK% = 52% IF WEEK% > 52% & \ YR% = 1970% + YEAR% - 1% & \ Y% = YR% + YR%/4% - YR%/100% + YR%/400% + 1% & \ FIRST.DAY% = Y% - 7%*(Y%/7%) & \ WEEK.DAY% = JULIAN% - 7%*((JULIAN%-1%)/7%) & \ WEEK.DAY% = WEEK.DAY% + FIRST.DAY% & \ WEEK.DAY% = WEEK.DAY% - 7% IF WEEK.DAY% > 7% & \ READ DAY$ FOR I% = 1% TO WEEK.DAY% & \ DAY$ = CVT$$(LEFT(DAY$, 3%), 32%) & \ K% = 1% & \ K% = 3% IF WEEK.DAY% = FRI% & \ IF AM.PM$ = "AM" & THEN & QUE.TIME$ = "12:30" & ELSE & QUE.TIME$ = "16:59" & 1060 QUE.TIME$ = QUE.TIME$ + "+" + NUM1$(K%) + "Day" & \ QUE.TIME$ = QUE.TIME$ + "s" IF K% <> 1% & 1080 DATA "FRI", "MON", "TUE", "WED", "THU", "FRI", "FRI" & 2000 OPEN "SAVBCK.WRK" AS FILE 1% & \ FIELD #1%, 512% AS BUF$ & \ CR.LF$=CHR$(13%)+CHR$(10%) & \ LOG.FILE$ = "[0,215]" + DAY$ + AM.PM$ + ".LOG" & 2020 WORK$ = & "$ ! Daily SAVER " + AM.PM$ + " Backup " + DATE$(0%) + CR.LF$ & + "$_Submit/Que=ADMIN/Af:" + QUE.TIME$ + " " + AM.PM$ + CR.LF$ & + "$_Delete/Erase/Nowarn/Nolog " + LOG.FILE$ + CR.LF$ & + "$_Allocate/Seize MT0:" + CR.LF$ & + "$_CCL SAVER @" + AM.PM$ +".CMD/More" + CR.LF$ & + "Write " + DAY$ + CR.LF$ & + "Fullog " + LOG.FILE$ + CR.LF$ & + "Go" + CR.LF$ & \ LSET BUF$ = WORK$ + STRING$(512%-LEN(WORK$),0%) & \ PUT #1%, RECORD 1% & \ CLOSE 1% & \ WORK$ = SYS(CHR$(14%) + "$_@SAVBCK.WRK") & 32767 END H%2?$ ! SAVER backup every morning $_RUN SAVBCK AM f%2?$ ! SAVER backup every evening $_RUN SAVBCK PM H2?SAVE INPUT DU0: OUTPUT MT0: DAYS 22-Aug-86 ACCOUNT ACCESSED AFTER INCLUDE ??????.???[2,*] INCLUDE ??????.???[3,*] INCLUDE ??????.???[40,*] INCLUDE ??????.???[60,*] INCLUDE ??????.???[70,*] INCLUDE ??????.???[80,*] INCLUDE ??????.???[90,*] INCLUDE ??????.???[162,*] INCLUDE ??????.???[251,*] NOEXCLUDE EXCLUDE ??????.BAK[*,*] EXCLUDE ??????.TMP[*,*] EXCLUDE ??????.LST[*,*] EXCLUDE ??????.LOG[*,*] EXCLUDE ??????.BAC[*,*] EXCLUDE ??????.SAV[*,*] EXCLUDE ??????.TSK[*,*] EXCLUDE ??????.LBL[*,*] EXCLUDE ??????.WP [*,*] EXCLUDE ??????.OBJ[*,*] EXCLUDE ??????.132[*,*] EXCLUDE ??????.OUT[*,*] EXCLUDE ??????.BAD[*,*] EXCLUDE W119??.W11[*,*] EXCLUDE ??????.???[0,1] BLOCK 8 SIZE 16 OPERATOR 0 DETACH SUICIDE f2?SAVE INPUT DU0: OUTPUT MT0: DAYS 22-Aug-86 ACCOUNT ACCESSED AFTER NOEXCLUDE EXCLUDE ??????.???[2,*] EXCLUDE ??????.???[3,*] EXCLUDE ??????.???[40,*] EXCLUDE ??????.???[60,*] EXCLUDE ??????.???[70,*] EXCLUDE ??????.???[80,*] EXCLUDE ??????.???[90,*] EXCLUDE ??????.???[162,*] EXCLUDE ??????.???[251,*] EXCLUDE ??????.BAK[*,*] EXCLUDE ??????.TMP[*,*] EXCLUDE ??????.LST[*,*] EXCLUDE ??????.LOG[*,*] EXCLUDE ??????.BAC[*,*] EXCLUDE ??????.SAV[*,*] EXCLUDE ??????.TSK[*,*] EXCLUDE ??????.LBL[*,*] EXCLUDE ??????.WP [*,*] EXCLUDE ??????.OBJ[*,*] EXCLUDE ??????.132[*,*] EXCLUDE ??????.OUT[*,*] EXCLUDE ??????.BAD[*,*] EXCLUDE W119??.W11[*,*] EXCLUDE ??????.???[0,1] BLOCK 8 SIZE 16 OPERATOR 0 DETACH SUICIDE x 2?1 EXTEND & 2! & ! & ! S L I D E & ! & ! & ! Program: SLIDE.BAS - BASIC-PLUS program that can be used & ! to make lecture slides from a text & ! file using a VT220 terminal. & ! & ! Version: 1.1 & ! & ! Date: 15-Sep-86 & ! & ! Author: W. Franklin Mitchell, Jr. & ! Director of Computer Services & ! Erskine College, Due West, South Carolina & ! & ! Copyright (c) 1986 & ! Erskine College, Due West, South Carolina & ! & ! *********************************************************************** & ! * This software is furnished without charge by Erskine College and * & ! * may be copied only with the inclusion of the author's name and * & ! * copyright notice. No title to or ownership of this software is * & ! * hereby transmitted. Neither Erskine College nor the author assumes * & ! * any responsibility for the use or reliability of this software. The * & ! * author welcomes comments and/or bug reports mailed to Franklin * & ! * Mitchell, Erskine College, Box 86, Due West, South Carolina 29639. * & ! *********************************************************************** & 1000 ! Text file syntax: & ! & ! If the first non-space/tab character is & ! & ! ~ Standard 80 column size & ! & ! @ Double wide & ! & ! Double high + double wide & ! & ! ^ Wait for key & ! & ! Exposure: For ASA 200 Ektachrome daylight silde film, use an & ! exposure time of about two to three seconds at f8. & 1020 ON ERROR GOTO 1260 & 1040 ESC$ = CHR$(155%) & \ CSI$ = ESC$ + '[' & \ CLS$ = CSI$ + 'H' + CSI$ + 'J' & \ VT52$ = CSI$ + '?2l' & \ ANSI$ = ESC$ + '<' & \ DHDW1$ = ESC$ + '#3' & \ DHDW2$ = ESC$ + '#4' & \ DW$ = ESC$ + '#6' & \ DW% = ASCII('@') & \ QRX% = ASCII("^") & \ STD% = ASCII('~') & \ OH$ = "o " & \ DOT$ = ESC$ + "(0" + CHR$(96%) + ESC$ + "(B" & \ DASH% = ASCII("q") & \ DASH.ON$ = ESC$ + "(0" & \ DASH.OFF$ = ESC$ + "(B" & 1060 PRINT & \ PRINT "File of text "; & \ INPUT LINE F$ & \ F$ = CVT$$(F$, -1%) & \ F$ = "DECUS.TXT" IF LEN(F$) = 0% & \ OPEN F$ FOR INPUT AS FILE 1%, MODE 256% + 2048% + 8192% & 1080 OPEN "_KB:" AS FILE 2% & 1100 V$ = SYS(CHR$(6%) + CHR$(-7%)) & \ PRINT ANSI$; CLS$; & ! & ! Switch from VT52 mode to ANSI mode & 1120 INPUT LINE #1%, T$ & \ T$ = CVT$$(T$, 4%) & \ GOTO 1280 IF T$ = 'EOF' & \ T$ = DOT$ + RIGHT(T$, 2%) IF LEFT(T$, 2%) = OH$ & 1140 X% = INSTR(1%, T$, "--") & \ GOTO 1160 UNLESS X% & \ L% = LEN(T$) & \ A% = X% + 1% & \ A% = A% + 1% UNTIL (MID(T$, A%, 1%) <> "-") OR (A% > L%) & \ T$ = LEFT(T$, X% - 1%) + DASH.ON$ & + STRING$(A% - X%, DASH%) & + DASH.OFF$ & + RIGHT(T$, A%) & \ GOTO 1140 & 1160 A% = ASCII(CVT$$(T$, 2%)) & \ X% = INSTR(1%, T$, CHR$(A%)) & \ IF A% <> QRX% & THEN & PRINT UNLESS A% = STD% & ELSE & V$ = SYS(CHR$(6%) + CHR$(11%)) & \ INPUT #2% ZZ$ & \ PRINT CLS$ & \ GOTO 1240 & 1180 IF A% = DW% & THEN & PRINT DW$; LEFT(T$, X% - 1%); RIGHT(T$, X% + 1%) & \ GOTO 1240 & 1200 IF A% = STD% & THEN & PRINT LEFT(T$, X% - 1%); RIGHT(T$, X% + 1%) & \ GOTO 1240 & 1220 PRINT DHDW1$; T$ & \ PRINT DHDW2$; T$ & 1240 GOTO 1120 & 1260 RESUME 1280 IF ERR = 28% & \ ON ERROR GOTO 0% & 1280 PRINT VT52$ & \ CLOSE 1%, 2% & 32767 END 8Ԁ2?@ ---------- * * * RSTS HINTS * * * @ ---------- by ~ W. Franklin Mitchell, Jr. ~ Director of Computer Services Erskine College Due West, South Carolina ^ o Use only one disk as the system disk. ^ o Use system-wide logicals (A:, PR:, MYLIB:, etc.). ^ o In V9, with enough main memory, load the storage allocation table (SAT) of your disks into XBUF memory. ~ LOAD/INDEX DU0: ~ ------ ^ o Choose efficient pack cluster sizes for each disk. ^ o Select the best file cluster size for each file. ~ V8: CLU% = 2% ^ INT(LOG(FILE.SIZE/7.)/LOG(2.) + .999999) ~ CLU% = 256% IF CLU% > 256% ~ OPEN OUT.FILE$ AS FILE OUT%, CLUSTERSIZE -CLU% ~ ----------------- ~ ~ V9: OPEN OUT.FILE$ AS FILE OUT%, FILESIZE FILE.SIZE ~ ------------------ ^ o Make files contiguous whenever possible. ~ V8: PIP *.*/MO:16/CL:nnn = XDATA.DAT/W ~ ------ ~ ~ V9: COPY/CONTIGUOUS/CLUSTER_SIZE=0 XDATA.DAT *.* ~ ----------- ^ o Remove a file's contiguous mark if you need to extend the file. ~ V8: UT FLAG XDATA.DAT/NOCTG ~ ------ ~ ~ V9: SET FILE/NOCONTIGUOUS XDATA.DAT ~ ------------- ^ o Put frequently opened files at the top of their directories. ~ (Mode 1552 = first and contiguous; mode 1536 = first). ~ PIP *.*/MO:1552 = XDATA.DAT/W ~ -------- ^ o Keep the 12 - 15 most frequently opened files open "read regardless" with the smallest buffer size possible. ~ OPEN F$, RECORDSIZE 32767% + 1% + 2%, MODE 4096% ~ --------------------------- ----- ~ @ re: BIGBRO.TSK ^ o "Place" files for efficient access. V9 BACKUP will give placed files first priority during a backup run. ~ V8: PIP *.*/PO:14000 = XDATA.DAT/W ~ --------- ~ ~ V9: COPY/POSITION=MIDDLE XDATA.DAT *.* ~ ---------------- ^ o Place the RSTS/E monitor SIL near the center of the system disk. ^ o Carefully decide where to place your swap files. ^ o On a PDP-11 with a large amount of main memory and a single disk, place an eight job swap file (SWAP0) at the center of the disk, SWAP1 at the edge, and SWAP at the hub. ^ o In V9, with enough main memory, put a single job swap slot on the virtual disk. ~ INSTALL/SWAP_FILE=0/SIZE=128 DV0:SWAP ~ --------------------- ^ o On a swapping RSTS/E system with multiple disk drives, add swapfiles A, B, C, and D to the system in the order of least-busy disk to most-busy disk. ~ V8: UT ADD SWAPFILE 0 DM2:SWAP ~ ------------ ~ ~ V9: INSTALL/SWAP_FILE=0 DM2:SWAP ~ ---------- ^ o RS232 null modem cables: @pin pin ~ @2 --------- 3 ~ @3 --------- 2 ~ @7 --------- 7 ^ o For terminals that care about Data Set Ready (pin six), tie pin six to pin four (Request to Send). ^ o Protect terminal lines from thunder- storms! ~ Re: The DEC* PROFESSIONAL Magazine V2.6, November '83, page 26. ^ o Understand the meaning of a non-zero HUNG TTY count! ~ $SY/F ~ ~ General FIP Hung ~ Buffers Buffers Jobs/Jobmax TTY's Errors ~ 481 110 20/63 0 2 ~ ----- ~ $SY/F ~ ~ General FIP Hung ~ Buffers Buffers Jobs/Jobmax TTY's Errors ~ 467 98 24/63 1 2 ~ ----- ~ $ ^ o Make as many monitor options memory resident as feasible. ~ V8: Sysgen options into the monitor. ~ ------ ~ ~ V9: LOAD/OVERLAY xxxx ~ ------------ ^ o Select overlapped seek for multiple disk drives. ^ o In V8, sysgen directory (FIP buffer- ing) and data caching (Extended data buffering) into your monitor. ^ o Allocate 10% - 15% of memory to XBUF. ^ o Change the cache replacement time to eight - sixteen seconds. ~ V8: Patch Seq 3.1.2 F ~ ----- ~ ~ V9: SET CACHE/KEEP=12 ~ -------- ^ o Use a data caching cluster size of four. ~ V8: System start-up question ~ ------------------------ ~ ~ V9: SET CACHE/CLUSTERSIZE=4 ~ -------------- ^ o Sysgen monitor stats and watch the system. Control stats gathering via the switch register or by switching to another RSTS monitor SIL that does not contain stats. ^ o In V8, sysgen disappearing RSX into the monitor. ^ o Run REORDR at least once a week. ^ o In V8, use a large PIP buffer for "big" file transfers. ~ PIP/SI:28 [123,8]*.* = [210,10]*.*/W ~ ------ ~ @ or with enough main memory, modify @ your V8 startup files so that PIP @ always runs in 28K (like in V9). ~ UT CCL PI-P=$PIP.SAV;8220 ~ ---- ^ o Use PIP for directory listings, not DIRECT.TSK/DIRECT.BAC. ~ V8: PIP/L ~ ----- ~ ~ V9: DIR -DCL command ~ --- ^ o In V9, relocate files using PIP's /RETAIN switch so that incremental backups will not tape files that have not changed. ~ PIP DU1:[1,23]*.*/RETAIN = DU0:[2,10]*.TUE/W ~ ------- ^ o In V9, use PBS for printer spooling and running batch jobs instead of OPSER. ^ o Use batch jobs at night to do general housekeeping. ^ o Use DCL (V8: ATPK) command files for routine operations. ^ o Put as little as possible in any one account, especially in account [1,2]. ^ o Use a Dynamic Priority (DYNPRI) program to help schedule users. @ re: BIGBRO.TSK ^ o Make changes to files stored in account [0,1] (such as START.COM) using the following steps: ~ ~ 1. COPY [0,1]START.COM *.* ~ ~ 2. EDIT START.COM ~ ~ 3. DIR/FULL START.* ~ ~ 4. If START.COM and START.BAK occupy the same number of disk blocks, ~ ~ COPY/OVERLAY START.COM [0,1]*.* ~ else -------- ~ COPY/CONTIGUOUS START.COM [0,1]*.* ~ or ~ PIP [0,1]*.*/MO:1552 = START.COM/W ^ o Discover the unsupported Commonly Used System Program (CUSP): CONNEC.BAS. ^ o Protect the hardware! ^ o Avoid BASIC-PLUS programs that cause garbage collection. ^ o Use the shared version of EDT. (Requires disappearing RSX in V8). ^ o TREKIE? ^ o Thanks go to members of the Carolinas LUG for their RSTS Hints suggestions. ~ @ --------------------------------- ? ? ? Q U E S T I O N S ? ? ? @ --------------------------------- ~ @ Franklin Mitchell (803) 379-2131 @ Erskine College @ P.O. Box 86 S1F @ Due West, SC 29639 ^ EOF K 2?1000 EXTEND & ! & ! C A L L . B A S Compile <252> & ! & ! Program to assign KB:, if available; ask for the telephone & ! number to call; bump up DTR; and force CONNEC to call (ATDnnnn) & ! the given phone number. & ! & ! This program requires DEC's unsupported CUSP CONNEC.BAS which can & ! be found on your RSTS distribution tape or disk. & ! & ! & ! Author: W. Franklin Mitchell, Jr. & ! Director of Computer Services & ! Erskine College & ! Due West, South Carolina & ! & ! Copyright (c) 1986 by & ! Erskine College, Due West, South Carolina & ! & ! Created: V1.0 12-Feb-86 & ! & ! Last Edit V1.1 22-Sep-86 *M & ! & ! *********************************************************************** & ! * This software is furnished without charge by Erskine College and * & ! * may be copied only with the inclusion of the author's name and * & ! * copyright notice. No title to or ownership of this software is * & ! * hereby transmitted. Neither Erskine College nor the author assumes * & ! * any responsibility for the use or reliability of this software. The * & ! * author welcomes comments and/or bug reports mailed to Franklin * & ! * Mitchell, Erskine College, Box 86S, Due West, South Carolina 29639. * & ! *********************************************************************** & 1020 ON ERROR GOTO 8000 & \ KB% = 8% & \ CONNEC$ = '[1,0]CONNEC' & \ CR$ = CHR$(13%) & \ FIP$ = CHR$(6%) & \ TAB.CHR$ = CHR$(9%) & \ CLEAR$ = CHR$(155%) + 'H' + CHR$(155%) + 'J' & \ V$ = SYS(FIP$ + CHR$(-7%)) & \ V$ = SYS(FIP$ + CHR$(9%) + CHR$(0%)) & ! & ! KB: is the one attached to the modem. & ! & ! Trap ^C, look up my KB number + system name & 1030 MY.KB% = ASCII(MID(V$, 2%, 1%))/2% & \ SYSTEM.NAME$ = CVT$$(RIGHT(V$, 3%), 4%) & 2000 PRINT CLEAR$ & \ PRINT SYSTEM.NAME$; " CALL V1.0 "; TIME$(0%); " "; DATE$(0%) & \ PRINT & \ IF MY.KB% < 0% & THEN & PRINT "?CALL can't run from a detached terminal!" & \ GOTO 32000 & 2010 V$ = SYS(FIP$ + CHR$(10%) + STRING$(20%, 0%) & + "KB" + CHR$(KB%) + CHR$(255%)) & \ V$ = SYS(FIP$ + CHR$(-21%) + CHR$(255%)) & ! & ! Assign KB kb%, drop privileges & 2020 PRINT & \ PRINT "Phone Directory:" & \ PRINT & 2030 READ PHONE$ & \ GOTO 2040 IF PHONE$ = "EOL" & \ X% = X% + 1% & \ PRINT USING "##) ", X%; & \ PRINT PHONE$ & \ PRINT & \ GOTO 2030 & 2040 PRINT & \ INPUT "Call who <1>"; C% & \ C% = 1% IF C% = 0% & 2060 IF (C% > X%) OR (C% < 1%) & THEN & PRINT & \ PRINT "Answer 1 to"; X%; "please. Try again:" & \ PRINT & \ GOTO 2040 & 2070 RESTORE & \ READ PHONE$ FOR X% = 1% TO C% & \ X% = INSTR(1%, PHONE$, TAB.CHR$) & \ PHONE$ = LEFT(PHONE$, X% - 1%) IF X% <> 0% & \ PHONE$ = CVT$$(PHONE$, 2%) & 2080 X% = INSTR(1%, PHONE$, "-") & \ IF X% <> 0% & THEN & PHONE$ = LEFT(PHONE$, X% - 1%) + RIGHT(PHONE$, X% + 1%) & \ GOTO 2080 & 2100 C$ = "ATD" + PHONE$ + CR$ & 4000 V$ = SYS(FIP$ + CHR$(-21%) + CHR$(0%)) & \ V$ = SYS(FIP$ + CHR$(-9%) + CHR$(KB%) + CHR$(-1%)) & \ V$ = SYS(FIP$ + CHR$(-4%) + CHR$(MY.KB%) + C$) & \ V$ = SYS(CHR$(8%) + CHR$(0%) + CHR$(KB%)) & ! & ! Gain privileges, bump up DTR, force "dail phone number" string & ! in type ahead, and load core common with null + kb% & 4010 PRINT CLEAR$ & \ PRINT "CTRL/P Switch from on-line mode to command mode." & \ PRINT "+++ Attention modem." & \ PRINT "ATH0 Modem: Hang up the phone." & \ PRINT & \ PRINT & \ PRINT 'Commands (enter to the prompt "Conn>"):' & \ PRINT & \ PRINT " Switch from command mode to on-line mode." & \ PRINT "TR FROM Type from my system to the remote "; & \ PRINT "system." & \ PRINT "TR TO Record next activity in ." & \ PRINT "CLOSE Stop recording." & \ PRINT "EXIT Exit on-line session and hang up." & \ PRINT & \ PRINT "Working..." & \ PRINT & 4020 CHAIN CONNEC$ 31000 & 4030 V$ = SYS(FIP$ + CHR$(-21%)) & \ PRINT "?Can't chain to "; CONNEC$; "." & \ GOTO 32000 & 8000 PRINT & \ RESUME 8400 IF ERR = 8% AND ERL = 2010% & \ RESUME 32000 IF ERR = 28% & \ RESUME 4030 IF ERL = 4020% & \ ON ERROR GOTO 0% & 8400 PRINT "Sorry... The line is busy. Try again later." & \ GOTO 32000 & 8990 ! phone number (with -'s) comment & 9000 DATA "1-800-555-1212 DCS" 9010 DATA "1-800-555-1212 Tele-Mail (Toll Free)" 9020 DATA " 1-555-1212 Tele-Mail" 9030 DATA "1-800-555-1212 DEC's electronic store" & 9990 DATA "EOL" & 32000 V$ = SYS(FIP$ + CHR$(11%) + STRING$(20%, 0%) & + "KB" + CHR$(KB%) + CHR$(255%)) & \ V$ = SYS(FIP$ + CHR$(-9%) + CHR$(KB%) + CHR$(1%)) & ! & ! Deassign KB kb%, hang up KB kb% & 32767 END @2? $@ THMAS.CMD $@ TCAS.CMD $@ TDAS.CMD $@ TPVAS.CMD $@ TYLINK.CMD M~8 2?! ASSEMBLE THE HELP MESSAGE SEGMENT RUN $MACRO THELPM,THELPM=THELPM ^Z 8 2?! ASSEMBLE THE PSEUDO-VECTOR SEGMENT RUN $MACRO TPVEC,TPVEC=TPVEC ^Z {:2?! LINK THE SEGMENTS TOGETHER AND FORM THE RUN-TIME SYSTEM RUN $LINK TYPE/Z,TYPE/A/W,TYPE=TCODE,THELPM,TPVEC,TDATA.STB/X/H:#177776/U:#4000 PATCH ^Z RUN $SILUS TYPE.RTS,TYPE=TYPE ^Z  +2?! LINK A LOAD MODULE WITH ODT FOR TESTING UNDER RT-11 ! TCODE.MAC SHOULD BE ASSEMBLED WITH DEBUG = 1 RUN $LINK TYPE,TYPE=TCODE,THELPM,TPVEC,TDATA,LB:ODT/T O.ODT ^Z 0f2?File to patch? [0,1]TYPE.RTS Base address? HELPMF Offset address? 0 Base Offset Old New? 177110 000000 054523 ? \' ;backslash, single quote 177110 000000 'S ? 'D ;single quote, "D" 177110 000001 'Y ? 'M 177110 000002 '0 ? '1 177110 000003 ': ? ;line feed 177110 000004 '[ ? 177110 000005 '0 ? '0 177110 000006 '0 ? '0 177110 000007 '1 ? '2 177110 000010 ', ? 177110 000011 '0 ? '2 177110 000012 '1 ? '5 177110 000013 '3 ? '4 177110 000014 '] ? 177110 000015 'T ? 177110 000016 'Y ? 177110 000017 'P ? 177110 000020 'E ? 177110 000021 '. ? 177110 000022 'H ? 177110 000023 'L ? 177110 000024 'P ? 177110 000025 '/ ? 177110 000026 'R ? 177110 000027 'S ? 'D 177110 000030 'Y ? 'M 177110 000031 '0 ? '1 177110 000032 ': ? 177110 000033 '[ ? 177110 000034 '0 ? '0 177110 000035 '0 ? '0 177110 000036 '1 ? '2 177110 000037 ', ? 177110 000040 '0 ? '2 177110 000041 '1 ? '5 177110 000042 '3 ? '4 177110 000043 '] ? ^C ;uparrow C - not CTRL/C for ONLPAT }v2?! ASSEMBLE THE DATA SEGMENT RUN $MACRO TDATA,TDATA=LB:COMMON,SY:TDATA ^Z RUN $LINK ,TDATA/W,TDATA=TDATA ^Z y}v2?! ASSEMBLE THE CODE SEGMENT SW RT11 SIZE 28 RUN $MACRO TCODE,TCODE=LB:COMMON,SY:TCODE ^Z }(}kQ2? TITLE TYPE .PSECT TDATA .GLOBL FORM, NAME, READY, QUERY, INDEX, SIZE, OURPPN, PROCOD .GLOBL FQBSAV, BUFFER, NAMBUF, REPBUF, CLUS, NOK, HELP .GLOBL COPIES, STRLEN, NAMPTR, NAMCNT, FIRST, BINARY .GLOBL BLKONE, COPCNT, DBSAV, PRNTER, SEPRTE ;NUMBER OF DISK BLOCKS IN THE BUFFER CLUS = 2 TDSTRT: NAMBUF: .BLKB 80. ;LINE BUFFER REPBUF: .BLKB 80. ;FOR REPLY NAMPTR: .WORD 0 ;Beginning of filespec string NAMCNT: .WORD 0 ;Number chars in filespec BLKONE: .WORD 0 ;True if first block in file COPIES: .WORD 0 ;Number of copies requested COPCNT: .WORD 0 ;Loop counter for copies STRLEN: .WORD 0 ;Length of name string after first time OURPPN: .WORD 0 PROCOD: .WORD 0 ;OUR PROTECTION CODE HELP: .WORD 0 BINARY: .WORD 0 FORM: .WORD 0 NAME: .WORD 0 PRNTER: .WORD 0 SEPRTE: .WORD 0 READY: .WORD 0 QUERY: .WORD 0 INDEX: .WORD 0 SIZE: .WORD 0 FIRST: .WORD 0 ;True until first file is printed DBSAV: .WORD 0 ;Debug sys call status FQBSAV: .BLKB FQBSIZ ;PLACE TO STORE FIRQB BUFFER: .BLKB 512. * CLUS TDEND: ;NUMBER OF K WORDS OF MEMORY NEEDED FOR A BUFFER SIZE OF "CLUS" DISK BLOCKS ;NSTORG IS THE OFFSET CAUSED BY THE JOB'S LOW CORE AREA NOK = /2048. .END E~MkQ2?.ENABL LC .PSECT HELPM .GLOBL NOSPMG, NSMGND CR = 15 LF = 12 ;MESSAGE TO BE SENT IF NO FILE SPEC IS TYPED WITH CCL NOSPMG: .BYTE CR, LF .ASCII "TYPE V7.7 licensed to " .ASCII "Erskine College, Due West, South Carolina 29639" .BYTE CR, LF, LF NSMGND: .END }kQ2? .ENABL LC TITLE TYPE, <1K RTS types ASCII files>, 07, 02-May-84, ;External globals in data section GLOBAL GLOBAL GLOBAL GLOBAL ;Internal globals GLOBAL DEBUG = 0 ;Change this to a 1 to run under RT-11 ;Move character from source to buffer pointed to by dest .MACRO PUTBUF SRC, DEST MOVB SRC, (DEST)+ .ENDM PUTBUF ;Change number in src to a character and send to buffer .MACRO PTBDIG SRC, DEST ADD #'0, SRC PUTBUF SRC, DEST .ENDM PTBDIG ;Make monitor call with preceeding EMT+377 if needed .MACRO SYSCALL WHICH .IF NE DEBUG EMT+377 .IFTF WHICH .IFT MOVB @#IOSTS, DBSAV .ENDC .ENDM SYSCALL ;Set up an xrb to point to a character string .MACRO SETUP START, STOP CALL SETXRB, R5 .WORD STOP - START .WORD START .ENDM SETUP ;Send a character string as a message .MACRO MESAGE START, STOP SETUP START, STOP SYSCALL .WRITE .ENDM MESAGE .MACRO CRLFLF REG PUTBUF #CR, REG PUTBUF #LF, REG PUTBUF #LF, REG .ENDM CRLFLF DEFORG MAINLP DEFORG PRINT DEFORG GENUTIL DEFORG FINDSW DEFORG NAMES DEFORG OUTPUT DEFORG CONVERT DEFORG CONSTANTS DEFORG HELPMF DEFORG PATCH ORG MAINLP .SBTTL MAIN PROGRAM LOOP .PAGE ;INITIALIZE SOME THINGS MAINLP: MOV #TRUE, FIRST ;Means printing first file CALL DROP ;Drop privileges SYSCALL .NAME ;Install our name SYSCALL .STAT MOV @#XRB + 10, OURPPN ;SAVE OUR USER'S PPN CALL CLRFQB MOVB #RSTFQ, @#FIRQB+FQFUN ;Close all channels SYSCALL CALFIP CALL CLRXRB CALL CLRFQB ;GET CORE COMMON STRING AND SKIP PAST CCL TO FILESPEC MOV #CORCMN, R0 ;Core common string MOVB (R0)+, R1 ;First byte is string length MOV R0, R2 ADD R1, R2 MOVB #SPACE, (R2) ;Post a sentinel at end of string 2$: TSTB (R0)+ ;Bump pointer DEC R1 ;Fix count CMPB (R0), #SPACE ;Is it a space? BEQ 1$ ;Yes CMPB (R0), #'/ ;No. Then is it a slash? BNE 2$ ;No. Try next character 1$: INC R0 ;Next char is first char DEC R1 ; in command string BGT 9$ ;Keep going if there is a spec ;NO FILE SPEC GIVEN,PRINT MESSAGE, TYPE HELP FILE 8$: MESAGE NOSPMG, NSMGND ;Otherwise send a message MOV #HELPMF, R0 ; and print help mesage file MOV #NOREDY-HELPMF, R1 ;SET INTERNAL FLAGS ACCORDING TO FILE SPEC SWITCHES 9$: MOV R0, NAMPTR MOV R1, NAMCNT CALL FINDSW ;Check for a switch at end of filespec ;If found, switches will be set ;and string length reduced accordingly TST R1 ;Any chars left? BLE 8$ ;Must type something besides switches ;OPEN "KB:" OR ITS ASSIGNED LOGICAL DEVICE AS FILE 2 CALL CLRFQB CALL CLRXRB MOV #XRB, R2 MOV #NOFIND-KBNAME, (R2) MOV (R2)+, (R2)+ MOV #KBNAME, (R2)+ SYSCALL .FSS CMPB #TTYHND, @#XRB+14 ;OK if a terminal BEQ 5$ CMPB #LPTHND, @#XRB+14 ; or line printer BEQ 5$ MESAGE BADDEV, KBNAME ;Not OK, print message JMP EXIT ; and quit 5$: CALL CLRJNK MOV #FIRQB+FQPPN, R2 CLR (R2)+ CLR (R2)+ CLR (R2)+ ;CLRJNK didn't do all we want here CLR (R2)+ CALL REGAIN MOVB #OPNFQ, @#FIRQB + FQFUN MOV #2*2, @#FIRQB + FQFIL MOV #8192.+100000, @#XRB + XRMOD ;No FF on close if LP: SYSCALL CALFIP CALL DROP TST PRNTER ;Turn printer port on? BEQ NAMELP SETUP PPON, PPOFF MOV #2*2, @#XRB + XRCI SYSCALL .WRITE ;POINT XRB TO FILESPEC LESS SWITCHES, DO FILE STRING SCAN, ;PREPARE RETURNED FIRQB FOR WILDCARD LOOKUP, AND SAVE IT NAMELP: CALL CLRFQB CALL CLRXRB MOV #XRB, R2 MOV NAMCNT, (R2) ;Buffer size MOV (R2)+, (R2)+ ;Byte count MOV NAMPTR, (R2)+ ;Buffer location SYSCALL .FSS MOV @#XRB + XRBC, NAMCNT ;Save data on MOV @#XRB + XRLOC, NAMPTR ; remaining filespecs TSTB @#IOSTS ;If ERROR BEQ 1$ ; then JMP LPEND ; skip it ; else 1$: DEC NAMCNT ;.FSS leaves XRB pointing to separator INC NAMPTR ; if no error, just past it if error BIT #NAMFND, @#XRB + 10 ;Did the filespec have a name field? BNE 4$ ;Yes MOV #R5STAR, @#FIRQB + FQNAM1 ;No, force an "*" MOV #R5STAR, @#FIRQB + FQNAM1 + 2 4$: BIT #DOTFND, @#XRB + 10 ;Did the filespec have a "."? BNE 3$ ;Yes MOV #R5STAR, @#FIRQB + FQEXT ;No, force ".*" 3$: CALL CLRJNK ;Clear unused parts of FIRQB CALL MOVFQB, R5 ;Move the FIRQB .WORD FIRQB ;From here .WORD FQBSAV ;To here MOVB #UU.LOK, FQBSAV+FQFUN ;Set code for wildcard lookup ;SAVE CORRECT PROTECTION CODE BIT MOV #1, R0 ;Read protected against owner TST @#FIRQB + FQPPN ;Same account? BEQ 2$ ;Yes CMP OURPPN, @#FIRQB + FQPPN ;Same account? BEQ 2$ ;Yes MOV #4, R0 ;Read protected against group CMPB OURPPN+1, @#FIRQB+FQPPN+1 ;Same group? BEQ 2$ ;Yes MOV #16., R0 ;Read protected against others 2$: MOV R0, PROCOD ;Save protection code bit ;MOVE SAVED FIRQB TO REAL FIRQB, DO WILDCARD LOOKUP, AND PRINT THE ;FILE IF WE FOUND ONE CLR INDEX ;Start with the first instance SRCHLP: CALL MOVFQB, R5 .WORD FQBSAV ;From here .WORD FIRQB ;To here MOV INDEX, @#FIRQB+FQFIL ;Get this instance SYSCALL .UUO TSTB @#IOSTS ;Error code <> 0? BNE LPEND ;Yes, no more matches; exit CALL PRINT ;Open file and print it INC INDEX ;Go for the next match BR SRCHLP ;Repeat forever ;IF NO MATCHES AT ALL, SAY SO LPEND: TST INDEX BNE 1$ CALL FRMFED MESAGE NOFIND, BELLS 1$: TST NAMCNT ;If more filespec then BGT NAMELP ; go again TST PRNTER ;Turn off printer port? BEQ 3$ SETUP PPOFF, BADDEV MOV #2*2, @#XRB + XRCI SYSCALL .WRITE 3$: TST BINARY ;If not BINARY BNE 2$ ; then MESAGE BELLS, FRMFD ; tell user we are through CALL CLRFQB MOVB #RSTFQ, @#FIRQB + FQFUN MOV #2*2, @#FIRQB + FQFIL SYSCALL CALFIP ;Close channel 2 ;EXIT WITH NO READY MESSAGE IF REQUESTED 2$: CALL DROP ;Permanently drop privileges TST READY ;/R switch? BEQ EXIT ;No, so exit CALL CLRFQB SETUP NOREDY, NOREND SYSCALL .FSS SYSCALL .RUN ;Chain to no ready program ;RETURN TO DEFAULT RUN-TIME SYSTEM EXIT: CALL DROPFG CALL CLRFQB SYSCALL .RTS ;Exit to default RTS SYSCALL .EXIT ;In case of failure ORG PRINT .SBTTL OPEN AND PRINT THE SELECTED FILE IN THE REQUESTED MODES .PAGE ;DON'T PRINT EXECUTABLE FILES OR THOSE PROTECTED AGAINST US PRINT: BIT #64., @#FIRQB+FQBUFL ;Executable? BNE 1$ ;Yes, skip it BIT #JFPRIV, @#KEY ;Do we have permanent privileges? BNE 2$ ;Yes, print it BIT PROCOD, @#FIRQB+FQBUFL ;Protected against us? BEQ 2$ ;No, print it 1$: JMP NEXT ;Skip this file ;SHOW FILE NAME ON SYSTAT AND CANCEL CONTROL/O 2$: SYSCALL .NAME SYSCALL .TTRST ;Cancel control/O CALL GETNAM ;PRINT FILENAME FIRST IF IN QUERY MODE PRTNAM: TST QUERY ;Skip if not query mode BEQ OPEN CALL TYPENM, R5 .WORD 0 ;User's terminal ;GET REPLY IF QUERY MODE TST QUERY ;If query mode BEQ OPEN CALL CLRXRB ;Cancel type-ahead MOV #XRB, R1 MOV #7, (R1)+ ;Special function code CMP (R1)+, (R1)+ TSTB (R1)+ MOVB #TTYHND, (R1) SYSCALL .SPEC CALL CLRXRB ;then get response MOV #XRB, R1 MOV #80., (R1)+ CLR (R1)+ MOV #REPBUF, (R1) SYSCALL .READ ;"Y"-->PRINT FILE ELSE DON'T. BICB #'y-'Y, REPBUF ;Make it upper case CMPB #'Y, REPBUF ;If response is not "Y" BNE NEXT ;then skip this one ;OPEN FILE, PRINT CONTENTS, AND CLOSE OPEN: MOV @#FIRQB+FQSIZ, SIZE ;save the file size BEQ NEXT ;Skip if file size is 0 CALL CLRJNK ;Leave only the important stuff MOVB #OPNFQ, @#FIRQB+FQFUN ;Open the file MOV #2*1, @#FIRQB+FQFIL ;on channel 1 MOV #256.+2048.+8192.+100000, @#FIRQB+FQMODE ;Read only, seq cashe CALL REGAIN ;privileges, that is SYSCALL CALFIP CALL DROP TSTB @#IOSTS BNE NEXT ;Skip if error CALL OUTPUT ;Type the contents CALL CLRFQB MOVB #CLSFQ, @#FIRQB+FQFUN ;Clos e file MOV #2*1, @#FIRQB+FQFIL ;on channel 1 SYSCALL CALFIP NEXT: RETURN ORG GENUTIL .SBTTL GENERAL UTILITY ROUTINES .PAGE ;PUT STARS IN CHARACTER BUFFER STARS: MOV #NOSTAR, R4 ;Set count 1$: PUTBUF #'*, R0 SOB R4, 1$ RETURN ;DROP TEMPORARY PRIVILEGES DROP: CALL CLRXRB MOV #JFSYS, XRB+0 SYSCALL .CLEAR ;Drop temp priv RETURN ;DROP PRIVILEGES PERMANENTLY DROPFG: CALL CLRXRB MOV #JFPRIV, XRB+0 SYSCALL .CLEAR ;Permanently drop priv RETURN ;REGAIN TEMPORARY PRIVILEGES REGAIN: CALL CLRXRB MOV #JFSYS, XRB+0 SYSCALL .SET RETURN ;CLEAR PARTS OF FIRQB NOT NEEDED BY WILDCARD LOOKUP CLRJNK: MOV #FIRQB, R0 ;Start here MOV #3, R1 ;Clear three words CALL 1$ ADD #4*2, R0 ;Skip four words MOV #5, R1 ;Clear five words CALL 1$ ADD #2*2, R0 ;Skip two words MOV #2, R1 ;Clear two words CALL 1$ RETURN ;That's all 1$: CLR (R0)+ ;Clear a word SOB R1, 1$ ;Do how many he said RETURN ;COPY A BLOCK OF SIZE OF A FIRQB MOVFQB: MOV #FQBSIZ/2, R1 MOV (R5)+, R2 ;From here MOV (R5)+, R0 ;to here 1$: MOV (R2)+, (R0)+ ;move a word SOB R1, 1$ ;Repeat 16 times RETURN R5 ;SET BUFFER LOCATION AND SIZE INTO XRB SETXRB: CALL CLRXRB MOV #XRB, R0 MOV (R5)+, (R0) ;Buffer size MOV (R0)+, (R0)+ ;Byte count MOV (R5)+, (R0) ;Buffer location RETURN R5 ;CLEAR THE XRB CLRXRB: MOV #XRB, R0 MOV #XRBSIZ/2, R1 1$: CLR (R0)+ SOB R1, 1$ RETURN ;CLEAR THE FIRQB CLRFQB: MOV #FIRQB, R0 MOV #FQBSIZ/2, R1 1$: CLR (R0)+ SOB R1, 1$ RETURN ;DO FORMFEED OR BLANK LINES (ON CHANNEL 2) WHEN WE ARE SUPPOSED TO FRMFED: TST FORM ;/F switch? BEQ 2$ ;No, see about blank lines ;PRINT LEADING FORM FEED IF REQUESTED SETUP FRMFD, BLANKS MOV #2*2, @#XRB+XRCI SYSCALL .WRITE BR 1$ ;Skip blank line stuff ;PUT BLANK LINES BETWEEN FILES IF NOT IN FORM MODE 2$: TST FIRST ;First file printed? BNE 3$ ;Yes, skip blank lines SETUP BLANKS, RADLST MOV #2*2, @#XRB+XRCI SYSCALL .WRITE 1$: RETURN 3$: CLR FIRST ;Never first again TST SEPRTE ;Form Feeds after the 1st file? BEQ 4$ MOV #TRUE, FORM 4$: RETURN ORG FINDSW .SBTTL PARSE THE FILE SPEC FOR THE NEXT SWITCH .PAGE ;FIND THE SWITCHES (WORKING LEFT TO RIGHT), SET THEIR FLAGS, ;AND CORRECT BYTE COUNT OF CORE COMMON STRING SO WE IGNORE THEM FROM NOW ON. FINDSW: CLR COPIES ;Set up default value CLR FORM CLR QUERY CLR BINARY CLR READY CLR NAME CLR PRNTER CLR SEPRTE MOV NAMPTR, R3 ;Beginning of string MOV NAMCNT, R4 ;Our loop counter 1$: CMPB (R3)+, #'/ ;Is this char a / ? BEQ 2$ ;Yes, record it SOB R4, 1$ ;No, try next char RETURN ;Didn't find any, go back ;FIX COUNT AND LOOK FOR MATCH IN SWITCH TABLE 2$: SUB R4, NAMCNT ;Main loop ignores switches 5$: SUB #2, R4 ;Correct our character count MOVB (R3)+, R2 ;Get character CMP R2, #'a BLT 9$ BIC #'a-'A, R2 ;Make it upper case 9$: BIC #HIBYTE, R2 ;Clear high byte MOV #/2, R0 ;Number of switches to check MOV #SWTBL, R5 ;Table of switch characters 3$: CMP R2, (R5)+ BEQ 4$ ;Found a match SOB R0, 3$ ;Loop until through SUB #'0, R2 ;Convert digit to value BLT 6$ ;Not a valid number switch, ignore it CMP R2, #9. BGT 6$ ;Ditto MOV R2, COPIES ;Set switch for number of extra copies 6$: TST R4 ;If no more then BLE 7$ ; go back 8$: CMPB (R3)+, #'/ ;Look for next switch BEQ 5$ SOB R4, 8$ 7$: TST BINARY ;If BINARY BEQ 10$ ; then MOV #TRUE, READY ; exit with no Ready 10$: RETURN ;SET THE CORRESPONDING FLAG 4$: MOV #TRUE, @DSTTBL-SWTBL-2(R5) ;Set appropriate switch BR 6$ ORG NAMES .SBTTL BUILD FILENAME STRING IN NAMBUF .PAGE GETNAM: TST QUERY ;Don't bother if we don't need it BNE 4$ TST NAME BEQ 3$ 4$: CALL CLRXRB MOV #NAMBUF, R0 ;Build string here CALL STARS ;DEVICE NAME IS FIRST MOV #FIRQB + FQDEV, R1 ;First get device name TSTB (R1) ;Anything there? BNE 2$ ;Yes, get it PUTBUF #'S, R0 ;No, fake it as "SY" PUTBUF #'Y, R0 BR 1$ ;and skip the unit number 2$: PUTBUF (R1)+, R0 ;Get PUTBUF (R1)+, R0 ;both chars CLR R2 ;Temporary location MOVB (R1)+, R2 ;Unit number TSTB (R1)+ ;Unit number real? BEQ 1$ ;No, skip it PTBDIG R2, R0 1$: PUTBUF #':, R0 ;Finish the device spec ;NOW THE PPN PUTBUF #'[, R0 ;Start the PPN MOV #FIRQB + FQPPN + 1, R1 ;Point to project # CALL NUMASC ;Make it ASCII & store PUTBUF <#',>, R0 DEC R1 ;Programmer # CALL NUMASC ;Do it too PUTBUF #'], R0 ;Finish PPN ;THEN THE FILENAME AND EXTENSION TST (R1)+ ;Start of filename CALL RADASC ;File name is CALL RADASC ;two words PUTBUF #'., R0 CALL RADASC ;Extension CALL STARS ; add stars PUTBUF #'?, R0 ; and a "?" PUTBUF #SPACE, R0 SUB #NAMBUF, R0 ;Now complete filespec is in MOV R0, STRLEN ; NAMBUF and char count is in STRLEN 3$: RETURN TYPENM: CALL CLRXRB MOV #XRB, R1 MOV STRLEN, (R1) ;Buffer size MOV (R1)+, (R1)+ ;Byte count MOV #NAMBUF, (R1)+ ;Buffer location MOV (R5)+, (R1)+ ; outfile is passed to us SYSCALL .WRITE RETURN R5 ORG OUTPUT .SBTTL READ AND WRITE THE DISK BLOCKS IN THE FILE .PAGE OUTPUT: MOV COPIES, COPCNT TST NAME BEQ 2$ MOV R0, -(SP) ;Take no chances MOV #NAMBUF, R0 ADD STRLEN, R0 SUB #2, R0 ;Replace the "? " CRLFLF R0 ; with CR LF LF MOV (SP)+, R0 2$: CALL ONECPY DEC COPCNT BGT 2$ RETURN ;PRINT CHUNKS OF SIZE CLUS WHILE SIZE > CLUS ONECPY: MOV #TRUE, BLKONE MOV SIZE, R3 CALL FRMFED TST NAME BEQ 1$ CALL TYPENM, R5 .WORD 2*2 1$: CMP R3, #CLUS ;Size remaining : buffersize BLOS LAST CALL READ CALL SHAVE CALL WRITE SUB #CLUS, R3 ;Correct size remaining BR 1$ ;PRINT REMAINDER OF FILE LAST: CALL READ CALL SHAVE CALL WRITE RETURN ;READ A BUFFER FULL READ: MOV #XRB, R0 MOV #CLUS * BLKSIZ, (R0)+ ;Buffer size CLR (R0)+ ;Byte count MOV #BUFFER, (R0)+ ;Address of buffer MOV #1*2, (R0)+ ;Channel 1 TST BLKONE ;If BLKONE BEQ 1$ ; then MOV #1, (R0)+ ; read block one CLR BLKONE ; not block one next time BR 2$ ; else 1$: CLR (R0)+ ; read next block 2$: CLR (R0)+ CLR (R0)+ SYSCALL .READ RETURN ;WRITE THE CHARACTERS WRITE: MOV #XRB, R0 ;Now set up to print what's left MOV #CLUS * BLKSIZ, (R0)+ ;Buffer size TST (R0)+ ;Byte count returned from shave MOV #BUFFER, (R0)+ ;Address of buffer MOV #2*2, (R0)+ ;Channel 2 CLR (R0)+ CLR (R0)+ TST BINARY ;If BINARY BEQ 1$ ; then MOV #BINMOD, (R0)+ ; write binary mode BR 2$ ; else 1$: CLR (R0)+ ; write normal mode 2$: SYSCALL .WRITE RETURN ;FIND LAST NOT NULL CHARACTER IN BUFFER SHAVE: TST BINARY ;Don't shave if binary mode BNE 3$ MOV #BUFFER, R1 ;Start of buffer MOV @#XRB + XRBC, R0 ADD R0, R1 ;End of buffer 1$: TSTB -(R1) ;Check a char BNE 2$ ;Not a null, so quit checking SOB R0, 1$ ;Go again if there's more 2$: MOV R0, @#XRB + XRBC ;Put correct value back 3$: RETURN ORG CONVERT .SBTTL CONVERSION ROUTINES (TO ASCII) .PAGE ;DIVIDE R3 BY (R5) AND STACK REMAINDER THREE TIMES DIVIT: MOV #3, R4 ;Loop counter 1$: MOV R2, R3 ;Set up for division CLR R2 ;High-order word DIV (R5), R2 ;Divide by radix PUSH R3 ;Save remainder SOB R4, 1$ ;Go three times ;FIX UP STACK FOR RETURN TST (R5)+ ;Return to the right place MOV 6(SP), R4 ;Link register contents MOV 4(SP), 6(SP) ;Move every thing MOV 2(SP), 4(SP) ;down one MOV (SP), 2(SP) ;place MOV R4, (SP) ;so we can return ok RETURN R5 ;CONVERT BYTE TO DECIMAL DIGITS NUMASC: MOVB (R1), R2 ;Get an 8-bit # BIC #^C377, R2 ;Low byte only CALL DIVIT, R5 ;Convert to codes on stack .WORD 10. ;Use remainders mod 10. ;PUT CHARACTERS IN BUFFER SUPPRESSING LEADING ZEROS MOV #2, R5 1$: POP R2 BNE 3$ SOB R5, 1$ BR 4$ 2$: POP R2 3$: PTBDIG R2, R0 SOB R5, 2$ ;SEND LAST DIGIT REGARDLESS 4$: POP R2 PTBDIG R2, R0 RETURN ;CONVERT WORD OF RAD50 BACK TO CHARACTERS RADASC: MOV (R1)+, R2 ;Take care of pointer ;GET STACK OF REMAINDERS CALL DIVIT, R5 .WORD 50 ;Remainders mod 50 ;PUT CHARACTERS IN BUFFER SUPPRESSING BLANKS UNLESS QUERY MODE MOV #3, R4 ;Loop counter 1$: POP R2 ;Get remainder BNE 3$ ;Not blank TST QUERY BEQ 2$ ;Skip blank if not query mode 3$: MOVB RADLST(R2), (R0)+ ;Get correct char 2$: SOB R4, 1$ ;Do three characters RETURN ORG CONSTANTS .SBTTL CONSTANT DEFINITIONS .PAGE DOTFND = 10 ;See flag word 2 in XRB after .FSS NAMFND = 1 ;Ditto HIBYTE = 177400 TRUE = -1 IOSTS = FIRQB BEL = 7 FF = 12. CR = 13. LF = 10. ESC = 155. BLKSIZ = 512. ;Size of a disk block SPACE = 32. NOSTAR = 4. ;# of stars before and after name BINMOD = 4096. ;Binary output mode QUEST = 35 ;.RAD50 /?/ R5STAR = << + QUEST> * 50> + QUEST ;.RAD50 /???/ ;ORDER IS CRITICAL IN THE FOLLOWING TWO TABLES SWTBL: .WORD 'F ;Switch table .WORD 'R .WORD 'N .WORD 'Q .WORD 'B .WORD 'P .WORD 'S DSTTBL: .WORD FORM ;Table of flags corresponding to switches .WORD READY .WORD NAME .WORD QUERY .WORD BINARY .WORD PRNTER .WORD SEPRTE ;BYTE DATA BEGINS HERE. ORDER OF LABELS IS IMPORTANT ;ADD NEW STRINGS ONLY AT THE BEGINNING (I.E. HERE) PPON: .BYTE ESC .ASCII /[?5i/ PPOFF: .BYTE ESC .ASCII /[?4i/ BADDEV: .ASCII %?Bad out dev?% .BYTE CR, LF KBNAME: .ASCII /KB:/ NOFIND: .ASCII /?File not found?/ .BYTE CR, LF BELLS: .BYTE BEL,BEL,BEL FRMFD: .BYTE FF BLANKS: .BYTE CR, LF, LF, LF, LF ;LIST OF RAD50 CHARACTERS IN ORDER OF ENCODING RADLST: .BYTE SPACE .ASCII /ABCDEFGHIJKLMNOPQRSTUVWXYZ/ .ASCII /$.?/ .ASCII /0123456789/ NCONST: .EVEN ORG HELPMF .SBTTL SOME FILE NAMES WE WILL USE ;NAME OF HELP MESSAGE FILE HELPMF: .ASCII %SY0:[001,013]TYPE.HLP/R% ;NAME OF FILE TO CHAIN TO IF NO READY MESSAGE WANTED ON EXIT NOREDY: .ASCII /SY0:[001,013]NREADY.BAC/ NOREND: .EVEN ORG PATCH .SBTTL PATCH SPACE .END kQ2?.PSECT TPVEC .GLOBL MAINLP, EXIT, NOK P.FLAG: .WORD 0 P.DEXT: .RAD50 /TYP/ P.ISIZ: .WORD NOK P.MSIZ: .WORD NOK P.FIS: .WORD EXIT P.CRAS: .WORD EXIT P.STRT: .WORD EXIT P.NEW: .WORD EXIT P.RUN: .WORD MAINLP P.BAD: .WORD EXIT P.BPT: .WORD EXIT P.IOT: .WORD EXIT P.EMT: .WORD EXIT P.TRAP: .WORD EXIT P.FPP: .WORD EXIT P.CC: .WORD EXIT P.2CC: .WORD EXIT P.SIZE: .WORD NOK .END @s2? @dU(_a4x $ * <ߕ " ,0B`ʕ Ћ  / w J7> w< :   "S4ߥ. ߥ.w Dwb T    6ߕ.  w \:( j X"  4$ & ߋw 5*  5* w {   -N ߭C 78 7 F w : 6ߋ ~ (  "  w V  w x?( w bh vߕ  Zw 84" F(&5@5=w$  "w p x "Q$ыɕ "P P Y"< pߕ L *ߋ   ߕЕ* pF. b8. T* e e  B~B@B~ "HH" B~ B~ N w k(  F w l(7 . 7 7 7 7 7 7 7 7 פ/7” aE E ~0  פ/    ~:  ɋЕSЕY PP Bыe0Е:Е[  ZЕ, PЕ] r nЕ. f (Е?Е 7 "QQ &mЕ Е Е    X w    l @ Z ."  R7 H   "   0   $`~$ r BEw Ce0Ee0Bw ( qFRNQBPS^_?Bad out dev? KB:?File not found?  ABCDEFGHIJKLMNOPQRSTUVWXYZ$.?0123456789SY0:[001,013]TYPE.HLP/RSY0:[001,013]NREADY.BAC TYPE V7.7 licensed to Erskine College, Due West, South Carolina 29639  ) k_Z&v((9c &y'@Q*(v2dt:#WWW@W2gYaff}fmhtIqXqPwsBx@yK #}qQpYfZ,i&W8".a\g&Z&yfW:2f ;line feed 177110 000004 '[ ? 177110 000005 '0 ? '0 177110 000006 '0 ? '0 177110 000007 '1 ? '2 177110 000010 ', ? 177110 000011 '0 ? '2 177110 000012 '1 ? '5 177110 000013 '3 ? '4 177110 000014 '] ? 177110 000015 'T ? 177110 000016 'Y ? 177110 000017 'P ? 177110 000020 'E ? Erskine College TYPE Page 3 Installation Notes 177110 000021 '. ? 177110 000022 'H ? 177110 000023 'L ? 177110 000024 'P ? 177110 000025 '/ ? 177110 000026 'R ? 177110 000027 'S ? 'D 177110 000030 'Y ? 'M 177110 000031 '0 ? '1 177110 000032 ': ? 177110 000033 '[ ? 177110 000034 '0 ? '0 177110 000035 '0 ? '0 177110 000036 '1 ? '2 177110 000037 ', ? 177110 000040 '0 ? '2 177110 000041 '1 ? '5 177110 000042 '3 ? '4 177110 000043 '] ? ^C ;uparrow C - not CTRL/C for ONLPAT The following assumes that SY0:[1,13] is the TYPE device/account. If not, substitute the device/account you selected in the previous step in place of the "SY0:[1,13]'s" below. Move the TYPE help message file to the TYPE account by PIP SY0:[1,13]*.*<40>/MO:1536=TYPE.HLP ("/MO:1536" is a special mode that places the file at the top of the TYPE account's directory.) Create the 'No Ready' program by SWITCH BASIC -if necessary NEW NREADY 10 V$=SYS(CHR$(5%)) 20 END COMPILE SY0:[1,13]<40>/MO:1536 Create the run-time system invoking program by (It is assumed that the CCL UT runs the program $UTILTY.) PIP SY0:[1,13]TYPE.TYP<104>/MO:1536=NL:/RTS:TYPE PIPing TYPE.TYP from the null device (NL:) creates a zero block file which is only used to call TYPE.RTS. Eliminate SY0:[1,13]TYPE.TYP from any auto- matic process that kills zero length files. Erskine College TYPE Page 4 Installation Notes If you have used the SET option of the RSTS init code to set any or all KB:'s and/or LP:'s PRIV and you want non-privileged users to type to one of these privileged devices from some other KB:, change TYPE.TYP's protection code to <232> by typing PIP SY0:[1,13]TYPE.TYP<232>/RE Leave TYPE.TYP's protection code <104> (as established in the previous step) if you have not set KB:'s or LP:'s PRIV or you do not want non-privileged users sending data anywhere other than to their own terminal or any non-privileged KB:/LP:. Add the following to your running system and to your start up files: UT ADD TYPE CCL TY-PE=SY0:[1,13]TYPE.TYP;0 EXIT If you choose not to use the CCL "TY-PE", you can use something else such as UT CCL WR-ITE=SY0:[1,13]TYPE.TYP;0 Erskine College TYPE Page 5 * * * * T Y P E U S E R ' S G U I D E * * * * If TYPE's CCL alone is typed, a help message is printed. 1.0 File specs - some examples TY JUNK.TXT -will print the file JUNK.TXT TY *.TXT -will print all files with extension .TXT TY .TXT -same as TY *.TXT TY REPORT.* -will print files named REPORT with any extension TY REPORT -same as TY REPORT.* TY REPORT. -will print the file REPORT. (null extension) TY INFO??.LST -will print INFOA.LST, INFO24.LST, INFO.LST, etc. TY *.* -will print all files in the current account TY JUNK.LST,JUNK.TXT -will print JUNK.LST 1st followed by JUNK.TXT TY *.LST, *.TXT -will print all .LST files then all .TXT files TY [100,2]FILE.TXT -will print FILE.TXT from account [100,2] if its protection code allows transfer 2.0 /F - form feed 1st /F simply sends a form feed (ASCII 12.) before the file's data is transmit- ted and it places additional form feeds between files. This allows one to use one form for LOGIN, for a catalogue of files, etc. then to have TYPE move to the top of a clean form before printing begins. (This requires a terminal that knows what to do with a form feed!) 3.0 /S - form feed after 1st file /S is the same as /F except that it does not output a form feed before the first file. This switch is useful when you are using a LA50 connected to a VT220's printer port. Erskine College TYPE Page 6 User's Guide 4.0 /P - VT220 printer port /P turns on a VT220's printer port, sends the file(s), and then turns off the printer port. Note: If you use CTRL/C to halt TYPE, it will not auto- matically turn o ff the VT220 printer port. (TYPE, as distributed, contains code that works if the VT220 is in VT52 mode.) 5.0 /R - no "Ready" This switch makes TYPE not print "Ready" once it is done. If this switch is omitted, a "Ready" or other system prompt will appear after the text on the last form. 6.0 /x - x copies TYPE will print x copies of all files specified if it finds a slash (/) fol- lowed by a single digit 2 to 9. Note the following examples: TY JUNK.TXT/3 -will print 3 copies of JUNK.TXT TY A.LST,B.LST/2 -will print 2 copies of A.LST then 2 copies of B.LST 7.0 /N - name 1st /N tells TYPE to preface each copy of each file with the name of the file. 8.0 /Q - query mode When the /Q switch is used, TYPE prints each file name that it finds to pro- cess followed by a question mark. IF a Y is typed by the user, TYPE proceeds to print that file. If any other character is typed, TYPE skips that file and presents any additional files it finds to process. 9.0 /B - binary mode The /B switch makes TYPE send the data in a file to a user's terminal in bi- nary mode. This is useful when punching a paper tape on an (antique) termi- nal when you want tab characters to stay tabs and not to be translated into a series of spaces, etc. This mode is also useful when you want to send text that contains ESCape sequences to a terminal. /B automatically sets /R (no "Ready"). Erskine College TYPE Page 7 User's Guide 10.0 Directed output TYPE opens "KB:" for output. You can direct TYPE's output to some other terminal (KBn:) or to a line printer (LPn:). The following command directs TYPE's output to the line printer (LP0:): ASSIGN LP:KB NOTE: TYPE V7.7 cannot determine that an output device is off-line. -------------------------------------------------------------------- To direct TYPE's output to KB2:, enter ASSIGN KB2:KB Use the DEASSIGN command to release either assignment. 11.0 All done TYPE sends a series of three bells to signal "all done" except in binary mode (/B). 12.0 Some perhaps strange but expected happenings TY XX.LST,XX.LST/9 -prints 18 copies of XX.LST TY YY.LST/25 -prints 2 copies of YY.LST, 2nd digit is ignored TY ZZ.LST/3/5 -prints 5 copies of ZZ.LST, earlier /3 is ignored TY A.LST/2,B.LST/3 -prints 3 copies of A.LST only, "/" terminates file spec scan. Switches must be last! If WORK.BAC has a protection code with bit 6 set such as <104> (run only), TY WORK.BAC -prints nothing. If RIDICU.LAS has a file size greater than 65,535 blocks, TY RIDICU.LAS -will not work properly. No attempt has been made to treat this as an error. ASSIGN DM0:KB -Is not allowed for obvious reasons! TY @r2? .Comment Copyright (c) 1982 by Erskine College, Due West, South Carolina .Comment This document may be reproduced in whole or in part for .Comment use with Erskine College TYPE if not for profit and if the .Comment "Copyright (c) 1982 by Erskine College, Due West, South .Comment Carolina 1982" copyright notice is included in the printed .Comment document. .Comment Last edit: 8-Mar-83 *M .Header Mixed .Paper Size 60, 76 .Flags Hyphenate .Title Erskine College TYPE .Center;TYPE for RSTS/E * .Skip 2 .Center;Copyright (c) 1982 by Erskine College, Due West, South Carolina .Skip 1 .Paragraph 0 The purpose of TYPE is to reduce the system requirements for printing text files from disk to users' terminals. TYPE.RTS is a 1K (words) run-time system. Each job running TYPE requires only 1K (words) of additional memory. Compare: 10 simultaneous TYPErs occupy 11K, 10 simultaneous PIPers occupy 164K or more. .Literal User selectable features: o output multiple copies o begin each file with a form feed o exit with no "Ready" message o print file name, then file o Y/N print file query mode o binary output mode for ESC seq., etc. o ability to direct output to LPn: or KBn: as well as KB: o output through a VT220's printer port Other features: o uses a 1,024 byte (2 block) disk buffer o allows wildcards in file names and extensions o handles multiple files listed together o sets job name _= name of file being processed .End Literal .Paragraph If you have any problems installing or using TYPE on your system, send your questions, print-outs, etc.#with a SASE to .Literal TYPE Erskine College Computer Center PO Box 86 Due West, SC 29639 .End Literal .Skip 2 .Center;Note .Skip 1 .Left Margin 8 .Right Margin 68 Although TYPE has =performed as expected at several test sites on RSTS V7.0 - V9.2, Erskine College and/or its personnel will not be responsible for anything that happens or that does not happen using TYPE. The information in this document is subject to change without notice. .Left Margin 0 .Right Margin 76 .Skip 2 * trademark of Digital Equipment Corporation .Page .Skip 3 .Center;* * * * I N S T A L L A T I O N N O T E S * * * * .Skip 3 You will find on your distribution medium $README.1ST (this document), $TYPE.RTS (the TYPE run-time system), $TYPPN.CMD (the PPN patch), $TYPE.HLP (the TYPE help message file), and $TYPE.RNO (this document in RUNOFF [RNO] format). These files are placed redundantly on the distribution medium in accounts [1,3], [1,4], and [1,5] for your use in case your tape drive or disk drive encounters trouble reading any of the files in the $ account. .Skip 1 Copy these files from the distribution medium into some PRIVILEGED scratch account. To do this use .Subtitle Installation Notes .Skip 1 PIP *.*_=dev:$*.*/HA/W .Skip 1 where dev:#is the name of your distribution device. .Skip 1 Move a contiguous (/MO:16) copy of TYPE.RTS to account [0,1]. Do this by .Skip 1 PIP [0,1]*.*/MO:16_=TYPE.RTS .Skip 2 The default device/account for other files associated with TYPE is SY0:[1,13]. If you do not wish to use this device/account, then edit TYPPN.CMD to reflect the DEV:[PPN] you want. The device must be a disk device whose name is expressed using three or fewer characters. The example DEV:[PPN] in TYPPN.CMD is DM1:[2,254]. Once TYPPN.CMD has been edited, RUN $ONLPAT and answer "Command file name?" with TYPPN.CMD. Skip this step if SY0:[1,13] is a =suitable TYPE device/account. .Literal Here is a listing of the patch contained in TYPPN.CMD File to patch? [0,1]TYPE.RTS Base address? HELPMF Offset address? 0 Base Offset Old New? 177110 000000 054523 ? \' ;backslash, single quote 177110 000000 'S ? 'D ;single quote, "D" 177110 000001 'Y ? 'M 177110 000002 '0 ? '1 177110 000003 ': ? ;line feed 177110 000004 '[ ? 177110 000005 '0 ? '0 177110 000006 '0 ? '0 177110 000007 '1 ? '2 177110 000010 ', ? 177110 000011 '0 ? '2 177110 000012 '1 ? '5 177110 000013 '3 ? '4 177110 000014 '] ? 177110 000015 'T ? 177110 000016 'Y ? 177110 000017 'P ? 177110 000020 'E ? 177110 000021 '. ? 177110 000022 'H ? 177110 000023 'L ? 177110 000024 'P ? 177110 000025 '/ ? 177110 000026 'R ? 177110 000027 'S ? 'D 177110 000030 'Y ? 'M 177110 000031 '0 ? '1 177110 000032 ': ? 177110 000033 '[ ? 177110 000034 '0 ? '0 177110 000035 '0 ? '0 177110 000036 '1 ? '2 177110 000037 ', ? 177110 000040 '0 ? '2 177110 000041 '1 ? '5 177110 000042 '3 ? '4 177110 000043 '] ? _^C ;uparrow C - not CTRL/C for ONLPAT .End Literal .Skip 3 .Test Page 10 The following assumes that SY0:[1,13] is the TYPE device/account. If not, substitute the device/account you selected in the previous step in place of the "SY0:[1,13]'s" below. .Skip 2 Move the TYPE help message file to the TYPE account by .Literal PIP SY0:[1,13]*.*<40>/MO:1536_=TYPE.HLP .End Literal ("/MO:1536" is a special mode that places the file at the top of the TYPE account's directory.) .Skip 2 Create the 'No Ready' program by .Literal SWITCH BASIC -if necessary NEW NREADY 10 V$_=SYS(CHR$(5%)) 20 END COMPILE SY0:[1,13]<40>/MO:1536 .End Literal .Skip 2 Create the run-time system invoking program by .Skip 1 (It is assumed that the CCL UT runs the program $UTILTY.) .Literal PIP SY0:[1,13]TYPE.TYP<104>/MO:1536_=NL:/RTS:TYPE .End Literal PIPing TYPE.TYP from the null device (NL:) creates a zero block file which is only used to call TYPE.RTS. Eliminate SY0:[1,13]TYPE.TYP from any automatic process that kills zero length files. .Skip 1 .Test Page 10 If you have used the SET option of the RSTS init code to set any or all KB:'s and/or LP:'s PRIV and you want non-privileged users to type to one of these privileged devices from some other KB:, change TYPE.TYP's protection code to <232> by typing .Literal PIP SY0:[1,13]TYPE.TYP<232>/RE .End Literal Leave TYPE.TYP's protection code <104> (as established in the previous step) if you have not set KB:'s or LP:'s PRIV or you do not want non-privileged users sending data anywhere other than to their own terminal or any non-privileged KB:/LP:. .Skip 2 Add the following to your running system and to your start up files: .Literal UT ADD TYPE CCL TY-PE_=SY0:[1,13]TYPE.TYP;0 EXIT .End Literal If you choose not to use the CCL "TY-PE", you can use something else such as .Skip 1 UT CCL WR-ITE_=SY0:[1,13]TYPE.TYP;0 .Subtitle .Page .Skip 3 .Center;* * * * T Y P E U S E R ' S G U I D E * * * * .Skip 3 If TYPE's CCL alone is typed, a help message is printed. .Subtitle User's Guide .HL 1 File specs - some examples .Literal TY JUNK.TXT -will print the file JUNK.TXT TY *.TXT -will print all files with extension .TXT TY .TXT -same as TY *.TXT TY REPORT.* -will print files named REPORT with any extension TY REPORT -same as TY REPORT.* TY REPORT. -will print the file REPORT. (null extension) TY INFO??.LST -will print INFOA.LST, INFO24.LST, INFO.LST, etc. TY *.* -will print all files in the current account TY JUNK.LST,JUNK.TXT -will print JUNK.LST 1st followed by JUNK.TXT TY *.LST, *.TXT -will print all .LST files then all .TXT files TY [100,2]FILE.TXT -will print FILE.TXT from account [100,2] if its protection code allows transfer .End Literal .HL 1 /F - form feed 1st /F simply sends a form feed (ASCII 12.) before the file's data is transmitted and it places additional form feeds between files. This allows one to use one form for LOGIN, for a catalogue of files, etc.#then to have TYPE move to the top of a clean form before printing begins. (This requires a terminal that knows what to do with a form feed!) .HL 1 /S - form feed after 1st file /S is the same as /F except that it does not output a form feed before the first file. This switch is useful when you are using a LA50 connected to a VT220's printer port. .HL 1 /P - VT220 printer port /P turns on a VT220's printer port, sends the file(s), and then turns off the printer port. Note: If you use CTRL/C to halt TYPE, it will not automatically turn off the VT220 printer port. (TYPE, as distributed, contains code that works if the VT220 is in VT52 mode.) .HL 1 /R - no "Ready" This switch makes TYPE not print "Ready" once it is done. If this switch is omitted, a "Ready" or other system prompt will appear after the text on the last form. .HL 1 /x - x copies TYPE will print x copies of all files specified if it finds a slash (/) followed by a single digit 2 to 9. Note the following examples: .Literal TY JUNK.TXT/3 -will print 3 copies of JUNK.TXT TY A.LST,B.LST/2 -will print 2 copies of A.LST then 2 copies of B.LST .End Literal .HL 1 /N - name 1st /N tells TYPE to preface each copy of each file with the name of the file. .HL 1 /Q - query mode When the /Q switch is used, TYPE prints each file name that it finds to process followed by a question mark. IF a Y is typed by the user, TYPE proceeds to print that file. If any other character is typed, TYPE skips that file and presents any additional files it finds to process. .Test Page 8 .HL 1 /B - binary mode The /B switch makes TYPE send the data in a file to a user's terminal in binary mode. This is useful when punching a paper tape on an (antique) terminal when you want tab characters to stay tabs and not to be translated into a series of spaces, etc. This mode is also useful when you want to send text that contains ESCape sequences to a terminal. /B automatically sets /R (no "Ready"). .HL 1 Directed output TYPE opens "KB:" for output. You can direct TYPE's output to some other terminal (KBn:) or to a line printer (LPn:). The following command directs TYPE's output to the line printer (LP0:): .Skip 1 ASSIGN LP:KB .Skip 1 .Center;NOTE:##TYPE V7.7 cannot determine that an output device is off-line. .Center;-------------------------------------------------------------------- .Skip 1 To direct TYPE's output to KB2:, enter .Skip 1 ASSIGN KB2:KB .Skip 1 Use the DEASSIGN command to release either assignment. .HL 1 All done TYPE sends a series of three bells to signal "all done" except in binary mode (/B). .HL 1 Some perhaps strange but expected happenings .Literal TY XX.LST,XX.LST/9 -prints 18 copies of XX.LST TY YY.LST/25 -prints 2 copies of YY.LST, 2nd digit is ignored TY ZZ.LST/3/5 -prints 5 copies of ZZ.LST, earlier /3 is ignored TY A.LST/2,B.LST/3 -prints 3 copies of A.LST only, "/" terminates file spec scan. Switches must be last! If WORK.BAC has a protection code with bit 6 set such as <104> (run only), TY WORK.BAC -prints nothing. .End Literal .Test Page 6 .Literal If RIDICU.LAS has a file size greater than 65,535 blocks, TY RIDICU.LAS -will not work properly. No attempt has been made to treat this as an error. ASSIGN DM0:KB -Is not allowed for obvious reasons! TY .End Literal q%2?$SET NODATA $RUN ANA921 $SET DATA $RUN [0,15]SRTUTL ANALYS.TMP/FO:ST:82=ANALYS.TMP/FO:ST:82 $RUN ANA922 q 2? 10 EXTEND 20 REM ANALY1.BAS (part of ANALYS.COM) & & COPYRIGHT (C) 1985, The Saddlebrook Corporation & & This program may be copied without restriction with the inclusion & of this copyright notice. This program is provided "AS-IS" as a & service to the RSTS community and is without warranty, expressed or & implied. & & AUTHOR: John S. Fine, The Saddlebrook Corporation. & & EDIT HISTORY: & 00 ??-???-85 JSF Original version. & & 01 12-SEP-85 John S. Fine Minor cleanups & The Saddlebrook Corporation to facilitate & 101 Main St. general distribution & Cambridge, Ma. 02155 & (617) 661-8100 & & ANALYS.COM is intended as a supplement for DEC's ANALYS.TSK crash dump & analyzer. It creates an annotated partial dump of the contents of a & crash dump file. (It only dumps those portions for which it has & annotations.) The areas in which it gives significantly more & information than the DEC version are: The contents of the data and FIP & cache in XBUF; The data structures (except for the BBR structure) & used by the MSCP disk driver. DSQs; and free pool memory within XBUF. & & ANALY1 reads the crash dump file and the symbol table in the SIL to & build a list of the type and address of annotations in the file & ANALYS.TMP. This file is then sorted (by the DEC program SRTUTL) and & then ANALY2 reads the crash dump file and ANALYS.TMP to produce the & annotated listing. & & The user interface and file interface are fairly primitive (but should & be easy to fix if you find them a problem): It expects the CRASH.SYS & file to be copied to CRASH.xxx in the current account and the SIL to be & copied to yyyyyy.SIL in the current account. It inputs only the & extension and name xxx and yyyyyy. The output always goes to the file & DUMP.xxx & & Restrictions: It does not check that the MSCP driver is present before & attempting to dump the MSCP data structures, nor does it check that the & data plus fip cacher (rather than the fip only cacher) is present before& dumping this data structure. Thus it probably will not work if either & of these are not present. Also some parts of this program are highly & dependant on internal details of RSTS and currently only work for & version 9.0-14. The problem for version 9.1 appears to be very minor & but I do not have time to fix it for the current SIG tape. Anyone with & a need to run this program on version 9.1 should contact me. By that & time I may be able to provide a small edit to fix the problem. Most of & the code should work for earlier versions of RSTS but I have no plans & to fix any problems in that area. & 100!******************************************************************* & ! This kludge works if the symbol table is between blocks 256 and & ! 767 within the SIL & DIM #1%,SIL%(32767%),SIL2%(32767%),STB%(32767%,3%) & !********************************************************************** & \ DIM #1%,HDR%(15%,15%) & \ DIM #1%,DUMP%(8191%,255%) & \ DIM DEVCLU%(63%) & \ HIBIT%=32767%+1% & \ OPEN "ANALYS.DAT" FOR INPUT AS FILE #2% & \ INPUT "CRASH.???,??????.SIL";C$,S$ & \ OPEN S$+".SIL" FOR INPUT AS FILE #1%, MODE 256% & \ OPEN "ANALYS.TMP" FOR OUTPUT AS FILE #3% & ! This record sorts to the beginning and tells ANALY2 what to do & \ PRINT #3%," ";'"CRASH.';C$;'","DUMP.';C$;'"' & ! This record sorts to the end of the disk map to tell ANALY2 & ! to start the annotation & \ PRINT #3%,".,64,,,,,,," & \ X%=X%+1% WHILE HDR%(X%,1%)<>24898% OR HDR%(X%,2%) !Find OVR & \ OVRLEN%=(FNF(HDR%(X%,8%))+FNF(HDR%(X%,9%))+511)/512 & \ S%,STB%=(SIL%(6%)-256%)*64% !SIL%(6%) is blk number of stb & \ STBE%=STB%+SIL%(7%) !SIL%(7%) is number of symbols & ! Symbols read from the STB are numbered (for sorting purposes) & ! from 10 to at most 99 & \ SYM%=10% & \ CHECTL=FNS & \ CMT =FNS & \ CMTSIZ=FNFIXED(18) & \ DEVCLU=FNS & \ DQSEND=FNS & \ DQSDV =FNS & \ DSKLOG=FNS & \ EXTPOL=FNS & \ FCBLST=FNS & \ FIPPOL=FNS & \ FIQUE =FNS & \ FPLAP6=FNS & \ JCPFB =FNFIXED(64) & \ JCRSIZ=FNS & \ JCWPTR=FNFIXED(60) & \ JOBTBL=FNS & \ LRGPOL=FNS & \ MEMLST=FNS & \ MONPOL=FNS & \ OPTDU =FNS & \ OPTDV =FNS & \ OVBASE=FNS & \ SNDLST=FNS & \ X.SCS =FNS & \ X.TAB =FNS & ! $ & \ FIPTB=FNS & ! $$ & \ EPMM=FNS & \ ISPE=FNS & \ ISPS=FNS & \ FOR S%=STB% TO STBE%-1% & \ V%=STB%(S%,3%) !Value of symbol & \ V=FNF(V%) & \ IF (V% AND 1%)=0% AND ( (V>512. AND V<=ISPS) OR & (V>=ISPE AND V<=EPMM) ) THEN & STB$=RAD$(STB%(S%,0%))+RAD$(STB%(S%,1%)) & \ X%=FNA%(V,STB$,0%) 110 NEXT S% 200 CLOSE 1% & \ OPEN "CRASH."+C$ FOR INPUT AS FILE #1%, MODE 256% & ! Convert orriginal device cluster size of crash dump from blocks & ! to MMUs & \ X.SCS%=FNP%(X.SCS)*8% & ! Convert crash dump regions from base and length (in MMUs) to & ! physical and dump-file address & \ FOR S%=0% TO 6% & \ A.P(S%)=FNP(X.TAB+S%*4)*64. & \ A.D(S%+1%)=A.D(S%)+ & INT((FNP(X.TAB+S%*4+2)-1)/X.SCS%+1)*X.SCS%*64. & \ NEXT S% & \ FPL.VX2D=A.D(1%)+64.*FNP%(FPLAP6)-A.P(1%)-16384. & \ FPL.V2D=FPL.VX2D-32768. & \ M.P2D=A.D(2%)-A.P(2%) & \ X.P2D=A.D(3%)-A.P(3%) & \ JCR=A.D(4%) & \ DEVCLU%(I%)=(FNP%(DEVCLU+I%*2.) AND 255%) FOR I%=0% TO 63% & \ OVR=FNV(OVBASE) & \ FOR P%=0% TO OVRLEN%-1% & \ P=OVR+4.*P% & \ V%=FNP%(P) & \ X%=FNA%(X.P2D+FNP(P+2)*64+(V% AND 8191%), & " OVR VBN "+NUM1$(P%),0%) IF V%<0% & \ X%=FNFBB%(P,P%,1%,",0,24898,0,") IF V%>=0% & \ NEXT P% & \ PNT=FIPTB & \ WHILE P$<>"UU.CFG" & \ INPUT #2%,P$ & \ P%=FNP%(PNT) & \ IF P% AND 1% THEN & X%=FNA%(PNT,P$,0%) & ELSE IF P% THEN & P=OVR+FNF(P% AND -512%)/128 & \ X%=FNA%(P,RIGHT(FNO$(P%),4%)+" "+P$,0%) & \ V%=FNP%(P) & \ X%=FNA%(X.P2D+FNP(P+2)*64+(P% AND 511%)+(V% AND 8191%), & P$,0%) IF V%<0% 210 PNT=PNT+2 & \ NEXT & \ CLOSE 2% & \ PNT=FNV(FIQUE) & \ P%=0% & \ WHILE PNT>0 !Loop through FIP queue & \ X%=FNA%(PNT,NUM1$(P%),1%) & \ PNT=FNV(PNT) & \ P%=P%+1% & \ NEXT & \ CHEPAR=FNP(CHECTL+10)*64.-49152.+X.P2D & \ CHENXT=CHECTL+6 & \ P%=0% & \ PNT=FNP(CHECTL+6)-2 & \ WHILE PNT<>CHENXT !Loop through cache tags & \ PN2=PNT+CHEPAR & \ X$=NUM1$(P%) & \ PRINT #3%,"5";STRING$(6%-LEN(X$),48%);X$;",23,";NUM1$(PN2) & \ X%=FNA%(PN2,NUM1$(P%),2%) & \ ENT=FNP(PN2+8)*64+X.P2D !Point at cached data & \ X%=FNA%(ENT,NUM1$(PNT),3%) & \ FUN%=FNP%(PN2+4) AND 255% & \ IF FUN%<>255% THEN & D%=DEVCLU%(FUN%) & ! dcn of this cache cluster & \ D=((SWAP%(FNP%(PN2+4)) AND 255%)*65536.+FNP(PN2+6))/D%+1. & \ X%=FNP%(ENT+496) !Clustersize word if this is an xFD & \ L%=(X% AND 255%)/D% !xFD cluster length in device clusters & ! if this looks like the first cluster of an xFD then write & ! out disk map entries for the entire cluster map & \ PRINT #3%,",";RIGHT(NUM1$(FUN%+100%),2%);","; & RIGHT(NUM1$(FNP(ENT+498+E+E)+100000),2%);","; & NUM1$(E*L%);",";NUM1$(L%);",";NUM1$(FNP%(ENT+12)); & ",0,0,0" IF FNP(ENT+498+E+E)<>0 FOR E=0 TO 6 & IF "FD"=RIGHT(RAD$(FNP%(ENT+14)),2%) IF D=FNP(ENT+498) & UNLESS X% AND 32767% AND (X% OR 16%)-1% 220 PNT=FNP(PN2)-2 & \ P%=P%+1% & \ NEXT & \ X%=FNPOOL%(0%,MONPOL) & \ X%=FNPOOL%(1%,FIPPOL) & \ X%=FNPOOL%(2%,LRGPOL) & \ X%=FNPOOL%(3%,EXTPOL) 300 DEF FNPOOL%(B%,P) & \ B1%=B% & \ PNT=FNP(P+2.) & \ P=0 & \ WHILE PNT<>0 & \ PNT=PNT+FPL.V2D IF B1%=1% AND PNT>40959 & \ PNT=PNT*64+X.P2D IF B1%>1% & \ X%=FNA%(PNT,NUM1$(B%),4%) & \ PNT=FNP(PNT) & \ PNT=0 IF INT(PNT/32)*320 AND P3<512 & \ X%=FNA%(P,P$+NUM1$(P3),14%) !DSQ & \ P3=P3+1 & \ P=FNV(P) & \ NEXT & \ P=FNP(PNT+6)*64+(FNP%(PNT+8) AND 16383%)+M.P2D & \ X%=FNA%(P,NUM1$(C%),6%) !CCB C% & \ P$="CCB"+NUM1$(P2)+"[" & \ P3=0 & \ P=FNV(P+20) !C.OLDL & \ WHILE P>0 AND P3<512 & \ X%=FNA%(P,P$+NUM1$(P3),14%) !DSQ & \ P3=P3+1 & \ P=FNV(P) & \ NEXT & \ PNT=PNT+CMTSIZ & \ P2=P2+1 & \ NEXT C% & \ JCRSIZ=FNP(JCRSIZ) & \ JOBPTR=JOBTBL & \ WHILE (FNP%(JOBPTR) AND 31%)=0% & \ JDB=FNV(JOBPTR) & \ IF JDB>0 THEN & JOB2%=JOBPTR-JOBTBL & \ JOB$=NUM1$(JOB2%/2%) & \ X%=FNA%(JDB,JOB$,7%)+ !JDB & FNA%(FNV(JDB),JOB$,8%)+ !IOB & FNA%(FNV(JDB+6),JOB$,9%) !WRK & \ JDB=JCR+JOB2%*JCRSIZ !JDB2 & \ X%=FNA%(JDB,JOB$,10%) & \ P=JDB+JCPFB !PFB & \ X%=FNA%(P,JOB$,20%) & \ X%=FNP%(P) & \ X%=FNA%(FNCON(X%),JOB$,21%) IF X% !Log CBB & \ X%=FNP%(P+2) & \ X%=FNA%(FNCON(X%),JOB$,22%) IF X% !Com CBB & \ P=INT(FNV(JDB+JCWPTR)/32)*32 !WDB & \ IF P>0 THEN & X%=FNA%(P,JOB$,11%) & \ P=INT(FNV(P)/32)*32 !WDB2 & \ IF P>0 THEN & X%=FNA%(P,JOB$,12%) & \ P=INT(FNV(P)/32)*32 !WDB3 & \ X%=FNA%(P,JOB$,13%) IF P>0 410 JOBPTR=JOBPTR+2 & \ NEXT & \ P=FNV(SNDLST) & \ WHILE P>0 & \ X%=FNA%(P,"",17%) !RIB & \ P1=FNV(P+16) & \ WHILE P1>0 & \ X%=FNA%(P1,NUM1$(P),18%) !PMB & \ M%=FNP%(P1+2) & \ X%=FNA%(FNCON(M%),NUM1$(P1),19%) IF M% !MSG & \ P1=FNV(P1) & \ NEXT & \ P=FNV(P) & \ NEXT & \ FOR FUN=0 TO DQSEND-DQSDV-2 STEP 2 & \ P2=256*FUN & \ P,P3=0 & \ P=FNV(FUN+DQSDV) IF FUN0 AND P3<512 & \ X%=FNA%(P,NUM1$(P2+P3),14%) !DSQ & \ P3=P3+1 & \ P=FNV(P) & \ NEXT & \ P3=0 & \ P=FNV(FUN+FCBLST) & \ WHILE P>0 AND P=INT(P/32)*32 AND P3<512 & \ X%=FNA%(P,NUM1$(P2+P3),15%) !FCB & \ F1$=","+RIGHT(NUM1$(FUN/2+100),2%)+"," & \ F2$=","+NUM1$(FNP%(P+4))+ & ","+NUM1$(FNP%(P+6))+ & ","+NUM1$(FNP%(P+8))+ & ","+NUM1$(FNP%(P+10)) & \ C=FNP(P+28)/DCS% & \ P4=0 & \ P5=FNV(P+30) & \ WHILE P5>0 AND P4<512 & \ X%=FNA%(P5,NUM1$(P4),16%) !WCB & \ B=FNP%(P5+10)*7. & \ PRINT #3%,F1$;RIGHT(NUM1$(FNP(P5+18+E+E)+100000),2%) & ;",";NUM1$(C*(B+E));",";NUM1$(C);F2$ & IF FNP(P5+18+E+E)<>0 FOR E=0 TO 6 IF B>=0 & \ P4=P4+1 & \ P5=FNV(P5+12) & \ P5=32*INT(P5/32) & \ NEXT & \ P3=P3+1 & \ P=FNV(P) & \ NEXT & \ NEXT FUN & \ PRINT #3%,"9999999,31,X" FOR X%=1% TO 2% & \ CLOSE 3% 20000 DEF FNS & \ INPUT #2%,X$ & \ X$=X$+SPACE$(6%-LEN(X$)) & \ X%=S% & \ S%=S%+1% WHILE X$<>RAD$(STB%(S%,0%))+RAD$(STB%(S%,1%)) & AND S%40959 & \ FNV=X & \ FNEND 20140 DEF FNO$(V%) & \ X1=(V% XOR HIBIT%)+32768. & \ FOR X%=6% TO 1% STEP -1% & \ X=INT(X1/8) & \ X%(X%)=48%+X1-X*8+16%*(X1=0 AND X%<6%) & \ X1=X & \ NEXT X% & \ X%(0%)=6% & \ CHANGE X% TO FNO$ & \ FNEND 20160 DEF FNPEEK(X%)=(FNPEEK%(X%) XOR HIBIT%)+32768. & \ DEF FNP(X)=(FNP%(X) XOR HIBIT%)+32768. & \ DEF FNF(X%)=(X% XOR HIBIT%)+32768. & \ DEF FNCON(X%) & \ FNCON=FNF(X%) & \ FNCON=(X% AND 127%)*32768.+FNF(X% AND -128%)/2+X.P2D & IF X% AND 31% & \ FNEND & \ DEF FNFBB%(P,B%,L%,P$) & \ X2%=FNP%(P) & \ X3%=DEVCLU%(X2% AND 255%) & \ X3%=1% UNLESS X3% & \ X=FNP(P+2)+65536.*(SWAP%(X2%) AND 255%) & \ X2=INT(X/X3%) & \ X5%=X-X2*X3% & \ B%=B%-X5% & \ X4%=(B%+X3%-1%)/X3% & \ PRINT #3%,",";RIGHT(NUM1$(100%+(X2% AND 255%)),2%);","; & RIGHT(NUM1$(100000+X2),2);",";NUM1$(X4%); & ",";NUM1$((L%+X5%+X3%-1%)/X3%);P$;NUM1$(B%-X4%*X3%) & \ FNEND 32767 END q2? ,YYhh V`8 0SYSYSYSYSYSYSYSYSYSYSYSYdCC`8nxR dd@e@Aew*@e@Ae&f . 1fABAD5 a C%!e e B V  B\E CP   D a@ C`B `%ֆ C ӆBEІ0  %C ‹  C B ‹ B 0    e\e\e\e\e\e\g\g\g\U\N E\N MEP\N U\v \$ B $ Cp` bf\$ 7B $Cp` bff\$ B $ Cp` bf\$ 7B $Cp` bf\l& N\w ^#\B  aw @L  aD\:w H\ \\ *l )ffeR $ S~e& "&e`Jlc##M*B l㋣  M  &f&&&      ҄ & \ Z%e \  &&    #   J  & e\ B    B @   \ N A f C%v   \ 3 EU 3 5EvUv\\& & \&&\  \ \\ \\\\&\\\&\&\\\& \ \ \\\\\\\@A@A @A C P \\%\%\%\%\%\'\'\'\ # r#C  "$ # ^#   "  "  ҥ  "C \m ## l d ".m *1@B*DFlm H *1@B "f`&  & ~ B~ !\ \ \& \ \ \& \ff&f  & N & + &   v        %  = 00 6 6 3    EsAq Dws w`w w6 e%6  6  E v v ‡%\&&& r= \ w\*EE ^  \5^ 5 ^2 B5^5 ^p5` E^U^ @!pX0 w #\0&( ffff\w~ w IJ? \**b 5h$$ " El\*ewR*b*&^\*^ *A@*0H\*5& w>0 H\*l ע  5\  % *p^0bl,Hv H 5/ A0  ( 56U W DW +H(E5 &e 00)wBe8 Ub *' & L b  5E(/e  f& & i5@  *e&B~ *I*53  ZH/ y "? & $ԕ ^Eє~~e&e-   6&e+6%e-  L*Uєb ee: CtEe0  Q: B*w@wlŘ  ѕ"єBѕ" & e-e.Q  &e&e f Fe `~  ee*~ѕ"ѕ ѕ * \f*eQe*!&$fl! (SS   f*E5@U?RMS error #FUNCTIONGOSUB called at line in "?Odd address trap?Memory management violation?Error file cannot be opened?Error file cannot be read?Undefined error number 8\ D  p &30 U^\9 ~U^  pU^ bU^& *0 0 0 *0 ,\  6p* & & 5^E^0 f :*3E^5`5` wz& / 4 & @ HF\ w Bv v N e\we 0 0 \ w ^\% 5^5^  0 5 >נ'נ", &D ŀ e1U͋ w, N w$w,6  hwe*@   \ \95^;A5U^f   `p00f h e|ѠѠɋ \* wʋ 0 "5@^ 42 42 Eנ נ , *5  5^DE^0  `ɋɥɥ AɥUɥ RɥGɥ E  f E^5`6: 5`5 C5^&`W&"U^ r @ɋɥ   a0  Rɕ v Dp 0 7 ɵfŀeSˋŀ  5^ &U^q S  p/ 5`*5^&l eFѢɋ5^ep 0 / ӕ ˕ p5^     w. @ w\ wͥ ww w w `  wtwlwB  DҐB~\ f &  b\& \\ l   Tw4 F*J, J, 1@Bw  r E@`\;I GEC*C, C,wT 7e< 0+e"*, , ]45485* @, @,w B  P  : | w *e   ,  ,Ѓ\wff&f hwf &wfU& Mvv 6`vU  q` c qm `a@ `qeAa@ a A @ A @ %  A @ 6v %\%% 0 0  &pf\ H`"w2H`"w0 \"w \"w<&f B@A  w w C P     d ʥ  w    5^5@^* *  h   .pXC `U^5^ 4p f\0 f5`U^w  F *X5 ~     U^ ʥ 0 fʥ  f5 ACCl  rTjA H * ̵C" & `5E8U` U` P`\ 04 e  C`$`\l 8 e  pTppXj&f*e <eEf b *p`E  B~\\\\\\\\\ y>!d!!!!d!d!~!f*5@U@f*E@E\ J" ^ D ~y!d!!!!d!d!! 8  r *@- @- @` E \\ \ \ \f X!! ק *$h $&f& h!!! T0! ! 敠^*.!*!,!\Ɍf&5^ h!! !*_x,&&*&,&&fp*p,p D1@A@ ,*f"! W 0# "\ Ìf"   \?    SS  4-v%  ߕ_ & 0~FB>.>:6$&"  E`E`$& 7$$peB vdB rbf&5@  e  \ de\ t  VeC`C~& &   & \ "e&5`&& & & B 33 3UU e'@R U3P*˕ *%  \˕˕ ˕U U^˕  *fœ0U^E ^0\5`U`HHV  U` C \ j AEC Ee p5 ^U ^\ ^+5^ 5^#X f* ,0  5` Z\ ^ߕw`wV    T E e#'N  e!&?e& wB e 6@ e w* B~*!3&e &s s 3  ~ 6 ~3e36 ~3@ TI,*—)0ՀHHVpTppX0^U`E^eEW s`R @ 3 3see@`e^i A  ~  )e2R ae0RR  "3;z  e<e 2E~! AE@ e3XR~ 5e0eN* 33 L\3 ~ ~ ~R~3 H  dW(\  p *AX(/@ BCzEG@HPtJ$*Uemory exceeded in "?No CHAIN table in "?Statement not found in "" *0 w?Maximum memory exceeded in "e~ ww  *U@eB B  BB B f &~Wtu` B " b wXe? WtE & fY  2  6vv ^*U@fB eEB `e E@m   f&    \5B~ E B~ f&*  ##   E b# 'f&B f ##! B EB BH#*u  Hf&*e@     $*@, @,  E@` `&*5@U@ &*E@E @A!*, , 3@sB@` Ee@"f*B, B, DF` EeDJe  W  * B`.*"&`EUC`{  6% % e@ "N' E`  Aa A@^   A ^EW W  &  ѕ-ѕ  r e0 ~ѕ e LB: BASIC2.ERR LB:[001,002]BASIC2.TSK ( $/0% % % % / C  %  v vf&\& & *2f&&& p %,% % U@     T F`D A @ 逎    5 5  e    ew  mנ נ E     CPQCQ<m     p   z &   5@  B5eN N .E D A @  eb" d$    D A @ &f&f eD A @ eA @ e@ e&f&f  %PeE <%PeE D A @ E@ 6 6 x f l&f& & 6v*v6 6 @   U*2 &C X H    5  6 c6 m  6#m    m  6ඌ c& ʕ ʕ- C   E@ U0Ґ 'ခ  + ҕ C eH %%@ f ҕ.  ҕ0  .ҕE  -  Ґ  s e0 e0R  ʥ0ʥ.%ʕ0 fW+W-W W0 W9fwʕ+w '  B   @A  ~~ \  n &  & *@@ , w&*&h\*&f\ \5^f 00 f 3\VӋf*x0 x\ n& &\w veE D` bl lrw 4  B eE"s    s-  Csl*U  -5^5`5^5^+5 ^U^fB qNB,'AeBpbef  Ba`p*p!1fpppf p*p, 1*p,q *5 E v #v%-*.f,*W0 U  ߗ_ 5$h  $ #v%  `` b w&f  '|8YYPRQQpU8WWpU+YY`8ANA921z z z dX jVX WWWr T W8T YT Y T YT W 4Y WX WWYWX WWXT T X8T X8T Y8T $X8T Y8T 0X8 T T 6X8 z df V~ |$|Y Baf VT |$|Y("9L V9z df VT |$|Y, Of VT |$|Y, OL@FXh JX\L lVT ^$bY!X@L Vj VVT ^$bYVL VX V, K *W, K .WNX, L V, K V, K V, K nV, K 2W, K V, K V, K rV, K V, K 6WRX, L vV, K zVVX, L V, K V, K :W, K >W, K ~V, K V, K V, K ^V, K V, K V, K V, K V, K V, K BW, K Vj VVj VWZ W VW;z df VT |$rYL Vf V, O V~ f V(" VJX VV VBW VV(";f Vr |$rYf V~ |$rY 4YVYr , ~LL Vz nVW$;Z Vz nz ~ (T ZXT Y 4Y WX WWYWV, NXL Vv VX Wz f Vf VbdX@V, ObRX |WY0 |Wf VH f VYf VbdX@V@hX, O6Wf Vp @Wf VjbRXL |WY0 |WVWz f VbdX@V FWFW, NL V4"V=FW@hX, ObRX@WT f VLT tXf V r , ~LL V4"V=FWf V~ X, \PL VVWv=Z Vz & VJWz T YT X.  ?T T Y JW, NL V~ f V("^>JWYr , ~LL V>4"V>T f V, Oh X@V FWFWf V, Nr T T Xx T Yx r , ~LL VFW, NL V4"V>FW@hX, ObRX@WT f VLT f VLYr , ~LL Vz hXJW>z T (V, nN JWv Vz 4"JWZ?JWf V~ , ~LL VJW, nN JWL V$?z *W@X, ObRX6X@W NW*W@X Vv V*W@X, O6hX JWz JWV*BJW@NW RWf V4YT T X8T T Y!T 0r 8T Y8T X8RWr 8 RWf VT , ~LL VRW@X, ObRX@W WWJWT , ~LL VRW@dX, NT L W WBf W6YL VWRW@dX, NT bXRW@X, OLf VWp @W XWW@X, NL VT f Vr VWL \WT f VT f VV ("BW@X, O XWBT XW@X, Nr T r . BVz W@X@V@V, O0"AT T X8f W|dr T r 8T X8W@X@V@V, O@Xr T r 8T X8f \WbVr 8T X8f \Wr 8T X8W@X, Nr 8T X8 WVX,AWVz z RW, O6hX JWL V?z r ~V, rBL V~ rV, rBL VT :W, rBL VT V, rBL Vz ,^C2!FWWz ,j W^WFW@hX, O JWFWz ,4"JWFC ^W JWX("BWJW ^WBJWbRX@W JWJWf WT , ~LL VJW, O JW ^W(CJWh XbX JW(CJW JWFW6CJW& JWFWWBz ,!FWW: Wz ,z & .WJWJW6XWT , ~LL VV.W6X, NL Vv `WT f VV L W `WW Ez JWf `WT , ~LL VT XV T Yx 4YWJW@dX, nN FWz 4"FW WJX("DDFWT YW T , ~LL VWWFW, nN FWCz JW@X, ObRXJW@X, NT ?L@bV FWFWf `WT , ~LL VT YV T Yx 4YWFW@Y, nN FWz 4"FW WJX("EFWT YW T , ~LL VWWFW, nN FWDz VJWWV`WWCZ `Wz zV, O zV& VbWz bW, NT ("GbW, nN fW4"fWGbW6V\L Wf Wv 4YfWYT , ~LfW, nNYT , ~LpfW@X, nNYT , ~LpL Vf WbzV@W fWfWYT , ~LL VfW@vV FWFWYT , ~LL VFW, NL V4"V6Ff V, OYT , ~LL VFW@hX, NL V4"VfFf V, OYT , ~LL VfW@V, nNh XbX FW4"FWGFWYT , ~LL VFW, nNh XbX FW4"FWGFWYT , ~LL VFW, nNh XbX FW4"FWGFWYT , ~LL Vz hXbW6Ez V, nN FWz 4"FWGFWWT , ~LL VFW@Y, nN fVz 4"fVGfVFWT , ~LL VfV@hX, NL jW4"jWGf jW, OfVT , ~LL VfV, nN fVNGz FW, nN FWGz lWV6nV6hX W lWWJz YblW VFWWV6V lW HlW@nV, nN FWlWh hX\6YL Wz 4"FW WJX("|HFWV@WT , ~LL VWWFW, nN FW2Hz WlW@V, nN FWz 4"FWFWh XbX FW WJX("JFWV@WT , ~LL VT XlWh hX@ Yr T  T Xx 4YT XFW@dX, N T Xx FW@X, N T Xx FW@X, N T Xx FW@X, N 4YFW@$Y, Of Wp  WpWFW@(Y, nN Vz 4"V pWJX("JVpWT , ~LL VV@X, Nb,Y V4"VJVz V@NX@V@V, O0"rJT T Y8V@NX@V@V, O@Xr T r 8T X8V@VbWr 8T X8Wr 8T Y8 WVXIWVz WpWV@X, nN VVh XbX VIz WWFW, nN FWHz hXlWWGhXlWz  VX Wz T T 0Y8 VWJZ Vz T (z NvLz NT T Y T YT T Y! 4Yj VVz NT Yf Vr |$rYf V~ |$rY r .  VV("KL VPKz N VVKf VT |$rY, O W& WVKj VVWVr T @Y8T Y8 z *NT T X8f Vr 8T X8Vr 8 L VB W2!"Wz *N& "WWT T X8f Vr 8T X8"Wr 8 L V!"WB Wz *Nz 4NM2!VYVz 4NV4YT T T Y!T 0r 8T Y8T X8f Vr 8T X8T Y8 !VYV: Wz 4Nz HNM2!Vz HNX V Wz HNVh X "Wf V\Y@V"WbXH4"V VXL\L zWYn zW& "WVVW ML Vz HNr Y\ 6Y4Y!Vb Yz HNz \NN2!Vz \Nf jVf VL V V Mf V@pX, NL WMf V@V, NL Wz fN!V: Wz fNz pNN2!"Wz pN"Wh JX\L V"Wf VbJXHhXp \L tWf Vf tW|$YL W!"W: W2!"Wz pN"W, O "W "WXNW"W& "WW!"WB Wz pNz NhO2!Vz Nf jVf V@pX vWX V Wz NvWh X "Wf V\Y@vW"WbXH4"vW VXL\L zWYn zW& "WvWVWNL Vz Nr Y\ 6Y4Y!Vb Yz Nz NQ2!Vz Nf V, Mf jV@pX W!VB W2!"Wz N"W, Nf jV@pX W!"WB W2!Vz Nf jVf V@pX W!VB W2!Vz Nf V, O WT f V("PPT f VbpXT f V, Oh hXL@W W!VB W2!Y\WWFWz NFW, NL VT f V6YL V4"VP VFW@hX, Of VT bXL "W"Wf Vp  V"Wf VbVH\L &W.!&WWf WVV r VL (WT T X8T f V|dr T r 8T X8X@Vr T r 8T X8f (Wr 8T X8f \W&WVV r Vr 8T Y8f Wf (WTV!r 8 !Y\WWFW: Wz Nz  z"#V%'""z"z"v# 88d8n;;>B,jB^CG NK*NK4NvLHNM\NMfNMpNNNNNhOQ@W ANALYS.DATWCRASH.???,??????.SILX.SILX ANALYS.TMPX X"CRASH.(X","DUMP.4X":X .,64,,,,,,,DEBCpC^XCRASH.AAGHxX OVR VBN X ,0,24898,0,XUU.CFGDX B@HAX5X,23,BHDX,DHP@BX,0,0,0XFD`BHCBYCMT Y[YCCBBBDCBBA4Y 9999999,31,XDYCould not find symbol: @C  000 @pU U V HVq 2? 10 EXTEND 20 REM ANALY2.BAS (part of ANALYS.COM) & & COPYRIGHT (C) 1985, The Saddlebrook Corporation & & This program may be copied without restriction with the inclusion & of this copyright notice. This program is provided "AS-IS" as a & service to the RSTS community and is without warranty, expressed or & implied. & & AUTHOR: John S. Fine, The Saddlebrook Corporation. & & EDIT HISTORY: & 00 ??-???-85 JSF Original version. & & 01 12-SEP-85 John S. Fine Minor cleanups & The Saddlebrook Corporation to facilitate & 101 Main St. general distribution & Cambridge, Ma. 02155 & (617) 661-8100 & & ANALYS.COM is intended as a supplement for DEC's ANALYS.TSK crash dump & analyzer. It creates an annotated partial dump of the contents of a & crash dump file. (It only dumps those portions for which it has & annotations.) The areas in which it gives significantly more & information than the DEC version are: The contents of the data and FIP & cache in XBUF; The data structures (except for the BBR structure) & used by the MSCP disk driver. DSQs; and free pool memory within XBUF. & & ANALY1 reads the crash dump file and the symbol table in the SIL to & build a list of the type and address of annotations in the file & ANALYS.TMP. This file is then sorted (by the DEC program SRTUTL) and & then ANALY2 reads the crash dump file and ANALYS.TMP to produce the & annotated listing. & & The user interface and file interface are fairly primitive (but should & be easy to fix if you find them a problem): It expects the CRASH.SYS & file to be copied to CRASH.xxx in the current account and the SIL to be & copied to yyyyyy.SIL in the current account. It inputs only the & extension and name xxx and yyyyyy. The output always goes to the file & DUMP.xxx & & Restrictions: It does not check that the MSCP driver is present before & attempting to dump the MSCP data structures, nor does it check that the & data plus fip cacher (rather than the fip only cacher) is present before& dumping this data structure. Thus it probably will not work if either & of these are not present. Also some parts of this program are highly & dependant on internal details of RSTS and currently only work for & version 9.0-14. The problem for version 9.1 appears to be very minor & but I do not have time to fix it for the current SIG tape. Anyone with & a need to run this program on version 9.1 should contact me. By that & time I may be able to provide a small edit to fix the problem. Most of & the code should work for earlier versions of RSTS but I have no plans & to fix any problems in that area. & 100 DIM #1%,DUMP%(8191%,255%) & \ DIM #4%,DCN%(32767%,6%) & \ DIM DEVCLU%(63%),FUN%(64%),FUN$(63%) & \ HIBIT%=32767%+1% & \ POL$(0%)="MONPOL" & \ POL$(1%)="FIPPOL" & \ POL$(2%)="LRGPOL" & \ POL$(3%)="EXTPOL" & \ OPEN "ANALYS.TMP" FOR INPUT AS FILE #3% & \ INPUT #3%,C$,D$ & \ CHECTL=FNS & \ CMT =FNS & \ CMTSIZ=FNS & \ DEVCLU=FNS & \ DQSEND=FNS & \ DQSDV =FNS & \ DSKLOG=FNS & \ EXTPOL=FNS & \ FCBLST=FNS & \ FIPPOL=FNS & \ FIQUE =FNS & \ FPLAP6=FNS & \ JCPFB =FNS & \ JCRSIZ=FNS & \ JCWPTR=FNS & \ JOBTBL=FNS & \ LRGPOL=FNS & \ MEMLST=FNS & \ MONPOL=FNS & \ OPTDU =FNS & \ OPTDV =FNS & \ OVBASE=FNS & \ SNDLST=FNS & \ X.SCS =FNS & \ X.TAB =FNS & ! $ & \ FIPTB=FNS & ! $$ & \ EPMM=FNS & \ ISPE=FNS & \ ISPS=FNS & \ OPEN C$ FOR INPUT AS FILE #1%, MODE 256% & \ OPEN D$ FOR OUTPUT AS FILE #2% & \ OPEN "ANALY2.TMP" FOR OUTPUT AS FILE #4%, MODE 256% & \ ON ERROR GOTO 30000 & \ X.SCS%=FNP%(X.SCS)*8% & \ FOR S%=0% TO 6% & \ A.P(S%)=FNP(X.TAB+S%*4%)*64. & \ A.D(S%+1%)=A.D(S%)+ & INT((FNP(X.TAB+S%*4%+2%)-1%)/X.SCS%+1%)*X.SCS%*64. & \ NEXT S% & \ DU0.FUN%=(OPTDU-OPTDV)/2% & \ JCRSIZ=2*FNP%(JCRSIZ) & \ FOR I%=0% TO 63% & \ DEVCLU%(I%)=(FNP%(DEVCLU+2%*I%) AND 255%) & \ DEVCLU%(I%)=1% UNLESS DEVCLU%(I%) & \ NM=I%*10%+DSKLOG+6% & \ FUN$(I%)=CVT%$(SWAP%(FNP%(NM))) & +NUM1$(FNP%(NM+2) AND 255%)+":" & \ NEXT I% & \ FUN%=-1% & \ WHILE A$<>"." & \ INPUT #3%,A$,F%,DC,B,L,P%,N1%,N2%,N3% & \ GOTO 150 IF F%=FUN% AND DC<=DCL AND DCN-BC=DC-B AND P%=PPN% & AND N1%=NA1% AND N2%=NA2% AND N3%=NA3% & \ GOTO 130 IF FUN%=-1% & \ WHILE D%65535 & \ D%=FUN%(FUN%)+INT(DCN/100) & \ D%=FUN%(FUN%+1%)-1% IF D%>=FUN%(FUN%+1%) & \ D%=D%+1% WHILE DCN>DCN%(D%,1%)+32769. & \ X$=FUN$(FUN%)+" "+NUM1$(LBN) & \ D=DCN%(D%,0%)+32769. & \ LBN=LBN-(D-DCN%(D%,2%)-32767.)*DEVCLU%(FUN%) & \ X2$,X1$="" & \ IF DCN%(D%,3%)=0% THEN LBN=LBN+DCN%(D%,6%) & ELSE & X1$="."+RAD$(DCN%(D%,6%)) IF DCN%(D%,6%) & \ X2$="["+FNP$(DCN%(D%,3%))+","+FNP$(PPN%)+"]" 160 X1$=X1$+"+"+NUM1$(LBN) IF LBN>0 & \ X1$=X1$+NUM1$(LBN) IF LBN<0 & \ X$=X$+" "+X2$+CVT$$(RAD$(DCN%(D%,4%))+ & RAD$(DCN%(D%,5%))+X1$,-1%) IF DCN>=D & \ FNLBN$=X$ & \ FNEND & \ DEF FNP$(P%) & \ PPN%=SWAP%(P%) & \ P%=PPN% AND 255% & \ FNP$="*" IF P%=255% & \ FNP$=NUM1$(P%) IF P%<255% & \ FNEND & \ FPL.V2D=A.D(1%)+64.*FNP(FPLAP6)-A.P(1%)-16384. & \ X.P2D=A.D(3%)-A.P(3%) & \ CHEPAR=FNP(CHECTL+10)*64.-49152. & \ CHENXT=CHECTL+6 & \ CHE.P=FNP(CHECTL+10)*64. & \ CHESEC%=FNP%(CHECTL+4) & \ CHF2CT=CHECTL+112 & \ F1%=32% & \ WHILE 1% & \ F%=F1% \P$=P1$ \V,V0=V1 \S%=S1% & \ INPUT #3%,V1,F1%,P1$ & \ V3=V1 & \ IF V1>=A.D(4%) THEN S1%=4% & ELSE IF V1>=A.D(3%) THEN S1%=3% & ELSE IF V1>=A.D(2%) THEN S1%=2% & ELSE IF V1>=A.D(1%) THEN S1%=1% & ELSE S1%=0% 2010 ON F%+1% GOSUB 10000,10100,10200,10300,10400,10500,10600, & 10700,10800,10900,11000,11100,11200,11300, & 11400,11500,11600,11700,11800,11900,12000, & 12100,12200,12300,12400,12500,12600,12700, & 12800,12900,13000,30000,13200 & \ NEXT & \ GOTO 32767 10000! Symbol & GOSUB 13300 & \ PRINT #2%,P$; & \ GOTO 13200 10100 GOSUB 13300 & \ PRINT #2%,"Item ";P$;" on the FIP queue"; & \ GOTO 13200 10200! Cache tag & GOSUB 13300 & \ P%=VAL(P$) & \ GOSUB 10250 & \ GOTO 13190 10250 PNT=FNP(V+8)*64+X.P2D & \ F%=FNP%(V+4) & \ FUN%=F% AND 255% & \ L1$=CHR$(68%-2%*(FNP(V+12)=CHF2CT))+ & " Cache entry:"+NUM$(P%+1%)+ & " TIM="+NUM1$(CHESEC%-FNP%(V+14)) & \ L2$="No longer valid" & \ L2$=FNLBN$(FUN%, & FNP(V+6)+65536*(SWAP%(F%) AND 255%)+DEVCLU%(FUN%)) & IF FUN%<>255% & \ RETURN 10300!Cache cluster & GOSUB 13300 & \ PRINT #2%,"Cache cluster. Tag at: ";F NO8$(VAL(P$)+CHEPAR); & \ V0=V+496 \GOSUB 13200 & \ V0=V+1008 \GOSUB 13200 & \ V0=V+2032 \GOSUB 13200 & \ V0=V+4080 \GOTO 13200 10400!Free memory & GOSUB 13300 & \ X=VAL(P$) & \ ITEM=INT(X/4) & \ X=X-ITEM*4 & \ PRINT #2%,POL$(X); & \ S=FNP(V+2) & \ S=S*64. IF X>1 & \ IF S<>0 OR ITEM<>0 THEN & PRINT #2%,ITEM;"SIZE=";NUM1$(S); & ELSE & PRINT #2%," ROOT"; & \ GOSUB 13200 FOR L%=1% TO 32% 10410 RETURN 10500! CMT & IF P$<>"" THEN & X%=FNPNT%(2%,"CMT "+P$+" Controller service request thread") & \ X%=FNPNT%(2%," UMR wait thread") & \ X%=FNPNT%(2%," TSQ/DSQ list-head") & \ X%=FNPNT%(2%," APR6 of CCB") & \ X%=FNPNT%(2%," Virtual address of CCB") & \ X%=FNPNT%(2%," Work area allocated") & \ X%=FNPNT%(2%," CSR") & \ X%=FNPNT%(2%," Vector/4 : flags") & \ X%=FNPNT%(2%," Ring sizes") & \ GOTO 13200 10510 X%=FNPNT%(0%,"CMT prefix area") & \ X%=FNPNT%(2%," Current CSR saved for INIT") & \ X%=FNPNT%(2%," Current APR6 saved for INIT") & \ X%=FNPNT%(2%," Current INIT mask word") & \ X%=FNPNT%(2%," Current response ring virtual address") & \ X%=FNPNT%(2%," Offset to compute UNIBUS address") & \ X%=FNPNT%(2%," TSQ done queue") & \ X%=FNPNT%(2%," UMR stalled queue") & \ X%=FNPNT%(2%," Controller service request root") & \ X%=FNPNT%(2%," Number of CCBs both : disk") & \ X%=FNPNT%(2%," Available work area") & \ X%=FNPNT%(2%," APR6 for BBR data") & \ X%=FNPNT%(2%," BBR status") & \ GOTO 13200 10600!CCB & CCB.D2V=A.P(2%)-FNP(CMT+FNP(V+12.)+6)*64.-A.D(2%)+49152. & \ STAT%=FNP%(V0) & \ X%=FNPNT%(2%,"C.STAT CCB "+P$) & \ X%=FNPNT%(0%," 1 Get command status sub-state") IF STAT% AND 1% & \ X%=FNPNT%(0%," 2 Set controller characteristics in progress") & IF STAT% AND 2% & \ X%=FNPNT%(0%," 4 Virtual circuit being initialized") & IF STAT% AND 4% & \ X%=FNPNT%(0%," 10 Controller requesting service") & IF STAT% AND 8% & \ X%=FNPNT%(0%," 20 Controller timed out") IF STAT% AND 16% & \ X%=FNPNT%(0%," 40 Verifying units (to free a UCB)") & IF STAT% AND 32% & \ X%=FNPNT%(0%,"100 Virtual circuit open") IF STAT% AND 64% & \ X%=FNPNT%(0%,"200 Controller online") IF STAT% AND 128% & \ X%=FNPNT%(4%,"C.CMST Oldest outstanding") & \ X%=FNPNT%(2%,"C.CMDS Command credit") & \ X%=FNPNT%(2%,"C.PDVR Port driver avail table") & \ X%=FNPNT%(2%,"C.RTRY Retry count") & \ X%=FNPNT%(2%,"C.CMT") & \ X%=FNPNT%(2%,"C.UMT") & \ X%=FNPNT%(2%,"C.TIMR") & \ X%=FNPNT%(2%,"C.NUNT Number of units") & \ X%=FNPNT%(2%,"C.OLDL Old list (DSQs)") & \ RSP%=FNP%(V0) & \ CMD%=SWAP%(RSP%) AND 255% & \ RSP%=RSP% AND 255% & \ X%=FNPNT%(2%,"C.RSP Ring sizes") & \ X%=FNPNT%(2%,"C.CPKT Current packet") & \ X%=FNPNT%(4%,"C.INIT initialization state") & \ X%=FNPNT%(8%,"C.ITBL initialization table") & \ X%=FNPNT%(2%,"C.VRSN MSCP version") & \ X%=FNPNT%(2%,"C.CNTF Controller flags") & \ X%=FNPNT%(2%,"C.CTMO Timeout") & \ X%=FNPNT%(2%,"reserved") & \ X%=FNPNT%(8%,"C.CNTI Controller ID") & \ CRSP,C.CRSP=FNP(V0+2) & \ X%=FNPNT%(4%,"C.CRSP Current rsp") & \ C.FRSP=FNP(V0+2) & \ X%=FNPNT%(4%,"C.FRSP First rsp") & \ C.LRSP=FNP(V0+2) & \ X%=FNPNT%(4%,"C.LRSP Last rsp") & \ CCMD,C.CCMD=FNP(V0+2) & \ X%=FNPNT%(4%,"C.CCMD Current cmd") & \ C.FCMD=FNP(V0+2) & \ X%=FNPNT%(4%,"C.FCMD First cmd") & \ C.LCMD=FNP(V0+2) & \ X%=FNPNT%(4%,"C.LCMD Last cmd") & \ FOR L%=1% TO (FNP%(V+18) AND 255%) & \ X%=FNPNT%(2%,"U.UNIT") & \ STAT%=FNP%(V0) & \ X%=FNPNT%(2%," U.STAT") & \ X%=FNPNT%(0%," 1 Available") IF STAT% AND 1% & \ X%=FNPNT%(0%," 2 Verification") IF STAT% AND 2% & \ X%=FNPNT%(0%," 4 BBR") IF STAT% AND 4% & \ X%=FNPNT%(0%," 10 Needs online") IF STAT% AND 8% & \ X%=FNPNT%(0%," 20 Online sent") IF STAT% AND 16% & \ X%=FNPNT%(0%," 40 Getting unit status") IF STAT% AND 32% & \ X%=FNPNT%(0%," 100 Write check") IF STAT% AND 64% & \ X%=FNPNT%(0%," 200 Read check") IF STAT% AND 128% & \ X%=FNPNT%(0%," 400 Volume valid") IF STAT% AND 256% & \ X%=FNPNT%(0%," 100000 Online") IF STAT%<0% & \ X%=FNPNT%(2%," U.RDCT Redirect CMT") & \ X%=FNPNT%(2%," U.MLUN Multi unit") & \ X%=FNPNT%(2%," U.UNFL Flags") & \ X%=FNPNT%(4%," ?") & \ X%=FNPNT%(8%," U.UNTI Identifier") & \ X%=FNPNT%(4%," U.MEDI Media") & \ X%=FNPNT%(4%," U.SHUN Shadow") & \ X%=FNPNT%(2%," U.TRCK") & \ X%=FNPNT%(2%," U.GRP") & \ X%=FNPNT%(2%," U.CYL") & \ X%=FNPNT%(2%," ?") & \ X%=FNPNT%(2%," U.RCTS RCT size") & \ X%=FNP%(V0) & \ X%=FNPNT%(2%," "+NUM1$(X% AND 255%)+ & " RBNs per track. "+ & NUM1$(SWAP%(X%) AND 255%)+" copies of RCT") & \ X%=FNPNT%(4%," U.UNSZ "+NUM1$(FNP(V0)+65536.*FNP(V0+2)))& \ X%=FNPNT%(4%," U.VSER Volume serial #") & \ NEXT L% & \ X%=FNPNT%(4%,"Ring header") & \ X%=FNPNT%(RSP%*4%,"Response ring") & \ X%=FNPNT%(CMD%*4%,"Command ring") & \ PRINT #2% & \ PRINT #2% & \ PRINT #2%,TAB(40%);"Command ring";TAB(101%);"Response ring" & \ PRINT #2%,STRING$(85,45);" ";STRING$(40,45) & \ PRINT #2%," Packet UCB DSQ CMD Length Phy addr"; & " Block";Tab(90%);"Packet UCB DSQ Resp Length"; & \ WHILE CRSP+CCMD<>0 & \ PRINT #2% & \ C=CCMD-CCB.D2V & \ PRINT #2%,FNO8$(CCMD);FNO8$(FNP(C+2));FNO8$(FNP(C)); & FNO8$(FNP(C+8));FNO8$(FNP(C+12));" "; & FNO8$(FNP(C+16)+65536.*FNP(C+18));" "; & FNLBN$(FNP%(C+4)+DU0.FUN%, & FNP(C+28)+65536.*FNP(C+30)); & IF CCMD<>0 & \ C=CRSP-CCB.D2V & \ PRINT #2%,TAB(88%);FNO8$(CRSP);FNO8$(FNP(C+2)); & FNO8$(FNP(C));FNO8$(FNP(C+8)); & FNO8$(FNP(C+12)); IF CRSP<>0 & \ CCMD=CCMD+64 IF CCMD<>0 & \ CCMD=C.FCMD IF CCMD>C.LCMD & \ CCMD=0 IF CCMD=C.CCMD & \ CRSP=CRSP+64 IF CRSP<>0 & \ CRSP=C.FRSP IF CRSP>C.LRSP & \ CRSP=0 IF CRSP=C.CRSP & \ NEXT & \ PRINT #2% & \ FOR L%=1% TO RSP%+CMD% & \ V=V0 & \ X%=FNPNT%(4%,"Response envelope") IF L%<=RSP% & \ X%=FNPNT%(4%,"Command envelope") IF L%>RSP% & \ X%=FNPNT%(4%," P.CRF Command reference") & \ X%=FNPNT%(2%," P.UNIT") & \ X%=FNPNT%(2%," ?") & \ X%=FNPNT%(2%," P.OPCD") & \ X%=FNPNT%(2%," P.STS status") IF L%<=RSP% & \ X%=FNPNT%(2%," P.MOD") IF L%>RSP% & \ X%=FNPNT%(4%," P.BCNT Byte count") & \ X%=FNPNT%(12%," ?") IF L%<=RSP% & \ X%=FNPNT%(12%," P.BUFF") IF L%>RSP% & \ X%=FNPNT%(4%," P.FBBK First bad block") IF L%<=RSP% & \ X%=FNPNT%(4%," P.LBN "+NUM1$(FNP(V0)+65536.*FNP(V0+2))) & IF L%>RSP% & \ V%=V+64-V0 & \ X%=FNPNT%(V%," ?") IF V% & \ NEXT L% & \ GOSUB 13200 FOR SZ%=1% TO 9% & \ GOTO 13200 & \ DEF FNPNT%(SZ%,T$) & \ V3=V0+SZ% & \ GOSUB 13300 & \ PRINT #2%,T$; & \ GOSUB 13170 & \ FNEND 10700 L$="JDB for job "+P$ & \ GOSUB 13140 & \ GOTO 13170 10800 L$="IOB for job "+P$ & \ GOSUB 13140 & \ GOTO 13170 10900 L$="WRK for job "+P$ & \ GOSUB 13140 & \ GOTO 13170 11000!JDB2 & V3=V+JCRSIZ & \ GOSUB 13300 & \ L$="JDB2 job "+P$ & \ GOSUB 13150 & \ L$=CVT$$(RAD$(FNP%(V+16))+RAD$(FNP%(V+18)),-1%) & \ GOSUB 13150 & \ GOTO 13170 11100 L$="WDB for job "+P$ & \ GOSUB 13140 & \ GOTO 13170 11200 L$="WDB2 for job "+P$ & \ GOSUB 13140 & \ GOTO 13170 11300 L$="WDB3 for job "+P$ & \ GOSUB 13140 & \ GOTO 13170 11400!DSQ & IF LEFT(P$,1%)<>"C" THEN & D=VAL(P$) & \ F=INT(D/512) & \ P$=FUN$(F)+"["+NUM1$(D-F*512) 11410 J%=FNP%(V+2) & \ L$="DSQ "+P$+"] Job "+ & NUM1$((J% AND 255%)/2%) & \ GOSUB 13140 & \ RETURN IF V1=V AND F1%=F% & \ J%=SWAP%(J%) AND 255% & \ L$="Error "+NUM1$(J%) IF J%<128% & \ L$="Retry "+NUM1$(256%-J%) IF J%>127% & \ GOSUB 13150 & \ L$="L3Q pntr="+CVT$$(FNO$(FNP%(V+4)),8%) & \ GOSUB 13150 & \ F=FNP(V+6) & \ M=INT(F/256) & \ F%=F-M*256 & \ L$=NUM1$(FNP(V+14))+" words plus "+NUM1$(FNP(V+20))+" Blocks" & \ GOSUB 13150 & \ L$="from " \L1$="to " & \ FUNC=FNP(V+16) & \ FAIR=INT(FUNC/256) & \ FUNC=FUNC-FAIR*256 & \ IF FUNC<>4 THEN & IF FUNC=6 THEN L1$="with " & ELSE L1$=L$ & \ IF FUNC=2 THEN L$="to " & ELSE L$="Unknown function " & \ L$="Write-and-check " IF FUNC=6 & \ L$="Initialize-drive ?" IF FUNC=8 & \ L$="Write-erase " IF FUNC=10 & \ L$="Release ?" IF FUNC=12 & \ L$="Unload ?" IF FUNC=14 11420 L$=L$+FNLBN$(F%,FNP(V+8)+65536.*M+DEVCLU%(F%)-1) & \ GOSUB 13150 & \ L$=L1$+CVT$$(FNO8$(FNP(V+12)+65536.*INT(FNP(V+10)/256)),8%) & \ GOSUB 13150 & \ L$="Faircnt="+NUM1$(FAIR) & \ GOSUB 13150 & \ L$="Work="+CVT$$(FNO$(FNP%(V+18)),8%) & \ GOSUB 13150 & \ RETURN IF ASCII(P$)<>67% AND MID(P$,2%,1%)<>"U" & \ L$="UMT="+CVT$$(FNO$(FNP%(V+22)),8%) & \ GOSUB 13150 & \ L$="BACK_POINTER="+CVT$$(FNO$(FNP%(V+28)),8%) & \ GOSUB 13150 & \ STAT%=(FNP%(V+26) AND 255%) & \ L$="STATUS="+CVT$$(FNO$(STAT%),8%) & \ GOSUB 13150 & \ RETURN 11500!FCB & D=VAL(P$) & \ F=INT(D/512) & \ U=FNP(V+24) & \ M=INT(U/256) & \ P1=FNP(V+4) & \ P2=INT(P1/256) & \ L$="FCB "+FUN$(F)+"["+NUM1$(D-F*512)+"]" & \ GOSUB 13140 & \ L$=FUN$(U)+"["+NUM1$(P2)+","+NUM1$(P1-256*P2)+"]"+ & CVT$$(RAD$(FNP%(V+6))+RAD$(FNP%(V+8)),128%)+"."+ & CVT$$(RAD$(FNP%(V+10)),128%) & \ GOSUB 13150 & \ GOTO 13170 11600 L$="WCB "+CVT$$(FNO$(FNP%(V+8)-28%),8%)+"["+P$+"]" & \ GOSUB 13140 & \ L$="Blockette"+NUM$(FNP(V+10))+"for job "+ & NUM1$((FNP%(V+2) AND 255%)/2%) & \ GOSUB 13150 & \ GOTO 13170 11700 L$="RIB for job "+NUM1$((FNP%(V+8%) AND 255%)/2%) & \ GOSUB 13140 & \ L$=CVT$$(CVT%$(SWAP%(FNP%(V+2)))+CVT%$(SWAP%(FNP%(V+4)))+ & CVT%$(SWAP%(FNP%(V+6))),128%) & \ GOSUB 13150 & \ GOTO 13170 11800 L$="PMB (RIB at"+FNO8$(VAL(P$))+")" & \ GOSUB 13140 & \ GOTO 13170 11900 L$="Message (PMB at"+FNO8$(VAL(P$))+")" & \ GOSUB 13140 & \ GOTO 13170 12000 L$="PFB for job "+P$ & \ V3=V+JCRSIZ-JCPFB & \ GOSUB 13300 & \ GOSUB 13150 & \ GOTO 13170 12100 L$="Log CBB for job "+P$ & \ GOTO 12210 12200 L$="Com CBB for job "+P$ 12210 GOSUB 13140 & \ V3=V+576 & \ V0=V+512 & \ GOTO 13170 12300!Ordered cache tags & P%=V-5000000 & \ V=VAL(P$) & \ GOSUB 10250 & \ PRINT #2% & \ PRINT #2%,FNO8$(V-X.P2D);" ";FNO$(FNP%(V+8));"00 ";L1$;" ";L2$; & \ RETURN 12400! 12500! 12600! 12700! 12800! 12900! 13000! 13140 V3=V+32 & \ GOSUB 13300 13150 S2EOL%=S2EOL%-LEN(S2EOL$)-LEN(L$) & \ IF S2EOL%>=0% THEN & PRINT #2%,;S2EOL$;L$; & ELSE & GOSUB 13300 & \ L$=LEFT(L$,S2EOL%) & \ GOTO 13150 13160 S2EOL$=" " & \ RETURN 13170 V3=V1 IF V3>V1 & \ GOSUB 13300 WHILE V00%) THEN & PRINT #2%,L1$;" ";L2$; & ELSE PRINT #2%,L1$; & \ GOSUB 13300 & \ PRINT #2%,L2$ 13200 RETURN UNLESS V014% AND V00%) & \ S2EOL$="" & \ RETURN 20000 DEF FNS & \ INPUT #3%,X%,X & \ FNS=X & \ FNEND 20040 DEF FNO8$(V) & \ FOR X%=8% TO 1% STEP -1% & \ X=INT(V/8) & \ X%(X%)=48%+V-X*8+16%*(V=0 AND X%<8%) & \ V=X & \ NEXT X% & \ X%(0%)=8% & \ CHANGE X% TO FNO8$ & \ FNEND 20060 DEF FNPEEK%(X%) & \ X%=X% XOR HIBIT% & \ IF X%<16384% THEN FNPEEK%=FNP%(X%+32768.) & ELSE FNPEEK%=FNP%(X%+FPL.V2D) 20070 FNEND 20080 DEF FNP%(X) & \ X%=INT(X/512) & \ X1%=(X-X%*512.)/2% & \ FNP%=DUMP%(X%,X1%) & \ FNEND 20100 DEF FNV$(V) & \ FNV$="" & \ GOTO 20120 IF S%=0% OR S%=4% & \ IF S%=1% THEN V=V+32768.-FPL.V2D & ELSE IF S%=2% THEN V=V+CCB.D2V & ELSE V=V-X.P2D & \ X=INT(V/64) & \ FNV$=" " & \ IF V-X*64>0 THEN 20120 & ELSE V=INT(X/512) & \ V=V+(X-V*512)*128 20110 FOR X%=8% TO 2% STEP -1% & \ X=INT(V/8) & \ X%(X%)=48%+V-X*8+16%*(V=0 AND X%<8%) & \ V=X & \ NEXT X% & \ X%(0%)=9% \X%(1%),X%(9%)=32% & \ CHANGE X% TO FNV$ 20120 FNEND 20140 DEF FNO$(V%) & \ X1=(V% XOR HIBIT%)+32768. & \ FOR X%=6% TO 1% STEP -1% & \ X=INT(X1/8) & \ X%(X%)=48%+X1-X*8+16%*(X1=0 AND X%<6%) & \ X1=X & \ NEXT X% & \ X%(0%)=6% & \ CHANGE X% TO FNO$ & \ FNEND 20160 DEF FNPEEK(X%)=(FNPEEK%(X%) XOR HIBIT%)+32768. & \ DEF FNP(X)=(FNP%(X) XOR HIBIT%)+32768. 30000 PRINT #2% & \ CLOSE 2% & \ ON ERROR GOTO 0 32767 END q2? ,xx VN: @SYSYSYSYSYSYSYSYSYSYSYSYdCCN:nb dd@e@Aew*@e@Ae&f . 1fABAD5 a C%!e e B V  B\E CP   D a@ C`B `%ֆ C ӆBEІ0  %C ‹  C B ‹ B 0    e\e\e\e\e\e\g\g\g\U\N E\N MEP\N U\v \  (ҐB~\ 'f '&  )\$ B $ Cp` bf\$ 7B $Cp` bff\$ B $ Cp` bf\$ 7B $Cp` bf\l& N\FB>.>:6$&"  E`E`$& 7$$peB vdB rbf&5@  (e  \ (e\ t  (eC`C~& &  & 0'& \ h(ew ^#\B  aw @L  aD\:w H\ \\ *l )ffeR 0& S~e& \'e`Jlc##M*B l㋣  M  x$f&&&      ҄ & \ &e \  &&    0%   J  & e\ B    B @   \ N A f C%v   \ 3 EU 3 5EvUv\\& & \&&\  \ \\ \\\\&\\\&\&\\\& \ \ \\\\\\\@A@A @A C P \\%\%\%\%\%\'\'\'\ " !C  $$ " !   $  #  ҥ  #C \m ! d!# l d ! 0 H\*l ע  5\  % *p^0bl,Hv H 5/ A0   56U W DW +H(E5 &e 00)wBe8  Ub *' & L b  5E2e  f& & i5@  *e&B~  *I*53  f2 y "? & 0ԕ ^Eє~~e&e-   6&e+6%e-  L*Uєb ee: CtEe0  Q: B*w@wlŘ  ѕ"єBѕ" & e-e.Q  &e&e f e `~  ee*~ѕ"ѕ ѕ * \f*eQe*!&$fl! 4SS   f*E5@U?RMS error #FUNCTIONGOSUB called at line in "?Odd address trap?Memory management violation?Error file cannot be opened?Error file cannot be read?Undefined error number 4\ @  p &30 U^\9 ~U^  pU^ bU^& *0 0 0 *0 ,\  6p* & & 5^E^0 f *3E^5`5` w& @32 ` & @ Hr\ w Bv v N e\we 0 0 \ w ^\% 5^5^  0 5 >נ'נ", &D ŀ e1U͋ w, N w$w,6  hwFe*@   \ \95^;A5U^f   `p00f h e|ѠѠɋ \* wʋ 0 "5@^ 42 42 Eנ נ , *5  5^DE^0  `ɋɥɥ AɥUɥ RɥGɥ E  f 4E^5`6: 5`5 C5^&`W&"U^ r @ɋɥ   a0  Rɕ v Dp 0 7 ɵfŀeSˋŀ  5^ &U^q S  p/ 5`*5^&l eFѢɋ5^ep 0 / ӕ ˕ p5^     w.  w\ wͥ ww w w `  wtwlwB& \\  \ r@ r( @%% e ee e  @A K I  7@A 8  4   +`( @A      X  ` w$    f    1 #+ ( #&$#" 6 c f ~ C`B@  @  v\    wh z*J, J, 1@Bw . r E@`\;I GEC*C, C,wz 7e< 0+e"*, , ]j8888* @, @,w v    n  wT*e   ,  ,Ѓ\wff&f hwf &wfU& Mvv 6`vU  q` c qm `a@ `qeAa@ a A @ A @ %  A @ 6v %\%% 0 0  &pf\ H`"w,H`"w* \"w \"w < N    @ʥ  w J  J 5^5@^* *  h   .pXC `U^5^ ,p \0 f5`U^w   F *X5 ~     U^ ʥ 0 fʥ  f3 C  %  v vf&\& & *2f&&& p %,% % U@     T F`D A @ 逎    5 5  e    ew  mנ נ E     CPQCQ<m     p   z &   5@  B5eN N .E D A @  eb" d$    D A @ &f&f eD A @ eA @ e@ e&f&f  %PeE <%PeE D A @ E@ 6 6 x f l&f& & 6v*v6 6 @   U*2 &C X H    5  6 c6 m  6#m    m  6ඌ c& ʕ ʕ- C   E@ U0Ґ 'ခ  + ҕ C eH %%@ f ҕ.  ҕ0  .ҕE  -  Ґ  s e0 e0R  ʥ0ʥ.%ʕ0 fW+W-W W0 W9fwʕ+w '  B   @A  ~~ \  &  & w NeE D` bl lrw   B eE"s    s-  Csl f#'-*.f,*W0 U  ߗ_ 5$h  $ #'  T` b w&f  )j:vxxbTbVbe:hhevvxN:ANA922 d rg vi vi vi v"i h~"h,i  *x BxX^ jhX^ nhX^ gX^ gX^ gX^ tgX^ rhX^ gX^ gX^ xgX^ gX^ vhX^ |gX^ gX^ gX^ gX^ zhX^ ~hX^ gX^ gX^ gX^ fgX^ gX^ gX^ gX^ gX^ gX^ hX^ g h h~"h*x h h~"hBx h h~"h:ih42bp gXF_ g g hd g g @gXaHi hv h gt gv g @gp LiLXap hH g p hL> g HiL hv h ghn<gdp g6gp Li hp gXF_ Li g h ?hd h h @gXF_  hHv h hnv`%@r= hHv h @rhp iL h hp hXF_ p h@LiXF_  : < Pi ^xv^x hh.=hd hd Fx Vi 2R@  Fx g h~ g~ h~ g h jg lg ghT hhp g6gp h6g2  gh hg jgh lgh`%@4@ h2?d h hnv p g\i>L2 :> h h v v xh<>d hnv p h6h\i>L h hh:? hhd hh8? h p g6`i hv h h p h6di hv h h p g6hi hv h h v h h v g h v h h v hxh<?d hg hh gg gh hg jgh lgh hg:0@xh hHv h h h v v  hg:,@xh<? hhT hh:N@ hh<=<B#hhp h hnv > gT gli0@~ g hnv p g\i>L h htnv hB@ htnv h h v @`i& g0@xh<@ hv pi p h: < .x h v @`i hp h h v H6hi hnv hphNxphJx h v`%@A h v @h h<A h v`%2A Vi h vn Nx vi h vXvBn |i hXvB< i Jxl%h0A Nx i p h: < Nxl%h:B Nxp h: n NxT ghB`B .x i Jx h v h v< Nx  b < .xp.xbxl$hhbx#g g h h g g@Bpifx g:B g : fxl$gfx vp vhXaHiL vH6i h v vH "hp jh@iXaHi6i hp jh@i gp jh@iXaHi &hp jh@iXF_ gp jh@i *h gp%2jD ggp2xRx 2hg 2h.h hg  2h~ g 2x 2hh v& 2hBC h<D v& 2hBC h<D v& 2hBC h<D v& 2hBD h<D h gt!rDDDEFF|HSSSSJTdT~TTLXbYYXZ~ZZZZ[[[[[[[[2b\<dC<Nb'\  Rxl <\t'\  il Rxl il <\'\ RxF' gD<j\ (p g@iXaHi@"h hp g@iXF_ g g h Dp g@iXa\ *h# i gt 2 < i gp g@iXF_# : < 6xpi:x h2E hp g@iXa g  jL hnv LXZ@:x$<(\  jl RxF'@hX6^ l p g@.j .h\p g@2j .h\p g@6j .h\p g@:j .h<\(\ RxF' 6hp 6hi> :hp :hi6h p 6h vl p g@LiXa hT 6hh0Fp hHi hl%hl%:h`%2F p :hd >jl p h: l <F  Hjl  h h(\ hhFh(($) Rx h 2G  Rj Rx Zj X\S h vjX\S h vjX\S h vjX\S h vjX\S h vjX\S h v kX\S h vkX\S h v4kX\S h<\) vHkX\S h v\kX\S h vkX\S h vkX\S h vkX\S h vkX\S h v lX\S h v8lX\S h vTlX\S h v~lX\S h vlX\S h vlX\S h vlX\S h<\h) vp g@iXa@nh@iXaHiH vH@i >hp .hXF_ Bh  l Rx X\S h Bh`%2H vmX\S h  Bh`%2I v&mX\S h  Bh`%22I vXmX\S h  Bh`%2PI vmX\S h  Bh`%2nI vmX\S h Bh`%2I vmX\S h @ Bh`%2I vmX\S h Bh`%2I vnX\S h v"nX\S h v@nX\S h vZnX\S h v|nX\S h vnX\S h vnX\S h vnX\S h vnX\S h vnX\S hp .hXF_ Dh Dh  Fh Dh Dh vnX\S h vnX\S h voX\S h v4oX\S h vToX\S h vloX\S h voX\S h voX\S h voX\S hp .h@LiXa Hh Hhh voX\S hp .h@LiXa Lh voX\S hp .h@LiXa h voX\S hp .h@LiXa g gh voX\S hp .h@LiXa g vpX\S hp .h@LiXa h v&pX\S h hp g@:pXF_  h hh8Nh) v>pX\S hp .hXF_ Bh vHpX\S h Bh`%2NL vXpX\S h  Bh`%2lL vrpX\S h  Bh`%2L vpX\S h  Bh`%2L vpX\S h  Bh`%2L vpX\S h Bh`%2L vpX\S h @ Bh`%2M vpX\S h Bh`%2 M vqX\S h  Bh`%2>M v4qX\S hl%Bh:TM vPqX\S h vfqX\S h vqX\S h vqX\S h vqX\S h vqX\S h vqX\S h vqX\S h v rX\S h vrX\S h v,rX\S h vqX\S h vh Phl%g2P p gX6^ l p Ph@LiXaX6^ l p PhXaX6^ l p Ph@iXaX6^ l p Ph@iXaX6^ l il p Ph@`sXap Ph@:pXajLX6^ l il p Ph@iXF_hp Ph@dsXap Ph@hsXajLXZ@ l p Hh6>h Phl%Hh2*Q  X$ l p HhX6^ l p Ph@LiXaX6^ l p PhXaX6^ l p Ph@iXaX6^ l p Ph@iXaX6^ l l%g28QHigT gh0HQ ggT gh@VQ~ gl%Hh2dQHiHhT Hhh0tQ LhHhT Hhh@Q~ Hh<Oh)  hl  h DhhFhh hh82Sh) .hg hDh8Q vlsX\S h hDh0Q vsX\S h vsX\S h vsX\S h vsX\S h vsX\S h hDh8LR vsX\S h hDh0fR vsX\S h vsX\S h hDh8R vsX\S h hDh0R vtX\S h hDh8R v tX\S h hDh0R  >tp .hXap .h@LiXajL: n X\S hp g@Hi6.h Thl%Th2&S ThvsX\S h hhQhh) Vh hh)\ Vhh@SVhh)<\#>xVhh) Vh @.h h\  >xl :\l$>xVhfhh)) Lt Rx Vx[<:\0* \t Rx Vx[<:\* lt Rx Vx[<:\*p g@g h\ |t Rx Vx[p g@`sXF_p g@:pXF_<  b Vx[<:\\+ t Rx Vx[<:\+ t Rx Vx[<:\$, t Rx Vx[<:\, Rx  t 2T RxF' hp ht> Xhp Xh v vi p hp XhtH: < Rx,p g@LiXF_ \h t Rx t \h : < Vx[T 2hg gg`%2HU$ \h  \h \h:tU t \h : n Vx \h0U t #\h : n Vx[ tp g@iXF_Xa b n Vx[p g@iXa Xhp Xht> ^hp Xhp ^htH gp g@iXa: u p g@uXa: < u Vx[p uVxp*u6xp g@`sXa bhp bht> gp gtbhT bhi2VT bhi@vVp2u6x<VpVx6xT bhLi@Vp*uVx<VpjLX6^ b n Vx[ up g: n Vx[ up g@:pXF_Xa b n Vx[ Rxz C Rx  ~ u `%2W$ up g@uXF_Xa b n Vx[ up g@dsXF_Xa b n Vx[p g@uXF_  Bh u BhXa b n Vx[$, RxF' hp ht> Xhp g@uXa gp gt> ^hp g@iXa ngp ngt> g up Xh v vi p hp XhtH: < i Vx[p g v vi p g: < |i p ngp tgH: < i p g@iXF_p g@iXF_< b < Vi p g@iXF_ b < Vx[<:\P- up g@iXF_#Xa b n vi Rx i Vx[ vp g@iXa2 n v p g@LiXF_  : < Vx[<:\- vp i@gXF_  : n Vx[p g@LiXF_ p g@iXF_ < p g@iXF_ < b Vx[<:\. .v RxF'X6^n >v Vx[<:\|. Dv RxF'X6^n >v Vx[<:\. Xv Rx Vxp g@g6|g h\[<:\D/ hv Rx Vx<Z/ |v Rx Vx/[p g@v hp g@t .h<:\ 0p g6v g RxF' gD  hl  p g6"hX6^ l pil p g@iXF_Xa l vl 6xl pil :xl $p008112d22T3p g@v h\^3 g Zx# Vx# gl%gB\  Zxl Vxl <.\\ Vx gVx<[h3ppiZx$r3T h2h0N\ 2hhr3T .hh:d\\<N\r3$3 6x :xp Dl%g #v :\  6xl pil :xl <\  6xl \  :xl 3T .h2hT .hh`%@\$3 h .hfh  hl 3T .h2h hT .hh`%2]p .hp .h`s>`sH h  ht$ l p .hXF_Xa l Li.h<]3  8$ l p fhX_ l p fh gvH gvLX6^ l il  Bl%g # gphZx$ N<.^ N  h 6h~ 6hhnh NHN<^#gHN h hHNp gi> 6h hp v@gp 6hiHl%g h L hHv h 6hg$ hhL^xhHN Hv B nvN jxl$gjxHN\N<>_#h\N rg h h h@:_ h @vXF_ h<*_ h @hXF_ hfNl$hfhfNpN<_#6hpNp 6ht> hp 6h h tHp Li h h hv hl$6hfhpNN< a#gNphrxl%g g`%@` g@_p g@v6h g<V` g@`>hg<V`"hgp gHi> 6hpvrxp gp 6hHiHh%8`p 6ht> gp 6hp gtHv@g gN h hNp gi> 6h hp v@gp 6hiHl%g h L hHv h 6hg$ hhf`xhN Hv Hv Hv B nvN rxNl$grxNN<a#ThN rg Th @v h h hNp hi> 6h hp v@hp 6hiHl%h h L hHv h 6hh$ hh%&~'0)&&%%& ::d:?4@AD'rDt'D'D (D<(E(F(F)F)Gh)|H)S0*S*S*S\+JT+dT$,~T,T,T,V,LXP-bY-Y.XZ|.~Z.ZD/Z/Z/Z 0[p0[0[81[1[2[d2[2[T3[^3[h3.\r3:\3j\3\3\ N^HN.^\N^fN*_pN>_N_NV`N`N aNa0u2bNb@iMONPOLiFIPPOLiLRGPOL&iEXTPOL0i ANALYS.TMP>i ANALY2.TMPCATi:Zi.CHHGHti zi[i,i]i+i i*G B@HAACiItem i on the FIP queueB@Bi Cache entry:i TIM=`BiNo longer validHjCache cluster. Tag at: D|EEFBjSIZE=Lj ROOTVjCMT ^j" Controller service request threadj UMR wait threadj TSQ/DSQ list-headj APR6 of CCBj Virtual address of CCBj Work area allocatedk CSRk Vector/4 : flags8k Ring sizesLkCMT prefix area`k Current CSR saved for INITk! Current APR6 saved for INITk Current INIT mask wordk+ Current response ring virtual addressk& Offset to compute UNIBUS address$l TSQ done queueANALYS.TMP/FO:ST:82=ANALYS.TMP/FO:ST:82 SRT>^Z $ TYPE DUMP.021 ... This package needs the following files: ANA92.COM ANA921.TSK ANA922.TSK ANALYS.DAT [0,15]SRTUTL.TSK It creates work files: ANALYS.TMP The following files are supplied to allow you to maintain or modify the package: ANA921.BAS ANA922.BAS They may be CSPCOM'd and built like any BASIC+ CUSP. qN<2?CHECTL CMT DEVCLU DQSEND DQS$DV DSKLOG EXTPOL FCBLST FIPPOL FIQUE FPLAP6 JCRSIZ JOBTBL LRGPOL MEMLST MONPOL OPT$DU OPT$DV OVBASE SNDLST X.SCS X.TAB $FIPTB $$EPMM $$ISPE $$ISPS CLoSeFQ OPeNFQ CREateFQ DeLeteNameFQ RENameFQ DIRFQ UUOFQ ERRFQ ReSeTFQ LOoKFQ ASSignFQ DEAssignFQ DeassignALlFQ CReateTmpFQ CReateBacFQ 36.FQ 40.FQ 42.FQ 44.FQ 46.FQ 50.FQ 52.FQ 54.FQ 56.FQ 60.FQ 62.FQ 64.FQ UU.TB3 UU.SPL UU.DMP UU.FIL UU.ATR UU.CCL UU.-23 UU.-22 UU.-21 UU.-20 UU.LOG UU.RTS UU.NAM UU.DIE UU.ACT UU.DAT UU.PRI UU.TB2 UU.BCK UU.-10 UU.HNG UU.FCB UU.-7 UU.POK UU.-5 UU.-4 UU.TB1 UU.NLG UU.YLG UU.PAS UU.DLU UU.CLN UU.MNT UU.LIN UU.BYE UU.ATT UU.DET UU.CHU UU.ERR UU.ASS UU.DEA UU.DAL UU.ZER UU.RAD UU.DIR UU.TRM UU.LOK UU.+18 UU.CHE UU.CNV UU.SLN UU.+22 UU.SWP UU.JOB UU.PPN UU.SYS UU.KMC UU.PRV UU.STL UU.PRM UU.3PP UU.CHK UU.ONX UU.CFG Iq Ԁ 2? RSTS SIG Tape Submitted by Michael Mayfield Northwest Digital Software Inc. Box 2-743 Spring Valley Road Newport, WA 99156 USA 509-447-5631 1. TAPCOP == TAPE DUPLICATION UTILITY TAPCOP will make a copy of the entire contents of a magnetic tape. The tape may be in any format (DOS, ANSII, EBCDIC, non-standard, etc.). The density of the output tape can be specified. A tape can be copied back onto itself to allow changing densities. Multiple copies of a tape can be made with one read of the original. Sufficient disk space is required to allow the entire tape to be copied to disk before being transferred to a new tape. RSTS V7.0 or later 2. FSTOPN == PREOPEN FILES FOR FAST OPENS Opens a list of files and accounts (UFDs) in the background so that subsequent opens of the files or UFD lookups will not require disk I/O. File and account specification are listed in a data statement within the program. Virtually any number of files may be specified. Multiple copies of the program will be spawned as necessary. Each group of up to 12 files requires one job slot. Each file requires two small buffers, but one small buffer is shared with a subsequent opener. This program was originally published in the RSTS Professional magazine. RSTS V7.0 or later. Large file option must be used in V7.x for benefits to be obtained. 3. SILSYM == LIST SYMBOL TABLE FOR A SIL IMAGE Lists the global symbols contained in a SIL image. The output is similar to the load map obtainable during system generation. This program was originally published in the RSTS Professional magazine. RSTS V7.0 or later. May work on previous versions as well, but it has not be tested. 4. EDTATR == EDIT FILE ATTRIBUTES EDTATR allows attributes to be added, modified, or removed from any file. Attributes are shown symbolically. This program was written by Rick Cadruvi of Touch Technologies (previously of Online Data Processing) and is submitted by permission of the author. It may be copied with the inclusion of the copyright notice. RSTS V7.0 or later. Requires VT100/VT200 or other terminal using compatible ANSII mode. 5. CLUOPT == OPTIMIZE CLUSTERSIZES OF FILES Given a disk and PPN specification, CLUOPT copies all the files in that account with an optimal cluster size. RSTS V7.0 or later. 6. BADBLK == IDENTIFY BAD BLOCKS ON A DISK BADBLK reads each block on the disk and reports any hard errors found. If error logging (ERRCPY) is in use, soft errors will also be entered in the error log. This program is capable of reading at over 500 blocks per second on an idle system. RSTS V7.0 or later. Requires a video terminal (any type). 7. TRACE1 == LIST DIRECTORY OVERHEAD SEEKS FOR RDS1 FORMAT DISKS TRACE1 shows the disk accesses required to open a file and read the last block. If the specified file is does not exist, TRACE1 shows the overhead required to access all name entries in the directory, as is done when a file is created. This program has been modified from the original DECUS submission for RDS1 by Mike Mayfield. RSTS V8.0 or later. 8. INI.EDT == EDT STARTUP FILE FOR DECWORD/DP EMULATION INI.EDT is a startup file for EDT V2.0 and later that provides an emulation of most of the keys used by DECWORD/DP, CT*OS, and WORD-11 word processing systems. More information on this startup file will be appearing in a future DEC Professional and/or RSTS SIG Newsletter. 8}( 2?1 EXTEND ! TAPCOP == Copy tape from one tape to another 2 ! & ! PROGRAM: TAPCOP.BAS & ! VERSION: V8.0 & ! EDIT: 07 & ! EDIT DATE: 24-MAY-85 MEM & !& ! This program copies the entire contents of one tape to one or & ! more other tapes or inplace to the same tape. Density may be & ! specified as 800 or 1600 BPI for the output tapes. & !& ! If "RECOVER" is entered in response to the first question, the & ! input tape will not be read, but the output tape(s) will be & ! written using the data previously read from the input tape. & 5 DEVICE$="SY:" ! Device to store temp files on 10 TAPCHN%=1% & \ LENCHN%=2% & \ DATCHN%=3% & \ BELL$=CHR$(7%) & \ ON ERROR GOTO 30000 & \ Z$=SYS(CHR$(6%)+CHR$(-7%)) & ! Define channel numbers for tape I/O, record length file, and & ! tape data file. Enable error trapping. Catch ^C. & 100 INPUT "Mount the tape to copy FROM and press RETURN"; RECOVER$ & \ OPEN "MT0:" FOR INPUT AS FILE TAPCHN%, RECORDSIZE 40%*512% & \ IF CVT$$(RECOVER$,-1%)="RECOVER" THEN & PRINT "[Using previous tape data]" & \ RECOVER%=-1% & \ GOTO 125 110 !ELSE! & Z%=MAGTAPE(3%,0%,TAPCHN%) & \ OPEN DEVICE$+"TAPREC.TMP" AS FILE LENCHN%, & CLUSTERSIZE 32%, & FILESIZE 32% & \ OPEN DEVICE$+"TAPDAT.TMP" AS FILE DATCHN%, & RECORDSIZE 2% OR NOT(32767%), & CLUSTERSIZE 256%, & FILESIZE 256%*7% & ! Ask for the input tape to be mounted. & ! If "RECOVER" was entered in response to the prompt for the input & ! tape, use the data file created by the last use of the TAPCOP. & ! Open the tape for input. Create our work files. & 120 COPIES%=1% & \ INPUT "Is the copy going to be stored on the same tape "; Z$ & \ Z$=CVT$$(Z$,-1%) & \ Z$="Y" IF Z$="" & \ IF LEFT(Z$,1%)="Y" THEN & SAME.TAPE%=-1% & ELSE & IF LEFT(Z$,1%)="N" THEN & SAME.TAPE%=0% & ELSE & PRINT "?Please enter YES or NO" & \ GOTO 120 125 INPUT "Output tape density <1600>"; TEMP% & \ DENSITY%=0% & \ DENSITY%=256% IF TEMP%=0% OR TEMP%=1600% & \ DENSITY%=12% IF TEMP%=800% & \ GOTO 125 IF DENSITY%=0% & \ INPUT "Number of copies <1>"; COPIES% IF NOT SAME.TAPE% & \ GOTO 200 IF RECOVER% & \ PRINT "[Copying source tape to disk]" & ! See if we are using more than one reel of tape. See what density & ! to use for the output. If using more than one reel of tape, see & ! how many copies we need. Skip reading the input tape on a recovery. & 130 GET #TAPCHN% & \ RECLEN%=RECOUNT 140 PRINT #LENCHN%, RECLEN% & \ PUT #DATCHN%+SWAP%(TAPCHN%), COUNT INT((RECLEN%+511%)/512%)*512% & \ EOF%=0% & \ GOTO 130 & ! Get the next record from the tape (EOF goes to 30000). & ! Record the length. Store the data in the temp file using & ! block I/O. Reset the "just read an EOF" flag. Repeat until & ! two EOFs read in a row (EOT). & 200 COPIES%=1% IF COPIES%<=0% & \ FOR COPY.LOOP%=1% TO COPIES% & \ IF NOT SAME.TAPE% THEN & PRINT BELL$; IF COPY.LOOP%>1% & \ PRINT "Mount the "; & \ PRINT "next "; IF COPY.LOOP%>1% & \ PRINT "tape to copy TO and press RETURN"; & \ INPUT LINE Z$ 210 CLOSE LENCHN%, DATCHN% & \ OPEN DEVICE$+"TAPREC.TMP/RO" FOR INPUT AS FILE LENCHN% & \ OPEN DEVICE$+"TAPDAT.TMP/RO" FOR INPUT AS FILE DATCHN%, & RECORDSIZE 2% OR NOT(32767%) & \ Z%=MAGTAPE(6%,DENSITY%,TAPCHN%) & \ PRINT "[Creating output tape]" 220 INPUT #LENCHN%, RECLEN% & \ GOTO 240 IF RECLEN%=-2% & \ IF RECLEN%=-1% THEN & Z%=MAGTAPE(2%,0%,TAPCHN%) & ELSE & GET #DATCHN%+SWAP%(TAPCHN%), & COUNT INT((RECLEN%+511%)/512%)*512% & \ PUT #TAPCHN%, COUNT RECLEN% 230 GOTO 220 240 Z%=MAGTAPE(2%,0%,TAPCHN%) & \ Z%=MAGTAPE(1%,0%,TAPCHN%) & \ NEXT COPY.LOOP% & \ PRINT BELL$; "Finished" & \ PRINT & \ GOTO 100 & ! All errors are fatal now. For each record originally read & ! from tape... Get the record length. If EOT flag (-2), then & ! finish this tape and do the next one, if any. If EOF flag & ! (-1) then write an EOF, else get the stored data and write & ! it. After writing all records, write third EOF and & ! rewind/offline the tape. Repeat for any additional copies of & ! the tape. Kill our temp files and we're done. & 30000 ! ERROR TRAPPING & 30010 IF (ERR=11% AND ERL=100%) OR ERR=28% THEN & CLOSE TAPCHN%, LENCHN%, DATCHN% & \ KILL DEVICE$+"TAPREC.TMP" & \ KILL DEVICE$+"TAPDAT.TMP" & \ GOTO 32767 & ! If ^Z or ^C, kill our temp files and exit. & 30020 IF ERR=11% AND EOF%=0% THEN & EOF%=-1% & \ PRINT #LENCHN%, -1% & \ RESUME 130 & ! EOF while reading magtape: & ! If the last record was not also an EOF, write an "EOF read" & ! flag to the record length file and count it as a record. & 30030 IF ERR=11% THEN & PRINT #LENCHN%, -2% & \ Z%=MAGTAPE(3%,0%,TAPCHN%) & \ Z%=MAGTAPE(1%,0%,TAPCHN%) IF NOT SAME.TAPE% & \ RESUME 200 & ! End of tape (EOT) detected by at least two tape marks. & ! Record the EOT point in the record length file. Rewind or & ! Rewind/offline the tape. Change tape density. Continue & ! with second half of copy operation. & 30040 !IF ERR=13% THEN! & RECLEN%=RECOUNT & \ PRINT "%"; BELL$; BELL$; BELL$; & "Data error reading tape. Continuing..." & \ RESUME 140 & ! DATA ERROR ON DEVICE: & ! Print a warning message but continue on as if nothing & ! happened. & 30050 ON ERROR GOTO 0 & ! Any other error is fatal. & 32767 END (N` 2?1 EXTEND 2 ! FSTOPN == Open Specified Files to Allow Fast Reopens & ! & ! Opens a list of files and then detaches. This allows later opens & ! of these files to be made without disk overhead. & ! & ! All commonly opened files and UFDs should be opened using this & ! program. The list of files and UFDs to be opened is contained in & ! a DATA statement at line 10. Each line specifies a file in the & ! format "Dev:[PPn]Filname.Filetype" or "Dev:[PPn]". Any number of & ! files and UFDs may be specified. One job slot is used for each & ! group of up to twelve files/UFDs. & ! & ! This program must be compiled before use. It should be compiled & ! using BASIC-PLUS and not BASIC-PLUS-II since the BASIC-PLUS version & ! uses less than half the memory and executes faster than the & ! BASIC-PLUS-II version. & ! & ! & ! COPYRIGHT (C) 1984, Northwest Digital Software Inc. & ! & ! This program may be copied without restriction with the inclusion & ! of this copyright notice. This program is provided "AS-IS" as a & ! service to the RSTS community and is without warranty, expressed or & ! implied. & ! & ! AUTHOR: Michael Mayfield, Northwest Digital Software Inc. & ! & ! EDIT HISTORY: & ! 00 18-SEP-84 MEM Original version. & ! & ! VARIABLE USAGE: & ! FILENAME$ Current filename for file open & ! PRGM.DEV$ Device name for spawn, in FIP format & ! PRGM.NAME.TYP$ Program name for spawn, in RAD50 & ! PRGM.PPN$ Program PPN for spawn, in FIP format & ! SKIP% Number of file specifications to skip & 10 ! List of files and UFDs to open: & DATA "SY0:[1,2]PIP.SAV", & "SY0:[1,2]NOTICE.TXT", & "LB:" & 99 DATA "*END*" ! *END* must be the last entry in the table. & 100 SKIP%=0% & ! We don't need to skip any entries the first time FSTOPN is run. & 1000 ON ERROR GOTO 32000 & \ Z$=SYS(CHR$(12%)) & \ PRGM.DEV$=MID(Z$,23%,4%) & \ PRGM.PPN$=MID(Z$,5%,2%) & \ PRGM.NAME.TYP$=MID(Z$,7%,6%) & \ Z$=SYS(CHR$(6%)+CHR$(-13%)+CHR$(255%)+CHR$(255%)+CHR$(-16%)) & \ IF SKIP%=0% THEN & PRINT "Detaching..." & \ Z$=SYS(CHR$(6%)+CHR$(7%)+CHR$(128%)) & ! Get our program name specification to use in spawning a new copy & ! of ourselves. Change our priority to -16 in case of error. If & ! this is the first run, tell them we are detaching and detach. & 1010 READ Z$ FOR Z%=1% TO SKIP% & \ FOR Z%=1% TO 12% 1020 READ FILENAME$ & \ GOTO 1030 IF FILENAME$="*END*" & \ OPEN FILENAME$ FOR INPUT AS FILE Z%, & RECORDSIZE 32767%+3%, MODE 4096% & \ SKIP%=SKIP%+1% & \ NEXT Z% & \ READ Z$ & \ GOTO 1030 IF Z$="*END*" & \ Z$=SYS(CHR$(8%)+CVT%$(SKIP%)) & \ Z$=SYS(CHR$(6%)+CHR$(24%)+CHR$(192%)+CHR$(0%)+PRGM.PPN$+PRGM.NAME.TYP$+ & STRING$(10%,0%)+PRGM.DEV$+CVT%$(SWAP%(30001%+32767%))) & ! Skip the files already opened by a previous run of FSTOPN. Read up & ! to 12 filenames and open them in read-regardless mode (Note that & ! read-regardless mode is ignored for UFD opens). If there are more & ! files to open, spawn a new copy of FSTOPN and tell it where to start & ! in the list of files to open. & 1030 SLEEP 32767% UNTIL 0% & ! Sleep forever. & ! & ! ** FEATURE PATCH: If you want all files opened by FSTOPN to be & ! closed immediately if SHUTUP is run or logins turned off, replace & ! line 1030 with the following: & ! & ! 1030 SLEEP 32767% & ! \ GOTO 1030 IF & ! (SWAP%(PEEK(SWAP%(CVT$%(MID(SYS(CHR$(6%)+CHR$(-12%)), & ! 13%,2%))))) AND 255%)>1% & ! \ CLOSE #Z% FOR Z%=1% TO 12% & ! \ Z$=SYS(CHR$(6%)+CHR$(8%)+STRING$(25%,0%)+CHR$(255%)) & ! \ SLEEP 32767 UNTIL 0% & ! Sleep for 32767 seconds (9 hours) or until logins are & ! disabled. See if logins were disabled. If not, go back to & ! sleep. Else, close all of our files and kill our job. If & ! the kill failed, go to sleep until SHUTUP kills us. & 30000 ! ** SPAWN ENTRY POINT ** & & SKIP%=CVT$%(LEFT(SYS(CHR$(7%)),2%)) & \ GOTO 1000 & ! Get the skip count passed in core common. Start the program using & ! the specified skip count. & 32000 ! ** ERROR TRAP ENTRY POINT ** & & IF ERR=5% AND ERL=1020% THEN & Z$=SYS(CHR$(6%)+CHR$(-5%)+CHR$(0%)+ & "%% FSTOPN: Unable to open file: "+FILENAME$+ & CHR$(7%)+CHR$(13%)+CHR$(10%)) & \ RESUME 1020 & ! "?Can't find file or account": Broadcast a message to KB0: telling & ! them about the error, then ignore the file. & 32766 Z$=SYS(CHR$(6%)+CHR$(-5%)+CHR$(0%)+"%% FSTOPN: Fatal error"+ & NUM$(ERR)+"at line "+NUM1$(ERL)+". Aborting..."+ & CHR$(7%)+CHR$(13%)+CHR$(10%)) & \ ON ERROR GOTO 0 & ! All other errors are fatal. Broadcast a message to KB0: telling & ! them we are aborting, then abort and hybernate. & 32767 END 4xz 2? 1 EXTEND 2 ! SILSYM == List symbols in .SIL image & ! & ! This program lists the symbols in a SIL image file in a format & ! similar to a load map. The SIL image may be a monitor image & ! (eg. RSTS80.SIL), a runtime system (eg. BASIC.RTS), a resident & ! library (eg. RMSLIB.LIB), or a task image built in SIL format to & ! allow use of global symbol names in ONLPAT (eg. CTOS.TSK). & ! & ! This program is provided by Northwest Digital Software Inc. as a & ! service to the RSTS community. It is provided "AS IS" with no & ! warranties, expressed or implied. & ! & ! Author: & ! Michael Mayfield & ! & ! Variable Usage: & ! IDENT1$ Current module IDENT, word 1 of 2 (RAD50) & ! IDENT2$ Current module IDENT, word 2 of 2 (RAD50) & ! LINCNT% Number of entries printed on current line & ! LOAD.ADDR$ Current module load address (SWAP%(CVT$%)) & ! MOD.LOOP% Current module number & ! MODCNT$ SWAP%(CVT$%) form of MODCNT% & ! MODCNT% Number of modules in SIL & ! MODULE.SIZE$ Size of current module (SWAP%(CVT$%) format) & ! NAME1$ Current module name, word 1 of 2 (RAD50) & ! NAME2$ Current module name, word 2 of 2 (RAD50) & ! RPTCHN% Report output channel number & ! SILBLK% Current block number is SIL & ! SILCHN% SIL file channel number & ! SILFIL$ Current SIL file name & ! SYM.LOOP% Current symbol number & ! SYMCNT$ SWAP%(CVT$%) form of SYMCNT% & ! SYMCNT% Number of symbols in current module & ! SYMNAM1$(0..63) Symbol names in block, word 1 of 2 (RAD50) & ! SYMNAM2$(0..63) Symbol names in block, word 2 of 2 (RAD50) & ! SYMOFF$ SWAP%(CVT$%) form of SYMOFF% & ! SYMOFF% Symbol entry offset in current symbol block & ! SYMVAL$(0..63) Symbol value in SWAP%(CVT$%) form & ! OVRNUM$(0..63) Symbol overlay number in SWAP%(CVT$%) form & ! XFER.ADDR$ Current module transfer address (SWAP%(CVT$%)) & ! & ! Function Usage: & ! FNC.OCT$(INTVAL%) Convert integer value to 6-digit octal string & ! C.OCT%(0..6) ASCII array for building octal string & ! INTVAL% Integer value to convert & ! & ! Edit History: & ! 00 15-Aug-84 MEM Original version & ! 01 16-Aug-84 MEM Optimize string handling in FNC.OCT$() & 10 DIM SYMNAM1$(63), & SYMNAM2$(63), & OVRNUM$(63), & SYMVAL$(63) & \ SILCHN%=1% & \ RPTCHN%=2% & \ ON ERROR GOTO 30000 & ! Define channel numbers. Trap all errors. & 100 PRINT IF CCPOS(0%) & \ PRINT "Input file"; & \ INPUT LINE SILFIL$ & \ SILFIL$=CVT$$(SILFIL$,39%) & \ OPEN SILFIL$ FOR INPUT AS FILE SILCHN%, MODE 4096% & \ FIELD #SILCHN%, & 2% AS MODCNT$ !Number of modules & \ GET #SILCHN%, RECORD 1% & \ MODCNT%=SWAP%(CVT$%(MODCNT$)) & \ FIELD #SILCHN%, Z%*8% AS Z$, & 2% AS SYMNAM1$(Z%), !Symbol name 1/2 (RAD50) & 2% AS SYMNAM2$(Z%), !Symbol name 2/2 (RAD50) & 2% AS OVRNUM$(Z%), !Overlay descriptor number & 2% AS SYMVAL$(Z%) !Symbol value & FOR Z%=0% TO 63% & \ PRINT IF CCPOS(0%) & \ PRINT "Output to "; & \ INPUT Z$ & \ Z$=CVT$$(Z$,-1%) & \ Z$="KB:" IF Z$="" & \ OPEN Z$ FOR OUTPUT AS FILE RPTCHN% & ! Ask for input file. Open it and field first entry. Get module & ! from SIL index block. Field symbol table entries as entire block. & ! Ask for output device and open it. & 110 FOR MOD.LOOP%=0% TO MODCNT%-1% & \ GET #SILCHN%, RECORD 1% & \ FIELD #SILCHN%, 32%*MOD.LOOP%+2% AS Z$, & 2% AS NAME1$, !Module name 1/2 (RAD50) & 2% AS NAME2$, !Module name 2/2 (RAD50) & 2% AS IDENT1$, !IDENT 1/2 (RAD50) & 2% AS IDENT2$, !IDENT 2/2 (RAD50) & 2% AS Z$, !Block offset to module & 2% AS SYMOFF$, !Block offset to symbol table & 2% AS SYMCNT$, !Number of symbols & 2% AS LOAD.ADDR$, !Virtual load address & 2% AS MODULE.SIZE$, !Module size & 2% AS XFER.ADDR$ !Virtual transfer address & \ PRINT #RPTCHN% & \ PRINT #RPTCHN%, "File: "; SILFIL$; TAB(30%); "Module: "; & RAD$(SWAP%(CVT$%(NAME1$))); RAD$(SWAP%(CVT$%(NAME2$))); & TAB(60%); "Ident: "; & RAD$(SWAP%(CVT$%(IDENT1$))); RAD$(SWAP%(CVT$%(IDENT2$))) & \ PRINT #RPTCHN%, "Load Address:"; & FNC.OCT$(SWAP%(CVT$%(LOAD.ADDR$))); & TAB(30%); "Transfer Address: "; & FNC.OCT$(SWAP%(CVT$%(XFER.ADDR$))); & TAB(60%); "Module Size: "; & FNC.OCT$(SWAP%(CVT$%(MODULE.SIZE$))) & \ PRINT #RPTCHN% & \ SYMCNT%=SWAP%(CVT$%(SYMCNT$)) & \ SILBLK%=SWAP%(CVT$%(SYMOFF$))+1% & \ SYMOFF%=32767% & \ LINCNT%=0% 120 FOR SYM.LOOP%=1% TO SYMCNT% & \ IF SYMOFF%>=64% THEN & GET #SILCHN%, RECORD SILBLK% & \ SILBLK%=SILBLK%+1% & \ SYMOFF%=0% 130 IF LINCNT%>=7% THEN & PRINT #RPTCHN% & \ LINCNT%=0% 140 PRINT #RPTCHN%, USING "\ \\ \ \ \ ", & RAD$(SWAP%(CVT$%(SYMNAM1$(SYMOFF%)))), & RAD$(SWAP%(CVT$%(SYMNAM2$(SYMOFF%)))), & FNC.OCT$(SWAP%(CVT$%(SYMVAL$(SYMOFF%)))); & \ Z%=SWAP%(CVT$%(OVRNUM$(SYMOFF%))) & \ IF Z% THEN & PRINT #RPTCHN%, USING "## ", Z%; & ELSE & PRINT #RPTCHN%, " "; 150 SYMOFF%=SYMOFF%+1% & \ LINCNT%=LINCNT%+1% & \ NEXT SYM.LOOP% & \ PRINT #RPTCHN% & \ PRINT #RPTCHN%, CHR$(12%); & \ NEXT MOD.LOOP% & ! Get the SIL index block. Print the info from the module in the & ! SIL. Get the count of symbols and offset to the symbol table. & ! Force a read on the first symbol block. & ! For all symbols in symbol table: & ! Get a new block every 32 symbols. Print the symbol name and & ! ocatl value for each symbol. Skip to a new line every 8 & ! symbols. Go to next symbol in block. & 160 GOTO 32767 & 20000 DEF* FNC.OCT$(INTVAL%) ! Convert integer to octal string & \ DIM C.OCT%(6%) !01 & \ IF INTVAL%>=0% THEN !01 & C.OCT%(1%)=48% !01 & ELSE !01 & C.OCT%(1%)=49% !01 20010 INTVAL%=INTVAL% AND 32767% & \ FOR Z1%=6% TO 2% STEP -1% !01 & \ C.OCT%(Z1%)=(INTVAL% AND 7%)+48% !01 & \ INTVAL%=INTVAL%/8% & \ NEXT Z1% & \ C.OCT%(0%)=6% !01 & \ CHANGE C.OCT% TO Z$ !01 & \ FNC.OCT$=Z$ & \ FNEND & ! If integer value is positive use a leading 0, else use a leading & ! 1. Strip off the sign bit to ensure no sign propogation. Mask & ! off each octal digit, convert to ASCII value and store in ASCII & ! array. Convert ASCII array to string and return this value. & 30000 IF ERR=11% AND ERL=100% THEN & RESUME 32767 & ! Exit cleanly on ^Z on KB: input & 30999 ON ERROR GOTO 0 & ! All other errors are fatal & 32767 END r 2? 1 EXTEND! ********* EDTATR - EDITS FILE ATTRIBUTES IN UFD ********** ! 2 EXTEND! ********************************************************** ! ! ** ** ! ! ** This material is the exclusive confidential property ** ! ! ** of ON-LINE DATA PROCESSING, INC. ** ! ! ** SPOKANE WASHINGTON.. ** ! ! ** Online Data Processing, Inc. CLAIMS A COMMON LAW ** ! ! ** COPYRIGHT. REPRODUCTION OR DISCLOSURE WITHOUT ** ! ! ** PERMISSION IS STRICTLY FORBIDDEN. ** ! ! ** ** ! ! ********************************************************** ! ! __________________________________________________________ ! 5 EXTEND 6 ! WRITTEN BY: RICK CADRUVI, Date: 23-JAN-79 ! EDIT LOG ! DATE WHO VERSION CHANGE ! --------- --- ------- ---------------------- 16-APR-79 JAM V01-01B ADDED DELETE ROUTINE @ 12500 24-AUG-79 DLM V01-01C ADDED MACRO INSTRUCTIONS /M: ! 13-DEC-79 RLC V01-01D FIX DEVICE PROBLEM 90 ! ------ WHAT KIND OF TERMINAL ARE YOU ---------------------------------- 92 PRINT CHR$(155%)+'X'; \ ON ERROR GOTO 96 \ OPEN 'KB:' AS FILE 1% \ X$=SYS(CHR$(3%)+CHR$(1%)) \ X$ = SYS(CHR$(11%)+CHR$(1%)) \ PRINT CHR$(155%);'Z'; \ X$="" \ WAIT 2% 93 Z$=SYS(CHR$(4%)+CHR$(1%)) \ GET #1% \ X%=RECOUNT \ FIELD #1%, X% AS Z$ \ X$=X$+Z$ \ GOTO 93 IF LEN(X$)<3% 94 X$=MID(X$,3%,1%) \ IF INSTR(1%,"KMZ",X$) THEN T% = 1% ELSE T% =2% 95 Z$=SYS(CHR$(2%)+CHR$(1%)) \ CLOSE 1% \ WAIT 0% \ T0%=22% \ T%=2% UNLESS T% \ T0%=51% IF T%=2% \ GOTO 97 96 RESUME 95 97 ! T% = 1% IF A VT52 T0% = 22% VIDEO TYPE TERMINAL ! T% = 2% IF NOT A VT52 T0% = 51% PAPER TYPE TERMINAL 99 DIM F$(12%), A%(30%) 100 GOSUB 105 \ X% = FNC.DIS%(1%,1%,2%,'') \ PRINT V9$; \ PRINT V8$ \ GOTO 500 105 ! ***** INITIALIZATION OF CONSTANTS ************************ 110 ON ERROR GOTO 26000 130 V7$="EDTATR" \ V8$=V7$+" V01-01D 13-DEC-79" \ V9$="This program EDITS FILE ATTRIBUTES IN UFD " 150 OPTION.% = 1% 200 W%(1%) = 1% \ Y%(1%) = 0% \ Z%(1%) = 256% \ W%(2%) = 2% \ Y%(2%) = 16% \ Z%(2%) = 512% \ W%(3%) = 3% \ Y%(3%) = 32% \ Z%(3%) = 2048% \ W%(4%) = 4% ! ARRAY OF VALID VALUES FOR FIRST WORD 210 TAB.%(1%) = 3% \ TAB.%(2%) = 31% \ TAB.%(3%) = 58% \ COMP.$(1%) = 'ABCD' \ COMP.$(2%) = 'ABC' \ COMP.$(3%) = 'ABC' 499 RETURN 500 ! ****** OPEN FILES AND FINISH SETUP *********************** 510 PRINT \ PRINT "FILE :";TAB(58%);"OPTION :" \ GOSUB 10000 \ GOTO 605 IF CCL.% ! SET UP SCREEN DISPLAY 600 X% = FNC.DIS%(21%,1%,1%,'File -') \ INPUT LINE X$ \ F$ = CVT$$(X$,255%) 605 B% = INSTR(1%,F$,'/') \ GOTO 610 UNLESS B% \ MACRO.% = INSTR(1%,MID(F$,B%+1%,2%),'M:') \ DAT$ = RIGHT(F$,B%+3%) IF MACRO.% = 1% \ DAT$ = CVT$$(DAT$,39%) IF LEN(DAT$) \ OPTION.% = INSTR(1%,'EVHM',MID(F$,B%+1%,1%)) \ OPTION.% = 1% IF OPTION.% = 4% \ F$ = LEFT(F$,B%-1%) \ GOTO 610 IF OPTION.% \ E$ = "Invalid Option - Type '/H' for help" \ GOSUB 23400 \ GOTO 600 ! INPUT FILE TO LOOK AT ! SEARCH FOR OPTION CHANGE ! SKIP IF NO OPTION CHANGE ! SET OPTION FLAG ! EXTRACT FILENAME ! GO ON IF VALID OPTION ! PRINT ERROR IF INVALID OPTION AND GET ANOTHER 610 GOSUB 16900 IF OPTION.% = 3% \ GOTO 600 IF OPTION.% = 3% \ CNTR%, WILD% = 0% \ A$ = SYS(CHR$(6%)+CHR$(-23%)+F$) \ CHANGE A$ TO A% \ F.L$ = RIGHT(A$,5%) \ S0% = A%(27%)+SWAP%(A%(28%)) \ S1% = A%(29%)+SWAP%(A%(30%)) \ GOTO 620 UNLESS S0% < 0% \ WILD% = A%(29%)+SWAP%(A%(30%)) ! GO PRINT HELP MESSAGE IF ASKED FOR ! RESET FLAGS ! DO FILE SCAN ! CHANGE TO INTEGER ARRAY AND KEEP FILE NAME ! GET FLAG WORD FROM SCAN ! CONTINUE IF NO WILD CARD ! SET WILD CARD FLAG TO SECOND SCAN FLAG WORD 620 X$ = CHR$(6%)+CHR$(17%)+CHR$(CNTR%)+CHR$(SWAP%(CNTR%))+F.L$ \ A$ = SYS(X$) \ CHANGE A$ TO A% \ DV$ = '' \ GOTO 630 UNLESS S1% AND 8192% \ DV$ = CHR$(A%(23%)) + CHR$(A%(24%)) \ DV$ = DV$ + NUM1$(A%(25%)) IF A%(26%) = 255% \ DV$ = DV$ + ':' \ GOTO 630 625 DV$ = RAD$(A%(23%)+SWAP%(A%(24%)))+RAD$(A%(25%)+SWAP%(A%(26%))) + ':' ! SET UP FOR DIRECTORY LOOK UP ! DO LOOK UP AND SET UP INTEGER ARRAY ! SET DEVICE NAME TO DEFAULT ! SKIP IF NO DEVICE SPECIFIED ! SET UP DEVICE NAME IF APPLICABLE 630 F$(1%) = DV$ \ F$(1%) = F$(1%)+'['+NUM1$(A%(6%))+','+NUM1$(A%(5%))+']' IF S0% AND 1024% \ F$(1%) = F$(1%)+RAD$(A%(7%)+SWAP%(A%(8%)))+RAD$(A%(9%)+SWAP%(A%(10%)))+ '.'+RAD$(A%(11%)+SWAP%(A%(12%))) \ ! SET UP FILE NAME ! ********** LOOK UP ATTRIBUTES HERE ************ 1000 GOTO 1005 IF MACRO.% \ IF WILD% THEN X$ = 'Is this the file you want - '+F$(1%)+' ?' \ X% = FNTRUE%(21%,9%,X$) \ GOTO 600 IF CTRL.Z% \ GOTO 3000 UNLESS X% ! CHECK FOR PROPER FILE IF WILD CARD SPECIFIED ! CHECK FOR CTRL Z, IF THERE IS GOTO 600 1005 X% = FNC.DIS%(3%,8%,0%,STRING$(35%,32%)) \ X% = FNC.DIS%(3%,8%,0%,F$(1%)) \ OPEN F$(1%) FOR INPUT AS FILE 1% \ GOSUB 10020 \ GOSUB 10030 ! CLEAR OLD FILE NAME AND DISPLAY NEW ONE ! OPEN FILE ! CLEAR SCREEN 1010 A$ = SYS(CHR$(6%)+CHR$(-25%)+CHR$(1%)+CHR$(0%)) \ CHANGE A$ TO A% \ GOTO 2000 IF A%(5%) = 0% AND A%(6%) = 0% ! GET ATTRIBUTES FROM UFD ! SKIP PRINTING THEM IF NONE EXIST 1050 W1% = A%(5%)+SWAP%(A%(6%)) \ S%(X%) = 0% FOR X% = 1% TO 3% \ S%(1%) = 2% IF W1% AND 2% \ S%(1%) = W1% AND 3% IF W1% AND 3% \ S%(1%) = 4% IF W1% AND 4% \ S%(2%) = 2% IF W1% AND 16% \ S%(2%) = 3% IF W1% AND 32% \ S%(2%) = 1% UNLESS S%(2%) \ S%(3%) = 1% IF W1% AND 256% \ S%(3%) = 2% IF W1% AND 512% \ S%(3%) = 3% IF W1% AND 2048% ! GET FIRST WORD ! SEPERATE FORMAT ! SEPERATE ORGANIZATION ! SEPERATE ATTRIBUTES 1100 X% = FNC.DIS%(5%+S%(1%),TAB.%(1%),0%,'*') IF S%(1%) \ X% = FNC.DIS%(5%+S%(2%),TAB.%(2%),0%,'*') IF S%(2%) \ X% = FNC.DIS%(5%+S%(3%),TAB.%(3%),0%,'*') IF S%(3%) ! DISPLAY OLD FORMAT ! DISPLAY OLD ORGANIZATION ! DISPLAY OLD ATTRIBUTES 1200 W2% = A%(7%) + SWAP%(A%(8%)) \ X% = FNC.DIS%(11%,1%,0%,'') \ PRINT USING '######', W2% ! DISPLAY OLD RECORDSIZE 1300 W3% = A%(9%)+SWAP%(A%(10%)) \ W4. = 256.*A%(12%)+A%(11%) \ WP4. = W3%*65536. + W4. \ X% = FNC.DIS%(12%,1%,0%,'') \ PRINT USING '######', WP4. ! DISPLAY OLD FILE SIZE 1400 W5% = A%(13%)+SWAP%(A%(14%)) \ W6. = 256.*A%(16%)+A%(15%) \ WP6. = W5%*65536. + W6. \ X% = FNC.DIS%(13%,1%,0%,'') \ PRINT USING '######', WP6. ! DISPLAY OLD BLOCKS IN USE 1500 W7% = A%(17%)+SWAP%(A%(18%)) \ X% = FNC.DIS%(14%,1%,0%,'') \ PRINT USING '######', W7% ! DISPLAY OLD BYTES IN LAST BLOCK 1600 X% = FNC.DIS%(15%,1%,0%,'') \ PRINT USING '######', A%(19%) \ X% = FNC.DIS%(15%,40%,0%,'') \ PRINT USING '######', A%(20%) ! DISPLAY OLD BUCKET SIZE ! DISPLAY OLD HEADER SIZE 1700 W9% = A%(21%)+SWAP%(A%(22%)) \ X% = FNC.DIS%(16%,1%,0%,'') \ PRINT USING '######', W9% ! DISPLAY OLD MAXIMUM RECORDSIZE 1800 W10% = A%(23%)+SWAP%(A%(24%)) \ X% = FNC.DIS%(17%,1%,0%,'') \ PRINT USING '######', W10% ! DISPLAY OLD DEFAULT EXT. QTY 2000 ON OPTION.% GOSUB 11000, 12000, 16900 ! GO TO PROPER SUBROUTINE FOR OPTION SPECIFIED 3000 IF WILD% THEN CNTR% = CNTR% + 1% \ GOTO 620 ! CLEAR SCREEN AND GET ANOTHER FILE IF WILD CARD 3010 GOTO 600 ! GO GET ANOTHER FILE 10000 ! ********** SCREEN FORMAT SUBROUTINES ************ 10010 X% = FNC.DIS%(5%,1%,2%,"") \ PRINT "1) RECORD FORMAT:";TAB(28%);"2) FILE ORGANIZATION:";TAB(55%); "3) RECORD ATTRIBUTES:" \ PRINT " a)Fixed Length";TAB(31%);"a)Sequential";TAB(58%); "a)Fortran Carriage " \ PRINT " b)Variable Length";TAB(31%);"b)Relative";TAB(58%); "b)Implied Carriage" \ PRINT " c)Var. w/ Fix Ctrl";TAB(31%);"c)Indexed";TAB(58%); "c)Records CAN'T lap" \ PRINT " d)ASCII Stream" \ PRINT \ PRINT " 4) Recordsize" \ PRINT " 5) File size" \ PRINT " 6) Blocks in use" \ PRINT " 7) Bytes in last block" \ PRINT " 8a)Bucket size";TAB(40%);" 8b)Header size" \ PRINT " 9) Max. Recordsize" \ PRINT " 10)Default Ext. Qty" \ X% = FNC.DIS%(23%,1%,2%,'MESSAGES -') \ RETURN ! CLEAR SCREEN AND REDISPLAY ! GO BACK TO CALLING MODULE 10020 ON Q% GOSUB 10021,10022,10023,10024 FOR Q%=1% TO 4% \ RETURN 10021 X% = FNC.DIS%(5%+I%,TAB.%(1%),0%,' ') FOR I% = 1% TO 4% \ RETURN 10022 X% = FNC.DIS%(5%+I%,TAB.%(2%),0%,' ') FOR I% = 1% TO 3% \ RETURN 10023 X% = FNC.DIS%(5%+I%,TAB.%(3%),0%,' ') FOR I% = 1% TO 3% \ RETURN 10024 X% = FNC.DIS%(10%+I%,1%,0%,' ') FOR I% = 1% TO 7% \ X% = FNC.DIS%(15%,40%,0%,' ') \ X% = FNC.DIS%(23%,11%,2%,'') \ RETURN ! CLEAR OLD ATTRIBUTES 10030 X% = FNC.DIS%(5%+I%,23%,0%," ") FOR I% = 1% TO 3% \ X% = FNC.DIS%(5%+I%,45%,0%,' ') FOR I% = 1% TO 3% \ X% = FNC.DIS%(5%+I%,79%,1%,'') FOR I% = 1% TO 3% \ X% = FNC.DIS%(10%+I%,30%,0%,' ') FOR I% = 1% TO 7% \ X% = FNC.DIS%(15%,64%,1%,'') \ RETURN ! CLEAR NEW ATTRIBUTES 11000 ! ********** SUBROUTINE TO EDIT ATTRIBUTES HERE ************ 11002 DONE.1% = 0% 11005 X% = FNC.DIS%(3%,66%,1%,'EDIT') 11008 GOTO 11200 IF DONE.1% IF MACRO.% \ GOTO 11012 IF MACRO.% UNLESS DONE.1% 11010 GOSUB 23050 \ INPUT LINE X$ \ DAT$ = CVT$$(X$,255%) 11012 GOTO 11010 UNLESS LEN(DAT$) \ DONE.1% = -1% \ IF LEFT(DAT$,1%) = 'D' THEN GOSUB 12500 \ GOTO 11008 11015 CHG% = INSTR(1%,'123456789',LEFT(DAT$,1%)) \ IF CHG% = 0% THEN E$ = 'INVALID INPUT' \ GOSUB 23400 \ GOTO 11010 ! INPUT CHANGE TO MAKE ! RETURN IF NOTHING INPUT ! SET SWITCH FOR CHANGING ! PRINT ERROR IF CAN'T FIND PROPER NUMGER TO CHANGE 11020 GOTO 11100 IF CHG% > 3% \ GOTO 11100 IF LEFT(DAT$,2%) = '10' \ GOTO 11025 IF LEN(DAT$) <> 2% \ FORMAT% = INSTR(1%,COMP.$(CHG%),RIGHT(DAT$,2%)) \ GOTO 11030 UNLESS FORMAT% = 0% 11025 E$ = 'INVALID INPUT' \ GOSUB 23400 \ GOTO 11010 ! SKIP IF YOU WANT TO CHANGE LINE 10 ! SET SWITCH FOR TYPE OF FORMAT ! IF FORMAT NOT VALID THEN PRINT ERROR AND GO BACK 11030 ON CHG% GOSUB 10021,10022,10023 \ S%(CHG%) = FORMAT% \ X% = FNC.DIS%(5%+FORMAT%,TAB.%(CHG%),0%,'*') \ GOTO 11008 ! SET NEW ATTRIBUTE AND DISPLAY GO BACK FOR MOR CHANGES 11100 GOTO 11110 IF CHG% = 2% OR CHG% = 3% \ IF INSTR(1%,DAT$,',') = 0% THEN E$ = 'NEED COMMA' \ GOSUB 23400 \ GOTO 11010 11110 ON CHG% GOSUB 11800,11290,11290,11500,11550, 11600,11650,11700,11750 \ GOTO 11008 ! GO CHANGE VARIOUS ATTRIBUTES ! GO BACK FOR ANOTHER CHANGE 11200 X0% = W%(S%(1%)) + Y%(S%(2%)) + Z%(S%(3%)) \ X$ = CHR$(X0%) + CHR$(SWAP%(X0%)) \ CHANGE X$ TO X% \ A%(5%) = X%(1%) \ A%(6%) = X%(2%) \ A%(0%) = 30% \ A%(1%) = 6% \ A%(2%) = -25% \ A%(3%) = 1% \ A%(4%) = 11% \ CHANGE A% TO A$ \ A$ = SYS(A$) 11290 RETURN ! GO BACK TO CALLING MODULE 11500 X0% = VAL(RIGHT(DAT$,3%)) \ X$ = CHR$(X0%)+CHR$(SWAP%(X0%)) \ CHANGE X$ TO X% \ A%(7%) = X%(1%) \ A%(8%) = X%(2%) \ X% = FNC.DIS%(11%,30%,0%,'') \ PRINT USING '######', X0% 11520 RETURN 11550 Q. = VAL(RIGHT(DAT$,3%)) \ I0% = Q./65536. \ I1. = Q.-I0%*65536. \ X$ = CHR$(I0%) + CHR$(SWAP%(I0%)) \ CHANGE X$ TO X% \ A%(9%) = X%(1%) \ A%(10%) = X%(2%) \ A%(12%) = I1./256. \ A%(11%) = I1.-A%(12%)*256. \ X% = FNC.DIS%(12%,30%,0%,'') \ PRINT USING '######', Q. ! BUILD 2 WORD INTEGER FOR FILE SIZE ! DISPLAY FILE SIZE 11570 RETURN 11600 Q. = VAL(RIGHT(DAT$,3%)) \ I0% = Q./65536. \ I1. = Q.-I0%*65536. \ X$ = CHR$(I0%) + CHR$(SWAP%(I0%)) \ CHANGE X$ TO X% \ A%(13%) = X%(1%) \ A%(14%) = X%(2%) \ A%(16%) = I1./256. \ A%(15%) = I1.-A%(16%)*256. \ X% = FNC.DIS%(13%,30%,0%,'') \ PRINT USING '######', Q. ! BUILD 2 WORD INTEGER FOR BLOCKS IN USE ! DISPLAY BLOCKS 11620 RETURN 11650 X0% = VAL(RIGHT(DAT$,3%)) \ X$ = CHR$(X0%)+CHR$(SWAP%(X0%)) \ CHANGE X$ TO X% \ A%(17%) = X%(1%) \ A%(18%) = X%(2%) \ X% = FNC.DIS%(14%,30%,0%,'') \ PRINT USING '######', X0% 11670 RETURN 11700 HI.LOW% = INSTR(1%,'AB',MID(DAT$,2%,1%)) \ IF HI.LOW% = 0% THEN E$ = 'INVALID INPUT' \ GOSUB 23400 \ RETURN 11710 ON HI.LOW% GOTO 11720,11730 11720 X% = VAL(RIGHT(DAT$,4%)) \ IF X% < 0% OR X% > 32% THEN E$ = 'RANGE IS 0-32' \ GOSUB 23400 \ GOTO 11740 11721 A%(19%) = X% \ X% = FNC.DIS%(15%,30%,0%,' ') \ X% = FNC.DIS%(15%,30%,0%,'') \ PRINT USING '######', A%(19%) \ GOTO 11740 11730 X% = VAL(RIGHT(DAT$,4%)) \ IF X% < 0% OR X% > 255% THEN E$ = 'RANGE IS 0-255' \ GOSUB 23400 \ GOTO 11740 11731 A%(20%) = X% \ X% = FNC.DIS%(15%,64%,1%,'') \ PRINT USING '######', A%(20%) 11740 RETURN 11750 X0% = VAL(RIGHT(DAT$,3%)) \ X$ = CHR$(X0%)+CHR$(SWAP%(X0%)) \ CHANGE X$ TO X% \ A%(21%) = X%(1%) \ A%(22%) = X%(2%) \ X% = FNC.DIS%(16%,30%,0%,'') \ PRINT USING '######', X0% 11770 RETURN 11800 X0% = VAL(RIGHT(DAT$,4%)) \ X$ = CHR$(X0%)+CHR$(SWAP%(X0%)) \ CHANGE X$ TO X% \ A%(23%) = X%(1%) \ A%(24%) = X%(2%) \ X% = FNC.DIS%(17%,30%,0%,'') \ PRINT USING '######', X0% 11820 RETURN 11900 E$ = 'BAD NUMBER' \ GOSUB 23400 \ RETURN 12000 ! *********** SUBROUTINE FOR VIEWING ATTRIBUTES ************* 12010 X% = FNC.DIS%(3%,66%,1%,'VIEW') \ RETURN ! RETURN (VIEW HERE AND WE ALREADY HAVE) 12500 ! ********* DELETE ROUTINE *********** 12510 GOTO 12530 UNLESS LEN(DAT$) = 2% \ SEL.% = VAL(RIGHT(DAT$,2%)) \ GOTO 12530 UNLESS SEL.% = 3% \ GOSUB 10023 \ S%(3%) = 0% \ GOTO 12550 12530 E$ = 'INVALID DELETE COMMAND' \ GOSUB 23400 12550 RETURN 16300 E$ = "CAN'T FIND FILE OR ACCOUNT - "+F$ \ GOSUB 23400 \ GOTO 600 ! PRINT ERROR MESSAGE IF FILE NOT FOUND 16900 E$ = 'SORRY FOLKS - HELP MESSAGE COMES WITH NEXT VERSION' \ GOSUB 23400 \ RETURN 17000 ! ******** FUNCTION TO CHECK TRUE/FALSE INPUT ********** 17010 DEF FNTRUE%(Z%,Y%,MES$) \ FNTRUE%,CTRL.Z% = 0% 17020 X% = FNC.DIS%(Z%,Y%,1%,MES$) \ X$ = SYS(CHR$(4%)) \ GET \ FIELD RECOUNT AS X$ \ IF X$ = CHR$(26%) THEN CTRL.Z% = -1% ELSE X$ = CVT$$(LEFT(X$,1%),32%) \ IF X$ = 'Y' THEN X% = FNC.DIS%(Z%,LEN(MES$)+Y%,1%,'Yes') \ FNTRUE% = -1% \ GOTO 17100 17030 X% = FNC.DIS%(Z%,LEN(MES$)+Y%,1%,'No') 17100 FNEND 23000 ! 'CURGEN' V01-01B 07-OCT-77 RWM ! 'CURGEN' V01-01C 24-OCT-78 RWM ADDED 'Z' DELIMITER FOR VT100 ***** CURSOR ADDRESSING FUNCTION **************************** ! HOME POSITION = 1% , 1% ! C1% = COLUMN POSITION ! L% = LINE POSITION ! X% = -1% CLEAR SCREEN FIRST ! X% = 0% DO NOTHING BUT POSITON CURSOR ! X% = 1% CLEAR TO END OF LINE AFTER POSITIONING ! X% = 2% CLEAR TO END OF SCREEN AFTER POSITIONING 23005 DEF FNC.DIS%(L%,C1%,X%,X$) \ GOSUB 23200 IF X%<0% \ IF T% = 1% THEN X$=CHR$(155%)+'Y'+CHR$(31%+L%)+CHR$(31%+C1%)+X$ ELSE X$ = CHR$(13%)+CHR$(10%)+X$ IF POS(0%) 23010 PRINT X$; \ GOSUB 23100 IF X% = 1% \ GOSUB 23300 IF X% = 2% \ FNEND! ! MOVE CURSOR TO PROMPT POSITION 23050 X% = FNC.DIS%(21%,1%,1%,"#,Change") \ RETURN ! ! SUBROUTINE TO CLEAR LINE 23100 PRINT CHR$(155%);'K'; IF T%=1 \ PRINT IF POS(0%) IF T%=2% \ RETURN ! ! SUBROUTINE TO CLEAR SCREEN 23200 PRINT CHR$(155%);'H';CHR$(155%);'J'; IF T%=1% \ PRINT CHR$(12%); IF T%=2% \ RETURN ! ! CLEAR TO BOTTOM OF SCREEN 23300 PRINT CHR$(155%)+'J'; IF T%=1% \ RETURN ! COMMON PROGRAM ERROR HANDLING 23400 X% = FNC.DIS%(23%,12%,2%,CHR$(7%)+'*** '+E$+' ***') \ SLEEP 2% \ X% = FNC.DIS%(23%,11%,2%,"") \ RETURN 26000 ! 'ERRGEN' V01-01A 23-SEP-77 RWM ***** ERROR HANDLING **************************************** 26050 GOTO 26100 IF ERR<>5% AND ERR<>10% 26070 RESUME 600 IF ERL = 620% AND CNTR% >= 1% \ RESUME 16300 IF ERL = 620 26100 GOTO 26200 IF ERR<>11% AND ERR<>15% \ RESUME 32767 IF ERL=27100% \ IF ERL<955% THEN RESUME 32767 26110 RESUME 11200 IF ERL = 11010% 26200 GOTO 26300 UNLESS ERR>=50% AND ERR<=52% ! BAD NUMBER HANDLING 26210 RESUME 11900 IF ERL = 11500% OR ERL = 11550% OR ERL = 11600% OR ERL = 11650% OR ERL = 11720% OR ERL = 11730% OR ERL = 11750% OR ERL = 11800% 26220 RESUME 12530 IF ERL = 12510 26300 ! 27010 E$ = CVT$$(RIGHT(SYS(CHR$(6%)+CHR$(9%)+CHR$(ERR)),3%),4%) \ PRINT ' AT LINE'; ERL \ GOSUB 23400 \ RESUME 600 ! PRINT SYSTEM ERROR MESSAGE 27050 E$ = " ** THE FILE "+F$(X9%)+" IS NOT ACCESSABLE ........"+CHR$(7%) \ GOSUB 23400 27090 CLOSE X% FOR X%=1% TO 12% 27100 PRINT CHR$(7%);" ** PRESS TO EXIT"; \ SLEEP 32767% \ INPUT Z$ \ GOTO 32767 ! ERROR TRAP TO KEEP AN ERROR MESSAGE ON SCREEN 30000 CCL.% = 0% \ X$ = SYS(CHR$(7%)) \ F% = INSTR(1%,X$,' ') \ F% = LEN(X$) UNLESS F% \ F$ = RIGHT(X$,F%) \ F$ = CVT$$(F$,39%) \ CCL.% = -1% IF LEN(F$) \ GOTO 1 ! CHAIN IN POINT FOR CCL CALL 32767 END ! END OF PROGRAM T` 2?1 EXTEND 10 DIM FILSIZ(1000), & CLUSIZ%(1000), & USTAT%(1000), & SYSCAL%(30%) & \ DIM #12%, FILNAM$(1000)=32 & \ OPEN "TEMP.TMP" FOR OUTPUT AS FILE 12%, CLUSTERSIZE 16%, FILESIZE 100% & \ ON ERROR GOTO 30000 & \ INDEX%=0% & \ IN.CHN%=1% & \ OUT.CHN%=2% & 20 PRINT "Enter _DEV:[PPN] "; & \ INPUT LINE DEVPPN$ & \ DEVPPN$=CVT$$(DEVPPN$,-1%) & \ CHANGE SYS(CHR$(6%)+CHR$(-10)+DEVPPN$) TO SYSCAL% & \ PROJECT%=SYSCAL%(5%) & \ PROGRAMMER%=SYSCAL%(6%) & \ DEV$=CHR$(SYSCAL%(23%))+CHR$(SYSCAL%(24%)) & \ UNIT%=SYSCAL%(25%) & \ PPN$="["+NUM1$(PROJECT%)+","+NUM1$(PROGRAMMER%)+"]" & \ FLAG1%=SYSCAL%(27%) OR SWAP%(SYSCAL%(28%)) & \ FLAG2%=SYSCAL%(29%) OR SWAP%(SYSCAL%(30%)) & \ FLAG2.MASK%=128% OR 4096% OR 8192% & \ IF ((FLAG1% AND (NOT (1024% OR 4096%))) <> 0%) OR & ((FLAG2% AND FLAG2.MASK%) <> FLAG2.MASK%) OR & ((FLAG2% AND NOT(FLAG2.MASK%)) <> 0%) THEN & PRINT "%Invalid device and/or PPN specification" & \ GOTO 20 & ! Get device and PPN spec. Scan spec and build device name, unit & ! number, and PPN variables. If anything other than DEV:[PPN] & ! specified, get a new spec. & 25 PRINT "[Building list of files to optimize.]" & ! Get disk and PPn for account to optimize clustersize for & 30 CHANGE SYS(CHR$(6%)+CHR$(15%)+CHR$(INDEX%)+CHR$(SWAP%(INDEX%))+ & CHR$(PROGRAMMER%)+CHR$(PROJECT%)+STRING$(16%,0%)+DEV$+ & CHR$(UNIT%)+CHR$(255%)) TO SYSCAL% & \ FILNAM$(INDEX%)=DEV$+NUM1$(UNIT%)+":"+PPN$+RAD$(SYSCAL%(7%)+ & SWAP%(SYSCAL%(8%)))+RAD$(SYSCAL%(9%)+SWAP%(SYSCAL%(10%)))+"."+ & RAD$(SYSCAL%(11%)+SWAP%(SYSCAL%(12%)))+"<"+ & NUM1$(SYSCAL%(15%))+">" & \ FILSIZ(INDEX%)=SYSCAL%(13%)+SYSCAL%(14%)*256.0+SYSCAL%(16%)*65538.0 & \ CLUSIZ%(INDEX%)=SYSCAL%(27%)+SWAP%(SYSCAL%(28%)) & \ USTAT%(INDEX%)=SYSCAL%(30%) & \ INDEX%=INDEX%+1% & \ GOTO 30 & ! Get filename and filesize for each file in specified account & ! and store in array for processing later. & 40 PRINT "[Optimizing file clustersizes.]" & \ LOG2=LOG(2.0) & \ FOR Z%=0% TO INDEX%-1% & \ IF FILSIZ(Z%)<=7.0 THEN & CLUSIZ%=-1% & ELSE & IF FILSIZ(Z%)>1792.0 THEN & CLUSIZ%=256% & ELSE & CLUSIZ%=2%^INT(LOG(FILSIZ(Z%)/7.0)/LOG2) 50 GOTO 80 IF CLUSIZ%=CLUSIZ%(Z%) & \ IF USTAT%(Z%) AND 174% THEN & PRINT "%Unable to optimize clustersize of "; FILNAM$(Z%) & \ GOTO 80 55 OPEN FILNAM$(Z%) FOR INPUT AS FILE IN.CHN%, & RECORDSIZE 8192%, MODE 8192% & \ OPEN DEV$+NUM1$(UNIT%)+":"+PPN$+"TEMP99.TMP" & FOR OUTPUT AS FILE OUT.CHN%, & RECORDSIZE 32767%+3%, & CLUSTERSIZE -CLUSIZ%, & FILESIZE FILSIZ(Z%), & MODE -64%*((USTAT%(Z%) AND 16%)<>0%) 60 GET #IN.CHN% & \ PUT #OUT.CHN%+SWAP%(IN.CHN%), COUNT RECOUNT & \ GOTO 60 70 CLOSE #IN.CHN%, #OUT.CHN% & \ KILL FILNAM$(Z%) & \ NAME DEV$+NUM1$(UNIT%)+":"+PPN$+"TEMP99.TMP" AS FILNAM$(Z%) & \ PRINT "[Clustersize for "; FILNAM$(Z%); " changed from"; & CLUSIZ%(Z%); "to"; CLUSIZ%; "]" 80 NEXT Z% & \ GOTO 32767 & ! For each file found in the first pass: Compute the optimal & ! clustersize and copy the file to itself if the clustersize & ! needs to be changed. & 30000 IF ERR=5% AND ERL=30% THEN & RESUME 40 30010 IF ERR=11% AND ERL=60% THEN & PUT #OUT.CHN%+SWAP%(IN.CHN%), COUNT RECOUNT IF RECOUNT>0 & \ RESUME 70 30020 ON ERROR GOTO 0 & ! Handle "?Can't find file or account" error at end of Directory & ! Lookup on Index loop. Handle "?End of file on device" error & ! on end of file transfer. All other errors are fatal. & 32767 END  k 2?1 EXTEND ! BADBLK.BAS == Check for bad blocks 2 ! Check any disk type for bad blocks. Hard errors are reported. & ! Soft errors are logged to the error log file. & ! & ! Author: Mike Mayfield, Northwest Digital Software Inc. & ! Created: 1-Apr-85 MEM & ! Modified: 1-Apr-85 MEM & ! & ! Variables Used: & ! BLKCNT% Number of blocks to read during fast read pass & ! BUFSIZE% Number of bytes in disk buffer & ! DSKCHN% Channel number for disk & ! TEMP$ Temporary variable & ! BLKNUM Current large transfer block number & ! BADCNT% Number of bad blocks found & ! TEMP Temporary variable & ! SUBBLK Current small transfer block number (0 if large xfer) & 10 BLKCNT%=50% & \ BUFSIZE%=BLKCNT%*512% & \ DSKCHN%=1% & \ INPUT "Disk to check"; TEMP$ & \ TEMP$=CVT$$(TEMP$,-1%) & \ TEMP$=TEMP$+":" IF INSTR(1%,TEMP$,":")=0% & \ OPEN TEMP$ FOR INPUT AS FILE DSKCHN%, RECORDSIZE BUFSIZE%, MODE 128% & \ ON ERROR GOTO 1000 & \ PRINT & \ PRINT "Checking "; TEMP$; " for bad blocks." & \ BLKNUM= -BLKCNT% & \ BADCNT%=0% & ! Init constants. Ask for disk name. Append a colon if not given. & ! Open the disk with a very large buffer. Print our banner. & 20 BLKNUM=BLKNUM+BLKCNT% & \ PRINT BLKNUM; CHR$(13%); & \ GET #DSKCHN%, BLOCK BLKNUM, COUNT BUFSIZE% & \ GOTO 20 & ! Read using many blocks per transfer to do fast transfers. Print & ! our block number as an odometer while reading. Errors will vector & ! to line 1000 and be handled by the routine at line 30. EOF exits & ! after printing a trailer. & 30 IF SUBBLK=0.0 THEN & TEMP=BLKNUM & ELSE & TEMP=SUBBLK+1.0 & \ PRINT "Bad block found at block:"; SUBBLK & \ BADCNT%=BADCNT%+1% & ! If this is the original entry into this routine, start at the & ! block number for this large transfer. Else, report the bad block & ! error and continue at next block. & 50 FOR SUBBLK=TEMP TO BLKNUM+BLKCNT%-1% & \ GET #DSKCHN%, BLOCK SUBBLK, COUNT 512% & \ NEXT SUBBLK & \ SUBBLK=0.0 & \ GOTO 20 & ! Read all blocks in large transfer one at a time. Errors will & ! vector to line 1000 and from there to line 30 for reporting. & ! When finished, flag that we are not in small transfer mode and & ! continue with next large transfer. & 100 PRINT "Finished. "; BADCNT%; "bad block"; & \ PRINT "s"; if BADCNT%<>1% & \ PRINT " found." & \ GOTO 32767 & ! Print a trailer and finish. & 1000 IF ERR=11% THEN & RESUME 100 & ELSE & IF ERR=13% THEN & RESUME 30 & ELSE & ON ERROR GOTO 0 & ! If error is end of file, go print banner and leave. Else, if error & ! is "?User data error on device" then go check for individual blocks. & ! All other errors are fatal. & 32767 END  2? 1 EXTEND 2 ! TRACE == Trace RDS1.1 Directory Structure Overhead (RSTS/E V8.0) & 3 !VARIABLES & ! UFD.ENTRY%() Current directory entry & ! UFD.MAP%() MFD map of current account & ! BLKBUF$ Current block in cluster & ! DEVNAM$ Disk name & ! FILNAM.1% File name. First 3 characters (RAD50) & ! FILNAM.2% File name. Second 3 characters (RAD50) & ! FILTYP% File type. (RAD50) & ! CUR.BLK% Block number of current block & ! CUR.ENT% Entry number of current entry & ! ENT.TYPE$ Current entry type & ! FLG.MASK% Mask for all but bits <0:4> (flag bits) & 100 DIM UFD.MAP%(7%), UFD.ENTRY%(8%), ENTRY%(16%) & \ UFD.CHN%=1% & \ OUT.CHN%=2% & \ FLG.MASK%=32767%+32753% & \ SEEK.PIC$="\ \ seek to Cluster ###### Sector ## Entry ##" & \ RE.PIC$="###### " & \ PRINT & \ PRINT "File Directory Trace Utility (RDS1.1)" & \ ON ERROR GOTO 30000 & ! Define I/O channels. FLG.MASK% is a constant of 177760(8) used to & ! mask off flag bits from link words. Define PRINT USING pictures. & ! Announce ourselves and trap ^Z on keyboard. & 110 PRINT "Output to "; & \ INPUTLINE Z$ & \ Z$=CVT$$(Z$,39%) & \ Z$="KB:TRACE.TXT" IF Z$="" & \ OPEN Z$ FOR OUTPUT AS FILE OUT.CHN% & ! Open our output file. & 115 PRINT & \ PRINT "File to trace "; & \ INPUTLINE Z$ & \ Z$=CVT$$(Z$,39%) & \ Z$="SY0:"+Z$ IF INSTR(1%,Z$,":")=0% & \ SYS.DAT$=SYS(CHR$(6%)+CHR$(-23%)+Z$) & \ FILNAM.1%=SWAP%(CVT$%(RIGHT(SYS.DAT$,7%))) & \ FILNAM.2%=SWAP%(CVT$%(RIGHT(SYS.DAT$,9%))) & \ FILTYP%=SWAP%(CVT$%(RIGHT(SYS.DAT$,11%))) & \ Z%=SWAP%(CVT$%(RIGHT(SYS.DAT$,5%))) & \ PROJ%=SWAP%(Z%) AND 255% & \ PROG%=Z% AND 255% & \ IF FILNAM.1%=0% THEN & PRINT "?No file name" & \ GOTO 115 120 !ELSE & IF FILTYP%=0% THEN & PRINT "?No file type" & \ GOTO 115 130 !ELSE & IF (PROJ% OR PROG%)=0% THEN & PRINT "?No account number" & \ GOTO 115 150 OPEN MID(SYS.DAT$,23%,2%)+CHR$(ASCII(RIGHT(SYS.DAT$,25%))+48%)+":["+ & NUM1$(PROJ%)+","+NUM1$(PROG%)+"]" AS FILE UFD.CHN% & \ FIELD #UFD.CHN%, 496% AS Z$, 16% AS Z$ & \ GET #UFD.CHN%, RECORD 1% & \ CHANGE Z$ TO ENTRY% & \ UFD.MAP%(Z%/2%)=ENTRY%(Z%+1%) OR SWAP%(ENTRY%(Z%+2%)) & FOR Z%=0% TO 15% STEP 2% & \ CUR.BLK%, CUR.ENT%=-1% & \ SEEK.CNT%, RE.CNT%=0% & ! Get the trace file specification. Convert logicals in filename. & ! Check for required specification arguments. Build RAD50 filename, & ! filetype, and PPN. Open the specified directory. Get the first & ! block of the directory and map the cluster map. Ensure that we & ! do physical I/O on next access. & 200 ENT.TYPE$="UFD" & \ PRINT #OUT.CHN% & \ Z%=FNC.GET.ENTRY%(0%) & ! Set our access type as "UFD". Get the label entry. & 210 Z%=FNC.GET.ENTRY%(UFD.ENTRY%(0%)) & \ IF UFD.ENTRY%(1%)<>FILNAM.1% OR & UFD.ENTRY%(2%)<>FILNAM.2% OR & UFD.ENTRY%(3%)<>FILTYP% THEN & IF (UFD.ENTRY%(0%) AND FLG.MASK%) THEN & GOTO 210 & ELSE & PRINT #OUT.CHN% & \ PRINT #OUT.CHN%, "?File not found after"; SEEK.CNT%; "seek"; & \ PRINT #OUT.CHN%, "s"; IF SEEK.CNT%<>1% & \ PRINT #OUT.CHN%, "." & \ CLOSE #UFD.CHN% & \ GOTO 115 & ! Follow the link to the next entry. If this is not the file we're & ! looking for, try the next entry if there are more, else we failed. & 300 RE.LINK%=UFD.ENTRY%(7%) & \ Z%=FNC.GET.ENTRY%(UFD.ENTRY%(6%)) & \ Z%=FNC.GET.ENTRY%(UFD.ENTRY%(0%)) WHILE UFD.ENTRY%(0%) AND FLG.MASK% & \ UFD.ENTRY%(0%)=RE.LINK% & \ PRINT #OUT.CHN%, NUM1$(SEEK.CNT%); " seek"; & \ PRINT #OUT.CHN%, "s"; IF SEEK.CNT%<>1% & \ PRINT #OUT.CHN%, " to find file, accounting entry, and attributes." & \ PRINT #OUT.CHN% & \ PRINT #OUT.CHN%, "Retrieval entry listing:" & \ ENT.TYPE$="RE" & ! Save the link to the first retrieval entry (RE). Map the accounting & ! entry (AE). Get the clustersize from the AE. Prepare to map the & ! first retrieval entry. Print our banner. & 310 IF (UFD.ENTRY%(0%) AND FLG.MASK%) THEN & Z%=FNC.GET.ENTRY%(UFD.ENTRY%(0%)) & \ RE.CNT%=RE.CNT%+1% & \ PRINT #OUT.CHN% USING "##: ", ENT.NUM%/16%; & \ PRINT #OUT.CHN% USING RE.PIC$, FNU(UFD.ENTRY%(I%)); & IF UFD.ENTRY%(I%) FOR I%=1% TO 7% & \ PRINT #OUT.CHN% & \ GOTO 310 320 !ELSE & PRINT #OUT.CHN%, NUM1$(SEEK.CNT%); " total seek"; & \ PRINT #OUT.CHN%, "s"; IF SEEK.CNT%<>1% & \ PRINT #OUT.CHN%, " with"; RE.CNT%; "retrieval entr"; & \ IF RE.CNT%=1% THEN & PRINT #OUT.CHN%, "y." & ELSE & PRINT #OUT.CHN%, "ies." 330 CLOSE UFD.CHN% & \ GOTO 115 & ! Follow link to next retrieval entry. Print entry number and all & ! values in that entry. Repeat for all retrieval entries then quit. & 1000 DEF* FNC.GET.ENTRY%(LINK%) & ! Fetch next UFD entry & \ SECT.NUM%=(SWAP%(LINK%) AND 240%)/16% & \ ENT.NUM%=LINK% AND 496% & \ CLUST.NUM%=(SWAP%(LINK%) AND 14%)/2% & \ BLOCK.NUM%=CLUST.NUM%*UFD.MAP%(0%)+SECT.NUM%+1% & \ IF BLOCK.NUM%<>CUR.BLK% THEN & GET #UFD.CHN%, RECORD BLOCK.NUM% & \ CUR.BLK%=BLOCK.NUM% & \ CUR.ENT%=-1% & \ SEEK.CNT%=SEEK.CNT%+1% & \ PRINT #OUT.CHN% USING SEEK.PIC$, ENT.TYPE$, & FNU(UFD.MAP%(CLUST.NUM%+1%)), SECT.NUM%, ENT.NUM%/16% 1010 IF ENT.NUM%<>CUR.ENT% THEN & FIELD #UFD.CHN%, ENT.NUM% AS Z$, 16% AS Z$ & \ CHANGE Z$ TO ENTRY% & \ UFD.ENTRY%(Z%/2%)=ENTRY%(Z%+1%) OR SWAP%(ENTRY%(Z%+2%)) & FOR Z%=0% TO 15% STEP 2% & \ CUR.ENT%=ENT.NUM% 1020 FNEND & ! Mask off sector, entry, and cluster numbers. Calculate block & ! number within UFD for specified block. If the block number changed & ! get the new block, ensure that we remap the entry and print our log & ! message. If the entry number changed, map the new entry. & 2000 DEF* FNU(INT.VAL%)=32768.+(INT.VAL% EQV 32767%) & ! Convert unsigned integer to floating point & 30000 IF ERR=11% AND (ERL=110% OR ERL=115) THEN & RESUME 32767 & 30010 IF ERR=2% AND ERL=150% THEN & PRINT "?Can't find file or account: "; Z$ & \ RESUME 115 & 30999 ON ERROR GOTO 0 & ! Trap ^Z on keyboard input. All other errors are fatal. & 32767 END y: 2?DEF M WIDTH_132 I=WIDTH_132 DEF K GOLD CONTROL W AS "EXT WIDTH_80." SE WR 130 SE SC 132 ^Z DEF M WIDTH_80 I=WIDTH_80 DEF K GOLD CONTROL W AS "EXT WIDTH_132." SE WR 78 SE SC 80 ^Z DEF K 0 AS "(ADV C)." DEF K 1 AS "(BACK C)." DEF K 2 AS "(L)." DEF K 3 AS "ADV CHGCSR." DEF K 4 AS "(W)." DEF K 5 AS "(PAR)." DEF K 7 AS "(SEN)." ! PF 2 DEF K 10 AS "(PAGE)." ! GOLD PF 2 DEF K 32 AS "(BACK PAGE ADV 54L ^L ^M)." DEF K GOLD 2 AS "(EL)." DEF K GOLD 5 AS "(ADV SEL PAR FILLSR)." DEF K GOLD B AS "ER BACK." DEF K GOLD F AS "EXT EX." DEF K GOLD G AS "EXT INC ?'File to get: ' = MAIN.." DEF K GOLD H AS "HELP." DEF K GOLD I AS "EXT INC ?'Input file: ' =?' Buffer: '." DEF K GOLD L AS "EXT F=LIB ;CO '<>'+1:'<<'-1 TO L." DEF K GOLD M AS "EXT F=MAIN.." DEF K GOLD N AS "EXT F=?'Buffer: '.." DEF K GOLD O AS "EXT WR ?'Output file: ' =?' Buffer: '." DEF K GOLD P AS "^L ^M." DEF K GOLD Q AS "EXT QUIT/SAVE." DEF K GOLD R AS "SEL PASTE=RULER." DEF K GOLD S AS "EXT SH BU." DEF K GOLD T AS "BR ADV." DEF K GOLD U AS "DEFK." DEF K GOLD , AS "'?'Search for: ''." DEF K GOLD . AS '"".' ! GOLD ' = Replace DEF K 110 AS "CUTSR=DELETE PASTE." DEF K GOLD ; AS "(CUTSR=DELETE PASTEKS'')." ! GOLD ENTER = Search for > DEF K 43 AS '">"+C.' ! RIGHT ARROW DEF K 14 AS "CUTSR." ! LEFT ARROW DEF K 15 AS "PASTE." ! DOWN ARROW = Delete DEF K 13 AS "D+C." DEF K GOLD CONTROL L AS "EXT INC LB:LIB.EDT =LIB;F=MAIN.." DEF K GOLD CONTROL P AS "(+PAGE D-C D+C)." DEF K GOLD CONTROL W AS "EXT WIDTH_132." SE NOWRAP SE MODE CHANGE F=MAIN Xl^2? .ROOT BASIC2-RMSROT-USER,RMSALL USER: .FCTR SY:CBDUMP-LIBR LIBR: .FCTR LB:BP2COM/LB @LB:BP2IC4 @LB:RMSRLX .END z2?TAPE ID = 'CB' TAPE FORMAT: ANSI / 1600BPI Name .Typ Size Date MM0: README.1ST 2 27-Aug-82 ;INITIAL DOCUMENTATION CB .DOC 95 27-Aug-82 ;CB USER MANUAL, INSTALLATION GUIDE CB .B2S 160 27-Aug-82 ;CB SOURCE CB .CMP 1 27-Aug-82 ;CB INITIAL TKB CONTROL FILE CB .CMD 1 27-Aug-82 ;CB FINAL TKB CONTROL FILE CBHLP .DOC 8 27-Aug-82 ;CB /HELP FILE CB .HLP 31 27-Aug-82 ;CB HELP FILE FOR RSTS HELP FACILITY CB .REF 10 27-Aug-82 ;CB REFERENCE CARD CBLIB .MAC 3 27-Aug-82 ;CB COMMON AREA RESIDENT LIBRARY SOURCE ST2NM .MAC 4 27-Aug-82 ;BP2 CB CALLABLE SUBROUTINE SOURCE ST2NM .OBJ 1 27-Aug-82 ;BP2 CB OBJECT OF SUBROUTINE RESSTB.TSK 103 27-Aug-82 ;COPY OF BP2 INSTALLATION TAPE UTILTY CB .DOC 95 27-Aug-82 ;COPIES OF ABOVE CB .B2S 160 27-Aug-82 ; CB .CMP 1 27-Aug-82 ; CB .CMD 1 27-Aug-82 ; CBHLP .DOC 8 27-Aug-82 ; CB .HLP 31 27-Aug-82 ; CB .REF 10 27-Aug-82 ; CBLIB .MAC 3 27-Aug-82 ; ST2NM .MAC 4 27-Aug-82 ; ST2NM .OBJ 1 27-Aug-82 ; RESSTB.TSK 103 27-Aug-82 ; CB .DIR 3 27-Aug-82 ;DIRECTORY (ANNOTATED) of this tape Total of 839 blocks in 24 files in MM0:[*,*] (CB ) |2?CB/MU,CB=CB,ST2NM,LB:BP2COM/LB / TASK=..CB.. RESLIB=LB:CBLIB/RW UNITS=12 // X|2? 1 PRINT "CBDUMP - Dump CB resident library" \ PRINT & 2 INPUT "Dump only active slots ";DOPT$ & \ DOPT$="Y" if dopt$="" & \ DOPT$=left(DOPT$,1%) & \ goto 2 if dopt$<>"Y" and dopt$<>"N" & 5 DIM ARY%(64%) & 7 COMMON (CBLIST) COMMON.IN.USE%, & COMMON.INIT%, & CB.CLOSED%, & CHANNEL.USED%(40%), & CHANNEL$(40%)=64%, & HANDLE$(63%)=12%, & TTY.WIDTH%(63%), & TALK.CHAN%(63%), & CB.PROJ%(63%), & CB.PROG%(63%), & JOB.FLAGS%(63%), & CB.PASS$(63%)=6% & 10 PRINT CHR$(12%); & \ PRINT "Common in use: ";COMMON.IN.USE% & \ PRINT "Common init flag: ";COMMON.INIT%;" ", & \ PRINT "(Initialized)"; if common.init% = 378% & \ PRINT "(Init in process)"; if common.init% = 991% & \ PRINT "(Init required)"; if common.init% = 457% & \ print & \ PRINT "CB closed flag: ";CB.CLOSED%, & \ print "(Open)" if cb.closed% = 0% & \ print "(Closed)" if cb.closed% <> 0% & \ PRINT & 30 PRINT "User Statistics:" \ PRINT & \ ANY.USERS%= 0% & \ PRINT "CB user","Width","Handle", & "Talk","Proj","Prog","JobFlags","Password" & \ for y=1 to 63 & \ goto 35 if (dopt$="Y") and (cb.proj%(y)=0%) & \ print "#";Y," ";TTY.WIDTH%(y),HANDLE$(y); & TAB(30%),TALK.CHAN%(y),CB.PROJ%(y), & CB.PROG%(y),JOB.FLAGS%(y),cb.pass$(y) & \ any.users% = -1% & 35 next y \ print "No Users" if any.users%=0% \ print & 40 PRINT "Channel Statistics: " \ PRINT & \ ANY.CHANNELS% = 0% & \ PRINT "Channel","Channel Used Flg",,,"Channel Values" & \ FOR y=0 to 40 & 50 goto 85 if (dopt$="Y") and (channel.used%(y)=0%) & \ CHANGE channel$(y) to ary% & \ PRINT y," ";channel.used%(y),TAB(33%); & \ c=0% & \ any.channels% = -1% & 55 for z=1 to 63% & 60 c=c+1 & \ if c>20% then c=1% \ print \ print tab(33%); & 70 print FNDG2$(ary%(z));" "; & \ NEXT Z & 80 print \ print & 85 next y & \ print "No Channels In Use" if any.channels%=0% & \ print chr$(12%); & \ goto 32767 & 32700 DEF* FNDG2$(ARG%) & \ ARG$ = NUM1$(ARG%) & \ ARG$ = "0" + ARG$ IF ARG%<10% & \ FNDG2$ = ARG$ & \ FNEND & 32767 end 82?CBLIB/-HD/PI,CBLIB,CBLIB=CBLIB / ; ;NOTE: STACK=0 Is VERY IMPORTANT Or All Preinitialized ; Data In Macro CLIB.MAC Will NOT Work..... ; STACK=0 // #42?CB=CB,LB:BP2COM/LB / TASK=..CB.. RESLIB=LB:CBLIB/RW UNITS=12 // &`2?; ; THIS IS THE INITIAL TASK BUILD COMMAND FILE TO DETERMINE ; THE OTS ROUTINES USED BY CB FROM BP2 ; ; DO **NOT** RUN CB AFTER THIS TSK BUILD FINISHES, FOLLOW ; THE INSTALLATION PROCEDURE!!! ; ; PJH 03/10/82 OLFBP (614)864-9200 ; CB,CB=CB,ST2NM,LB:BP2COM/LB / TASK=CBBAD UNITS=12 // zYkQ2? .TITLE ST2NM ;============================================================== ; ST2NM - STRING TO ARRAY CONVERSION ROUTINE ; ; WILL CONVERT A 64 CHARACTER STRING TO A 64 WORD AREA ; USUALLY SET UP AS A 64 ITEM INTEGER ARRAY, ESSENTIALLY ; DOING A CHANGE BASIC CALL ; ;============================================================== ; ; This software is furnished under a license and may ; be used and copied only in accordance with the ; terms of such license and with the inclusion of ; the above copyright notice. This software or any ; other copies thereof may not be provided or other- ; wise made available to any other person. No title ; to and ownership of the software is hereby trans- ; ferred. No SOURCE code can be copied. ; ; The information in this software is subject to ; change without notice and should not be construed ; as a commitment by the author. ; ;============================================================== .PSECT ST2NM,I,RO .IDENT /PJH016/ ; ST2NM:: MOV 2(R5),R1 ;ADDR OF INPUT STRING MOV 4(R5),R2 ;ADDR OF OUTPUT ARRAY ADD #2.,R2 ;SKIP THE ZERO POSTION OF ARRAY MOV #64.,R0 ;NUMBER OF BYTES TO MOVE ; MLOOP: CLR R3 ;MAKE SURE WORK ARRAY IS CLEAR MOVB (R1)+,R3 ;MOVE THE BYTE OF DATA MOV R3,(R2)+ ;AND PUT IN ITS PLACE AS A WORD SOB R0,MLOOP ;DO AGAIN ; RTS PC ;WE FINISHED ; ;----------------------------------------------------------------- ; .PSECT NM2ST,I,RO .IDENT /PJH016/ ; ;CONVERT ARRAY TO STRING ; NM2ST:: MOV 2(R5),R1 ;ADDR OF OUTPUT STRING MOV 4(R5),R2 ;ADDR OF INPUT ARRAY ADD #2.,R2 ;SKIP THE ZERO POSTION OF ARRAY MOV #64.,R0 ;NUMBER OF BYTES TO MOVE ; CLOOP: MOV (R2)+,R3 ;GET THE DATA MOVB R3,(R1)+ ;PUT IT BACK SOB R0,CLOOP ;DO AGAIN ; RTS PC ;WE FINISHED ; .END &`[2? CB - Citizens Band Radio Emulator - Version 02.02 08/27/82 ================================= Philip Hunt O.L.F.B.P 6400 E. Broad Street Columbus, Ohio 43213 (614)864-9200 NOTE> NOTE> NOTE>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> THIS DOCUMENTATION IS FOR VERSION 2.02 OF CB USING BP2 V1.6 FOR COMPILE. IT IS PROVIDED FOR COMPLETENESS ONLY. THE INSTALLATION SECTION OF THIS MANUAL WAS REWRITTEN FOR V2.1 OF BP2 AND RSTS V8.0. THE V1.6 BP2 VERSION OF CB (V2.02) IS STORED IN FILE CBV16.B2S AND SHOULD BE RENAMED TO CB.B2S TO USE THIS MANUAL. >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Description: ------------ CB is a very versitile program running in 2-3K of user space that will allow any users on the system to communicate with each other as they would on a citizen's band radio. A 'Talk' channel is used to send messages to anyone currently 'Monitoring' that channel. A user may monitor any or all of the 40 'channels' avail- able, but may only talk on one. Note that channel 40 is a privileged-only channel and may not be used by non-privileged users. Commands are defined to allow the user to change talk channels, monitor and unmonitor channels, list users by user or by channel, set 'Restricted' messages that will only be recieved if the sender and reciever (or recievers) have the same password set, etc. A user may even execute system commands while still in CB through the use of a FG/BG (Foreground/Background) arrangement. Note: CB will NOT execute correctly on systems before RSTS V7.0 because shared resident library support is required. Program Entry: -------------- When the user enters the program, they must enter a 12 character 'handle' that will be transmitted everytime he sends a message. The prompt for sending messages is a 'T' with the channel number you are currently talking on included, example: 'T19>' would mean you are currently talking on channel #19. If an extra bracket ('>') is included in the prompt, it would indicate that the user has a password set for his messages and that only people with the same password will recieve them. For entry by CCL, see CCL/LOGGED-OUT formats. CB will execute a command file called 'CB.INI' in the users' account for start-up initialization changing CB standard defaults. If the command file does not exist, no error is generated at start-up. As noticed, anything not beginning with a '/' are sent to other CB users on the users current TALK channel. The slash indicates a command entry. Note: If a blank line is entered (i.e., a carriage return is struck without any other user entry), CB will print its' version number and return for more commands/messages. On RSTS v7.1 (or later), if a terminal has a 'SET GAG' executed, then CB will set the terminal to NO GAG, when CB is exited, it will reset the terminal to GAG. Commands: --------- /TALK Chnl# This command will change the channel the user is currently transmitting on. When the user first enters CB, the channel will be set to 19. Valid channels are 01-40, any other entry will give an error message. The channel that is set for Talk will cause all messages sent to be recieved by any user currently monitoring that channel unless a password has been set (See /RESTRICT). Note: When changing Talk channels, the previously set Talk channel will still be marked for monitor. Also note that channel 40 is special and may only be used by a privileged user [1,*]. /MONITOR Chnl#,Chnl#,....,Chnl# This command will allow the user to monitor multiple channels. When the user first signs into CB, he will only be monitoring channel 19. Valid channels are 01-40, any other entry will cause an error message for that channel, but all other entries on the command line will be processed. If the channel number is entered as negative, then the channel specified will be 'UNMONITORED'. Note: You cannot unmonitor your current TALK channel. Also note that channel 40 is special and may only be monitored by a privileged user [1,*]. /RESTRICT nnnnnn Restrict allows a user to set a password up to 6 characters long. When a password is set, the users' messages will only be sent to other users monitoring the channel that have the same password set. This allows private messages to be sent. Note: Privileged users can obtain Restrict passwords (See /List) and can recieve Restrict messages (See /Spy). Messages with this set will have the word 'SECRET' appended to the message (See Message Formats). If password is turned on and no password is entered, the password will be set to the first 6 characters of the entered command. If the password entered is greater than 6 characters, the first 6 will be used. /BROADCAST [Chnl#] <> This command will allow a user to send a message to any valid channel ignoring the sending users' password protection. If channel is specified, then the message will be sent to that channel, otherwise, the message will go to your current Talk channel. This command is useful if you would like to send one message to everyone on your channel, but would like to keep most of your messages 'Private'. /XEQ [command] This command will activate/deactivate Background (BG) processing. If entered without the command and the user has activated BG, then BG will be turned OFF. If entered without the command and BG has not been activated, it will be activated. Once activated, more /XEQ commands can be entered to execute. anything that is legal to be entered at a terminal may be entered to BG mode. I.E. You can do SYSTAT, enter a new program, edit a file etc. If your BG job generates large amounts of output, you may ^C (Control/C) interrupt the background job. THIS WILL ONLY WORK WHILE IN BG OUTPUT MODE, if entered at other times, CB will be exited. Note: If command entered is '<>', it will be translated to NULL line (i.e. only), it a line contains anything of the form '^n' where 'n' is a letter, that combination will be translated to CTRL/n. To override this, the user must append an underscore ('_') to the control sequence. If the user would like to send an underscore, they must enter 2 underscores which will translate to 1. Also note that if the BG job does not enter a KB wait or I/O state within appoximately 10 seconds, the user will be placed back in CB command mode. A scan for BG I/O will occur appoximately every 3 seconds. This scan will be invisible to the user as he may enter CB commands during these scans. Only when I/O is found, will the user be interrupted to show this I/O. If the BG job is running, then any attempt to send a command to the background (except '/XEQ ^ctrl/char') will cause an error and the command will NOT BE SENT. Note that '/XEQ ^C' will interrupt the BG and cause it to enter KB state. $ (ESCAPE KEY) The escape key allows the user to enter or exit a 'locked' background environment. This environment is equivalent to an ATPK run using KB: for input file. If currently in locked background mode, another entered Escape character will unlock the background, BUT LEAVE BG mode open allowing for re-entry by entering another escape. NOTE: Control characters such as CTRL/C, CTRL/T, CTRL/Z should be entered as 'uparrow letter' (^n) to be recognized as background control characters, otherwise, it is possible that they might be interpreted as forground control. To send a message while in 'locked' mode, append 2 periods ('..') to the beginning of the message, they will be removed and the message sent on your talk channel. Note: You may also execute CB commands by entering '../command' as you can think of '..' as a reverse-shift. /CALL Kb# This command will send a message to the specified terminal currently NOT running CB, to request that they do run CB. The message sent is o f the form: **CB - User: Handle - Please enter CB on Channel #n** where: Handle is the current user NAME n is the current users' TALK channel NOTE: If the specified job is already in CB, an error message is generated and the message is not sent. /TIME /DATE These commands will display the current date and time. This is useful when using CB for an extended period of time. /KB KB will toggle a bit in the user flag word allowing him to recieve KB numbers when a message is recieved by him (See Message Formats). The default for this is 'OFF'. /PPN PPN will toggle a bit in the user flag word allowing him to recieve user PPN numbers when a message is recieved by him (See Message Formats). The default for this is 'OFF'. /JOB JOB will toggle a bit in the user flag word allowing him to recieve JOB numbers when a message is recieved by him (See Message Formats). The default for this is 'OFF'. /UPPER Toggles the user flag word informing CB to start or stop translate all MESSAGES (sent or recieved) to UPPER case. The default for this is 'OFF'. /AT or @ Process commands from the file entered. Note that anything that is not a command (beginning with '/') or a comment is executed as a message as if it was entered at the terminal. A comment is valid ONLY in a command file and is ignored. A comment begins with ';' or '!'. These are useful in the file to comment steps in the procedure. /WIDTH n This command sets the terminal message wraparound at character n. The default for CB is a wraparound at position 78. All characters after position 78 or a set value will be displayed on subsequent lines with '--> ' prepended. If 'n' is not specified, then current width is displayed. Note: The minimum width allowed is 28 and the maximum is 133. Also, if the current width is set less than the number of characters required to display at least all header options requested (/KB,/PPN etc.), width is set to 78 until an one or more options are toggled 'OFF'. /LIST [Job#] List all users currently using CB. A list of their TALK channel, channels they are monitoring, their 'Handles', Job #, KB #, User PPN and JOB attributes (See Attributes) are listed. If you are currently privileged, then any currently set Restrict password is also printed. If the job listed is attached to a dial-up line, a star is appended to the KBnn: display. Note: If Job# is entered, then the listing will be only for that Job#. /WATCH [Chnl#] This command will give a list of users currently monitoring a channel. Their KB#, Job #, Handles and Job attributes are printed. If the job listed is attached to a dial-up line, a star is appended to the KBnn: display. If Chnl# is not entered, then the list will be entered for the current Talk channel. Note: If /Watch is entered as a CCL command, then a Chnl# MUST be specified (See CCL/LOGGED-OUT formats). /HELP Prints a Help message for CB. It is very similar to the reference card in format. /EXIT (^Z, ^C) Exit CB. Note: ^Z and ^C act as if an /EXIT command has been entered. If the user has opened a BG job, that job will terminate in an orderly fashion. **Privileged ONLY commands:** These commands, when executed by a non-privileged user, will generate an error message, and NOT be executed. /SPY Toggles a bit in the user job attributes that allows a privileged user to recieve Restrict messages even though he might have no password or a different password set. The default is 'OFF'. a message recieved by /SPY being set will have '+SPY+' appended to it. /KILL Job# Clear the job specified from CB and kill the job. A check is made to be sure the job specified is in CB. A message is sent to the JOB (Unless detached) informing him that his job has been killed, and all users recieve the 'Leaving CB' message with the phrase '(Involuntarily)' appended to it (See Message Formats). THIS COMMAND SHOULD BE USED TO KILL A CB JOB, NOT THE RSTS 'UTILTY' COMMAND. UNDER NORMAL CIRCUMSTANCES, CB WILL CORRECT ITSELF on the next item sent across the CB network if UTILTY KILL is used though, there is no need to worry!! /OPEN Opens CB to allow non-privileged users access to CB. /CLOSE Closes CB from usage by non-privileged users. /DETACH Detach from current Keyboard. This allows a user to change keyboards or leave CB for a while without having to exit and then enter CB again. /ALL text Send a message to ALL CB users on all channels, the message part usually displayed as 'Cxx' or 'Bxx' indicating channel number is replaced by the string 'OPR' Start-Up Switches: ------------------ Certain switches may be entered to CB while entering the user Handle. They are as follows: /DBG (PRIV) - Allows a privileged user to recieve all internal data as CB executes a command. This is 'debug'. Note: All debug logic and the command are commented out on the distributed source to save program space. they must be uncommented to execute this command. /CLR (PRIV) - Allows a privileged user to clear the CBLIB area of memory if it ever gets corrupted. ALL USERS SHOULD HAVE /EXITed CB BEFORE THIS IS EXECUTED or BEWARE!!! /HIDE (PRIV) - Allows a privileged user to enter and exit a current CB session without the startup/exit messages sent to all users that normally occur. These commands MUST be entered when the CB handle is requested in the form: What is your handle? HANDLE/COMMAND This will satisfy the CB parsing algorithms. Note in the '/CLR' command, the handle is ignored and reprompted when the command is complete. Note: These commands may NOT be entered as part of a CCL entered handle. Attributes: ----------- Job attributes associate special processing modes with a specific job. Special modes cause different forms of the broadcast header to be displayed upon recieving a message. The mode or attributes set cause different information to be displayed (See Message Formats). Message Formats: ---------------- Messages recieved are displayed in different formats depending on the Job attributes set. See below for description: #DBG#+SPY+SECRET (Cxx/KBxxx:*[PPN]HANDLE#xx) Message text here ! ! ! ! PnnJjj ! ! ! ! ! ! ! ! ! ! ! ! +----Message sent. Note: If ! ! ! ! ! ! ! ! Message is too long to ! ! ! ! ! ! ! ! fit on 1 line of output ! ! ! ! ! ! ! ! terminal screen, it is ! ! ! ! ! ! ! ! broken into multiple ! ! ! ! ! ! ! ! messages, with a '->>' ! ! ! ! ! ! ! ! prepended to the ! ! ! ! ! ! ! ! remaining message text. ! ! ! ! ! ! ! +------------Job sending message. ! ! ! ! ! ! ! This can be displayed ! ! ! ! ! ! ! if /JOB is toggled ON. ! ! ! ! ! ! +------------------Sending Jobs' handle ! ! ! ! ! +----------------------Job PPN sending Msg. ! ! ! ! ! This can be displayed ! ! ! ! ! if /PPN is toggled ON ! ! ! ! +-----------------------------Job KB# sending Msg. ! ! ! ! This can be displayed ! ! ! ! if /KB is toggled ON. ! ! ! ! If the KB is on a ! ! ! ! dial-up line, the star ! ! ! ! shown is displayed. ! ! ! +----------------------------------Channel message sent ! ! ! on (xx), If message ! ! ! sent by broadcast, ! ! ! then Bxx is displayed ! ! ! If message is sent by ! ! ! /ALL then OPR is ! ! ! displayed ! ! +-----------------------------------------This is displayed if ! ! the message sent has ! ! the /RESTRICT option ! ! set. ! +----------------------------------------------This is displayed if ! the message is sent ! with the /RESTRICT ! option, but recieved ! with the /SPY option ! set, which is ! privileged. +---------------------------------------------------Debug message display, Currently commented out of the CB source code, therefore never displayed. System Messages =============== CB system messages are also sent when a user enters or exits CB. The format for CB system messages is: **<<>>** CB data requests are not preceded by the '**' characters. The format for CB data requests is: ? --Answer in response-- A complete list of possible messages/requests follows: %Initializing CBLIB This is an informative message that the resident common library has just been loaded and is being initialized to empty by the first user requesting CB. It will also occur if the internal /CLR option when Handle requested is invoked. Handle ? CB is requesting the 12 character phrase to call your CB job when sending a message. %%Debug ENABLED The internal option /DBG has been invoked. This will allow a programmer to see the internal workings of CB for debug purposes. Note '/DBG' is commented out of the source to save memory area, it must be enabled by removing comments and recompiling. **CB is closing, please finish up** An operator is currently shutting down CB, no new users are allowed to access CB, please use a '/EXIT' command as soon as possible. **CB - Vxx.xx** If in talk mode and a carriage return only is entered, CB will display its version number x.xx where this represents a number. **Now talking on channel xx A /TALK command has been executed and all future transmissions will occur on channel xx until another /TALK command is executed. **All channels except xx reset** A '/MON -' has been executed, resetting all channels currently being monitored. The channel xx is your current Talk channel and has not been reset. **Now monitoring channels: xx,yy,zz....,nn When a /MONITOR command is executed, a display of all channels currently being monitored is shown. No users on this channel A /WATCH command has been executed in which no users are currently using the channel specified. No users A /LIST command has been executed, and there currently are no users on CB Really CLEAR job # xx ? A /KILL command has been executed, and the specified job 'xx' is currently using CB. This is a request to verify that you will kill that job. /KILL aborted! A /KILL has been executed, and anything but 'Y' has been entered to the verification request. The specified job has NOT been killed. **!!Your Job has just been cleared from CB by the operator!!** A /KILL has been executed by an operator that killed this users' job. **Job # xx KILLed** A /KILL has been executed and job xx has been cleared from CB and killed off the system. This message will show up on the terminal of the user (operator) who did the /KILL command. **CB - User: HANDLE - Enter CB on Channel # xx** A /CALL command has been executed by a CB user transmitting under the name 'HANDLE' and currently transmitting on channel # xx. That user would like the user on the recieving job to enter CB and talk to them. **Request sent** A /CALL has been executed successfully and a message has been sent to the specified keyboard. **Width set to xx** A /WIDTH command was entered and the current width is now 'xx' for wraparound. **BG ON** A /XEQ command has been executed by the user for the first time this session. **BG OFF** A /XEQ command has been executed with no command, while the user was already in active BG mode. BG has been turned OFF or an /EXIT or ^Z or ^C has been entered by the user and one or more BG jobs are currently in use. They will be shutdown in an orderly fashion as if a blank /XEQ command was entered for each BG job. **BG has no I/O** A BG job has started the execution of a program and has not displayed any I/O for about 15 seconds. The user is placed back in CB command mode and a scan is made on the BG job every 5 seconds for I/O. **KB On** The /KB toggle has been set allowing a user to recieve KB numbers on messages transmitted. **KB Off** The /KB toggle has been reset. **SPY On** The privileged /SPY has been set. This allows messages normally requiring a /RESTRICT password to be transmitted to this operator job even though no /RESTRICT is set for the operator. **SPY Off** The privileged /SPY has been reset. **PPN On** The /PPN toggle has been set allowing a user to recieve PPN numbers on messages transmitted. **PPN Off** The /PPN toggle has been reset. **UPPER ONLY On** The /UPPER toggle has been set. This allows a given user to send and recieve in only UPPER CASE. Normal system messages though are not translated. **UPPER ONLY off** The /UPPER toggle has been reset. **JOB On** The /JOB toggle has been set, allowing a user to recieve job numbers along with messages. **JOB Off** The /JOB toggle has been reset. **Password on** A /RESTRICT toggle has been set and the specified password has been set, if none specified, first 6 characters of the command line are used. If password entered was too long, the first 6 characters are used. **Password off** A /RESTRICT toggle has been reset. The users password field has been cleared. **Detaching from terminal** A privileged /DETACH has been executed, detaching a CB job from its' terminal. **dd-mmm-yy at hh:mm xm** A /TIME or /DATE has been executed showing the current Date (DD-MMM-YY) and Time (HH:MM xM) **CB open** The operator '/OPEN' command has been executed. **CB closed** The operator '/CLOSE' command has been executed. Error Messages ============== CB error messages are printed when an error in encountered in the execution of a CB command. Their format is as follows: **??<>** A complete list of possible error messages follows: **??Login PLEASE??** CB has been entered as a logged out command with a specified Handle. A logged-out user may only execute certain commands, but may not talk through CB unless they login first. **??Invalid [CCL], Type '/HELP'??** An illegal command has been entered. Certain valid commands are invalid during CCL entry and these will be flagged with the 'CCL' specified in the message. **??12 character max??** This message will occur if you enter more than 12 characters for your user Handle. **??'Handle' IN-USE??** A user entered a valid Handle to CB, but it is in currently in use, enter another. **??Illegal Channel??** A bad channel number was entered as an argument to a command requiring a channel as an argument. (I.E. /TALK 42 or /TALK C) **??Already monitoring channel xx??** A /MONITOR xx command was executed, but the user is already monitoring the channel xx specified. **??Not monitoring channel xx??** A /MONITOR -xx command was executing trying to UNMONITOR the channel xx, but the user is not currently monitoring that channel. **??Illegal MONITOR channel 'xx'??** A /MONITOR xx command was executed with xx being a bad channel number, i.e. /MONITOR 42 or /MONITOR C. **??Cannot UNMONITOR your TALK channel??** A /MONITOR command was entered with the users current TALK channel specififed for UNMONITOR. This is illegal. **??Illegal channel specified??** A /WATCH command was executed with a bad channel number specified. **??40 - ??Privileged Operation??**" A /TALK or /MONITOR command was executed with channel 40 specified as the argument by a non-privileged user. Channel 40 is reserved for privileged users ONLY!! **??CB is CLOSED??** CB has been closed by an operator. Ask the system manager to open CB for normal processing. **??Illegal Job number??** A /KILL or /LIST command was entered with a bad job number, i.e. /KILL 67 or /KILL C. Job numbers may only be 1-63. **??Job not in CB??** A /KILL was entered with as valid job number, but that job is currently not using CB, therefore, it cannot be CLEARED. **??No BG available??** All Background devices are currently in use or there were no Pseudo-keyboards generated during RSTS system generation. If pseudo-keyboards are available to the user, try the command again later. **??BG busy??** A '/XEQ [command]' has been attempted, but the Background job is currently executing a program and cannot recieve any commands at the moment, try again later or send a '/XEQ ^C' command to interrupt the BG program in progress. **??No HELP AVAILABLE??** The CB help file 'CBHLP.DOC' cannot be found in the account that CB resides in or is protected against the current user. See system manager. **??Bad KB number specified??** A /CALL xx command was entered with a bad Keyboard number, it could be out of range 0-127 or it might not exist on the system. **??KB specified already in CB??** A /CALL was entered with a valid keyboard number, but that keyboard is already using CB, so a /CALL would not be appropriate. **??Nothing to send??** A /ALL command was executed with no message specified to send to all users. **??Privileged operation??** The specified command is legal but is a privileged command and the current user is not privileged. (i.e. [1,*]). **??Job detached-Cannot /KILL ??** The job specified is currently executing CB, but is detached and therefore cannot be /KILL ed. **??BG aborted??** The background job this user was attached to was logged out, either by the user logging it out or by an operator killing the job. **??Bad File??** A '/AT' or @ command was executed with a file that could not be opened. **??Multiple indirect NOT allowed??** Only one indirect command file may be opened at a time. therefore, the '/AT' or @ in your indirect file has been ignored. ??SPR - No OPN A fatal system error has occured, CB tries to recover by executing a /EXIT but recovery might not be complete. This error should never occur. ?CB - FATAL ERROR - AT xxxxx A fatal system error has occured, CB tries to recover by executing a /EXIT but recovery might not be complete. This error should never occur. Sign-On/Off Messages ==================== When a new user signs on to CB, all current CB users recieve a message informing them of that fact. The CB sign-on messages appear as follows: **New User - Job #xx (HANDLE) has signed on to CB** Where: xx = The new users' job number HANDLE = The new users' Handle When a CB user signs off of CB, all current CB users recieve a message informing them a user has left CB. The CB sign-off message appear as follows: **User #xx (HANDLE) is [leaving] CB [(Involuntarily)] ** [ABORTING] [DETACHING] Where: xx = The users' job number HANDLE = The users' Handle The message will contain either 'leaving' or 'ABORTING from' depending on the conditions of the users exit. The 'ABORTING from' means a system error has occurred in that users' CB job and the library 'CBLIB' may or may not be corrupt. The 'ABORTING from' message should never occur and it has not occurred since release V0.01. Due to improved recovery, even if it occurs, there is very little chance that it will affect any user but the one listed. The 'Detaching' message is a special case that only occurs when CB is executed on a 'dial-up' line. Under certain unusual RSTS timing errors, I/O may be queued for a terminal that detaches due to dial-up line carrier lost. Most occurances of this will cause CB to go into 'HB' state and mark the job detached, recovering where it left off when 'attached' to. If this is not possible, the job is closed orderly by CB, then killed. The '(Involuntarily)' messages occurs when a user is being KILLed by the operator with the /KILL command. When the /CALL command is used, the following message is sent to the keyboard specified: **CB - User: HANDLE - Please enter CB on Channel # yy** Where: HANDLE = The handle of the user using /CALL yy = The channel that user is currently Transmitting on. CCL/LOGGED-OUT Formats: ----------------------- CB can be set up by the operator to be called by CCL for certain functions (See Installation for installation instructions). Commands that are valid through CCL are: /LIST - list jobs on CCL /WATCH n - Watch jobs on a certain channel. Note: For CCL, channel number MUST be specified. /HELP - Display help message /KILL xx - PRIV - Kill a job in CB, user must be privileged to do this. /TIME - Display current Date/Time /OPEN - Open CB for non-privileged use (PRIV only). /CLOSE - Close CB for non-privileged use (PRIV only). CB may also be entered with the HANDLE in place of the command. Example: CB LONESTAR will enter you into CB with the handle set to 'LONESTAR'. Note: If CB is set up to be entered logged-out (See Installation), all CCL commands are valid EXCEPT entering CB with a 'handle' set, /OPEN, /CLOSE which give an error messages. Installation: ------------- CB is designed to be executed by many users at a time. Therefore, the following method will allow CB to use the least amount of user memory possible, while sharing the code/ data areas that are non-volatile. CB requires certain options be present in the RSTS environment to execute: A) Resident library support be present B) RSX monitor emulation be present in the monitor If either of these options are not present, than CB will not run correctly. NONE OF THE FOLLOWING STEPS SHOULD GENERATE AN ERROR, IF THEY DO, A PROBLEM HAS DEVELOPED THAT MUST BE SOLVED BEFORE PROCEEDING!!! The CB command '/XEQ' will not be allowed if the current RSTS system was generated with NO pseudo-keyboards. Any attempt to use the /XEQ command will generate the '**No BG available**' error message. 1) Obtain the following files for installation: CB.B2S , CB.CMP, CB.CMD, CBLIB.MAC, ST2NM.MAC, CBHLP.DOC, CB.HLP If the command files are not available, the following files may be entered under the names specified : **CB.CMP** **CB.CMD** CB,CB=CB,ST2NM,LB:BP2COM CB/MU,CB=CB,ST2NM,LB:BP2COM/LB / / TASK=CBBAD TASK=..CB.. UNITS=12 RESLIB=LB:CBLIB/RW // UNITS=12 // 2) Macro assemble ST2NM: RUN $MAC MAC>ST2NM=ST2NM MAC>^Z 3) Compile CB using Basic-Plus 2: RUN $BASIC2 OLD CB.B2S COM/OBJ/LINE/CHAIN 4) TKB the resulting file: TKB @CB.CMP 5) Look at the Task Builder map (CB.MAP) for the section marked BP2OTS, all names under this section will be built into CBLIB, the communications library. This causes all the BP2 code segments to be shareable. The names you find under the section above will be used later. SAVE THE MAP ON HARD-COPY!! 6) Macro assemble the communications library: RUN $MAC MAC>CBLIB=CBLIB MAC>^Z 7) Enter a file named CBLIB.CMD consisting of the following: CBLIB/-HD/PI,CBLIB,CBLIB=CBLIB LB:BP2COM/LB:?????? LB:BP2COM/LB:?????? +---------------------------+ LB:BP2COM/LB:?????? !Note: These ?????? are to ! " !be replaced by the names ! " !found in step 05 above. ! " !There are about 60 of them ! LB:BP2COM/LB:RQLCB !all starting with '$' ! LB:BP2COM/LB:SAVRG !EXCEPT the last TWO. ! / !NOTE: These MUST be entered! PAR=CBLIB:060000:110000 !in the same order as found ! STACK=0 !on your CB.MAP from Step 05! // +---------------------------+ 8) TKB the library using the edited file from step 07 with the following: TKB @CBLIB.CMD 9) Run RESSTB which is distributed on your BP2 installation tape. RUN RESSTB ENTER FILE SPECIFICATION FOR RESIDENT LIBRARY? CBLIB ENTER 3 CHARACTER CCL/MCR NAME ? BP2 THE PSECT FOR YOUR LIBRARY IS BASOTS. Note: Always enter BP2 whether or not that is the CCL name for your BP2 compilier. 10) Run MAKSIL to turn it into a resident library: RUN $MAKSIL Resident Library name ? CBLIB Task-Built Resident Library input file ? Include symbol table (Yes/No) ? Symbol table input file ? Resident Library output file ? CBLIB built in XX K-words, YYY symbols in directory CBLIB.TSK renamed to CBLIB.TSK<40> Note: XX above is 10 or 11 depending on BP2 compilier used, YYY should be a relatively large number (100-800). 11) Move CBLIB.LIB, CBLIB.STB, CBLIB.OBJ to LB: PIP LB:<40>=CBLIB.OBJ,CBLIB.LIB,CBLIB.STB 12) Add library with Utilty: UT ADD LIBRARY LB:CBLIB<0>/ADDR:xxx/RW/STAY (xxx=memory address to located library, it is site-dependant, The <0> allows writing to the library). Note: The /RW is important as it allows the communication between jobs by specifying the library is Read/Write and not Readonly. If the library is not made permanent with the /STAY shown above, when there are no CB users and your system starts swapping, CBLIB will leave memory, causing the first new CB user to get a message stating the library is being re-initialized. This will not hurt anything, but may be annoying. If the library is not ADDed with a protection code of <0>, then PROTECTION VIOLATION errors will occur when running CB. 13) Task build to CB program again using CB.CMD this time: TKB @CB.CMD Note: If the fatal error from TKB, "Insufficient APRs available to map read-only root" occurs, CB is too large on your system or you left out one or more subroutines from your CBLIB installation. If all subroutines are included and the problem persists, call me or remove 1 or more CB functions from the code by replacing any dispatched command with a 'RETURN'. 14) Run MAKSIL to turn it into a resident library: RUN $MAKSIL Resident Library name ? CBCODE Task-Built Resident Library input file ? CB.TSK Include symbol table (Yes/No) ? NO Resident Library output file ? CB.TSK CBCODE built in 2 K-words, 0 symbols in directory CB.TSK renamed to CB.TSK<104> 15) Move CB.TSK,CBHLP.DOC to execution account: Move CBCODE.LIB TO LB: PIP LB:=CBCODE.LIB PIP [PPN]<232>=CB.TSK PIP [PPN]<40> =CBHLP.DOC Note: [PPN] is the project,programmer that the task will execute from. Program MUST be set privileged (i.e. <232>)!! FILES: CB.B2S,CB.OBJ,ST2NM.MAC,ST2NM.OBJ CB.CMP,CB.CMD may now be removed if space is needed. 16) Add the second resident library CBCODE: UT ADD LIBRARY LB:CBCODE/ADDR:xxx (xxx=memory address to located library, it is site-dependant). 17) **OPTIONAL** Add CCL to allow CB to run direct (See CCL Format): UT ADD CCL CB-=[PPN]CB.TSK;PRIV 30000 Note: [PPN] is from step 15 above. 18) **OPTIONAL** CB can also be entered from LOGIN by entering a statement into LOGIN.BAS and recompiling it into $. The statement follows: 32256 DATA CB, "[PPN]CB",2, 4 This allows all commands that CCL entry allows except except entry to CB with a specified handle. Note: [PPN] is from step 15 above. 19) **OPTIONAL** A CB Help facility is available and may be added to the SYSTEM help file. The following lines must be added to the system file named 'HELP.HLP': *CB @_SY:[ACCT]CB.HLP Where: _SY:[ACCT] = The account that your Help facility is located on your system. Note that the file 'CB.HLP' must be moved to your Help facility account witha protection of <40>: PIP SY:[ACCT]<40>=CB.HLP for more information on the use of RSTS Help, see the RSTS/E Managers' guide and/or the RSTS/E Users' Guide. 20) Execute CB by CCL or otherwise. A SYSTAT of the job should show "..CB.." as the jobname, if 'CB' or 'CBBAD' is the jobname, 1 or more installation steps were skipped. INSTALL CB again or it will not run correctly!! Also note that the message, '%%Initializing CBLIB resident library"" should appear. If the library is initialized by a non-privileged user, CB will also automatically execute a '/CLOSE' command, otherwise CB will execute an automatic '/OPEN' command. Note: If the fatal errors, "Illegal byte count for I/O at line 540" or "?Program too large" occurs, CB is too large on your system or you left out one or more subroutines from your CBLIB installation. If all subroutines are included and the problem persists, call me or remove 1 or more CB functions from the code by replacing any dispatched command with a 'RETURN'. *** NOTE: On RSTS v7.1 (or later), if a terminal has a 'SET GAG' *** *** executed, then CB will set the terminal to NO GAG, when CB is *** *** exited, it will reset the terminal to GAG. *** Sample Run of CB: ----------------- A sample run of CB demonstrating most commands in regular as well as CCL formats follow: SY/L Resident Libraries: Name Prot Acct Size Users Comments RMSRES < 42> [ 0,1 ] 23K 9 Perm, Addr:873 ED2 < 42> [ 0,1 ] 20K 1 Perm, Addr:853 CBCODE < 42> [ 1,11 ] 8K 0 Perm, Addr:827 CBLIB < 0> [ 1,11 ] 10K 0 Perm, Addr:835, R/W BASICS < 42> [ 0,1 ] 8K 0 Perm, Addr:845 CB CB - V02.02 RSTS V7.1-11 SYSTM #1 11/70 What is your 'Handle' ? TEST PERSON **??GAG set??** T19>/EXIT Ready SET NO GAG Ready CB CB - V02.02 RSTS V7.1-11 SYSTM #1 11/70 What is your 'Handle' ? TEST PERSON T19>/LI CB User list: #24 [1,10] P2J20 TEST PERSON Talk: 19 Att: None Wdth: 78 Mon: 19 T19> **New User - Job #15 (PHIL) has signed on to CB** /LI CB User list: #15 [1,10] KB20: PHIL Talk: 19 Att: None Wdth: 78 Mon: 19 #24 [1,10] P2J20 TEST PERSON Talk: 19 Att: None Wdth: 78 Mon: 19 T19> (PHIL/C19) HELLO TEST PERSON T19>HELLO PHIL T19>/WA 19 Users on Channel # 19 #24 [1,10] P2J20 TEST PERSON Monitor, Talk #15 [1,10] KB20: PHIL Monitor, Talk T19>/JO JOB numbers will be printed T19>/KB KB numbers will be printed T19/XEQ **BG turned on** T19>/XEQ SY/L Resident Libraries: Name Prot Acct Size Users Comments RMSRES < 42> [ 0,1 ] 23K 9 Perm, Addr:873 ED2 < 42> [ 0,1 ] 20K 1 Perm, Addr:853 CBCODE < 42> [ 1,11 ] 8K 0 Perm, Addr:827 CBLIB < 0> [ 1,11 ] 10K 0 Perm, Addr:835, R/W BASICS < 42> [ 0,1 ] 8K 0 Perm, Addr:845 Ready T19>/XEQ **BG turned OFF** T19>/PP PPN numbers will be printed T19> (KB20:[1,10](15)PHIL/C19) HOW DOES THIS READ T19>LETS GO TO CHANNEL 23 T19> (KB20:[1,10](15)PHIL/C19) OK, LETS (KB20:[1,10](15)PHIL/C19) GO T19>/TALK 23 **Now talking on channel 23 T23>/WA 23 Users on Channel # 23 #24 [1,10] P2J20 TEST PERSON Monitor, Talk T23>/WATCH 19 Users on Channel # 19 #24 [1,10] P2J20 TEST PERSON Monitor #15 [1,10] KB20: PHIL Monitor, Talk T23>/TIME **16-Mar-82 at 12:33 PM** T23> **CB - V02.02** T23>/WA Users on Channel # 23 #24 [1,10] P2J20 TEST PERSON Monitor, Talk #15 [1,10] KB20: PHIL Monitor, Talk T23> (KB20:[1,10](15)PHIL/C23) IM AM HERE!!!!!!! T23>/MON **Now monitoring channels: 19 23 T23>/MON -19 **Now monitoring channels: 23 T23>LETS GET SECRET USING YOUR LAST NAME T23>/RES PLOMPR **Password set** T23>> (KB20:[1,10](15)PHIL/C23) OK, SOUNDS GOOD T23>>/WA 23 Users on Channel # 23 #24 [1,10] P2J20 TEST PERSON Monitor, Talk, PSWD #15 [1,10] KB20: PHIL Monitor, Talk, PSWD T23>>I AM DONE T23>> SECRET(KB20:[1,10](15)PHIL/C23) DO YOU READ ME???????????????? T23>>/WA 19 Users on Channel # 19 #15 [1,10] KB20: PHIL Monitor T23>>/LIST CB User list: #15 [1,10] KB20: PHIL Talk: 23 Att: PSWD PERSON Wdth: 78 Mon: 19 23 #24 [1,10] P2J20 TEST PERSON Talk: 23 Att: JOB KB PPN PSWD PERSON Wdth: 78 Mon: 23 T23>> SECRET(KB20:[1,10](15)PHIL/C23) I AM LEAVING SEE YOU LATER T23>>OK, BYE T23>> **User #15 (PHIL) is leaving CB** T23>>/EX Ready CB/LI CB User list: No users Ready CB/G **Invalid CCL command, Type '/HELP'** Ready CB/WA 19 Users on Channel # 19 No Users on this channel Ready CB/CL 19 **??Specified job not in CB??** CB PHIL2 T19>/LI Current CB User list: #24 [1,10] P2J20 PHIL2 Talk: 19 Att: None Wdth: 78 Mon: 19 T19>/EX Ready +-----------------------------------------------------------------+ ! 'CB Command Reference Card - V02.02' ! ! ! ! CB Commands are: ! ! ! ! /TALK n - Change talk channel to 'n'. ! ! This is the channel that you ! ! 'Transmit' on. ! ! /MONITOR n,m,..z - Monitor All channels specified ! ! If negative, Unmonitor channel. ! ! If negative, with no number, then ! ! Unmonitor ALL channels (Except TALK) ! ! /RESTRICT xxxxxx - Restrict sending message to ! ! any JOB having 'xxxxxx' as ! ! it's internal password, If no ! ! argument, then turn off password ! ! /BROADCAST nn Text- Allows a message to be sent to everyone ! ! even if a password is set. This allows a ! ! user to send text to everyone without ! ! having to reset his password, send a ! ! message and then set the password again. ! ! If 'nn' is included, then message is sent ! ! on channel #nn, else it is sent on the ! ! users' normal talk channel. ! ! /XEQ [CMD] - Open a Background job and execute the ! ! system command (CMD), if any. If the ! ! background is not currently opened, then ! ! open it. If no command is specified and ! ! the background is open, close it. ! ! $ (Escape key) - this command may be thought ! ! of as a /XEQ shift-lock. While in this ! ! mode, no CB prompt is displayed and all ! ! terminal entry is sent to the BG job unless ! ! prefixed by '..' which will execute as a ! ! CB command or message. ! ! /CALL Kbn# - Send a message to specified terminal ! ! requesting that they enter CB ! ! /SPY (PRIV) - Allows operator to recieve Restricted ! ! messages without knowing PASSWORDS ! ! /KILL n (PRIV) - Clear out job specified by 'n'. ! ! This removes job from tables and ! ! KILLs job off system (Logs out). ! ! /DETACH (PRIV) - Detach from the current terminal ! ! /ALL Txt (PRIV) - Send message to all CB users. ! ! /OPEN (PRIV) - Opens CB to allow non-privileged users ! ! access to CB. ! ! /CLOSE (PRIV) - Closes CB from usage by non-privileged ! ! user. ! ! /TIME - Display current Date/Time. ! ! /DATE - Display current Date/Time. ! ! /KB - Toggle KB on message switch ! ! /PPN - Toggle PPN on message switch ! ! /JOB - Toggle JOB on message switch ! ! /UPPER - Toggle Upper/Lower Translation switch ! ! /AT Filename or @ - Execute commands from a command file. Note ! ! that only 1 level of indirect is allowed. ! ! /WIDTH [n] - Sets terminal wraparound width to 'n'. If ! ! 'n' is not specified, current width is ! ! displayed. DEFAULT is 78. ! ! /LIST [n] - List current users on CB. ! ! If 'n' is specified, then list ! ! only that user ! ! /WATCH [n] - List all users WATCHING channel 'n' ! ! If 'n' is not entered, then all users on ! ! current talk channel are shown. ! ! /HELP - This message ! ! /EXIT - Exit CB ! ! ! ! Note: ^Z and ^C act like '/EXIT' was entered ! ! All commands may be abbreviated to 2 letters. ! ! ! ! Note: More complete descriptions of each command can be found ! ! in the documentation for CB. ! +-----------------------------------------------------------------+ Questions or comments: ---------------------- Questions or comments about CB? You may write or call directly to the below address: Philip Hunt O.L.F.B.P 6400 E. Broad Street Columbus, Ohio 43213 (614)864-9200 A tape containing all command files, source code and documentation is available, send a tape and $15.00 to the above address. &`Ǔ2? 10 !=========================================================== & ! & ! PROGRAM: ..CB.. & ! AUTHOR : PHILIP HUNT (OLFBP) & ! INITIAL DATE: 02/26/82 & ! EDIT: V02.02 & ! EDIT DATE: 08/27/82 & ! & !=========================================================== & ! & ! (c)1982, O.L.F.B.P., Philip Hunt & ! & ! This software is furnished under a license and may & ! be used and copied only in accordance with the & ! terms of such license and with the inclusion of & ! the above copyright notice. This software or any & ! other copies thereof may not be provided or other- & ! wise made available to any other person. No title & ! to and ownership of the software is hereby trans- & ! ferred. No SOURCE code can be copied. & ! & ! The information in this software is subject to & ! change without notice and should not be construed & ! as a commitment by the author. & ! & ! The author has no commitment to support this & ! software package at this time, unless stated & ! elsewhere in writing. & ! & !=========================================================== & ! & ! Problems and "SPR"s will be gratefully? & ! acknowledged by the author at the following & ! address: & ! & ! Philip Hunt & ! O.L.F.B.P. & ! 6400. E. Broad Street & ! Columbus, Ohio 43213 & ! & ! (614)864-9200 & ! & !=========================================================== & ! & ! Description: & ! & ! CB allows any user on a RSTS/E system to communicate with & ! any other user on the same system through an emulation of & ! a citizens' band radio. Each user has a 'HANDLE' that is & ! transmitted along with any messages intended for another & ! user monitoring the same channel. Multiple users may be & ! monitoring any or all CB channels. There are 40 channels & ! for communication as well special modes to send/recieve & ! only upper case, send messages only to people knowing a & ! changeable password, etc. & ! & ! There are special options that allow a privileged user to & ! detach from a keyboard, kill a CB job, send messages to & ! all users on CB, etc. & ! & ! CB uses 2 resident libraries and uses only 2-3K of user & ! space to allow many CB jobs from using a large amount of & ! memory. & ! & !=========================================================== & 15 ! & ! & ! M O D I F I C A T I O N H I S T O R Y & ! & 16 ! & ! Date Edit BY Reason & ! 022782 v00.01 pjh Test version. & ! 030182 v01.00 pjh Original Issue. & ! 030282 v01.00a pjh Put BP2 threads into CBLIB. & ! 030582 v01.01 pjh Put object code into CBCODE. & ! 032582 v01.02 pjh Add /CALL,/TIME commands. & ! Fix /CLEAR for kill on & ! current job number. & ! Add ST2NM macro code for & ! conversions to speed up. & ! 033082 v01.03 pjh RSTS Professional Release & ! 041982 v01.04 pjh Add MODEM display support & ! 042082 v01.04A pjh Fix /TALK multiple monitor & ! problem & ! 042382 v01.05 pjh Add RSTS V7.1 Terminal GAG & ! checking & ! 042982 v01.06 pjh Add PK terminal (/XEQ) & ! Make Channel 40 privileged & ! 052182 v01.07 pjh Enhance PK/XEQ ctrl char & ! processing, fix /CLEAR bug & ! Change /CLEAR to /KILL & ! Add /OPEN and /CLOSE. & ! 060282 v01.07a pjh Fix /DET with /XEQ BG open & ! causing I/O errors & ! 061082 v01.08 pjh Add ESC for /XEQ lock & ! command & ! 070782 v01.08a pjh Fix I/O det kb error to & ! orderly exit. Add '/HIDE'. & ! 072482 v01.09 pjh Speed up list/channel & ! processing. & ! 082782 v02.01 pjh Fix message wrap-around & ! processing for ALL cases. & ! Add /WIDTH command. & ! Add indirect commands, & ! CB.INI on start-up. & ! 088282 v02.02 pjh Fix all?? corrupt library & ! condition windows, self- & ! correcting libry implemented & ! Error processing 'holes' & ! plugged up. & !=========================================================== & 20 ! & ! & ! V A R I A B L E D E F I N I T I O N S & ! & 21 ! & ! ANS$ - User reponse holder var & ! ANY.USERS% - /WATCH any usr for msg flg & ! ARG% - Def argument Utility var & ! ARG1% - Def argument Utility var & ! ARG1$ - Def argument Utility var & ! AT.PROC% - Currently proc indirect fl & ! AT.FILE$ - Indirect cmd file name & ! BCST.CHNL$ - FNBRODCAST Msg channel hld & ! BCST.TYPE$ - FNBRODCAST Typ:/B,/C, /OPR & ! BFLAG% - FNBRODCAST send type flag & ! .BG.OPT% - BG open option flag & ! BRDCST% - Channel to send on /BROAD & ! CB.CLOSED% - CBLIB - Usage not allowed & ! CB.PKG$ - Where CB came from & ! CB.PASS$ - Currently parsed password & ! CB.PASS$(63)=6 - CBLIB - User /Res Pswrds & ! CB.PROG%(63) - CBLIB - User progmmr nos. & ! CB.PROJ%(63) - CBLIB - User project nos. & ! CCL.ENTRY% - CB entered as CCL flag & ! CHANNEL$(40)=64 - CBLIB - All CB chnls array & ! CHANNEL.USED%(40%) - CBLIB - Chnl used ever flg & ! CHHN$ - Hold Utility Variable & ! CHN% - Channel # hold var as int% & ! CHN$ - Channel # hold var as str$ & ! CHR6$ - CHR$(6%) constant & ! CLR% - /CLR internal command flag & ! CM% - Index on Command type & ! CMD$ - User entered Command/Msg & ! COMMON.IN.USE% - CBLIB - Common locked flag & ! COMMON.INIT% - CBLIB - Common initialized & ! CRLF$ - CR/LF Hold string & ! CSTRG$ - Put Channel hold variable & ! CTRL.LINE$ - FNQUOTE/CTRL utility var & ! CTYP$ - Command entered (2 lettrs) & ! CXX% - Index Utility Variable & ! DEBUG% - DEBUG on flag & ! DUMMY% - Hold Utility Variable & ! DUMMY$ - Hold Utility Variable & ! DUMMY2% - Hold Utility Variable & ! EDIT.VAL% - Used for Msg Snd/Rcv CVT$$ & ! EL% - ERROR trapping util var & ! EN% - /LIST command utility var & ! ER% - ERROR trapping util var & ! ERTMP% - ERROR trapping hold var & ! .FALSE% - FALSE value bit mask & ! FIP%(30) - SYS Call array holder & ! FIRST.CUR.SEND% - FNBROADCAST 1st send flag & ! FLAG% - Hold Utility Variable & ! FLAGS% - Hold Utility Variable & ! HANDLE$(63)=12 - CBLIB - User handles & ! HIDE% - No announce entry/exit & ! HLD.ARG$ - FNBROADCAST$ hold msg$ & ! HNDL$ - Accepted HANDLE$ & ! HNDL.ENTERED% - Handle entered as CCL flag & ! HOLD.TMO% - Hold timeout value & ! I% - Utility Variable & ! I2% - Utility Variable & ! II% - Utility Variable & ! JBNO% - Utility Variable & ! JBNUM% - Utility Variable & ! JOB$ - FNBROADCAST$ usr.job% as $ & ! JOB.FLAGS%(63) - CBLIB - User job attrbutes & ! JOBTBL% - RSTS job table address & ! .JOB.OPT% - /JOB option bits values & ! KB% - FNKB.NUMBER$ hold kb dcder & ! KB$ - /LIST formatted kb# hold & ! KB.KILL% - /KILL on KB flag & ! KB.DDB% - Device blk for term addr & ! .KB.OPT% - /KB option bits value & ! KB.SND% - FNBROADCAST$ kb# to snd to & ! KBN% - FNKB.NUMBER$ kb# decoded & ! KBN$ - FNKB.NUMBER$ formtted hold & ! KBS$ - FNBROADCAST$ - Utility Var & ! LOGGED.OUT% - Curr user not logged in & ! LONG.MSG.FLAG% - If fnbrdcst msg > ter max & ! MCNT% - Utility Variable & ! .MIN.WIDTH% - Minimum /WIDTH allowed & ! .MAX.WIDTH% - Maximum /WIDTH allowed & ! MSG$ - FNBROADCAST$ - msg to send & ! MSG.MAX% - User term max allowed & ! OLD.INIT.VAL% - Saved common.init% opn/cls & ! OLD.USER% - 1st time thru flag, cb.ini & ! ONE.USER% - /LIST no user flags & ! OPEN.POS% - Utility Variable & ! OPNX% - Utility Variable & ! OTHER.POS% - Utility Variable & ! OTHER.USER% - /KILL - Position of a usr & ! OUSRX% - Utility Variable & ! PKG.LOC$ - FNPKG.LOC utility var & ! PK.BUSY% - Flag, no pk available & ! PK.CMD$ - Command sent string /XEQ & ! PK.CTRL.T% - Processing ^T in /XEQ flag & ! PK.LOCK% - ESC entered /XEQ toggle & ! PK.NOECHO% - PK-Noecho /XEQ I/O flag & ! .PK.I.O% - PK I/O check timeout & ! PK.OPEN% - PK (/XEQ) in use & ! PK.RCV% - Flag, rcvd pk i/o, reprmpt & ! PK.RCV$ - PK i/o recieved buffer & ! PK.SCAN% - Scanning-only pk flag & ! PK.SND% - Flag to stop echo aftr cmd & ! PK.TMO% - Timeout count for BG/PK & ! PK.TYPE% - Command snd type,reg/force & ! PK.UNIT% - /XEQ PK unit in use & ! PPN% - Initial current user ppn & ! PPN$ - FNBROADCAST$ ppn formatted & ! .PPN.OPT% - /PPN opt bits value & ! .PRIV% - RSTS priv user value & ! PS$ - FNBROADCAST - Util Varble & ! RUNNING.IN.ERROR% - A Fatal error occured flag & ! RUNNING.IN.ZAP% - Internal /ZAP* cmd (ABORT) & ! .SECRET.OPT% - /RESTRICT opt bits value & ! SILENT% - /AT silent sw, /AT CB.INI & ! SND.HDR$ - FNBROADCAST$ hdr build var & ! SND.JOB% - FNBROADCAST$ job sndng to & ! .SPY.OPT% - Spy option bits value & ! ST% - /LIST start position & ! ST%(64) - CHANNEL$() array decoder & ! STRT.ARG% - Start pos of cmd argument & ! TALK% - Current usr talk chnl hold & ! TALK.CHAN%(63) - CBLIB - User talk channels & ! TER.SYS$ - Term Characteristics const & ! .TIMEOUT.MAX% - PK timeout maximum & ! T0% - FNQUOTE/CTRL utility var & ! T0$ - FNQUOTE/CTRL utility var & ! TMP% - Public temp integer field & ! .TRUE% - TRUE value bit mask & ! TTINTF% - Terminal interface flag & ! TTY.WIDTH%(63) - CBLIB - User term width & ! TYP$ - For error, CCL/reg entry & ! TYP2$ - /EXIT utility variable & ! UFLAG% - User attribute flag hold & ! .UPPER.OPT% - Upper case only opt bits & ! USER.JOB% - Current user job number & ! USER.POS% - FNUSER.POS% utility var & ! USER.PROG% - Current user progmmr # & ! USER.PROJ% - Current user project # & ! USER.PSSWRD$ - Pswrd of curr user for XEQ & ! USER.SPY% - FNBROADCAST - Util Varble & ! USR% - Utility Hold Variable & ! USRX% - Utility hold Variable & ! VALID$ - Valid commands check var & ! .VERSION$ - CB Version number & ! WAS.GAGGED% - KB was gagged on entry flg & ! .WIDTH.DEFAULT% - Std message width for term & ! WX% - Utility Index Variable & ! X% - Utility Index Variable & ! XXX% - Utility Index Variable & ! Y% - Utility Index Variable & ! YX% - Utility Index Variable & ! & !=========================================================== & 30 ! & ! & ! U S E R - D E F I N E D F U N C T I O N S & ! & 31 ! & ! FNBROADCAST%( ) - Broadcast to a channel func & ! FNDGT2$( ) - Display 2-digit no, ldng 0s & ! FNGET.CHAN%( ) - Get a chnl $ to int array & ! FNKB.NUMBER$( ) - Format a KB number & ! FNDET% - Logical KB detached flag & ! FNLOCK.COMMON% - Lock cblib common area & ! FNOPEN.POSITION% - Find open position in chnl & ! FNOTHER.POSITION%( ) - Find user in a channel & ! FNPUT.CHAN%( ) - Put a chnl int array to $ & ! FNUNLOCK.COMMON% - Unlock cblib common area & ! FNUSER.POSITION% - Find curr user in a channel & ! FNPKG.LOC$ - Find program location & ! FNQUOTE$ - XEQ cmd line unquoter "_" & ! FNCTRL$ - XEQ cmd line ctlr "^n" & ! FNTOGGLE$( ) - Toggle job.flag% bits & ! FNCHECK.JOB%( ) - Check job still in CB & ! FNSET.CHNL$( ) - Set user in channel & ! & !=========================================================== & 35 ! & ! & ! I / O C H A N N E L S & ! & 40 ! & ! Channel # Description of Use & ! 1% Terminal Command/Message reciever & ! Indirect channel file channel & ! 2% BG (PK:) device channel (/XEQ) & ! 3% /HELP file channel & ! & !=========================================================== & 41 ! & ! & ! C O M M O N A R E A S & ! & 42 ! & ! CBLIST COMMON DATA AREA IN CBLIB.LIB & ! COMMON.IN.USE% - Lock common flag & ! COMMON.INIT% - Common init flag & ! CB.CLOSED% - CB usage not allowed & ! CHANNEL.USED%(40%) - Channel ever used flag & ! CHANNEL$(40) =64 - 40 channel user table & ! HANDLE$(63) =12 - User Handle Table & ! TTY.WIDTH%(63) - User terminal width & ! TALK.CHAN%(63) - User Transmit Chnl Tbl & ! CB.PROJ%(63) - User project number Tbl & ! CB.PROG%(63) - User progmmr number Tbl & ! JOB.FLAGS%(63) - User job attributes Tbl & ! CB.PASS$(63) =6 - User /RESTRICT Passwrds & ! & !=========================================================== & 50 ! & ! & ! S U B P R O G R A M S C A L L E D & ! & 51 ! & ! ST2NM.MAC & ! NM2ST - CHANGE NUM ARRAY(64) TO ST$ VARIABLE & ! ST2NM - CHANGE ST$ VARIABLE TO NUM ARRAY(64) & ! & !=========================================================== & 60 ! & ! & ! R E S I D E N T L I B R A R I E S U S E D & ! & 61 ! & ! CBLIB .LIB/RO - COMMON DATA AREA/BP2 THREADS & ! CBCODE.LIB/RW - OBJECT CODE EXECUTED BY BP2 THREADS & ! & !=========================================================== & 100 COMMON (CBLIST) COMMON.IN.USE%, & COMMON.INIT%, & CB.CLOSED%, & CHANNEL.USED%(40%), & CHANNEL$(40%)=64%, & HANDLE$(63%)=12%, & TTY.WIDTH%(63%), & TALK.CHAN%(63%), & CB.PROJ%(63%), & CB.PROG%(63%), & JOB.FLAGS%(63%), & CB.PASS$(63%)=6% & ! & !=========================================================== & !COMMON DATA AREA FORMAT: & ! COMMON.IN.USE% = WHETHER ANOTHER CB JOB & ! HAS THE COMMON LOCKED FOR UPDATE & ! 0=NO, ANY OTHER VALUE = YES & ! (COMMON IN USE=JOB# LOCKING & ! COMMON.INIT% = WHETHER COMMON HAS BEEN & ! INITIALIZED, IF YES = 378% ELSE & ! if = 457%, reinit required else & ! IF = 991%, SOMEONE ELSE IS INITIALIZING ELSE & ! GARBAGE & ! CB.CLOSED% = CB USAGE NOT ALLOWED EXCEPT BY & ! [1,*] USERS IF THIS IS NON-ZERO. & ! CHANNEL.USED%()= ALL CHANNELS FLAG SPECIFYING & ! WHETHER ANY ONE CHANNEL WAS EVER USED. & ! CHANNEL$() = ALL CHANNELS, PACKED JOB & ! NUMBERS CURRENTLY MONITORING THIS CHAN & ! CHANNEL$(0) IS SPECIAL, IT CONTAINS & ! ALL JOBS USING CB CURRENTLY, THIS IS & ! USED FOR BROADCAST PURPOSES & ! HANDLE$() = ALL JOBS USING CB HANDLES & ! TTY.WIDTH%(63%)= TERM WIDTH (DEFLT TO 78) for wrap & ! TALK.CHAN%() = ALL JOBS USING CB CURRENT & ! CHANNEL THEY ARE TALKING ON & ! CB.PROJ%() & ! CB.PROG%() = PPN OF CB USER & ! JOB.FLAGS%() = CURRENT OPTIONS A CB USER HAS & ! SET, CURRENTLY DEFINED ARE: & ! BIT 0 ON = PRINT PPN WHEN & ! GETTING A MESSAGE & ! BIT 1 ON = PRINT KB# WHEN & ! GETTING A MESSAGE & ! BIT 2 ON = PRINT JOB WHEN & ! GETTING A MESSAGE & ! BIT 3 ON = THIS JOB HAS A & ! SECRET PASSWORD SET & ! BIT 4 ON = SPY BIT SET. A PRIV & ! USER MAY RCV MESSAGES & ! RESTRICTED WITHOUT & ! KNOWING PASSWORD & ! BIT 5 ON = PRINT TO TERM IN UPR & ! CASE ONLY & ! BIT 6 0N = BG JOB IN USE & ! BIT 7 TO 15 - NOT USED & ! CB.PASS$() = PASSWORD MULTIPLE USERS & ! MUST ENTER TO RECIEVE SECRET & ! MESSAGES & ! & !=========================================================== & 110 ON ERROR GOTO 19000 & \ DIM FIP%(30%),ST%(64%) & !=================================================================== & ! DEFINE JOB.FLAGS%() BITS AND OTHER COMPILE-TIME VARIABLES: & ! & \ .DEFINE .PPN.OPT% = 1% !/PPN & \ .DEFINE .KB.OPT% = 2% !/KB & \ .DEFINE .JOB.OPT% = 4% !/JOB & \ .DEFINE .SECRET.OPT% = 8% !/RESTRICT & \ .DEFINE .SPY.OPT% = 16% !/SPY & \ .DEFINE .UPPER.OPT% = 32% !/UPPER & \ .DEFINE .BG.OPT% = 64% !/XEQ & & \ .DEFINE .FALSE% = 0% !INT WORD FALSE BITS & \ .DEFINE .TRUE% = -1% !INT WORD TRUE BITS & & ! DEFINE SYSTEM DEPENDANT VARIABLES IN R/O MEMORY & & \ .DEFINE .VERSION$ = "02.02" !PROGRAM VERSION & \ .DEFINE .WIDTH.DEFAULT% = 78% !Terminal width dflt & \ .DEFINE .MIN.WIDTH% = 28% !Min /WIDTH allowed & \ .DEFINE .MAX.WIDTH% = 133% !Max /WIDTH allowed & \ .DEFINE .TIMEOUT.MAX% = 10% !10 SECOND WAIT-PK & \ .DEFINE .PK.I.O% = 2% !PK I-O CHECK TMOUT & \ .DEFINE .PRIV% = 1% !PRIV USER ON RSTS & \ .DEFINE .NULL$ = "" !NULL ARGUMENT & !=================================================================== & ! DEFINE CURRENT USER ITEMS: & ! & \ CB.PKG$ = FNPKG.LOC$ !GET CB LOCATION & \ USER.JOB% = (PEEK(518%) AND 255%)/2% !GET JOBNO & \ PPN% = PEEK(PEEK(PEEK(520%)+8%)+24%) !GET PPN & \ USER.PROJ%= SWAP%(PPN%) AND 255% & \ USER.PROG%= PPN% AND 255% & \ CHR6$ = CHR$(6%) & \ TER.SYS$ = CHR6$+CHR$(16%)+CHR$(0%)+CHR$(255%)+ & STRING$(23%,0%) & \ GOTO 32700 IF FNDET% !CANNOT SPAWN CB JOB & & \ GOTO 115 IF LOGGED.OUT% !NO ACCT IF OUT & \ CHANGE SYS(CHR6$+CHR$(14%)) TO FIP% !GET USER ACCTNH & \ USER.PSSWRD$=RAD$(FIP%(09%)+SWAP%(FIP%(10%)))+ & RAD$(FIP%(11%)+SWAP%(FIP%(12%))) !USER PSSWRD & 115 CHANGE SYS(CHR6$+CHR$(-3%)) TO FIP% !GET RSTS JOB TABLE & \ JOBTBL% = FIP%(11%)+SWAP%(FIP%(12%)) !SAVE IT & \ PK.LOCK% = .false% !clear PK lock flag & !=================================================================== & ! PRINT HEADER, PROGRAM IDENTIFICATION (IF NEEDED) & ! & \ PRINT "CB - V";.VERSION$,ERT$(0%)+CR+LF UNLESS CCL.ENTRY% & !CHECK FOR GAG ON RSTS 7.1 OR LATER & \ GOTO 120 IF VAL(MID(ERT$(0%),7%,3%)) < 7.1 & !DO NOT DO ON RSTS V7.0 & \ DUMMY$ = SYS(TER.SYS$) !GET CURR TTY CHARACTERSTICS & \ WAS.GAGGED% = .FALSE% !ASSUME NOT GAGGED & \ IF ASCII(MID(DUMMY$,28%,1%)) = 255% then & WAS.GAGGED% = .TRUE% !SEE IF WAS GAGGED & \ DUMMY$=SYS(TER.SYS$+CHR$(128%)) !CLEAR GAG FOR CB & !=================================================================== & 120 GOTO 190 IF COMMON.INIT%=378% !NORMAL & !=================================================================== & ! INITIALIZE RESIDENT LIBRARY IF THIS IS THE FIRST USER & ! SINCE LIBRARY WAS LOADED & ! & \ GOTO 120 IF COMMON.INIT% = 991% !SOMEONE ELSE INITNG & & \ OLD.INIT.VAL%=COMMON.INIT% !SAVE INIT TYPE & \ PRINT "%Initializing CBLIB" & unless OLD.init.VAL% = 457% & \ COMMON.INIT% = 991% !SAY WE ARE INITING & \ COMMON.IN.USE%=USER.JOB% !JUST IN CASE & \ PRINT & \ FOR X%= 0% TO 40% !INIT CHANNLE STUFF & \ CHANNEL$(X%)=STRING$(64%,99%) & \ CHANNEL.USED%(X%) = .FALSE% & \ NEXT X% & \ FOR X%= 0% TO 63% & \ CB.PROG%(X%), & CB.PROJ%(X%), & TTY.WIDTH%(X%), & TALK.CHAN%(X%), & JOB.FLAGS%(X%)= .FALSE% & \ HANDLE$(X%), & CB.PASS$= .NULL$ & \ NEXT X% & \ GOTO 130 IF OLD.INIT.VAL%=457% !REINIT, NO CLOSE & \ CB.CLOSED% = .TRUE% !CLOSE CB TIL [1,*] & \ CB.CLOSED% = .FALSE% IF USER.PROJ% = .PRIV% !PRIV,SO OPN & 130 COMMON.INIT% = 378% !SET INIT FLAG & \ COMMON.IN.USE%= 0% !UNLOCK CORE & !=================================================================== & 190 IF (CB.CLOSED%) AND & (USER.PROJ% <> .PRIV%) !CLOSED, NOT PRIV & THEN & PRINT "**??CB closed??**" & \ GOTO 32700 !CLOSED, TELL USER & 200 GOTO 1000 IF (CCL.ENTRY%) & AND (HNDL.ENTERED%=.FALSE%) & \ GOTO 230 IF LOGGED.OUT% !CANT ENTER NOT LOGGED IN & !=================================================================== & ! ACCEPT USER ID UNLESS CCL ENTERED. CHECK FOR 'HIDDEN' & ! OPTIONS. '/DBG'= DEBUG, '/CLR' = FORCE CBLIB INIT & ! & \ LINPUT "Handle ";HNDL$ & UNLESS (CCL.ENTRY%) AND & (HNDL.ENTERED%) & \ CCL.ENTRY%,HNDL.ENTERED% = .FALSE% & ! II%= INSTR(1%,HNDL$,"/DBG") DEBUG MODE, HIDDEN & \ CLR%=INSTR(1%,HNDL$,"/CLR") !CLEAR LIB HIDDEN FUNC & \ HIDE%=INSTR(1%,HNDL$,"/HIDE") !DONT ANNOUNCE ENTRY/EXIT & \ CLR%,HIDE% = .FALSE% IF USER.PROJ% <> .PRIV% & \ IF CLR% THEN & COMMON.INIT%=.FALSE% & \ GOTO 120 & 204 IF HIDE% THEN & HNDL$=LEFT(HNDL$,HIDE%-1%) !CLEAR '/HIDE' & 205 DEBUG%=.FALSE% & ! IF II% THEN & ! HNDL$=LEFT(HNDL$,II%-1%) & ! PRINT "%%Debug ENABLED" & ! DEBUG%=.TRUE% & 210 GOTO 215 IF HNDL$= .NULL$ OR LEN(HNDL$)>12% & \ FOR X%=1% TO 63% & \ GOTO 220 IF HNDL$=HANDLE$(X%) & \ NEXT X% & \ GOTO 300 & 215 PRINT "**12 character max**" & \ GOTO 200 & 220 PRINT "**??'Handle' IN-USE??**" & \ GOTO 200 & 230 PRINT "**??Login PLEASE??**" & \ GOTO 32700 & !=================================================================== & 300 & ! SETUP THE USER ITEMS FOR THIS RUN , DEFAULTS= & ! TALK ON CHANNEL 19, MONITOR 19, NO FLAGS SET & ! **TELL THE WORLD WE ARE HERE** & ! & PRINT & \ DUMMY%=FNLOCK.COMMON% & \ DUMMY$=SYS(CHR6$+CHR$(-7%)) !CTRL/C TRAP & & \ TMP%=FNSET.CHNL%(0%) !PUT IN CHANNEL 0 & \ TMP%=FNSET.CHNL%(19%) !PUT IN CHANNEL 19 & & \ HANDLE$(USER.JOB%) = CVT$$(HNDL$,128%) & \ JOB.FLAGS%(USER.JOB%) = .FALSE% !DEF TO NO FLAGS SET & \ TTY.WIDTH%(USER.JOB%) = .WIDTH.DEFAULT% !DEF TO /WIDTH 78 & \ CB.PROJ%(USER.JOB%) = USER.PROJ% & \ CB.PROG%(USER.JOB%) = USER.PROG% & \ CB.PASS$(USER.JOB%) = .NULL$ & \ TALK.CHAN%(USER.JOB%) = 19% !TALK TO 19 FIRST & & \ DUMMY% = FNUNLOCK.COMMON% & \ CMD$="**New User - Job #"+NUM1$(USER.JOB%)+" ("+HNDL$+ & ") has signed on to CB**" & !SEND STD SYS MESSAGE & \ DUMMY%=FNBROADCAST%(0%,CMD$,-1%) & UNLESS HIDE% !tell everyone & !=================================================================== & 500 & ! PROMPT THE CURRENT USER WITH HIS TALK CHANNEL NUMBER & ! ADD AN EXTRA '>' IF HE HAS A PASSWORD SET & ! ACCEPT COMMAND OR MESSAGE, IF IT BEGINS WITH '/', & ! THEN ASSUME IT IS A PROGRAM COMMAND. IF WE ARE PROCESSING & ! AN INDIRECT FILE, THEN A LINE STARTING WITH A ';' OR 'EXCL' & ! IS IGNORED. FIRST TIME THRU, SETUP COMMAND AS '@CB.INI' TO & ! EXECUTE INITIALIZER FILE IF IT EXISTS, NO ERROR IF IT & ! DOESN'T. & ! & PK.LOCK% = .FALSE% IF NOT(PK.OPEN%) !FORCE PROMPT, NO PK & \ GOTO 540 IF PK.LOCK% or silent% !NO PROMPT IF LOCKED & \ IF NOT(OLD.USER%) THEN & OLD.USER%,SILENT% = .TRUE% & \ CMD$ = "@CB.INI" !SETUP INIT COMMAND & \ GOTO 552 !PRETEND WE ENTERED & 530 SLEEP 1% FOR TMP%=1% UNTIL NOT(FNDET%) !DO NOT PRMPT IF DET & \ PRINT "T"+FNDGT2$(TALK.CHAN%(USER.JOB%))+">"; & \ PRINT ">"; IF JOB.FLAGS%(USER.JOB%) AND .SECRET.OPT% & !FLAG IF PASSWORD (/RESTRICT) SET & 540 WAIT .PK.I.O% IF PK.OPEN% !CHECK PK IF OPEN & \ goto 550 if at.proc% !do not open if @ & \ OPEN "_KB:CB.CMD" AS FILE 1% !OPEN COMMAND CHANEL & 550 INPUT LINE #1, CMD$ !GET COMMAND W/TERMS & \ print cmd$; if at.proc% and not(silent%) !echo cmd from file & \ TYP$ = LEFT(CMD$,1%) !GET 1ST CHAR, REM? & \ GOTO 550 IF (TYP$=";" OR TYP$="!") AND (AT.PROC%) !YES... & 552 PK.LOCK% = NOT(PK.LOCK%) IF CMD$=CHR$(27%) !ESC TOGGLES LOCK & \ PRINT IF CMD$=CHR$(27%) !FORCE NEW LINE & \ GOTO 500 IF (PK.LOCK%=.FALSE% AND CMD$=CHR$(27%)) !BK TO PMT & OR ((PK.OPEN%) AND (PK.LOCK%) AND CMD$=CHR$(27%)) & 555 CMD$ = CVT$$(CMD$,4%) !CLEAR TERMINATOR & \ CMD$ = "<>" IF (PK.LOCK%) AND (CMD$=.NULL$) & \ CMD$ = "/XEQ "+CMD$ IF PK.LOCK% UNLESS LEFT(CMD$,2%)=".." & \ CMD$ = RIGHT(CMD$,3%) IF LEFT(CMD$,2%)=".." AND PK.LOCK% & \ WAIT 0% & \ CLOSE #1% UNLESS AT.PROC% !CLOSE & \ GOTO 5990 IF CMD$=CHR$(24%)+CHR$(24%) !/KILL FROM AN OPER & \ GOTO 570 & 560 !WAIT TIMEOUT & PK.SCAN% = .TRUE% !TELL PK DVR SCANNNG & \ HOLD.TMO%, PK.TMO% = 0% !SET TIMEOUT & \ GOSUB 6815 !ANY PK STUFF & \ PK.SCAN% = .FALSE% !RESET IN CASE & \ WAIT 0% !STOP TIMEOUT & \ IF PK.RCV% GOTO 500 !REPROMPT IF I/O & ELSE GOTO 550 & 570 EDIT.VAL%=8% & \ EDIT.VAL%=40% IF JOB.FLAGS%(USER.JOB%) AND .UPPER.OPT% & \ CMD$=CVT$$(CMD$,EDIT.VAL%) !NO LDNG SPCS & \ TYP$ = LEFT(CMD$,1%) !ISOLATE CHARACTER & \ CMD$="/AT "+RIGHT(CMD$,2%) IF TYP$="@" !INDIRECT ENTERED & \ GOTO 1000 IF LEFT(CMD$,1%)="/" !COMMAND & \ IF CMD$=.NULL$ THEN !NOTHING & PRINT "**CB - V";.VERSION$;"**" !..SO GIVE VERS & \ GOTO 500 !AND GET MORE & !=================================================================== & 600 !MESSAGE TO BROADCAST & ! WE JUST SEND A MESSAGE TO ALL USERS ON THE CURRENT USERS' & ! TALK CHANNEL WITH A HEADER PREPENDED TO IT. & ! & \ DUMMY%=FNBROADCAST%(TALK.CHAN%(USER.JOB%),CMD$,0%) & \ GOTO 500 & 1000 !COMMAND & CTYP$=CVT$$(MID(CMD$,2%,2%),32%) !cmd in upper case & UNLESS CCL.ENTRY% & \ CTYP$=LEFT(CVT$$(CMD$,40%),2%) IF CCL.ENTRY% & \ CTYP$=CVT$$(CTYP$,-1%) & \ CTYP$="LI" IF CTYP$="L" !ALLOW LIST.... & \ CTYP$="HE" IF CTYP$="H" !...HELP TO BE ONE LTR & \ CTYP$="*" IF (LEN(CTYP$)<>2%) & OR (INSTR(1%,CTYP$,".")<>0%) & OR (CTYP$="^^") !SNEAKY TO TRY ON CCL ENTRY & & \VALID$="TA.BR.MO.WA.LI.AT.HE.WI.KI.EX.CA.XE.KB.SP.PP.UP.JO.AL.RE.DE.TI.DA.CL.OP" & \VALID$="^^.^^.^^.WA.LI.^^.HE.^^.KI.^^.^^.^^.^^.^^.^^.^^.^^.^^.^^.^^.TI.DA.CL.OP" & IF CCL.ENTRY% & & \ CM%=INSTR(1%,VALID$,CTYP$) !CHECK IF LEGAL & \ CM%=INT(CM%/3%)+1% IF CM% !OFFSET COMMAND & \ GOTO 1010 IF CM% & \ TYP$= .NULL$ & \ TYP$=" CCL" IF CCL.ENTRY% !SAY CCL PROBLEM & \ PRINT "**??Invalid"+TYP$+", Type '/HELP'??**" & \ IF CCL.ENTRY% THEN 32700 & ELSE 500 & 1010 !DO DISPATCH, GO BACK FOR MORE & \ STRT.ARG%=INSTR(1%,CMD$," ") & \ ON CM% GOSUB 2000,2800,3000,3800,4000,4700,5000,5200,5500, & 6000,6500,6700,7000,7500,8000,8500,8700,8900,9500, & 9800,9900,9900,9950,9960 & ! COMMAND DISPATCH TABLE VALUES: & ! 2000 - TALK & ! 2800 - BROADCAST & ! 3000 - MONITOR & ! 3800 - WATCH & ! 4000 - LIST & ! 4700 - AT OR @ & ! 5000 - HELP & ! 5200 - WIDTH & ! 5500 - KILL & ! 6000 - EXIT & ! 6500 - CALL & ! 6700 - XEQ & ! 7000 - KB & ! 7500 - SPY & ! 8000 - PPN & ! 8500 - UPPER & ! 8700 - JOB & ! 8900 - ALL BROADCAST & ! 9500 - RESTRICT & ! 9800 - DETACH & ! 9900 - TIME/DATE & ! 9950 - CLOSE & ! 9960 - OPEN & & \ IF CCL.ENTRY% THEN 32700 & ELSE 500 & !=================================================================== & 2000 & ! **TALK COMMAND** & ! & ! CHANGE A USERS CURRENT TALK CHANNEL, THEY MUST BE PRIV. TO & ! USE CHANNEL 40, OTHERWISE JUST CHECK FOR VALID RANGE. & ! NOTE THAT /TALK ALSO SETS THE NEW TALK CHANNEL AS /MON TOO & ! & GOTO 2500 IF STRT.ARG%=.FALSE% & \ CMD$=RIGHT(CMD$,STRT.ARG%+1%) & 2010 TALK%=VAL(CMD $) & \ GOTO 3750 IF (TALK%=40%) AND (USER.PROJ%<>.PRIV%) & !CHAN 40 SPECIAL & \ GOTO 2950 IF TALK%<1% OR TALK%>40% !NO SUCH CHANNEL & 2020 DUMMY% =FNLOCK.COMMON% & \ TALK.CHAN%(USER.JOB%)=TALK% & \ DUMMY2% =FNGET.CHAN%(TALK%) & \ DUMMY% = FNUSER.POSITION% !SEE IF ALREADY MONITORING & \ TMP% =FNSET.CHNL%(TALK%) !DO THE SET IN MONITOR & IF DUMMY% = -1% !UNLESS ALREADY MONITORNG & \ DUMMY%=FNUNLOCK.COMMON% & 2500 PRINT "**Talking on channel "; & FNDGT2$(TALK.CHAN%(USER.JOB%)) & \ RETURN & !=================================================================== & 2800 & ! **BROADCAST COMMAND** & ! & ! BROADCAST TO A SPECIFIC CHANNEL, BUT IF CHANNEL IS NOT & ! SPECIFIED, BROADCAST ON CURRENT USERS TALK CHANNEL. NOTE & ! THAT BROADCAST WILL SEND THE MESSAGE WITH NO PASSWORD CHECKS & ! OR /RESTRICT CHECKS & ! & GOTO 2950 IF STRT.ARG%=.FALSE% !ILLEGAL IF NO ARG & \ BRDCST%=TALK.CHAN%(USER.JOB%) !ASSUME STD CHN & \ I2%=INSTR(STRT.ARG%+1%,CMD$," ") !CHN TYPED? & \ GOTO 2810 IF I2%=.FALSE% !NO CHN SPECFD & \ CHN$=MID(CMD$,STRT.ARG%+1%,I2%-STRT.ARG%-1%) !GET CHNL & \ BRDCST%=VAL(CHN$) !SAVE IT & \ STRT.ARG%=I2% !POINT PAST CHNL & 2810 MSG$=RIGHT(CMD$,STRT.ARG%+1%) ! & \ GOTO 3750 IF (BRDCST%=40%) AND (USER.PROJ%<>.PRIV%) & !CHAN 40 SPECIAL & \ GOTO 2950 IF BRDCST%<1% OR BRDCST%>40% !ILLEGAL, SORRY & \ DUMMY%=FNBROADCAST%(BRDCST%,MSG$,1%) !SEND, NO PSWD & \ RETURN & 2950 PRINT "**??Illegal Channel??**" & \ RETURN & !=================================================================== & 3000 & ! **MONITOR COMMAND** & ! & ! ADD OR SUBTRACT CHANNELS TO BE MONITORED, NOTE THAT YOU CAN & ! NOT SUBTRACT YOUR CURRENT TALK CHANNEL. ALSO, A '/MON -' & ! COMMAND WILL DROP ALL CHANNELS FROM THE USERS MONITOR LIST & ! EXCEPT THE CURRENT USER TALK CHANNEL & ! & GOTO 3500 IF STRT.ARG%=.FALSE% !SHOW CUR IF NO ARG & \ CMD$=RIGHT(CMD$,STRT.ARG%+1%) & \ talk% = talk.chan%(user.job%) !get talk chnl lclly & \ DUMMY%=FNLOCK.COMMON% & 3010 GOTO 3400 IF CMD$= .NULL$ & \ I2%=INSTR(1%,CMD$,",") & \ CHN$=CMD$ & \ CMD$=.NULL$ IF I2%=.FALSE% !NO MORE & \ GOTO 3050 IF I2%=.FALSE% !MUST BE LAST ONE & \ CHN$= LEFT(CMD$,I2%-1%) & \ CMD$=RIGHT(CMD$,I2%+1%) & 3050 GOTO 3100 IF CHN$="-" & \ CHN%=ABS(VAL(CHN$)) & \ GOTO 3750 IF CHN%=40% AND USER.PROJ%<>.PRIV% !CHAN 40 SPC & \ GOTO 3700 IF CHN%=0% OR CHN%>40% & \ GOTO 3110 IF INSTR(1%,CHN$,"-") !DELETE & 3060 DUMMY2%=FNGET.CHAN%(CHN%) & \ DUMMY%=FNUSER.POSITION% & \ IF DUMMY%<>-1% THEN & PRINT "**??Already monitoring channel "; & FNDGT2$(CHN%);"??**" & \ GOTO 3010 !do another & 3070 TMP% = FNSET.CHNL%(CHN%) !PUT US IN THIS CHANNEL & \ GOTO 3010 & 3100 FOR WX%=1% TO 40% & \ GOTO 3105 IF WX%=TALK% & OR CHANNEL.USED%(WX%)=.FALSE% & !CANT UNMONITOR USERS' TLK CHAN & !OR UNUSED CHANNEL & \ DUMMY2%=FNGET.CHAN%(WX%) & \ DUMMY%=FNUSER.POSITION% & \ GOTO 3105 IF DUMMY%= -1% !NOT ON CHANNEL & \ ST%(DUMMY%)= 00% & \ DUMMY2%=FNPUT.CHAN%(WX%) & 3105 NEXT WX% & \ DUMMY%=FNUNLOCK.COMMON% & \ PRINT "**All channels except "; & TALK%;" reset **" & \ PRINT & \ RETURN & 3110 GOTO 3720 IF CHN%=TALK% & !CANT UNMONITOR TALK CHANNEL & \ DUMMY2%=FNGET.CHAN%(CHN%) & \ DUMMY%=FNUSER.POSITION% & \ IF (DUMMY%= -1%) THEN & PRINT "**??Not monitoring channel "; & FNDGT2$(CHN%);"??**" & \ GOTO 3010 !do another & 3120 ST%(DUMMY%)= 00% & \ DUMMY2%=FNPUT.CHAN%(CHN%) & \ GOTO 3010 & 3400 DUMMY%=FNUNLOCK.COMMON% & 3500 PRINT "**Monitoring channels: " & \ MCNT%= 0% & \ FOR X%=1% TO 40% & \ GOTO 3550 IF CHANNEL.USED%(X%) = .FALSE% !NEVR USED & ! PRINT "MONITOR - CHANNEL CHECKING=";X% & ! IF DEBUG% & \ DUMMY2%=FNGET.CHAN%(X%) & \ DUMMY%=FNUSER.POSITION% & \ GOTO 3550 IF DUMMY%= -1% !NOT ON CHANNEL & \ MCNT%=MCNT%+1% & \ PRINT FNDGT2$(X%);" "; & \ IF MCNT%>15% THEN & MCNT%= 0% & \ PRINT & 3550 NEXT X% & \ PRINT cr+lf & \ RETURN & 3700 PRINT "**??Illegal MONITOR channel '"; & CHN$;"'??**" & \ GOTO 3010 & 3720 PRINT "**??Cannot UNMONITOR your "+ & "TALK channel??**" & \ GOTO 3010 & 3750 PRINT "**??40 -"; & \ gosub 8950 !priv operation msg & \ goto 3010 & !=================================================================== & 3800 & ! **WATCH (USERS ON A SPECIFIC CHANNEL)** & ! & ! GET A LIST BY CHANNEL OF WHO IS ON THE SYSTEM UNDER A & ! SPECIFIC CHANNEL & ! & GOTO 2950 IF (STRT.ARG%=.FALSE%) AND (CCL.ENTRY%) & !MUST BE GIVEN A CHANNEL TO CHECK & !IF CCL ENTRY & \ ANY.USERS%=.FALSE% & \ GOTO 3805 IF STRT.ARG%<>0% & \ CHN%=TALK.CHAN%(USER.JOB%) & \ GOTO 3807 & 3805 CMD$=RIGHT(CMD$,STRT.ARG%+1%) & \ CHN%=VAL(CMD$) & 3807 GOTO 2950 IF (CHN%<=0%) OR (CHN%>40%) & \ PRINT "Users on Channel #";CHN%;CR+LF & \ GOTO 3855 IF CHANNEL.USED%(CHN%)=.FALSE% !NEVER USED & \ DUMMY2%=FNGET.CHAN%(CHN%) & 3810 FOR CXX%=1% TO 63% & \ GOTO 3850 IF ST%(CXX%)=00% !NOT IN THIS POSITION & \ GOTO 3855 IF ST%(CXX%)=99% !END OF USERS & \ USR%=ST%(CXX%) & \ KBN$=FNKB.NUMBER$(USR%) & \ GOTO 3850 IF KBN$="ILL:" !DONT REPORT KILLED JOBS & \ PRINT "#";NUM1$(USR%);TAB(6%); & "[";NUM1$(CB.PROJ%(USR%))+","+ & NUM1$(CB.PROG%(USR%));"]";TAB(18%); & KBN$;TAB(27%); & HANDLE$(USR%);TAB(46%); & \ PRINT "Monitor"; & \ PRINT ", Talk"; IF TALK.CHAN%(USR%)=CHN% & \ PRINT ", PSWD"; IF (JOB.FLAGS%(USR%) AND .SECRET.OPT%) & AND (TALK.CHAN%(USR%)=CHN%) & \ PRINT & \ ANY.USERS%=.TRUE% & 3850 NEXT CXX% & 3855 PRINT "No Users on this channel" IF NOT(ANY.USERS%) & \ PRINT & \ RETURN & !=================================================================== & 4000 & ! **LIST (USERS) COMMAND** & ! & ! LIST CURRENT CB USERS. NOTE IF A USER IS SPECIFIED, ONLY & ! JOB NUMBER IS REPORTED & ! & ST%=1% & \ EN%=63% & \ CM% = 0% !RESET FLAG & \ ONE.USER%=.FALSE% & \ GOTO 4010 IF STRT.ARG%=.FALSE% !CHK IF WE HAVE ARG & \ CM%=VAL(RIGHT(CMD$,STRT.ARG%+1%)) & \ GOTO 4010 IF CM% = 99% !ALL JOB FLAG SET & \ GOTO 5720 IF CM%<1% OR CM%>63% & \ ONE.USER%=.TRUE% & \ ST%,EN% = CM% !SET STRT,END & 4010 PRINT "CB is CLOSED"+CR+LF+LF IF CB.CLOSED% AND & USER.PROJ%=1% & \ PRINT "CB User list:" UNLESS ONE.USER% & \ ANY.USERS%=.FALSE% & \ PRINT & \ FOR X%=ST% TO EN% & \ GOTO 4500 IF CB.PROJ%(X%)= 0% & \ KB$=FNKB.NUMBER$(X%) & \ GOTO 4500 IF KB$="ILL:" AND CM%=.FALSE% & !DONT REPORT KILLED JOBS & \ ANY.USERS%=.TRUE% & \ PRINT "#"+FNDGT2$(X%);" ["+NUM1$(CB.PROJ%(X%))+ & ","+NUM1$(CB.PROG%(X%))+"]"; & TAB(14%);KB$;TAB(21%); & CVT$$(HANDLE$(X%),128%);TAB(34%); & "Talk: "; & FNDGT2$(TALK.CHAN%(X%)); & \ PRINT TAB(43%);"A tt: "; & \ FLAGS% = JOB.FLAGS%(X%) & \ PRINT "JOB "; IF FLAGS% AND .JOB.OPT% & \ PRINT "KB "; IF FLAGS% AND .KB.OPT% & \ PRINT "PPN "; IF FLAGS% AND .PPN.OPT% & \ PRINT "PSWD "; IF FLAGS% AND .SECRET.OPT% & \ PRINT "SPY "; IF FLAGS% AND .SPY.OPT% & \ PRINT "UPR "; IF FLAGS% AND .UPPER.OPT% & \ PRINT "BG "; IF FLAGS% AND .BG.OPT% & \ PRINT "None"; IF FLAGS%=.FALSE% & \ PRINT cr+lf;" Wdth: ";tty.width%(x%); & \ PRINT tab(12%);CVT$$(CB.PASS$(X%),-1%); & IF (USER.PROJ%= .PRIV%) & ! OR (((JOB.FLAGS%(X%) AND & ! .SECRET.OPT%) <>0%) & ! AND (DEBUG%<>0%)) & & \ PRINT TAB(19%);"Mon: "; & \ MCNT%= 0% & \ FOR Y%=1% TO 40% & \ GOTO 4050 IF CHANNEL.USED%(Y%) = .FALSE% & \ DUMMY2%=FNGET.CHAN%(Y%) & \ OTHER.USER%=FNOTHER.POSITION%(X%) & \ GOTO 4050 IF OTHER.USER%= -1% !NOT ON CHAN & \ PRINT FNDGT2$(Y%);" "; & \ MCNT%=MCNT%+1% & \ IF MCNT%>15% THEN & MCNT%= 0% & & \ PRINT cr+lf;TAB(24%); & 4050 NEXT Y% & \ PRINT & 4500 NEXT X% & \ PRINT "No users " IF NOT(ANY.USERS%) & \ PRINT & \ RETURN & !=================================================================== & 4700 & ! **INDIRECT FILE PROCESSING** & ! & ! PROCESS AN INDIRECT FILE, THIS CODE IS EXECUTED AT STARTUP & ! TO PROCESS 'CB.INI' IN THE CURRENT USERS ACCOUNT, BUT NO & ! ERROR WILL OCCUR IF IT DOES NOT EXIST. ONLY ONE INDIRECT & ! FILE CAN BE OPENED, AND A '/AT' OR '@' COMMAND FROM A FILE & ! WILL GENERATE AN ERROR & ! & goto 4720 if at.proc% !ALREADY PROCESSING & \ goto 4710 if STRT.ARG%=.FALSE% !no filename, error & \ AT.FILE$ = CVT$$(RIGHT(CMD$,strt.arg%),-1%) !GET FILENAME & \ OPEN AT.FILE$ FOR INPUT AS FILE #1% & \ AT.PROC% = .TRUE% !SET OPEN FLAG & \ RETURN & 4710 !OPEN ERROR OCCURED & PRINT "**??Bad file??**" UNLESS SILENT% & \ silent% = .FALSE% !make sure public & \ RETURN & 4720 !MULT INDIRECT NOT ALLOWED & PRINT "**??Multiple indirect NOT ALLOWED??**" & \ RETURN & !=================================================================== & 5000 & ! **HELP COMMAND** & ! & ! READ THE CBHLP.DOC FILE IN READ-ONLY MODE FROM THE ACCOUNT & ! THAT CB RESIDES IN. AN ERROR IS GENERATED IF THE HELP FILE & ! DOES NOT EXIST. & ! & OPEN CB.PKG$+"CBHLP.DOC/RO" FOR INPUT AS FILE 3% & \ GOTO 5020 !A-OK & 5010 PRINT "**??No HELP AVAILABLE??**" & \ RETURN & 5020 LINPUT #3%, MSG$ !GET A LINE & \ PRINT MSG$ & \ GOTO 5020 & 5030 CLOSE #3% !WE ARE DONE & \ RETURN & !=================================================================== & 5200 & ! **WIDTH COMMAND** & ! & ! SET THE TERMINAL WRAP-AROUND WIDTH TO A SPECIFIC VALUE. IF & ! A VALUE IS ILLEGAL OR NOT SPECIFIED, THEN THE CURRENT VALUE & ! IS RETURNED AND DISPLAYED. A VALUE BELOW .MIN.WIDTH% OR & ! ABOVE .MAX.WIDTH% IS ILLEGAL & ! & GOTO 5250 IF STRT.ARG% = .FALSE% !DISPLAY CUR WIDTH & \ CMD$=RIGHT(CMD$,STRT.ARG%+1%) & \ tmp%=VAL(CMD$) & \ GOTO 5250 IF (tmp%< .MIN.WIDTH%) OR !MIN TO ALLOW & (tmp%> .MAX.WIDTH%) !MAX TO ALLOW & \ DUMMY% = fnlock.common% & \ TTY.WIDTH%(USER.JOB%) = tmp% !SET NEW WIDTH & \ DUMMY% = fnunlock.common% & 5250 PRINT "**WIDTH set to ";TTY.WIDTH%(USER.JOB%);"**" & \ RETURN & !=================================================================== & 5500 & ! **KILL JOB COMMAND (PRIV)** & ! & ! KILL A JOB RUNNING CB BY FORCING INTERNAL ABORT COMMANDS TO & ! IT. A JOB IN CB THAT IS DETACHED CANNOT BE KILLED UNTIL IT & ! IS DETACHED. & ! & GOTO 8950 IF USER.PROJ%<>.PRIV% !PRIV FUNCTION ONLY & \ GOTO 5720 IF STRT.ARG%=.FALSE% !WE MUST HAVE AN ARG & \ CMD$=RIGHT(CMD$,STRT.ARG%+1%) & \ JBNUM%=VAL(CMD$) & \ GOTO 5720 IF JBNUM%<1% OR JBNUM%>63% & \ DUMMY%=FNLOCK.COMMON% & \ DUMMY2%=FNGET.CHAN%(0%) & \ OTHER.USER%=FNOTHER.POSITION%(JBNUM%) !USER ON CB???? & \ DUMMY%=FNUNLOCK.COMMON% & \ GOTO 5730 IF OTHER.USER%= -1% !NO, CANT KILL & \ PRINT "Really KILL job #";JBNUM%; & \ WAIT 60% !JUST IN CASE & \ INPUT ANS$ & \ WAIT 0% & \ GOTO 5502 IF CVT$$(LEFT(ANS$,1%),-1%)="Y" & 5501 PRINT "/KILL aborted!" & \ WAIT 0% & \ RETURN & 5502 KB$=FNKB.NUMBER$(JBNUM%) & \ GOTO 5740 IF KB$="ILL:" OR KB$="Det" & \ KB.SND%=KBN% !RTNED FRM FN CALL & \ HNDL$=CVT$$(HANDLE$(JBNUM%),128%) !SAVE USER HANDLE & & \ MSG$= CR + CHR$(24%) + CHR$(24%) + CR !SEND INTERNAL ABORT & \ DUMMY$ =SYS(CHR6$ +CHR$(-4%)+CHR$(KB.SND%)+MSG$) & !force to offending terminal & \ SLEEP 2% & 5550 PRINT "**Job #";JBNUM%;" KILLed**" & \ RETURN & 5720 PRINT "**??Illegal Job number??**" & \ RETURN & 5730 PRINT "**??Job not in CB??**" & \ RETURN & 5740 PRINT "**??Job Detached-Cannot /KILL??**" & \ RETURN & !=================================================================== & 5990 & ! **INTERNAL /ZAP* COMMAND** & RUNNING.IN.ZAP% = -1% & 6000 & ! **EXIT COMMAND (^Z OR ^C TOO)** & ! **ANY FATAL OR WEIRD ERRORS COME HERE TOO** & ! A FLAG 'RUNNING.IN.ERROR%' WILL BE SET ON THE LATTER & ! NOTE: IF ENTRY IS MADE AT 5990 ABOVE THEN AN EXIT WILL & ! OCCUR WITH SPECIAL EXIT MSGS, THIS ENTRY OCCURS & ! ON AN OPERATOR JOB /KILL COMMAND & ! & ! V2.2 - CALLED BY FNCHECK.JOB IF LIBRARY CORRUPT, WE CLEAR & ! A USER REALLY NOT IN CB ANYMORE BY DOING THIS FOR & ! HIM & ! & DUMMY%=FNLOCK.COMMON% & \ TMP% = USER.JOB% !SAVE JOB NUM & \ USER.JOB% = CLEARING.JOB% IF CLEARING.JOB% !FNCLEAR.JOB & !CLEAR USER STUFF & \ TALK.CHAN%(USER.JOB%), & CB.PROG%(USER.JOB%), & CB.PROJ%(USER.JOB%), & TTY.WIDTH%(USER.JOB%), & JOB.FLAGS%(USER.JOB%)=.FALSE% & \ HNDL$=CVT$$(HANDLE$(USER.JOB%),128%) & \ CB.PASS$(USER.JOB%), & HANDLE$(USER.JOB%)= .NULL$ & \ FOR YX%= 0% TO 40% & \ GOTO 6050 IF CHANNEL.USED%(YX%) = .FALSE% !NEVR USED & \ DUMMY2%=FNGET.CHAN%(YX%) & \ DUMMY%=FNUSER.POSITION% & \ GOTO 6050 IF DUMMY% = -1% & & \ ST%(DUMMY%)= 00% & \ GOTO 6030 IF YX%<>0% ! & & \ USRX% = 0% !LETS CNT REM USERS & \ FOR Y% = 1% TO 63% & \ USRX% = USRX%+1% & IF ST%(Y%)<>0% AND ST%(Y%)<>99% & \ Y%=999% IF ST%(Y%)=99% !NO MORE ANYWAY & \ NEXT Y% & \ COMMON.INIT% = 457% IF USRX%= 0% !NO REMIANING USRS & 6030 DUMMY2%=FNPUT.CHAN%(YX%) & 6050 NEXT YX% & \ USER.JOB% = TMP% !RESTORE USER.JOB NUMBER & \ RETURN IF CLEARING.JOB% !FNCLEAR.JOB CALL, RETURN & \ TYP$="leaving" & \ TYP$="ABORTING" IF RUNNING.IN.ERROR% & \ TYP$="DETACHing" IF RUNNING.IN.ERROR% AND & RUNNING.IN.ZAP% !USER DETACHED & \ TYP2$=.NULL$ & \ TYP2$=" (Involuntarily)" IF RUNNING.IN.ZAP% & \ CMD$="**User #"+NUM1$(USER.JOB%)+" ("+HNDL$+")"+ & " is "+TYP$+" CB"+TYP2$+"**" & \ DUMMY%=FNUNLOCK.COMMON% & \ DUMMY%=FNBROADCAST%(0%,CMD$,-1%) & UNLESS HIDE% !DO NOT SAY LEAVING & \ GOTO 32700 & !==================== =============================================== & 6500 & ! **CALL COMMAND** & ! & ! Send message of form: & ! '**CB - User: Handle - Please enter CB on Channel #n**' & ! & GOTO 6600 IF STRT.ARG%=.FALSE% !NOTHING SPECIFIED & \ ST%=VAL(RIGHT(CMD$,STRT.ARG%+1%)) & \ GOTO 6600 IF ST%<0% OR ST%>127% & \ DUMMY2%=FNGET.CHAN%(0%) & 6510 FOR X%=1% TO 63% & \ GOTO 6550 IF ST%(X%)= 00% !NO JOB THERE & \ KB$=FNKB.NUMBER$(ST%(X%)) !GET JOB KB & \ GOTO 6620 IF KBN%=ST% !IN CB-ABORT & 6550 NEXT X% & \ MSG$=BELL$+"**CB - User: "+ & CVT$$(HANDLE$(USER.JOB%),16%)+" - "+ & "Enter CB on Channel # "+ & NUM1$(TALK.CHAN%(USER.JOB%))+"**" & \ MSG$= CR + LF +MSG$+ CR + LF +BELL$ & \ DUMMY$ = SYS(CHR6$+CHR$(-5%)+CHR$(ST%)+MSG$) & \ PRINT "**Request sent**"+CR+LF & \ RETURN & 6600 PRINT "**??Bad KB number??**" & \ RETURN & 6620 PRINT "**??KB in CB??**" & \ RETURN & !=================================================================== & 6700 & ! **XEQ COMMAND** & ! & ! ATPK-TYPE routine to process commands at a pseudo-keyboard & ! while still in CB. The PK buffers are checked reqularly for & ! I/O on an asynchronous operation. & ! & GOTO 6950 IF (PK.OPEN%) & AND (STRT.ARG%=.FALSE%) !USER WANTS OUT... & \ PK.CMD$=RIGHT(CMD$,STRT.ARG%+1%) !WHAT TO SEND? & \ PK.CMD$= .NULL$ IF STRT.ARG%=.FALSE% !NO MSG & \ GOTO 6880 IF PK.OPEN% !WEVE BEEN HERE B4. & \ PK.UNIT%, PK.BUSY% = 0% !LETS FIND OPEN & 6705 OPEN "PK"+NUM1$(PK.UNIT%)+":" AS FILE #2%, RECORDSIZE 134% & \ PK.OPEN% = .TRUE% !WE GOT A GOOD ONE & \ GOTO 6710 ! & 6707 GOTO 6960 IF PK.BUSY% !ALL IN USE & \ PK.UNIT% = PK.UNIT%+1% & \ GOTO 6705 !TRY AGAIN & 6710 PRINT #2%, RECORD 1%, "HELLO "+NUM1$(USER.PROJ%)+ & ","+NUM1$(USER.PROG%)+";"+USER.PSSWRD$+CR; & \ PK.NOECHO% = .TRUE% & \ PK.TMO% = .TIMEOUT.MAX% - 30% !TMO FOR 30 SEC & \ GOSUB 6805 !SEND HELLO STUFF & \ JOB.FLAGS%(USER.JOB%)=JOB.FLAGS%(USER.JOB%) XOR .BG.OPT% & \ PRINT "**BG ON**" UNLESS FNDET% !tell user & \ IF PK.CMD$<>.NULL$ THEN 6880 ELSE 6870 !IF CMD, DO IT & 6805 HOLD.TMO% = PK.TMO% !SAVE COUNTER & 6810 RETURN IF PK.SCAN% !AT NOTHING,SCAN RTN & \ SLEEP 1% & \ PK.TMO%=PK.TMO%+1% !INC TIMEOUT & \ IF PK.TMO% > .TIMEOUT.MAX% THEN & PRINT "**BG has no I/O**" UNLESS FNDET% OR PK.LOCK% & or PK.CTRL.T% & \ GOTO 6870 !RETURN TO CB CMD & 6815 PK.RCV% = .FALSE% & 6820 GET #2 & \ FIELD #2, RECOUNT AS PK.RCV$ & \ PK.RCV$ = RIGHT(PK.RCV$,LEN(PK.CMD$)+PK.SND%) IF PK.SND% & \ PK.SND% = .FALSE% & \ PK.RCV% = .TRUE% & \ PK.TMO% = HOLD.TMO% !CLR TIMEOUT COUNT & \ PRINT PK.RCV$; UNLESS PK.NOECHO% or fndet% !cant i/o det kb & \ GOTO 6820 & 6860 PUT #2%, RECORD 4%, COUNT 0% !SEE IF PK IN WAIT & 6870 !WE ARE IN PK WAIT FOR INPUT, GO BACK TO USER & PK.TMO% = HOLD.TMO% !CLEAR TMOUT COUNTER & \ RETURN & 6880 FIELD #2%, 134% AS PK.SND$ & \ PK.CMD$=.NULL$ IF PK.CMD$="<>" !XLATE null line & \ PK.CMD$=FNQUOTE$(PK.CMD$) !DO "_" STUFF & \ PK.CMD$=FNCTRL$ (PK.CMD$) !DO ^X STUFF & \ PK.CMD$=PK.CMD$+CR UNLESS LEN(PK.CMD$)=1% AND & ASCII(PK.CMD$)<32% & \ LSET PK.SND$ = PK.CMD$ & \ PK.NOECHO% = .FALSE% & \ PK.TYPE% = 1% !SPECIAL SEND & \ PK.TYPE% = 0% UNLESS LEN(PK.CMD$)=1% AND & ASCII(PK.CMD$)<32% & 6890 TMP% = LEN(PK.CMD$) !SAVE LENGTH & \ PUT #2%, RECORD PK.TYPE%, COUNT TMP% & \ PK.SND% = 0% !IF CTRL, ECHO CMD & \ PK.SND% = 2% UNLESS TMP%= 1% AND & ASCII(PK.CMD$)<32% & \ PK.SND% = 3% IF TMP% = 1% AND & (ASCII(PK.CMD$)=10% OR ASCII(PK.CMD$)=13%) & \ PK.SND% = 4% IF TMP% = 1% AND & (ASCII(PK.CMD$)=03% OR ASCII(PK.CMD$)=26%) & \ PK.SCAN%, HOLD.TMO%, PK.TMO%, PK.CTRL.T% = .FALSE% & !RESET SOME FLAGS & \ PK.CTRL.T% = .TRUE% IF (TMP%=1%) AND (ASCII(PK.CMD$)=20%) & \ PK.TMO%, HOLD.TMO% = .TIMEOUT.MAX% - 2% IF (PK.LOCK%) OR & (PK.CTRL.T%) & !ALMOST NO TMO IF $ & !OR ^T & & \ GOSUB 6820 !SEE IF I/O & \ GOTO 6870 !RETURN & 6895 !PK IN USE, IT IS BUSY, CANNOT SEND DATA & PRINT "**??BG busy??**" UNLESS FNDET% & \ GOTO 6870 !RETURN & 6950 !TURN OFF THE XEQ STUFF & PUT #2%, RECORD 6%, COUNT 0% !IF AT CMD LEVEL & \ GOTO 6955 !THEN NO ^Z,^C NDED & 6953 FIELD #2%, 128% AS PK.SND$ & \ LSET PK.SND$=CHR$(26%) !SETUP CTRL/Z & \ PUT #2%, RECORD 1%, COUNT 1% !SEND IT & \ PK.SCAN% = .FALSE% !LETS GET I/O & \ PK.TMO% = .TIMEOUT.MAX% - 5% !.BUT FOR 5 SEC ONLY & \ HOLD.TMO% = PK.TMO% !...SAVE IT & \ SLEEP 1% !WAIT A SECOND.. & \ GOSUB 6815 !SNATCH SOME I/O & \ LSET PK.SND$=CHR$(3%) !SETUP CTRL/C & \ PUT #2%, RECORD 1%, COUNT 1% !SEND IT & \ PK.SCAN% = .FALSE% ! & \ GOSUB 6815 !WAIT FOR COMPLETE & 6955 CLOSE #2% !EXIT THE PK & \ PK.OPEN%, PK.UNIT%=.FALSE% !RESET FLAG & & \ JOB.FLAGS%(USER.JOB%)=JOB.FLAGS%(USER.JOB%) XOR .BG.OPT% & \ PRINT "**BG OFF**" UNLESS FNDET% !tell user & OR ((RUNNING.IN.ZAP%) AND (RUNNING.IN.ERROR%)) & \ RETURN !DONE WITH IT & 6958 PRINT "**??BG Aborted*??**" UNLESS FNDET% !Something wrong & OR ((RUNNING.IN.ZAP%) AND (RUNNING.IN.ERROR%)) & \ PK.LOCK% = .FALSE% !RESET LOCK & \ GOTO 6955 !PK logged out??? & 6960 PRINT "**??No BG available??**" & \ RETURN & 6980 !CTRL/C TRAP FOR PK ONLY & FIELD #2%, 128% AS PK.SND$ & \ LSET PK.SND$=CHR$(3%) & \ PUT #2, RECORD 1%, COUNT 1% & \ GOTO 6820 & 6990 !^Z ON USER INPUT DURING PK.LOCK% & CMD$ = "^Z" !AS A LOCK EXIT & \ GOTO 555 !PROCESS USER ^Z & 6995 !^C ON USER INPUT DURING PK.LOCK% & CMD$ = "^C" !AS A LOCK EXIT & \ GOTO 555 !PROCESS USER ^C & !=================================================================== & 7000 & ! **KB TOGGLE COMMAND** & ! & ! Toggle /KB user job flag & ! & DUMMY% = FNTOGGLE%("KB",.KB.OPT%) & \ RETURN & !=================================================================== & & & & 7500 & ! **SPY TOGGLE COMMAND** & ! ALLOW A PRIV USER TO WATCH RESTRICTED MESSAGES & ! & ! Toggle /SPY user job flag & ! & ! & GOTO 8950 IF USER.PROJ%<>1% & \ DUMMY% = FNTOGGLE%("SPY",.SPY.OPT%) & \ RETURN & !=================================================================== & & & & 8000 & ! **PPN toggle COMMAND** & ! & ! Toggle /PPN user job flag & ! & DUMMY% = FNTOGGLE%("PPN",.PPN.OPT%) & \ RETURN & !=================================================================== & & & & 8500 & ! **UPPER CASE toggle COMMAND** & ! & ! Toggle /UPPER user job flag & ! & DUMMY% = FNTOGGLE%("UPPER ONLY",.UPPER.OPT%) & \ RETURN & !=================================================================== & & & & 8700 & ! **JOB toggle COMMAND** & ! & ! Toggle /JOB user job flag & ! & DUMMY% = FNTOGGLE%( "JOB",.JOB.OPT%) & \ RETURN & !=================================================================== & 8900 & ! **ALL (BROADCAST) COMMAND** & ! & ! Send a message across channels to all users on CB. This is & ! a privileged function. & ! & GOTO 8950 IF USER.PROJ%<>.PRIV% !PRIV FUNCTION & \ GOTO 8940 IF STRT.ARG%=.FALSE% & \ MSG$=RIGHT(CMD$,STRT.ARG%+1%) & \ DUMMY%=FNBROADCAST%(0%,MSG$,2%) !SEND IT & \ RETURN & 8940 PRINT "**??Nothing to send??**" & \ RETURN & 8950 PRINT "**??Privileged operation??**" & \ RETURN & !=================================================================== & 9500 & ! **RESTRICT (PASSWORD) COMMAND** & ! & ! Set or reset a password associated with messages that are & ! sent by the current user. A priv user with /SPY can see & ! /RESTRICTed messages whether he has /RESTRICT set or not. & ! If no arg is sent but password turned on, set psswrd to & ! 1st six chars of entered command line & ! & PS$=CVT$$(RIGHT(CMD$,STRT.ARG%+1%),-1%) & \ dummy%= fntoggle%("Password",.SECRET.OPT%) !TURN OFF & \ PS$ = .null$ if dummy%=.false% !RESET & \ CB.PASS$(USER.JOB%)=PS$ & \ RETURN & !=================================================================== & 9800 & ! **DETACH (PRIV) COMMAND** & ! & ! Detach a privileged user from CB. A /LIST command will & ! show this user on kb 'Det' & ! & GOTO 8950 IF USER.PROJ%<>.PRIV% & \ PRINT "**Detaching from terminal**"+cr+LF+cr+LF & \ DUMMY$=SYS(CHR6$+CHR$(7%)) !do the detach & \ RETURN & !=================================================================== & 9900 & ! **DATE or TIME FUNCTION** & ! & ! Return current system date and time & ! & PRINT "**"+DATE$(0%)+" at "+TIME$(0%)+"**"+CR+LF & \ RETURN & !=================================================================== & 9950 & ! **CLOSE COMMAND** & ! & ! Allows a privileged user to close CB from further usage by & ! non-privileged users. All users get a closing message sent & ! to their terminals & ! & GOTO 8950 IF USER.PROJ%<>.PRIV% !PRIV FUNCTION ONLY & \ CB.CLOSED% = .TRUE% !CLOSE CB & \ MSG$ = "**CB is closing, please finish up**"+BELL$ & \ DUMMY% = FNBROADCAST%(0%,MSG$,2%) !TELL EVERYBODY & \ PRINT "**CB closed**" & \ RETURN & !=================================================================== & 9960 & ! **OPEN COMMAND** & ! & ! Allows a privileged user to open CB to use by non-privileged & ! users. & ! & GOTO 8950 IF USER.PROJ%<>.PRIV% !PRIV FUNCTION ONLY & \ CB.CLOSED% = .FALSE% !OPEN CB & \ PRINT "**CB open**" & \ RETURN & !=================================================================== & 10000 & ! ***USER DEFINED FUNCTIONS*** & ! & DEF FNLOCK.COMMON% & ! LOCK THE COMMON AREA SO OTHER USERS CANNOT & ! UPDATE WHILE WE ARE & & ! PRINT "LOCK.COMMON%" IF DEBUG% & 10001 SLEEP 1% IF COMMON.IN.USE%<>USER.JOB% & AND COMMON.IN.USE%<>0% & \ GOTO 10001 IF COMMON.IN.USE%<>USER.JOB% & AND COMMON.IN.USE%<>0% & \ COMMON.IN.USE%=USER.JOB% & UNLESS COMMON.IN.USE%<>USER.JOB% & AND COMMON.IN.USE%<>0% & \ GOTO 10001 IF COMMON.IN.USE%<>USER.JOB% & AND COMMON.IN.USE%<>0% & ! PRINT "LOCK.COMMON% FINISHED" IF DEBUG% & \ FNEND & !=================================================================== & & & & & 10003 DEF FNUNLOCK.COMMON% & ! UNLOCK THE COMMON AREA, WHEN WE ARE FINISHED & & ! PRINT "UNLOCK.COMMON%" IF DEBUG% & \ COMMON.IN.USE%=.FALSE% IF COMMON.IN.USE%=USER.JOB% & \ FNEND & !=================================================================== & & 10004 DEF FNOPEN.POSITION% & ! FIND OPEN POSITION IN ST%() ARRAY FOR THIS & ! JOB & & ! PRINT "FNOPEN.POSITION%" IF DEBUG% & \ FOR OPNX%=1% TO 63% & \ IF ST%(OPNX%)= 00% OR ST%(OPNX%)=99% THEN & OPEN.POS%=OPNX% & \ GOTO 10010 & 10005 NEXT OPNX% & \ PRINT "?SPR - No OPN?" & \ RUNNING.IN.ERROR% = .TRUE% & \ GOTO 6000 !TRY TO /EXIT & 10010 FNOPEN.POSITION% = OPEN.POS% & ! PRINT "OPEN.POSITION FOUND = ";OPEN.POS% IF DEBUG% & \ FNEND & !=================================================================== & 10020 DEF FNUSER.POSITION% & ! FIND A USER JOB SLOT IN THE ST%() ARRAY & ! IF NOT FOUND, RETURNS -1 & & ! PRINT "FNUSER.POSITION%" IF DEBUG% & \ FOR USRX%=1% TO 63% & \ IF ST%(USRX%) = 99% THEN & GOTO 10031 !END OF EVERYTHING, STOP & 10025 IF ST%(USRX%)=USER.JOB% THEN & USER.POS%=USRX% & \ GOTO 10040 & 10030 NEXT USRX% & 10031 USER.POS%= -1% !USER NOT FOUND-LEGAL & 10040 FNUSER.POSITION% = USER.POS% & ! PRINT "FNPOSITION - FOUND POSITION ";USER.POS% & ! IF DEBUG% & \ FNEND & !=================================================================== & 10042 DEF FNOTHER.POSITION%(ARG%) & ! FIND ALTERNATE USERS JOB SLOT IN ST%() ARRAY & ! RETURNS -1 IF NOT FOUND & & ! PRINT "FNOTHER.POSITION%",ARG% IF DEBUG% & \ FOR OUSRX%=1% TO 63% & \ IF ST%(OUSRX%) = 99% THEN & OUSRX% = 999% !END LOOP & \ GOTO 10044 & 10043 IF ST%(OUSRX%)=ARG% THEN & OTHER.POS%=OUSRX% & \ GOTO 10046 & 10044 NEXT OUSRX% & \ OTHER.POS%= -1% !USER NOT FOUND-LEGAL & 10046 FNOTHER.POSITION% = OTHER.POS% & ! PRINT "FNOTHERPOSITION - FOUND POSITION ";OTHER.POS% & ! IF DEBUG% & \ FNEND & !=================================================================== & 10050 DEF FNDGT2$(ARG%) & ! PRINT A NUMBER (USUALLY CHANNEL #) LEADING & ! ZERO FILLED & & ! PRINT "FNCHAN%",ARG% IF DEBUG% & \ CHHN$=NUM1$(ARG%) & \ CHHN$="0"+CHHN$ IF ARG%<10% & \ FNDGT2$=CHHN$ & \ FNEND & !=================================================================== & 10060 DEF FNTOGGLE%(ARG1$,ARG%) & ! TOGGLE A BIT IN THE USER JOB FLAGS WORD, THE & ! CALLER SENDS WHAT TO ACKNOWLEDGE AND THE BIT TO & ! TOGGLE, IT IS ACKNOWLEDGED WHEN THE OPERATION & ! IS COMPLETE. It also returns .true% or .false% in & ! the call name to specify whether bits now set, or & ! reset & & \ DUMMY%=FNLOCK.COMMON% & \ JOB.FLAGS%(USER.JOB%)=JOB.FLAGS%(USER.JOB%) XOR ARG% & \ DUMMY%=FNUNLOCK.COMMON% & \ tmp% = ((job.flags%(user.job%) and arg%)<>.FALSE%) & \ typ$ = "On" & \ typ$= "Off" IF NOT(tmp%) & \ PRINT "**";ARG1$;" ";TYP$;"**" & \ fntoggle% = tmp% !set return of tru/f & \ FNEND & !=================================================================== & 10100 DEF FNBROADCAST%(ARG1%,ARG1$,BFLAG%) & ! BROADCAST A MESSAGE TO ALL USERS ON THE & ! CHANNEL SPECIFIED BY ARG1%, IF FLAG% IS SET, & ! THEN DO NOT APPEND A HEADER & ! BFLAG% VALUES: & ! 0 =SEND WITH HEADER & ! -1=SEND NO HEADER (SYS MSG) & ! 1 =BYPASS PASSWRD CHECKS & ! 2 =ALL CMD (/OPR, NOT /Cnn) & ! & ! V2.2 WILL CHECK THAT JOB ST%(CXX%) IS REALLY IN '..CB..' & ! IF NOT, IT WILL CLEAR IT FROM TABLES, THIS SHOULD & ! CLEAR UP CORRUPTED CB LIBRARY ERRORS FROM 'UT KILLs' & & ! PRINT "FNBROADCAST% ";ARG1%,ARG1$,FLAG% IF DEBUG% & & & \ HLD.ARG$=ARG1$ & \ KB$=FNKB.NUMBER$(USER.JOB%) & \ KB%= KBN% !KBN RTD FRM CALL & \ JOB$=NUM1$(USER.JOB%) & \ PPN$="["+NUM1$(USER.PROJ%)+","+NUM1$(USER.PROG%)+"]" & \ USER.SPY%=((JOB.FLAGS%(USER.JOB%) AND .SECRET.OPT%) <> 0%) & \ USER.SPY%=.FALSE% IF (BFLAG%=1%) OR (BFLAG%=2%) & !USER DOING BROADCAST & 10110 GOTO 10210 IF CHANNEL.USED%(ARG1%) = .FALSE% !NEVER USED & \ DUMMY2%=FNGET.CHAN%(ARG1%) & \ FOR CXX%=1% TO 63% & \ SND.JOB% = ST%(CXX%) !GET NUMBER & \ GOTO 10200 IF SND.JOB% = 00% !NO JOB SLOT & \ GOTO 10210 IF SND.JOB% = 99% !END OF JOB SLOTS & ! PRINT "LOOKUP OF JOB ";CXX% IF DEBUG% & & \ GOTO 10200 IF fncheck.job%(snd.job%) !chk for IN CB & & \ KBS$=FNKB.NUMBER$(SND.JOB%) & ! PRINT "KB OF ACTIVE CB JOB ";CXX%,KBN% & ! IF DEBUG% & \ GOTO 10200 IF KBN$="ILL:" & \ KB.SND%=KBN% & \ GOTO 10200 IF KB.SND%=KB% !AND DEBUG%=.FALSE% & \ GOTO 10200 IF (KB.SND% < 0%) & OR (KB.SND% > 127%) & !DETACHED IN CB?? - NO SEND & \ FLAGS% = JOB.FLAGS%(SND.JOB%) !GET FLAG WORD & \ ARG1$=HLD.ARG$ & \ ARG1$=CVT$$(ARG1$,32%) & IF FLAGS% AND .UPPER.OPT% & & \ GOTO 10200 IF ((FLAGS% AND .SECRET.OPT%)=.FALSE%) AND & ((FLAGS% AND .SPY.OPT%)=.FALSE%) AND & (USER.SPY%) !SEND RESTR, RCV, NO & !SKIP IF....... & !SENDER HAS /RESTRICT SET & !RCEVER HAS /RESTRICT CLR & !RCEVER HAS /SPY CLR & \ GOTO 10200 IF ((FLAGS% AND .SECRET.OPT%)<>0%) & AND (USER.SPY%) & AND ((FLAGS% AND .SPY.OPT%)=.FALSE%) & AND (CB.PASS$(USER.JOB%) <> & CB.PASS$(SND.JOB%)) & !SKIP IF....... & !SENDER HAS /RESTRICT SET & !RCEVER HAS /RESTRICT SET & !RCEVER HAS /SPY CLR & !RCEVER / SENDER PSSWRDS DIF & ! PRINT "BROADCAST - PSWRDS '"; & ! CB.PASS$(USER.JOB%);"', "; & ! "'";CB.PASS$(SND.JOB%);"'", & ! "FLAGS SEND/RCV "; & ! JOB.FLAGS%(USER.JOB%),FLAGS% & ! IF DEBUG% & & \ BCST.TYPE$ = "C" !CHANNEL & \ BCST.TYPE$ = "B" IF BFLAG%=1% !BROADCAST & \ BCST.TYPE$ = BCST.TYPE$+FNDGT2$(ARG1%)+"/" & \ BCST.TYPE$ = "OPR/" IF BFLAG%=2% !ALL COMMAND & & \ SND.HDR$="("+BCST.TYPE$ & & \ SND.HDR$=SND.HDR$+KB$ & IF FLAGS% AND .KB.OPT% & \ SND.HDR$=SND.HDR$+PPN$ & IF FLAGS% AND .PPN.OPT% & \ SND.HDR$=SND.HDR$+ & CVT$$(HANDLE$(USER.JOB%),128%) & \ SND.HDR$=SND.HDR$+"#"+JOB$ & IF FLAGS% AND .JOB.OPT% & \ SND.HDR$ = SND.HDR$ + ") " & \ SND.HDR$=" " IF (BFLAG%= -1%) & !IF NO HDR REQUESTED..... & !THEN FORCE CLEAR & ! SND.HDR$="#DBG#"+SND.HDR$ IF DEBUG% & ! AND KB.SND%=KB% & !SAY DEBUG IF....... & !KB TO SEND= USER.JOB KB & \ SND.HDR$="SECRET"+SND.HDR$ IF (USER.SPY%<>0%) & AND (CB.PASS$(USER.JOB%) = & CB.PASS$(ST%(CXX%))) & !SAY SECRET IF....... & !SENDER HAS /RESTRICT SET & !RCEVER / SENDER PSSWRDS SME & \ SND.HDR$="+SPY+"+SND.HDR$ IF (USER.SPY%) & AND ((FLAGS% AND .SPY.OPT%)<>0%) & AND (CB.PASS$(USER.JOB%) <> & CB.PASS$(SND.JOB%)) & !SAY SPY IF....... & !SENDER HAS /RESTRICT SET & !RCEVER HAS /SPY SET & !RCEVER / SENDER PSSWRDS DIF & & \ MSG.MAX% = TTY.WIDTH%(SND.JOB%) - LEN(SND.HDR$) & !GET MAX FOR A LINE & \ MSG.MAX% = .WIDTH.DEFAULT% & IF (MSG.MAX% < 2%) & !DO NOT BLOW UP ON OBSCURE & !CONDITION & \ first.cur.send% = .true% !SETUP as 1st send & 10180 MSG$= ARG1$ !GET TOTAL MESSAGE & & \ LONG.MSG.FLAG% = .FALSE% !ASSUME STD MSG LEN & \ IF LEN(MSG$) > MSG.MAX% THEN & LONG.MSG.FLAG% = .TRUE% & \ ARG1$ = "--> "+RIGHT(MSG$,MSG.MAX%+1%) & \ MSG$ = LEFT(MSG$,MSG.MAX%) !CUT MSG DOWN & 10190 DUMMY$ = SND.HDR$ + MSG$ + CR + LF !SETUP MESSAGE & \ DUMMY$ = CR + LF + DUMMY$ & IF (FIRST.CUR.SEND%) & \ FIRST.CUR.SEND% = .FALSE% !RESET SEND FLAG & \ DUMMY$=SYS(CHR6$+CHR$(-5%)+CHR$(KB.SND%)+ & DUMMY$) & \ IF LONG.MSG.FLAG% THEN & GOTO 10180 & 10200 NEXT CXX% & 10210 FNEND & !=================================================================== & 10250 DEF FNGET.CHAN%(ARG%) & ! CHANGE CHANNEL$(ARG%) TO ST% (IN MACRO) & ! & \ CALL ST2NM BY REF (CHANNEL$(ARG%), ST%()) & \ FNEND & !=================================================================== & 10260 DEF FNPUT.CHAN%(ARG%) & ! CHANGE ST% TO CHANNEL$(ARG%) (IN MACRO) & ! & \ CSTRG$= CHANNEL$(ARG%) !MAKE NON-LOCAL & \ CALL NM2ST BY REF (CSTRG$, ST%()) !TO CALL & \ CHANNEL$(ARG%)= CSTRG$ !PUT BACK HERE & \ FNEND & !=================================================================== & 10300 DEF FNKB.NUMBER$(JBNO%) & ! FORMAT A KB NUMBER AS TO DET OR PSEUDO OR & ! REGULAR, IF NO KB ON JBNO% SPECIFIED, & ! RETURNS 'ILL:' & ! **V01.04 - APPENDS A '*" IF USER ON A MODEM, ONLY SHOWS & ! 2 DIGIT NUMBER IF KB<100 & ! & \ KBN$="ILL:" & \ CHANGE SYS(CHR6$+CHR$(26%)+CHR$(JBNO%)+CHR$(0%)) & TO FIP% & \ KBN%=FIP%(4%) & \ KBN$="Det" & \ GOTO 10350 IF KBN%<0% OR KBN%>127% !DET JOB & \ GOTO 10330 IF FIP%(5%)<>0% !PSEUDO KB & \ KBN$=NUM1$(KBN%) & \ tmp% = 3% & \ tmp% = 2% IF KBN%<100% & \ KBN$="KB"+LEFT("000",tmp%-LEN(KBN$))+KBN$+":" & & \ JDB%=PEEK(JOBTBL%+(JBNO%*2%)) & \ GOTO 10350 IF JDB%=.FALSE% & \ KB.DDB%=PEEK(PEEK(JDB%)) & \ TTINTF%=PEEK(KB.DDB%+30%) & \ KBN$=KBN$+"*" IF (TTINTF% AND 16384%)<>0% & & \ GOTO 10350 & 10330 KBN$="P"+NUM1$(KBN%-1%)+"J"+FNDGT2$((FIP%(5%)-1%)/2%) & 10350 FNKB.NUMBER$=KBN$ & \ FNEND & !=================================================================== & 10500 DEF FNDET% & ! & ! RETURNS .TRUE% IF USER IS DETACHED, ELSE RETURNS .FALSE% & ! & \ KBN$= FNKB.NUMBER$(USER.JOB%) !GET KB NAME & \ FNDET% = .FALSE% !ASSUME ATTACHED & \ FNDET% = .TRUE% & IF KBN$="Det" or KBN$="ILL:" !..but be flexible & \ FNEND & !=================================================================== & 11000 DEF FNPKG.LOC$ & ! & ! Function FNPKG.LOC This function returns the PPN of the last & ! opened file, usually the first program in & ! a package of programs. This information & ! is returned in FSPEC format with a device & ! suffixed if the device is not public. & ! & ! & \ CHANGE SYS(CHR$(12%)) TO FIP% & \ PKG.LOC$ = "["+NUM1$(FIP%(6%))+","+ & NUM1$(FIP%(5%))+"]" & \ PKG.LOC$ = "_"+CHR$(FIP%(23%))+ & CHR$(FIP%(24%))+ & NUM1$(FIP%(25%))+":"+PKG.LOC$ & IF FIP%(26%) AND 1% & \ FNPKG.LOC$ = PKG.LOC$ & \ FNEND & !=================================================================== & 18000 ! & ! & ! F N Q U O T E $ ( C T R L . L I N E $ ) & ! & ! P A R S E F O R Q U O T E C H A R S & ! & ! & DEF FNQUOTE$(CTRL.LINE$) & \ FNQUOTE$=CTRL.LINE$ & \ T0%=.FALSE% & ! INITIALIZE TO PARSE FOR QUOTE CHARACTER. & 18010 T0%=INSTR(T0%,CTRL.LINE$,"_") & ! FIND NEXT QUOTE CHARACTER IN LINE. & \ IF T0% THEN & ! WE FOUND ONE. & FNQUOTE$,CTRL.LINE$=LEFT(CTRL.LINE$,T0%-1%) & +CHR$(ASCII(MID(CTRL.LINE$,T0%+1%,1%)) OR 128%) & +RIGHT(CTRL.LINE$,T0%+2%) & ! TAKE OUT QUOTE CHARACTER AND SET PARITY BIT & ! ON NEXT CHARACTER. & \ GOTO 18010 & ! SEE IF WE HAVE ANOTHER QUOTE CHARACTER. & 18020 FNEND & !=================================================================== & 18100 ! & ! & ! F N C T R L $ ( C T R L . L I N E $ ) & ! & ! P A R S E F O R C T R L C H A R S & ! & DEF FNCTRL$(CTRL.LINE$) & \ T0%=.FALSE% & ! INITIALIZE FOR SEARCH FOR CTRL CHARS. & \ T0$=CVT$$(CTRL.LINE$,4%) & ! STRIP LINE TERMINATOR. & \ IF ASCII(T0$)=94% AND LEN(T0$)=2% THEN & CTRL.LINE$=cvt$$(T0$,32%) & ! IF LINE CONTAINS ONLY UPARROW FOLLOWED BY SGL CHAR & ! DISCARD THE LINE TERMINATOR. & 18120 T0%=INSTR(T0%,CTRL.LINE$,"^") & ! FIND NEXT (UNQUOTED) UPARROW IN LINE. & \ IF T0% THEN & CTRL.LINE$= & LEFT(CTRL.LINE$,T0%-1%) & +chr$(ascii(cvt$$(mid(ctrl.line$,t0%+1%,1%),32%))-64%) & +RIGHT(CTRL.LINE$,T0%+2%) & ! TAKE OUT UNQUOTED UPARROW AND UNSET BITS & ! ON NEXT CHARACTER MAKING IT A CONTROL CHARACTER. & \ GOTO 18120 & ! SEE IF WE HAVE ANOTHER UPARROW. & 18130 FNCTRL$=CVT$$(CTRL.LINE$,1%) & \ FNEND & ! END OF FNCTRL$(CTRL.LINE$) & !=================================================================== & 18200 DEF fncheck.job%(arg%) & ! & ! THIS ROUTINE WILL CHECK THAT A JOB TO BE SENT TO IS INDEED & ! IN '..CB..', ELSE IT'S CB LIB STUFF WILL BE CLEARED AND THE & ! FUNCTION WILL RETURN .TRUE% & ! & \ CLEARING.JOB% = .FALSE% !ASSUME OK & \ DUMMY$ = .NULL$ !BADNAME & \ CHANGE SYS(CHR6$ +CHR$(26%)+CHR$(ARG%)+CHR$(0%)+ & STRING$(26%,0%)) TO FIP% !GET JOB STATUS & \ DUMMY$ = RAD$(FIP%(17%)+SWAP%(FIP%(18%)))+ & RAD$(FIP%(19%)+SWAP%(FIP%(20%))) & \ FNCHECK.JOB% = .FALSE% !ASSUME OK & 18205 GOTO 18220 IF DUMMY$="..CB.." !YES, OK & & \ CLEARING.JOB% = ARG% !FLAG CLEARING JOB & \ GOSUB 6000 !CLEAR IT W /EXIT & \ FNCHECK.JOB% = .TRUE% !SAY WE CLEARED & 18220 FNEND & !=================================================================== & 18300 DEF FNSET.CHNL%(ARG%) & ! & ! GETS A CHANNEL SETS THE ARG% (USER%) IN THE CHANNEL, & ! REWRITES THE CHANNEL. THIS ROUTINE WILL NOT LOCK COMMON. & ! & ! PRINT "FNSET.CHNL%" IF DEBUG% & ! & \ DUMMY2% = FNGET.CHAN%(ARG%) & \ ARG1% = FNOPEN.POSITION% & \ ST%(ARG1%) = USER.JOB% !SETUP IN CUR USER LIST & \ DUMMY2% = FNPUT.CHAN%(ARG%) & \ CHANNEL.USED%(ARG%) = .TRUE% & \ FNEND & 19000 & ! **ERRORS SECTION** & ! & ERTMP% = ERL !GER OFFEND LINE NO & \ RESUME 19001 IF ERTMP%>18999% AND & ERTMP%<20000% !ERR IN ERR?? & \ ER% = ERR !NO, SO GET ERROR & \ EL% = ERTMP% !SAVE STD FOR LINE & \ RESUME 19001 !RESUME TO PROC ERR & 19001 DUMMY$=SYS(CHR6$+CHR$(-7%))+ & SYS(CHR$(0%)) !RENABL ^C,RSTR ECHO & \ GOTO 6953 IF EL%=6950% !ANY PK EOF ER% & \ GOTO 6980 IF ER%=28% AND & (EL% >= 6700% AND EL% < 6980%) & !OR PK.OPEN%) & \ GOTO 6995 IF ER%=28% AND PK.LOCK% !PROCESS USER ^C & \ GOTO 6000 IF ER%=28% !^C AT CMD,EXIT & \ GOTO 5010 IF EL%=5000% !NO HELP & \ GOTO 5030 IF EL%=5020% !EOF IN HELP & \ GOTO 5501 IF EL%=5500% AND ER%=15% !CLR VERIF TMOUT & \ GOTO 5720 IF EL%=4000% & \ GOTO 10350 IF EL%=10300% & \ GOTO 2950 IF EL%=2010% & \ GOTO 3700 IF EL%=3050% & \ GOTO 2810 IF EL%=2800% & \ GOTO 2950 IF EL%=3805% & \ GOTO 5250 if EL%=5200% !bad width & \ GOTO 5720 IF EL%=5500% & \ GOTO 6600 IF (EL%=6500%) OR (EL%=6550%) & \ GOTO 32700 IF EL%=200% AND ER%=11% & \ GOTO 4710 IF EL%=4700% !BAD INDIRECT FILE & \ GOTO 18205 IF EL%=18200% !NO JOB TO FNCHK.JOB & \ IF ER%=11% AND EL%=550% AND (AT.PROC%) THEN & tmp%=SILENT% !SAVE SILENT FLAG & \ SILENT%, & AT.PROC% = .FALSE% & \ AT.FILE$ = .NULL$ & \ CLOSE #1% !CLOSE CMD CHANNEL & \ GOTO 500 IF tmp% !PROMPT IF WE WERE & \ GOTO 540 !EOF ON INDIRECT FLE & 19050 GOTO 6990 IF EL%=550% AND ER%=11% AND PK.LOCK% & \ GOTO 6000 IF EL%=550% AND ER%=11% & \ IF ER%=31% THEN & PRINT "?CB - Program too large" & \ GOTO 32700 & 19100 IF ER%=6% AND EL%=6705% THEN & PK.BUSY% = -1% & \ GOTO 6707 & 19200 GOTO 6860 IF ER%=11% AND EL%=6820% !NO I/O, SEE IF KB & \ GOTO 560 IF EL%=550% AND ER%=15% !TIMOUT ON KB FOR PK & \ GOTO 6707 IF EL%=6705% AND ER%=8% !PK IN USE & \ GOTO 6958 IF EL%=6860% AND ER%=5% !PK IN LOGED-OUT & \ GOTO 6895 IF EL%=6890% !PK BUSY ON CMND & \ GOTO 6810 IF ER%=3% AND EL%=6860% !PK NOT IN KB & \ GOTO 6980 IF ER%=28% AND (EL% >= 6700% AND EL% <= 6920%) & 19250 IF ER%=27% THEN & RUNNING.IN.ERROR% = .TRUE% & \ GOTO 5990 !SET 'ZAP,ER%OR' & 19900 PRINT "?CB - FATAL ERROR -";ERT$(ER%);" AT ";EL% & \ RUNNING.IN.ERROR% = .TRUE% & \ GOTO 6000 !TRY TO /EXIT & !=================================================================== & & 30000 & ! ***CCL ENTRY POINT*** & ! & CMD$=SYS(CHR$(7%)) !GET CORE COMMON & \ I%=INSTR(1%,CMD$,"/") & \ IF I% THEN & CMD$=CVT$$(RIGHT(CMD$,I%+1%),16%+32%+64%) & \ CCL.ENTRY%=.TRUE% & \ HNDL.ENTERED%=.FALSE% & \ GOTO 10 & 30010 I%=INSTR(1%,CMD$," ") & \ GOTO 10 IF I%=.FALSE% & \ HNDL$=RIGHT(CMD$,I%+1%) & \ CCL.ENTRY%=.TRUE% & \ HNDL.ENTERED%=.TRUE% & \ GOTO 10 & !=================================================================== & 32000 & ! ***LOGIN ENTRY POINT*** & ! & LOGGED.OUT%=.TRUE% !LETS CHECK THIS LATER & \ GOTO 30000 !TREAT JUST LIKE CCL & !=================================================================== & 32700 !CLOSE-UP PROCESSING & PK.CLOSING% = 0% & \ PK.NOECHO% =.TRUE% !DONT ECHO DIE STUFF & \ GOSUB 6950 IF PK.OPEN% !CLOSE UP PK & \ CLOSE #1%, #2%, #3% !CLOSE TERM, PK, HELP & & \ DUMMY$=SYS(TER.SYS$+CHR$(255%)) !SET GAG WHEN LEAVING CB & IF WAS.GAGGED% !...IF IT WAS SET & & \ IF RUNNING.IN.ZAP% THEN & PRINT CR + BELL$ + LF + LF + LF + & "**!!You have just been cleared from CB "+ & "by the operator!!**"+ & BELL$ + CR + LF + LF + LF & UNLESS (RUNNING.IN.ZAP%) AND & (RUNNING.IN.ERROR%) & \ FIP%(X%) = 0% FOR X%= 0% TO 30% & \ FIP%(00%)=30% & \ FIP%(01%)=6% & \ FIP%(02%)=8% & \ FIP%(03%)=USER.JOB% & \ FIP%(28%)=255% & \ CHANGE FIP% TO DUMMY$ !KILL JOB STUFF & \ DUMMY$=SYS(DUMMY$) !KILL OURSELVES & 32767 END 8|2? .TITLE CBLIB .IDENT /PJH016/ ; ;============================================================== ; THIS IS THE COMMUNICATIONS AREA SOURCE FOR 'CB' ; ; ASSEMBLY FORMAT: ; MAC CBLIB,CBLIB=CBLIB ; ; AFTER ASSEMBLY, THIS IS TASK-BUILD WITH ALL BP2 THREADS ; THAT CB.B2S USES. PLEASE SEE INSTALLATION INSTRUCTIONS ; FOR MORE DETAILS. ;============================================================== ; ; This software is furnished under a license and may ; be used and copied only in accordance with the ; terms of such license and with the inclusion of ; the above copyright notice. This software or any ; other copies thereof may not be provided or other- ; wise made available to any other person. No title ; to and ownership of the software is hereby trans- ; ferred. No SOURCE code can be copied. ; ; The information in this software is subject to ; change without notice and should not be construed ; as a commitment by the author. ; ;=============================================================== ; .PSECT CBLIST,D,RW,GBL,REL,OVR .BLKW 3072. .END _[2?HOW TO COMPILE CB TO USE 2 RESIDIENT LIBRARIES AND ONLY 2K USER AREA PJH 030282 =========================================================================== 1) MAKE CHANGES NECESSARY TO CB.B2S 2) COM/OBJ/LINE/CHAIN 3) TKB @CB !NOTE CB.CMD MUST HAVE '/MU' 4) RUN $MAKSIL NAME ? CBCODE INPU FILE ? CB.TSK INC SYM TBL ? NO LIB OUT FILE ? CB.TSK 4.5) MOVE ALL CBCODE STUFF TO LB: 4.6) MOVE CB.TSK TO [1,4]<232> 5) REMOVE OLD LIBRARY CBCODE 6) ADD NEW LIBRARY CBCODE THIS ALSO LINKS TO LIBRARY CBLIB. TO CHANGE CBLIB.LIB =================== 1) MAKE CHANGES TO CBLIB.MAC (IF NECESSARY) 2) MAC CBLIB.MAC (IF NECESSARY) 3) TKB @CBLIB (MUST BE SPECIAL .CMD WITH BP2COM EXTRACTS) 4) RUN $MAKSIL NAME ? CBLIB INPUT ? INCLUDE SYM ? SYM INPUT FILE ? RES OUT FILE ? 5) RUN RESSTB RESIDENT LIBRARY NAME ? CBLIB 3 CHAR CCL NAME ? BP2 (ALWAYS SPECIFY THIS) 5.5) MOVE ALL CBLIB STUFF TO LB: 6) REMOVE OLD LIBRARY CBLIB 7) ADD NEW LIBRARY CBLIB 8) NOTE*** IF CBLIB IS CHANGED FOR ANY REASON, CB MUST BE RE TASK BUILT USING ABOVE INSTRUCTIONS [qy2? ,ffn O I  hSYSYSYSYSYSYSYSYSYSYSYSYOVr@IrQ&XZ @r@  *  + 23E Ew T  Е-  0@A TW e`fÊ    E 7@evT{V7@epT{VvW7@@0fe Ve.T RwRw"@7@e.T{V7@eHT{VWW~WWW7@ 7z@7p@ 7f@7\@e{V7J@eS{VWWW7@e Ve VeS Q e 5 > VwQwj?7?eS{VW7?e {VW7?e {V7?e\S{Vw4QeTK $ &ecH   e@ B*f@e0 ` `.  pp`P@pP@P@0``@@p !w?&pT ! ?eE& ! ?&f&.e  %!&Tf 6҇wv , E   W 2*sff % $ ,*5f*5 ߋ 0PЕ:5Е[   >Е,   ,Е]5        5 ҕ.   *@U` "0 ӕA     ~6 <" PTtӤ "&f*"eP *Be  ~3 *   0 P 585p\u7  UU uP5`J&& P$C`   u05,4ae45"-  vA *% cU5@`o5` A L**U $5 *A <U`pB ae6R`5`!553B4B,8u5&B" B !B *A6Erf% %pf w f\U ` E5`  U`~   HU`p(05@^HfUpV5@^ BP *  E @*A"eQE5 5 5`5` B  %p   A 5 `Ew5`  ED @DE aeR &*1hwwwf  %0wlw  epeE%6 5*B( 1 (&4å4e`U¥E5U562 ( 6 A25`26/B 8,56 5`U`^E`U` wbA2pV Ap$ W f X w f  %  we\e\e\e\e\e\g\g\g\U\N E\N MEP\N U\v \  $ҐB~\ bf Z&  >%\FB>.>:6$&"  E`E`$& 7$$peB vdB rbf&5@  $e  \ $e\ t  $eC`C~& &  " <#& \ t$ew ^#\B  aw @L  aD\:w H\ \\ *l )ffeR <" S~e& h#e`Jlc##M*B l㋣  Mw PU@#H####v#b&&E@ *U@  "  ~w t    8 b"E !FE@ 5 ^wZb w# &*   X Q~  4  p 2w  4}\\\&\\\&\&\\\& \ \ \\\\\\\\%\%\%\%\%\'\'\'\  vC  ^!$  b   @!  0!  ҥ  !C \m  # l d  .m *1@B*DFlm *1@B f`&  B& ~ B~ B \ \ \& \ \ \& \&&& r= \ w*EE ^  \5^ 5 ^2 B5^5 ^p5` E^U^ h!pX0 ? \**b 5h$$ " El\*ew *b*&^\*^ *A@*0H\*5& w>0 H\*l ע  5\  % *p^0bl,Hv H 5/ A0   R56U W DW +H(E5 &e 00)wBe8 Ub *' &  b  5E6e  f& & i5@  *e&B~ *I*53  F6 y "? & ԕ ^Eє~~e&e-   6&e+6%e-  L*Uєb ee: CtEe0  Q: B*w@wlŘ  ѕ"єBѕ" & e-e.Q  &e&e f e `~  ee*~ѕ"ѕ ѕ * \f*eQe*!&$fl! SS  j f*E5@U?RMS error #FUNCTIONGOSUB called at line in "?Odd address trap?Memory management violation?Error file cannot be opened?Error file cannot be read?Undefined error number d5^*&30 f02000\ `~4 hR~& Tf`0 v lCAE` f * B ѕ Cp0\ `*2`f0f0*00 ep  p~f\*0ep  p~f*~ x p p~\  \ r@ r( @%% e ee e  @A K I  7@A 8  4   +`( @A      Z D ` wB .  h f \   1 #+ ( #&$#" 6 c f ~ C`B@  @  \ \   p &30 U^\9 ~U^  pU^ bU^& ^0 0 0 *0 ,\  6p* & & 5^E^0 f  *3E^5`5`   Tv v N e\we 0 0 \ l ^\% 5^5^  0 : Pנ'נ", &D ŀ eCU͋  N ͥ   6  hwe*@   \ \95^;A5U^f   `p00f p eѠѠɋ \*  `  0 "5@^ 42 42 Eנ נ , *5  5^DE^0  `ɋɥɥ AɥUɥ RɥGɥ E  f .E^5`6: 5`5 C5^&`W&"U^ r @ɋɥ   a0  Rɕ v Dp 0 7 ɵfŀeSˋŀ  5^ &U^q S  p/ 5`*5^&l eFѢɋ5^ep 0 / ӕ ˕ p5^   & \\ H P P (& & 0 06  &*,0 h 3hNA 2%H `~ "\  0   0X \   w *J, J, 1@Bw  r E@`\;I GEC*C, C,wL 7e< 0+e"*, , ];(< 5&@@   $) % e  C   r  &V p 0 p 0    5w      @  ppp 0 0 0  1 1 1 f.eB DJ̥J  WW-} WW-}p 0&.f "&   J& vDP΋P L4  #5(aerBы$ HB`55w$&  4 ȕ 0*3*  p1p   E@DU W  E5J5 B5 D5 H@  e&.e &.0  H&&̥   U e @  1  d P PH f. X( * PPPH ȥ U.f. Zw$ |̥ #3/5 fȋȥ&#g&ȥ W0  ɥɥ    uȋ81,'; 1#". fՀ  \  Xŀ  L`0    &f T0 &V f \p&&  K f ` & . 1  d̥ @ &"! 1  ŀ f&& bpp  \ x. JVfZQ~PPzT&JTTzTVWIRESSTBrOr rrdr,rrrrr&T'TTr`T@JT$ vV`T@J U$ vVV0U|@J#8UVrM`T2xPr#0UVVT>&#@UVVT>&#HUVVT>&#PUVVT>&#XUVVT>&T8TrV`UH#VTzT'TV=TVhUH#VT'TVr&zTrr`zT@LB">'(T`="`="B )2LzT<Lr$`=@Lr(&T TTdTT8Lr(T|$*T*VTT~T~V V T~r+V#V|@L6M`T2L`T2,Pr.$TT4LTr.r<KrrpU$U$r V~T)~TBMU$<.M~TF~T V~Tr<PPr'r$'dTT"dTT"dTT"BF )2dM8Tr.'dTT"dTT"F )2MVT>&)T@M8T<M*VTT`T`V V T`"&TTr*$r*r+ VU|T)|T2NV|TH#Vr+VH@Nr +&TTr +VT lTr%+U\T""U\T"B )2NU\T""U\T"B )2NU\T "U\T "F )2NU\T@Nr*+$TT8NTr*+r/+$rH+TU$U$r\+$r8JH"H"F )2LO&T'T4V&T~rJr:JH"H"F )2Oc W|ZJd WZa WY"\ WY\ WYa WZ\ WZ\ WZ ^ WZ\ WZ ^ WY` WY` WYa WZ_ WZb5ew  Bv    E  5,  YW [Zw eE D` bl lrw \  B eE"s    s-  Csl&f pf r&W.WW6W>WNWVW^WFWlY WA4AAAAAAp[Y.p[YY.p[YYLZ0@_ YY3@_YY6@_LYY9@_LYZ<@_ZY4Z=`ZZ?`LZ(ZB`DZZD@_`Y@ZF@_dYYJp[XZYYJp[LZdZNp[pZLZZPL_xdZ|ZSL_ddZZVL_dZpZXp[< LZZ]p[XZLZXZ``ZZb`pZZJY5  5U E5@-& E& & f,&ËDef Ë )̋U  1  v55 ^ uu.@e b@.e 30 5 C&3 3 3 wp[@` e {V@@ 0 UWU 5U 5U@UP5!@@  X w   w.   ^ ` Pw@5@wB@ 2 !;—fu  Е6ߵUe   &$]"] 4 $&(04 *E? 5@p@E44* Et! (Еe P 6 .  5  \ ^ ` e\R  u  0       .( p. *VV <V 4V ,V $JYJY 3 $&e"&( B4  @&f& v  *  p 1 f   &f e.   p0  A@BAA&@ :   e&Ee f&B&r & 2F&ק&@ק&   H58ep &u&~qe eppe*>5 >5t @5 Հt3@A 0 ) 4 Hu&@e b5eF be( b.eD b.fV D&4  5 H-B* B( H, .e6 f? 5SY C3 %SY6 ӕ:ӕ[ ӕ, ӕ]& @&(e N` ^߂  5 #ѕ.  p5 D  5ҥ;% + ʥ9ҥ0  Q4@Q4DR 555f &  e:  @ (  & ` v %/ѐ  p 1 f   z&f e.   p0  "& d   5 85 :5 < `& & & C@6e@L@ K ɋ@ QQԊ 0 3 "@+J P aez C ˥ BC<  ,33  e fV A8 5 8 w ww0ww*e # # # VJ#  >!Еe6` އI# eme{c  `"    & b@ c N % K@|g S S S K S @ e#S K eFS S K  w$ӗ ӗ ˗& 8t5   v ` h'c& Q$ee 3 3 3 3 3 3 <3    * +,-   & 0kB:  b ] :A<W" 1tL 1c5:ezc`J3 *3 , R  R ׬835363 23 343T.3V03 &fA8  r /58  bu8%`6%     z U"& d  &̥ (Е64,4, 44 6 6 ev ]( 6  mA ` P L#m t  `&(Еe P 6. &D ZeR   p&f&f̥  v w\4  PM1 B C `4 058ul8l&  ^ 8!   E 855  w  e@ 4 t 4 0f&  & eV #5  r 2EN& 5( B8 2܃%`%1 &&  5  q8qm8q8t  .C `54ul4̥ 4  p,p, pp   Ɋ  B    && ߰ 1 1 &V Hw ,4 w"& d  @&eB  ::  & eEeU &] 0f,0e ,  0ed 0f[0e [0ed U   ] V&#פ.     $  `C&& Μe E \5e b.ej b(uu4*5*55(1))At.B 5  u@&EW@0U   E. &feJ B  La     f eW!ZW!AW!9W!0@ ReE5.515)00  Հ$"  5$4 "4 &W p  4.fV 6  "`  55 J , 5 %,t04r"4p$4h4n4l4 &5)05 5"5(1    t.fV 5   1 #   fV ev b.et b 4 "$4 &wf eB b.e8 b .e. b 5wH WZ` WZa WZB` W(Za 4p-$4 "4 &B* @m A  !!WpY C.  ՀeEt4  't0)) C@)e@@K ɋ0˥P@ 5 5 5t,t.!@pw@ 5 5 515f V]  @ _4t,t. @pM4  B0)At*t5B`e  A1 t( W @@ C@)e@@K ɋ0˥P@8@e:PPH@8@e:  e, be bu@&fV @&eB  ::  & eEeU &] 0f,0e ,  0ed 0f[0e [0ed U   ] V&#פ.   J  $  ,`C&& Μe &feJ B  La     f eW!ZW!AW!9W!0@@@0@`}h!.5* 6 EE e`"<" `" !; 55 5U EU5U@  U UE*]*w 5U  _ E p 5U@' U   &ȥ 5 5_ _ UWU@ ߕߵ@ N@!GB@ 2 —t u  R p p 5    LЕP3e P 6@  . ^ `eR  u  0  p 1 f   &f e.   p0  "& d  Wq"q $e$q "f&   h5 6 f   e v ," ,$    ," ,$ p $p"$"    * &V , LO  rB  8t $t "(((4( e$t "4 & & f f @eL 6- R55uNuLt t"W-"W- @"@ PL  Ї `  t0$p0"r0h0l0n   && ߰w4!= 5e~ b@@* X _%SYU_  ^"55 5u@&@&eB  ::  & eEeU &] 0f,0e ,  0ed 0f[0e [0ed U   ] V&#פ.   J  $  ,`C&& Μe &feJ B  La     f eW!ZW!AW!9W!0@  p 1 f   z&f e.   p0  "& d  &̥ (Е64,4, 44 6 6 ev ]( 6  mA ` P L#m t  `&(Еe P 6. &D ZeR   p&f&f̥  v5 85 :5 <E  u@ !p@  & x "F &B5    . B B <@   &@  @ 5 w @  p N t %` v 0 f  A85 8A:5 :   . ߱ u8 Z  5E- 5f@6   N2   Z2 6   5L# 5D > 8 2 \* @  < <.(  6 6 U66 6 6 v `A-<u< "A< Fu: r 5>vm>  @   w.( 66 6 N \\6B  '5 >5@ B &5 > @5@r> r@ /0$p0"r %@@ "* (A:@> j  ZUUU3@Wq"q $e$q "f&   5 | f   e v ," ,$  N  ," ,$ p $p"$"    p Nހ&V   p 1  f   0&f e. Z H p0    55   (   &       l  3 5 wP&̥ (Е64,4, 44 6 6 ev ]( 6  mA ` P L#m t  `&(Еe P 6. &D ZeR   p&f&f̥  v ,wT   Ww6A W !  @  4 f %6 5 4$ 4" 4&0- "0- $0-&5@uw w  55!w  e@ 4 t 4 0f&  & eV #5  r 2EN& 5( B8 ރ%`%1 &&  5  q8qm8q8t  C `54ul4̥ 4  p,p, pp   Ɋ  B    &&  1 1 &V @ 88 4m&  ^ 4!1   Ee(" eb  B$   wB$  ?A  ( f  )e l*t5 5 5  444  4 w w ( w &̥ (Е64,4, 44 6 6 ev ]( 6  mA ` P L#m t  `&(Еe P 6. &D ZeR   p&f&f̥  v0- "0- $0-&  e@ 4 t 4 0f&  & eV #5  r 2EN& 5( B8 %`%1 && $ 5  q8qm8q8t D C `54ul4̥ 4  p,p, pp   Ɋ  B    `&& L 1 1 &V @ 88 4m&  ^ 4!1   Ee(" eb  @31  4 7B8 A3 bC lwZ@3 44 4  8   ,m5 4 w4 4 47pC<7)6 W9W^+0 ` C` ::  2  7 8wT7# )u`:NCA" &   5w   {P5 .5 <A  f "f  .    <.wf $  3 u u<u<76 E : 8& t:tm<5 5 5555 5 5 <5@  3'A@ 33u z  B`. <3 u-<Q.u <5.3 e t @4@84 w C4#3 ` f ꆖ @4  .3:. e bXO  . .!@ A B&VP 853*3 & & &f&   .H55e b@  3@3   w5 P (@ #p Be2   4 4  t, t,  K    %:   1 d`Cm: > 4 C:Cm@ 4w4 4  Bl2 B-@  цBm :A7=60B`@@ e0b e0I@7C:C0B" F&  6Š5w %B>C<  : 7   p76 EB ( C2776     < :3 "3 $3&s-<s<5@u7BB:   m@m:55 5 5555 5 5 u 4B C4C#   ꆖ ``w m& 77 6^ 4 @pj du>u<5256758*A-<FA-<@¥e%¥ )`e¥B<Bm>   u:Am<p u@  HVq8 5 :2&2 <C> > <נ+נ$ѕ נ1ѕ נ0ѕ ѕ :B>f<C4C#  J  :u 4 2ѕ (555 5 5 5@uC . N  4  #.e b \ue b wZ@4 w@pj du>u<5256758*A-<FA-<@¥e%¥ )`e¥B<Bm>   u:Am<p u@& & &4 4 4 1- 1-  B  W7  u-.8 ) Dm :I@0. 7 C:C0B"B : B>C< ,55  5 5 5&C4C#. H f   u-.8W7wp "5.5-@p7! .er b 4 w &̥ (Е64,4, 44 6 6 ev ]( 6  mA ` P L#m t  `&(Еe P 6. &D ZeR   p&f&f̥  vw 5 , T , LL 2.e bPuLuNfV 0L ]1! W-, A , LœE¥ .t4 e b  e t 4 @eLW-, t 4  && Lwu5 @@P5 , "55 @ , l /&fB@A 3 s 3s 3 "s $3"s$&e@ !5 | zCA u spk ef& ,q-(q-& 4  &&  @(A&  %56tt t tt  1 1 1 1  ,&4   w W-L0[LLE.4  "$0 &e b.eh b  e    4 4 4tLuLuNwF(Еe P 6L5 N  e@ 4 t 4 0f&  & eV #5  r 2EN& 5( B8 ܃%`%1 &&  5  q8qm8q8t @ C `54ul4̥ 4  p,p, pp   Ɋ  B    \&& H 1 1 &V @SM IpC >   AL04  42$"2& 1 Ɋ  4  4 uw@ t8 4m&  ^ 4!1   Ee(" eb & &f C6B, ^ Nf $@&@( l@ &   `@ ` B   & A @    "& d  & &f C6B,  f @&@( l@ 5 N ` 5 2 &wZ 4 4 e t w& & B 5W-2eA #@ A BW-25@  wj4tCP P r 2 w6 5 5 55&5(2 r 4 &f %wB, <  Lfwt  pmW-2 5 ȵȵ-55 ȵȵ et w@ȵ ȵP  :4 U@LuLuNfLV L5 NE@4 4 5 5 5 5 &5 (5 P K@ Fp>0W1` , 55" Be,( * E    RR @L&f(`@ ,",$wf&   L[    t  L4542p$2r" p#"-$4  )W-2 @LL4 L4  n .e be 5 j"`  W,  5 L W,  U  fLfN  NL WZNb WZFc&   `@ ` B   & A @    @5 Np'&] 0N  H m  4  LuLuNw w w  |m 0u.0 )A"` 5@  =u>C5   CA  4 4 e t W- 5 NLuLuNE@w%LL 5 @L4 4 5 5 5 5 &5 ( 4  T 0WJ` E@p;Ae,( * EQ    QQQ  *A-<A-<L&]b_0N X DS  BmѕW0Q<Q=0 )CmѐѐCB"` B>C<  4 5 5 5  LuLuNwL5 5 5 &̥ (Е64,4, 44 6 6 ev ]( 6  mA ` P L#m t  `&(Еe P 6. &D ZeR   p&f&f̥  vWq"q $e$q "f&   5  ^f   e v ," ,$    ," ,$ p $p"$"     &V ̥ $ "& & & ,.6.  .( .5(66  "556@eL$" \555 VL <$p"r jU 4  e4     L  ztT 0WJ` E@p;Ae,( * EQ    QQQ  *A-<A-<L <w4 4  \  ~mѕ0Q<Q=0 )CmѐѐCB" B C<B> 4  f 4 4 e t L@uLuNw4 4 5 5 5 5 &5 (4  2?SY:cb/mu/fp,SY:cb,sy:cb=SY:cb,lb:B23ots/LB / UNITS = 13 TASK=..CB.. RESLIB=LB:CBLIB/RW // 8kQ2? .TITLE CBLIB .IDENT /V02.06/ ; ; Edit date: 08/27/84 pjh ; Verified: 05/30/86 pjh (RSTS V9.1) V2.06 ;============================================================== ; Version 2.03 of cb or greater only ; ; THIS IS THE COMMUNICATIONS AREA SOURCE FOR 'CB' ; ; ASSEMBLY FORMAT: ; MAC CBLIB,CBLIB=CBLIB ; ; AFTER ASSEMBLY, THIS IS TASK-BUILD WITH ALL BP2 THREADS ; THAT CB.B2S USES. PLEASE SEE INSTALLATION INSTRUCTIONS ; FOR MORE DETAILS. ;============================================================== ; ; This software is furnished under a license and may ; be used and copied only in accordance with the ; terms of such license and with the inclusion of ; the above copyright notice. This software or any ; other copies thereof may not be provided or other- ; wise made available to any other person. No title ; to and ownership of the software is hereby trans- ; ferred. No SOURCE code can be copied. ; ; The information in this software is subject to ; change without notice and should not be construed ; as a commitment by the author. ; ;=============================================================== ; .PSECT CBLIST,D,RW,GBL,REL,OVR ; BP2 V2.1 - CB V2.05 Common Statement: ; ; !Storage offset ; COMMON (CBLIST) INTEGER COMMON.IN.USE, !0-1 ; INTEGER COMMON.INIT, !2-3 ; STRING CBLIB.VERSION=6, !4-9 ; INTEGER CB.CLOSED, !10-11 ; LONG CB.USER.COUNTS, !12-15 ; BYTE CHANNEL.USED(40%), !16-56 ; STRING CHANNEL(40%)=64%, !57-2680 ; STRING HANDLE(63%)=12%, !2681-3448 ; BYTE TALK.CHAN(63%), !3449-3512 ; BYTE FILL, !3513-3513 ; INTEGER TTY.WIDTH(63%), !3514-3641 ; INTEGER CB.PROJ(63%), !3642-3769 ; INTEGER CB.PROG(63%), !3770-3897 ; INTEGER JOB.FLAGS(63%), !3898-4025 ; STRING CB.PASS(63%)=6%, !4026-4409 ; STRING CB.LAST.CB.DATE =9, !4410-4418 ; STRING CB.LAST.CB.TIME =8, !4419-4426 ; STRING CB.LAST.INIT.DATE=9, !4427-4435 ; STRING CB.LAST.INIT.TIME=8 !4436-4443 ; LONG CB.LINE.COUNTS, !4444-4447 ; LONG CB.LINE.COUNT(40) !4448-4611 CIU: .blkb 2. CI: .blkb 2. CBLV: .ASCII /V02.06/ CBC: .blkb 2. CBUC: .BLKB 4. CU: .blkb 41. CNL: .blkb 2624. HNDL: .blkb 768. TC: .blkb 64. FILLR: .BLKB 1. TW: .blkb 128. CBPJ: .blkb 128. CBPG: .blkb 128. JF: .blkb 128. CBP: .blkb 384. CLCD: .ASCII /NONE / ;9 BYTES CLCT: .ASCII /NONE / ;8 BYTES CLID: .ASCII /NONE / ;9 BYTES CLIT: .ASCII /NONE / ;8 BYTES CBLC: .BLKB 4. CBLCA: .BLKB 164. .END 8^2?68PԳD L;L;,V02.06 :*:NONE NONE NONE NONE 82?,??II V SYSYSYSYTICLV02.06NONE NONE NONE NONE 8xQ2? CBLIB.TSK Memory allocation map TKB 09.105 Page 1 30-MAY-86 11:57 Partition name : GEN Identification : V02.06 Task PPN : [100,198] Task attributes: -HD,PI Total address windows: 1. Task image size : 2336. words Task address limits: 000000 011003 R-W disk blk limits: 000002 000013 000012 00010. *** Root segment: CBLIB R/W mem limits: 000000 011003 011004 04612. Disk blk limits: 000002 000013 000012 00010. Memory allocation synopsis: Section Title Ident File ------- ----- ----- ---- . BLK.:(RW,I,LCL,REL,CON) 000000 000000 00000. CBLIST:(RW,D,GBL,REL,OVR) 000000 011004 04612. 000000 011004 04612. CBLIB V02.06 CBLIB.OBJ *** Task builder statistics: Total work file references: 163. Work file reads: 0. Work file writes: 0. Size of core pool: 4340. words (16. pages) Size of work file: 768. words (3. pages) Elapsed time:00:00:04 8y2?&8PԳL;D#8jL2?8 @ 94xV02.06NONE NONE NONE NONE ' ! 082784 V02.05 pjh Chg CVT$$ to edit$'( ! Fix Pseudo print to inc ":" on end((@( ! 053086 V02.06 pjh Add V9 rsts support(*PO ! BG require PW if hashed PW in effect*===================5 %SBTTL 'Variable Descriptions'B %PAGE`20 !P !+ ! V A R I A B L E D E F I N I T I O N S+@] ! !4j ! ANS$ - User reponse holder var47 ! ANY.USERS% - /WATCH any usr for msg flg7r for msg flg75w ! ARG% - Def argument Utility var55` ! ARG1% - Def argument Utility var55 ! ARG1$ - Def argument Utility var5) ! AT.PROC% - Currently proc indirect fl)%@ ! AT.FILE$ - Indirect cmd file name%7 ! BCST.CHNL$ - FNBRODCAST Msg channel hld77 ! BCST.TYPE$ - FNBRODCAST Typ:/B,/C, /OPR7 & ! BELL$ - Bell character7 ! BFLAG% - FNBRODCAST send type flag7X2?SY:CBDUMP/FP,SY:CBDUMP=SY:CBDUMP,LB:B23OTS/LB / UNITS = 13 RESLIB = LB:CBLIB/RW // X2?1 %TITLE 'CBDUMP - CB Resident Library Dumper' %SBTTL 'Common/MAP area definitions' %IDENT 'V02.06' ! Version BP2 V2.2, CB V02.06 definitions ! pjh May-30,1986 Updated for V9.1 rsts MAP (USERRD) POS0$=1%, & CNL$ =64% MAP (USERRD) BYTE CNL(64) !0-64 0=POS0$ DECLARE STRING CONSTANT VERSION = "V02.06", & OUT.DFLT= "KB:CBDUMP.RPT" !Storage offset COMMON (CBLIST) INTEGER COMMON.IN.USE, !0-1 & INTEGER COMMON.INIT, !2-3 & STRING CBLIB.VERSION=6, !4-9 & INTEGER CB.CLOSED, !10-11 & LONG CB.USER.COUNTS, !12-15 & BYTE CHANNEL.USED(40%), !16-56 & STRING CHANNEL(40%)=64%, !57-2680 & STRING HANDLE(63%)=12%, !2681-3448 & BYTE TALK.CHAN(63%), !3449-3512 & BYTE FILL, !3513-3513 & INTEGER TTY.WIDTH(63%), !3514-3641 & INTEGER CB.PROJ(63%), !3642-3769 & INTEGER CB.PROG(63%), !3770-3897 & INTEGER JOB.FLAGS(63%), !3898-4025 & STRING CB.PASS(63%)=6%, !4026-4409 & STRING CB.LAST.CB.DATE =9, !4410-4418 & STRING CB.LAST.CB.TIME =8, !4419-4426 & STRING CB.LAST.INIT.DATE=9, !4427-4435 & STRING CB.LAST.INIT.TIME=8, !4436-4443 & LONG CB.LINE.COUNTS, !4444-4447 & LONG CB.LINE.COUNT(40) !4448-4611 ! %SBTTL 'Program sections' %PAGE PRINT "CBDUMP - Dump CB resident library" PRINT ON ERROR GOTO error.section Prompt.for.input: INPUT "Dump only active slots ";DOPT$ DOPT$="Y" if dopt$="" DOPT$=edit$(left(DOPT$,1%),-1%) goto Prompt.for.input if dopt$<>"Y" and dopt$<>"N" 10 LINPUT "Output filename ";o.fle$ o.fle$ = OUT.DFLT if o.fle$="" o.fle$ = edit$(o.fle$,-1%) open o.fle$ for output as file #1% PRINT #1%, CHR$(12%); print #1%, "CBDUMP report of loaded CBLIB.LIB on ";DATE$(0%);" at "+ & time$(0%) PRINT #1% PRINT #1% PRINT #1%, "Common in use: ";COMMON.IN.USE;" ", PRINT #1%, "(Free)"; if common.in.use = 00% PRINT #1% PRINT #1%, "Common init flag: ";COMMON.INIT;" ", PRINT #1%, "(Initialized)"; if common.init = 378% PRINT #1%, "(Init in process)"; if common.init = 991% PRINT #1%, "(Init required)"; if common.init = 457% PRINT #1%, "(Just loaded)"; if common.init = 000% PRINT #1% PRINT #1%, "CB closed flag: ";CB.CLOSED, PRINT #1%, "(Open)" if cb.closed = 0% PRINT #1%, "(Closed)" if cb.closed <> 0% PRINT #1% PRINT #1%, "CB ";VERSION;" Statistics" PRINT #1% PRINT #1%, "Last init Date: ";CB.LAST.INIT.DATE PRINT #1%, "Last init Time: ";CB.LAST.INIT.TIME PRINT #1% PRINT #1%, "Last use Date: ";CB.LAST.cb.DATE PRINT #1%, "Last use Time: ";CB.LAST.cb.TIME PRINT #1% PRINT #1%, "CB users count: ";CB.USER.COUNTS PRINT #1%, "Lines sent : ";CB.LINE.COUNTS PRINT #1% PRINT #1%, "CBLIB Version : ";CBLIB.VERSION PRINT #1% PRINT #1% PRINT #1%, "User Statistics:" PRINT #1% ANY.USERS%= 0% PRINT #1%, "CB user","Width","Handle", & "Talk","Proj","Prog","JobFlags","Password" User.loop: for y=0 to 63 !DO ZERO TO HELP DEBUG iterate user.loop if (dopt$="Y") and (cb.proj(y)=0%) iterate user.loop & if y=0 and tty.width(y)=0 and handle(y)="" and & talk.chan(y)=0 and cb.proj(y)=0 and & cb.prog(y)=0 and job.flags(y)=0 and & cb.pass(y)="" PRINT #1%, "#";Y," ";TTY.WIDTH(y),HANDLE(y); & TAB(30%),TALK.CHAN(y),CB.PROJ(y), & CB.PROG(y),JOB.FLAGS(y),cb.pass(y) any.users% = -1% next y PRINT #1%, "No Users" if any.users%=0% PRINT #1% PRINT #1% PRINT #1% PRINT #1%, "Channel Statistics: " PRINT #1% ANY.CHANNELS% = 0% PRINT #1%, "Channel","Chnl Usd Flg","Chnl Ln Cnt",,"Channel Values" Outside.loop: FOR y=0% to 40% Iterate outside.loop if (dopt$="Y") and (channel.used(y)=0%) CNL$ = channel(y) PRINT #1%, y," ";channel.used(y),cb.line.count(y);TAB(37%); & if y<>0 PRINT #1%, " 0(Usrs)"," ";channel.used(y),cb.line.count(y); & TAB(37%); & if y=0 c=0% any.channels% = -1% for z=1 to 63% c=c+1 if c>20% then c=1% PRINT #1%, PRINT #1%, tab(37%); end if PRINT #1%, FNDG2$(CNL(z));" "; NEXT Z PRINT #1% PRINT #1% next y PRINT #1%, "No Channels In Use" if any.channels%=0% PRINT #1%, chr$(12%); goto End.of.program User.functions: DEF* FNDG2$(ARG%) ARG$ = NUM1$(ARG%) ARG$ = "0" + ARG$ IF ARG%<10% FNDG2$ = ARG$ FNEND %SBTTL 'Error handling routine' %PAGE Error.section: select err Case = 2% PRINT "?Bad output file name" RESUME 10 Case = 5% PRINT "?Output account not found" RESUME 10 Case = 6% PRINT "?Bad output file device" RESUME 10 Case = 8% PRINT "?Output device is not available" RESUME 10 Case Else PRINT "?CBDUMP - Fatal error ";err;ERT$(err);" at ";ERL RESUME 32767 end select %SBTTL '' %PAGE End.of.program: CLOSE #1% PRINT PRINT "Report complete, output to ";O.FLE$ unless o.fle$=out.dflt 32767 end X^2? XPԳjklL;=TsBvL@@:@irȪ@g@!@^@n'@ 9@9@;@@@Sժ@_@L@Y@D@Sū@5M@y@@Y @ Q@{L@):@r@S;@@<@u~@S۪@y@+˫@S۪@yg@Ѫ@S۪@ |g@Ȫ@Ȫ@zժ@ZȪ@K@.@YȪ@@ժ@@ū@c8@vg@*}@ YȪ@Sū@ N@Sժ@۪@۪@e@&@]z@^\@ @+@=@K"Ȫ@""@ Sū@s@$"@"@q@t!@ K@Z@d@p@"l@+@ 6m;@+:+:+:@ 6m;@+:+:+:@G0 Da T,a ̫rG pa i ,1zhG(  +:  p  Z  d  K( ( "l0 0 "l8 8 p@ @ pp p +~ ~ Da @|C Report complete, output to 2?CBDUMP - Fatal error L?Output device is not availablep?Bad output file device $2>Lbp ?Output account not found?Bad output file name0No Channels In Use 0(Usrs)Channel Values Chnl "<BXdv  Ln Cnt Chnl Usd FlgChannel*Channel Statistics: BNo UsersN T#ZPasswordfJobFlagsrProgzPr  (*@BLNRTXZdfprxz |ojTalkHandleWidthCB userUser Statistics:CBLIB Version : Lines sent : CB users count: ".BVj Last use Time: Last use Date: "Last init Time: 6Last init Date: J StatisticsZCB b(Closed)n(O ,"@6TJdZlbxn ppen)xCB closed flag:  (Just loaded)(Init required)(Init in process) (Initialized)Common init x 2F\n flag: (Free) Common in use:  at (%CBDUMP report of loaded CBLIB.LIB on ROutput filename  6 >(hR d tN~YDump only active slots !CBDUMP - Dump CB resident library KB:CBDUMP.RPT t~ Bhz V02.06   L; @)  L; @)9  L;9  @y  L;y @@y  L;y D@  L; D@:  L;: D@  L;  D@:  L;: (@  L; 0:  L;: 4C  L;C 8K  L;K <T  L;T @H)`  L;` H@  =Ts L@A  =Tsi , |  G, G G| G &w  G 6m; G    i j +: , , Da Da ,a CBDUMP  ̫r a p ,vp vL : irȪ Da g!:irȪ Da vg"!$^&p(n',.9 X v~z 9irȪ Da  girȪ ̫r ;!irȪ ̫r irȪ Da v "~$Sժ &Da z | z  ̫r irȪ ̫r  _ LYDSū ̫r irȪ ̫r irȪ Da z "5M$irȪ  pP N  ̫r irȪ Da p  5MyY QPvL {L"):$irȪ &Da N(g v irȪ ̫r; ! irȪ ̫rirȪ Da vSժ Da  ̫r irȪ "̫r$Y  $ DSū ̫r r Da ̫r0_2:4S;8:v n'Ѫ ,a _:irȪ Da >g! _":$irȪ &Da v(g,!._ vv& :irȪ Da v g!_:irȪ Da vg!_ :"irȪ $Da &&g*! v  _:irȪ Da v g!Ȫ ,a _:irȪ Da g"irȪ $Da &g*irȪ v (  Da g irȪ Da vgirȪ Da g!n' S;$&Sū (,a *,.Sū 4J z  ,a zժ Da  ,a  ZȪ Da  ,a  ,a JQn'irȪ ̫r "irȪ $Da z Vv KS۪ ,a  .YȪ Da KyY v Q"$S۪ &,a (. |H  c8 Da  N Da H ժ ,a  Da Y _:S۪ ,a vg"irȪ $Da &g D% S۪ ,a . YȪ Da ygS۪ ,a .YȪ Da D|g S;$*}&(g,!   ժ ,a  Da   _:irȪ Da girȪ Da g"S۪ $,a &.(YȪ D%  Da yg S۪ ,a .YȪ Da D|gS;*} g$!&(*Sū ,,a ? YȪ ,a S; Sū ,a Sժ Da  ,a zժ Da  ,a ZȪ Da  ",a  $,a  >D    DQ n'S۪ ,a ۪ Da Sū ,a S; ۪ ",a $e&(_* f v% Sū ,a _ : irȪ Da vg!_:S;*} "g&!(_*:,S۪ P.J   ,a .YȪ Da P &.girȪ Da Jg! n'$ZȪ &Da  (,a  *,a  D vv Dzժ Da  ,a  n'_:irȪ Da vg!_ :"irȪ $Da v&g*!  J  n'ZȪ Da  ,a  ,a Jzժ Da  ,a n'Ѫ ,a "$&_(:*irȪ  B p  Da g ! _:S;g!Q B "n'&Q(p*]z .,a 2n' : ^ S۪ ,a  ^\ Sū ̫rѪ ,a  ^irȪ Da irȪ ̫r"+$Sū &̫r ^  Sժ ̫r ̫r = ,a K"Ȫ ̫rn'""Sū ,a  Ѫ ",a &(*n'. B  :irȪ Da  g!sQB Ѫ ,a  "n'&(:*irȪ ,Da B  l g! s QB Ѫ ,a n' ":$irȪ &Da l(g,!.s0 B  HB QB Ѫ ,a  n':irȪ Da Hg"!$s&(Q*B ,n'0  .| :irȪ Da . g""yg""$"girȪ Da "g&"(yg,!.s0| > B v| QB n' _q:irȪ Da vg!irȪ ̫r"irȪ $Da &(Y *| f  :irȪ Da  girȪ ̫rg!vLt!  X2? ,LL33 V8??II V"D *SYSYSYSYTICLPԳdd"DrpI ԳPԳ ,   >Z  LD^PZ< @ BCzEG@HPtJ$?Maximum memory exceeded in "?No CHAIN table in "?Statement not found in "" ?RMS error #FUNCTIONGOSUB called at line in "ERROR?Odd address trap?Memory management violation?Error file cannot be opened?Error file cannot be read?Undefined error number  @e@Ae&f . 1fABAD5 a C%!e e B V  B\E CP   D a@ C`B `%ֆ C ӆBEІ0  %C ‹  C B ‹ B 0    U\N E\N MEP\v U\\w #\B w j a  T  aD\ \:* l(\H \\ *l )ffeB   S~e& P!e`Jl#M B  B    B @   \  DҐB~\ !f &  \ N A f C%v   \ 3 EU %  3  5EvB   v\\& & \&&\  \ \\ \\\\&\& \\\&\&\\\& \ \ \\\\\\\@A@A @A C P \\%\%\%\%\'\'\'\ R C  $ >      p  ҥ  \C \m P # l d ( r.m *1@B*DFlm *1@B Tf`&  v& ~ B~ \ e v   e f&f& \E 5ŀ5΋ΠFDנ'נ"ΐ<0Рנ נ 0 0(v W Õ 0  a z  E 0@ נ[נ]Ê3ѐE֋ 5 CN נ נ  wP  Pߕ6wH*5 w4*EE ^  \5^ 5 ^2 B5^5 ^p5` E^U^ pX0 * !&$l!\ *b 5h$$"0$%Ewb*ew$*b*&^\*^^ ^A@*E@0H\*5& w20 H\*U@5 \*U@  5e*Cl ע עע###55@#$#H5 55@p˜$HE@5U@ w X##\w8fw. w(w"D\w wDw  *l(  II >\ J  p &30 \U^\9 U^  U^ U^& 0 0 0 *0 ,\*U^*U^*U^  6p* & & 5^E^0 f v *3E^5`5`  h Tv v N e\we 0 0 \ l ^\% 5^5^  0 9 Jנ'נ", &D ŀU͋  N ͥ   6  jw8ew.*@   \ \95^;A5U^f   `p00f j ѠѠɋ \*  `  0 5@^ 42 42 Eנ נ *5  5^DE^0  \ɋɥɥ ?ɥSɥ PɥEɥ C  f <E^5`685`5 C5^&`W&"U^ p @ɋɥ   a0  Pɕ t Bp 0 6 ɵfŀSˋŀ  5^ &U^q S  p/ & \\ x \ r@ r( @%% e ee e  @A K I  7@A 8  4 * t +`( @A       ( ` w   L f @   9 3#1#N , #)'#% 6 c f ~ C`B@  @  \  n% \B   @A  ~~ \  &  &     |w*J, J, 1@Bw@ V*U@ r E@`E@\ wwZ*C, C,w N& # * ,  ,&   &  K&  &*, , ]* @, @,wP" \ Z  @  * t w4B .5`*5`5`"5^ E` S ˋ5^ 5^ W W   f&  `  c w&f$w@A  w w C P     z  n lʥ  w  t<  B6 b 5^5@^I *0,&U^5` 5`0 f f ` * N h   .pXC `U^5^ Bp \0 f5`U^w   F *X5 ~     U^ ʥ 0 fʥ  fҕ C eH ~ %%K ` ҕ.  ҕ0 eҕE+-  Ґ s e0e0RCD`CE ~ ʥ0ʥ.%ʕ0 U&*0   h% % e@ RNA& & D 6N D D eD eAaD e   f6*DI  D   D 慡Eť ť  &f    ӕ-ӕ A s&DE s& sA ae0 f  ~ӕ ew *" ~& & pTppXjwTjw&*5@U@ &*E@E &&    e "&f &f qfqeCaB a w qfqe  FE7      F#!-*.f,*W0 U ߗ _ 5$h  $ #!  .` b www&w0@f*A"_*E5@Uw eE D` bl lrw t  B eE"s    s-  Cslw  wwD&*&e& :5 ACCl  rf*e <eEf (*p`E  B~ U@eB B  `B B f ,wWtu` B " b &wpe? WtE & fYf&B f ##! B EB BH#*u *5@ U@ E@E & \*A"C *5"   ( $0% % % % &f :LpI,DpD: E ED`IpI:CBDUMPp  Hx H0 Hx H0 Cp  4x H0x lI x lIx HT z;HlIx lI  r lIx lIx HT 4x lIx |HT 4,lT;v:p $x ZH0x hI x hIx HT z;HhIx hI r hI EhI Hx f 0 Hx 0H0 0 ~(H 0 Hx H0 Hx H0 Hx H0 x H0 8 zB< Hx G0 Hx H0 Hx G0 x H0 8 zz< Hx G0 8 z< Hx G0 8 z< Hx G0 8 z< Hx G0 Hx H0 Hx G0  8 z = Hx vG0 8 l"= Hx jG0 Hx H0 Hx bG0x H0x RG0 Hx H0 Hx >G0x DI0 Hx *G0x HI0 Hx H0 Hx G0x v,@p x lIx HT $ EnH! I$ $,l>v@ EE$ EnH!I E$ En!Ix HT $ EnH!I E$ EnH! I E$ EnH!(I E$ EnH!0I E$ En!8Ix HT $,l?v@ Hx \F0 E$x VF0 EnH!I En!I0x  0 EnH!I EnH! I EnH!(I EnH!0I En!8I0 Ep EEE>tEEp 8 EzH@ Hx JF0 Hx H0 Hx H0 Hx H0 Hx 2F0 Hx H0 E Hx &F0x F0x F0x H0x E0 p x (> E > EtEEEEE@vBp x lIx HT $ EnH!H$ $,lAvB En!ITI EEllA H E$x H0 EnH!H EnH!PIx % 0 EEzA Hx E0x H0 EnH!H EnH!PIx % 0 > D Ex ?> DJ EDtEDEDDAv`Bp  DE> Dx  Dj*B > D Hx H0 Hx % 0 H DnH!\IB 0x VF0 p EDDAtEDp Hx H0 Hx H0 p EEE@tEEp 8 EzB Hx E0 Hx f 0 vCp vCDp D`I8 D tBx Ex `I `I`IdI2DfdIp p D8 Dz>Cp Hx E0 T;vC8 DzbCp Hx E0 T;vC8 DzCp Hx xE0 T;vC8 DzCp Hx TE0 T;vCp Hx :E0  0x (H0  DvCp d Hx H0 x hIx HT lD Hx E0x hI0 p  &:w2828B7>7<7@7z48\7L7P7D7D7 !z#J@|CEReport complete, output to >E?CBDUMP - Fatal error XE?Output device is not available|E?Bad output file deviceE?Output account not foundE?Bad output file nameE0ENo Channels In UseE 0(Usrs)EChannel Values F Chnl Ln CntF Chnl Usd Flg*FChannel6FChannel Statistics: NFNo UsersZF `F#fFPasswordrFJobFlags~FProgFProjFTalkFHandleFWidthFCB userFUser Statistics:FCBLIB Version : FLines sent : FCB users count: GLast use Time: GLast use Date: .GLast init Time: BGLast init Date: VG StatisticsfGCB nG(Closed)zG(Open)GCB closed flag: G (Just loaded)G(Init required)G(Init in process)G (Initialized)GCommon init flag: H(Free) H HCommon in use: ,H at 4H%CBDUMP report of loaded CBLIB.LIB on ^HOutput filename HNHYHDump only active slots H!CBDUMP - Dump CB resident libraryH KB:CBDUMP.RPTHV02.06@)@)9 @y@@yD@D@:D@D@:@: CK TH)`_:@@A^:: T;DXxQ2? CBDUMP.TSK Memory allocation map TKB 09.105 Page 1 30-MAY-86 13:08 Partition name : GEN Identification : V02.06 Task PPN : [100,198] Stack limits: 001000 001777 001000 00512. PRG xfr address: 042042 Total address windows: 2. Task image size : 9824. words Task address limits: 000000 046217 R-W disk blk limits: 000002 000050 000047 00039. *** Root segment: CBDUMP R/W mem limits: 000000 046217 046220 19600. Disk blk limits: 000002 000050 000047 00039. Memory allocation synopsis: Section Title Ident File ------- ----- ----- ---- . BLK.:(RW,I,LCL,REL,CON) 002000 000000 00000. BP2OTD:(RO,D,LCL,REL,CON) 002000 000606 00390. 002000 000006 00006. $STCVT 10CM B23OTS.OLB 002006 000020 00016. $ICRED 61RE B23OTS.OLB 002026 000016 00014. $STMOS 26CM B23OTS.OLB 002044 000002 00002. $FNEXT 11CM B23OTS.OLB 002046 000034 00028. $FUNC2 11CM B23OTS.OLB 002102 000014 00012. $IVOPN 63RE B23OTS.OLB 002116 000152 00106. $BINIT 106RE B23OTS.OLB 002270 000272 00186. $ERROR 119RE B23OTS.OLB 002562 000004 00004. $ECONV 30CM B23OTS.OLB 002566 000002 00002. $OVSG2 04CM B23OTS.OLB 002570 000002 00002. $OVSG3 04CM B23OTS.OLB 002572 000002 00002. $OVSG1 04CM B23OTS.OLB 002574 000002 00002. $OVSG4 04CM B23OTS.OLB 002576 000002 00002. $ERROT 103RE B23OTS.OLB 002600 000006 00006. $BXTRA 06RE B23OTS.OLB BP2OTS:(RO,I,LCL,REL,CON) 002606 032330 13528. 002606 000502 00322. $FADD 12CM B23OTS.OLB 003310 000044 00036. $BTDID 05CM B23OTS.OLB 003354 000406 00262. $CNTRL 16CM B23OTS.OLB 003762 000104 00068. $JCON1 14CM B23OTS.OLB 004066 000070 00056. $STFN1 06CM B23OTS.OLB 004156 000226 00150. $FCON1 22CM B23OTS.OLB 004404 000150 00104. $FMOV 04CM B23OTS.OLB 004554 000140 00096. $JMOVS 07CM B23OTS.OLB 004714 000124 00084. $FCMP 02CM B23OTS.OLB 005040 000040 00032. $JCMPS 03CM B23OTS.OLB 005100 000136 00094. $STCMP 04CM B23OTS.OLB 005236 000320 00208. $STCOS 04CM B23OTS.OLB 005556 000446 00294. $STCVT 10CM B23OTS.OLB 006224 000056 00046. $TIME 12RE B23OTS.OLB 006302 000026 00022. $ICEND 07CM B23OTS.OLB 006330 000230 00152. $ICEOL 21CM B23OTS.OLB CBDUMP.TSK Memory allocation map TKB 09.105 Page 2 CBDUMP 30-MAY-86 13:08 006560 000654 00428. $ERTHR 75CM B23OTS.OLB 007434 000176 00126. $FUNC3 01CM B23OTS.OLB 007632 000426 00278. $ICINI 25CM B23OTS.OLB 010260 001562 00882. $ICRED 61RE B23OTS.OLB 012042 000030 00024. $LOADS 02CM B23OTS.OLB 012072 000642 00418. $STFNS 14CM B23OTS.OLB 012734 000202 00130. $STLSS 08CM B23OTS.OLB 013136 001056 00558. $STMOS 26CM B23OTS.OLB 014214 000124 00084. $FNEXT 11CM B23OTS.OLB 014340 000072 00058. $STNMF 11CM B23OTS.OLB 014432 000666 00438. $ICWRT 42CM B23OTS.OLB 015320 000224 00148. $ICWR1 02CM B23OTS.OLB 015544 000200 00128. $ICRCL 17CM B23OTS.OLB 015744 000356 00238. $ICROP 50RE B23OTS.OLB 016322 000236 00158. $SWPST 06CM B23OTS.OLB 016560 000044 00036. $FADDM 06CM B23OTS.OLB 016624 000374 00252. $FUNC2 11CM B23OTS.OLB 017220 000226 00150. $ICFNS 11RE B23OTS.OLB 017446 000044 00036. $TESTS 04CM B23OTS.OLB 017512 000746 00486. $IEULT 32RE B23OTS.OLB 020460 000200 00128. $SSSUB 10CM B23OTS.OLB 020660 000030 00024. $SSCST 03CM B23OTS.OLB 020710 001070 00568. $IVOPN 63RE B23OTS.OLB 022000 000000 00000. $ICIO0 08CM B23OTS.OLB 022000 001404 00772. $BINIT 106RE B23OTS.OLB 023404 001116 00590. $STMSC 28CM B23OTS.OLB 024522 000222 00146. $STGTA 04CM B23OTS.OLB 024744 000124 00084. $STXCM 02CM B23OTS.OLB 025070 001754 01004. $ERROR 119RE B23OTS.OLB 027044 000112 00074. $ICULT 05CM B23OTS.OLB 027156 000266 00182. $JCONV 03CM B23OTS.OLB 027444 002404 01284. $ECONV 30CM B23OTS.OLB 032050 000446 00294. $LCONV 05CM B23OTS.OLB 032516 000150 00104. $IMALQ 14CM B23OTS.OLB 032666 000070 00056. $PROCT 00CM B23OTS.OLB 032756 000154 00108. $SSOFF 04CM B23OTS.OLB 033132 000062 00050. $ICCRL 00CM B23OTS.OLB 033214 000260 00176. $ICFSS 32RE B23OTS.OLB 033474 000002 00002. $OVSG2 04CM B23OTS.OLB 033476 000002 00002. $OVSG3 04CM B23OTS.OLB 033500 000002 00002. $OVSG1 04CM B23OTS.OLB 033502 000002 00002. $OVSG4 04CM B23OTS.OLB 033504 000000 00000. $BFPEI 06CM B23OTS.OLB 033504 000114 00076. $ERROT 103RE B23OTS.OLB 033620 000242 00162. RQLCB 69CM B23OTS.OLB 034062 000000 00000. $RUNDN 01CM B23OTS.OLB 034062 000002 00002. $MTRET 01CM B23OTS.OLB 034064 000646 00422. $IMGSA 15CM B23OTS.OLB 034732 000100 00064. $CCTRP 27RE B23OTS.OLB 035032 000004 00004. $BFPER 06CM B23OTS.OLB 035036 000054 00044. $BXTRA 06RE B23OTS.OLB 035112 000024 00020. SAVRG 69CM B23OTS.OLB CBLIST:(RW,D,GBL,REL,OVR) 160000 011004 04612. 160000 011004 04612. CBDUMP V02.06 CBDUMP.OBJ USERRD:(RW,D,GBL,REL,OVR) 035136 000102 00066. CBDUMP.TSK Memory allocation map TKB 09.105 Page 3 CBDUMP 30-MAY-86 13:08 035136 000102 00066. CBDUMP V02.06 CBDUMP.OBJ $ARRAY:(RW,D,LCL,REL,CON) 035240 000000 00000. 035240 000000 00000. CBDUMP V02.06 CBDUMP.OBJ $CODE :(RO,D,LCL,REL,CON) 035240 004602 02434. 035240 004602 02434. CBDUMP V02.06 CBDUMP.OBJ $CODEI:(RO,I,LCL,REL,CON) 042042 000012 00010. 042042 000012 00010. CBDUMP V02.06 CBDUMP.OBJ $FLAGR:(RW,D,GBL,REL,CON) 042054 000000 00000. 042054 000000 00000. CBDUMP V02.06 CBDUMP.OBJ $FLAGS:(RW,D,GBL,REL,CON) 042054 000002 00002. 042054 000002 00002. CBDUMP V02.06 CBDUMP.OBJ $FLAGT:(RW,D,GBL,REL,CON) 042056 000000 00000. 042056 000000 00000. CBDUMP V02.06 CBDUMP.OBJ $ICIO0:(RW,D,GBL,REL,OVR) 042056 000102 00066. 042056 000000 00000. CBDUMP V02.06 CBDUMP.OBJ 042056 000000 00000. CBDUMP V02.06 CBDUMP.OBJ 042056 000102 00066. $ICIO0 08CM B23OTS.OLB $ICIO1:(RW,D,GBL,REL,OVR) 042160 000200 00128. 042160 000200 00128. CBDUMP V02.06 CBDUMP.OBJ 042160 000200 00128. CBDUMP V02.06 CBDUMP.OBJ $IDATA:(RW,D,LCL,REL,CON) 042360 000034 00028. 042360 000034 00028. CBDUMP V02.06 CBDUMP.OBJ $PDATA:(RO,D,LCL,REL,CON) 042414 002124 01108. 042414 002124 01108. CBDUMP V02.06 CBDUMP.OBJ $STRNG:(RW,D,LCL,REL,CON) 044540 000020 00016. 044540 000020 00016. CBDUMP V02.06 CBDUMP.OBJ $TDATA:(RW,D,LCL,REL,CON) 044560 000000 00000. 044560 000000 00000. CBDUMP V02.06 CBDUMP.OBJ $$BP2 :(RW,D,GBL,REL,OVR) 044560 001440 00800. 044560 001440 00800. CBDUMP V02.06 CBDUMP.OBJ Global symbols: ADD$ 002660-R BRA$ 003566-R CLL$M 004442-R CMS$AA 005124-R ESB$M 007464-R IPR$ 010104-R LMA$1 013030-R ADF$MS 002630-R BUF$ 017424-R CLL$P 004456-R COS$AA 005272-R ESD$M 007512-R IPT$ 010110-R LNE$ 012064-R ADF$PS 002606-R CCE$ 034732-R CLL$S 004416-R COS$AS 005424-R ESF$M 007504-R IRD$ 007640-R LSS$AA 012740-R ADF$SM 016604-R CCP$ 017302-R CMF$MM 004776-R COS$SA 005236-R ESI$M 007476-R IVF$A 010260-R LSS$AM 012760-R ADF$SS 002644-R CCTRP 034742-R CMF$MP 004752-R COS$SS 005342-R ESL$M 007504-R IVI$A 010372-R LSS$AP 012734-R ANI$ 003314-R CCX$ 034772-R CMF$MS 004720-R CVT$ 005562-R ESR$M 007540-R IVS$A 010432-R LSS$MA 013010-R ARI$M 020460-R CFI$ 003770-R CMF$PM 004772-R DAT$ 006242-R ESS$M 007546-R JMC$ 003454-R LSS$PA 013004-R ARI.M 020462-R CFL$ 003762-R CMF$PP 004746-R DOP$ 015744-R EXTSP 034474-R KTI$ 003340-R MAD$ 024502-R ARR$ 020472-R CHR$ 004146-R CMF$PS 004714-R DPF$ 004404-R FCL$ 007434-R LAM$1 012762-R MIS$ 012364-R ARS$C 020660-R CIF$ 004156-R CMF$SM 005006-R DPI$ 004554-R FLN$ 006560-R LAM$2 012766-R MOF$MA 004524-R ARS$M 020460-R CLB$S 004634-R CMF$SP 004762-R ECS$AA 005100-R FPUERR 042156-R LEN$ 004114-R MOF$MM 004512-R ARS.C 020662-R CLF$ 004264-R CMF$SS 004734-R ECS$01 005110-R FSS$ 033416-R LEQ$ 012044-R MOF$MP 004532-R ARS.M 020462-R CLF$A 004452-R CMI$IM 005060-R END$ 006302-R GSC$ 003400-R LFT$ 012216-R MOF$MS 004424-R ASC$ 004124-R CLF$M 004442-R CMI$IS 005054-R EOL$ 006330-R GSU$ 003354-R LGE$ 012054-R MOF$PA 004544-R BEQ$ 003554-R CLF$P 004456-R CMI$MI 005070-R EQI$ 003322-R III$ 010064-R LGT$ 012052-R MOF$PM 004540-R BGE$ 003564-R CLF$S 004416-R CMI$MM 005074-R ERL$ 006746-R IIN$ 007756-R LIN$ 006560-R MOF$PP 004550-R BGT$ 003562-R CLI$A 004644-R CMI$MS 005064-R ERN$ 006726-R ILI$ 010044-R LIS$ 007722-R MOF$PS 004436-R BLE$ 003552-R CLI$M 004640-R CMI$SI 005044-R ERR$ 006764-R ILS$ 007740-R LIT$ 010024-R MOF$SA 004462-R BLT$ 003574-R CLI$S 004634-R CMI$SM 005050-R ERT$ 006776-R INS$ 012522-R LLE$ 012042-R MOF$SM 004476-R BNE$ 003572-R CLL$A 004452-R CMI$SS 005040-R ERT$X 007024-R IOI$ 003310-R LLT$ 012066-R MOF$SP 004506-R CBDUMP.TSK Memory allocation map TKB 09.105 Page 4 CBDUMP 30-MAY-86 13:08 MOI$IA 004606-R NVF$M 014222-R SSI$ 016322-R VRS$C 020660-R $CLXRB 020242-R $GTROM 023404-R $PSMSK 003600-R MOI$IM 004602-R NVF$P 014214-R SSL$ 016352-R VRS$M 020460-R $CMR 004734-R $GTR01 024522-R $PSM1 007260-R MOI$IS 004570-R N1F$ 014370-R SSS$ 016334-R VRS.C 020662-R $CNVIA 027346-R $GTR23 024626-R $RAD50 012116-R MOI$MA 004630-R OEA$ 007052-R STF$ 014354-R VRS.M 020462-R $CNVLA 032344-R $GTSTN 023610-R $RELCB 033620-R MOI$MM 004624-R OEG$ 007032-R STR$ 004074-R WAT$ 017404-R $CRLF 014742-R $GTSTR 023674-R $REQCB 033722-R MOI$MS 004620-R OGB$ 007102-R STS$ 017270-R XOI$ 003324-R $DATRC 023356-R $ICIO0 042056-R $RSU2 025070-R MOI$SA 004564-R OGS$ 007136-R SUF$MM 016564-R $ABNEX 025712-R $DATRS 023334-R $ICJM1 027126-R $RUNDN 034062-R MOI$SM 004560-R ONI$A 004664-R SUF$MS 002616-R $ADFPS 002632-R $DMAXD 002564-R $INITM 022000-R $SAVRE 035112-R MOS$AA 013420-R ONI$M 004656-R SUF$PM 016560-R $ATLIN 026560-R $DOIT 026776-R $INPTT 011034-R $SETCC 034764-R MOS$AM 013344-R ONI$S 004650-R SUF$PS 002612-R $ATOD 027444-R $DOIT1 027020-R $INTCM 023162-R $SETSC 023010-R MOS$AP 013360-R POS$ 012504-R SUF$SM 016600-R $ATOI 027156-R $DTOA 030626-R $IOERV 027030-R $SETUP 015010-R MOS$AS 013136-R PVD$SI 014432-R SUF$SS 002640-R $ATOL 032050-R $DTOAX 030632-R $IOTST 020424-R $SPEC 017524-R MOS$MA 013524-R PVF$SI 014444-R SWE$ 016636-R $BALBF 032562-R $ERRTR 033504-R $IR 003770-R $SSOFF 032756-R MOS$MM 013646-R PVI$SI 014610-R SWI$ 003350-R $BALMP 032544-R $ERRT1 025104-R $ISETP 010700-R $STCRE 024012-R MOS$MP 013606-R PVL$SI 015320-R TAB$ 017220-R $BCL 021572-R $ERTXT 026050-R $I4ER 010352-R $STCRX 024016-R MOS$MS 013176-R PVS$AI 014460-R TIM$ 006224-R $BINPT 020260-R $EXTSP 023552-R $MEMPR 033520-R $STMOV 024044-R MOS$PA 013530-R RAD$ 012072-R TJK$ 016624-R $BOFS 020750-R $FLSAL 006372-R $MEMP1 026204-R $STMVX 024056-R MOS$PM 013352-R RCL$ 015544-R TRM$ 005556-R $BOP 020710-R $FLSFR 006402-R $MNIUS 024356-R $STXCM 024744-R MOS$PP 013602-R RCT$ 017256-R TSD$M 017460-R $BOPX 020726-R $FLSNL 006420-R $MNSUB 024422-R $SYSHD 025556-R MOS$PS 013166-R REG$ 003510-R TSD$P 017470-R $BOUTP 017642-R $FLUSH 006430-R $MTRET 034062-R $VALDC 027062-R MOS$SA 013416-R RIT$ 012264-R TSD$S 017446-R $BREAD 017776-R $FMAXD 002562-R $NOREX 026014-R $VALID 027044-R MOS$SM 013266-R RLI$I 004574-R TSF$M 017460-R $BRTBF 032650-R $FNDMS 007200-R $ODDAD 033514-R $VREAD 017552-R MOS$SP 013216-R RLI$M 004570-R TSF$P 017470-R $BRTMP 032630-R $FPASX 035034-R $ODDA1 026166-R $XWRT 020302-R MOS$01 013760-R RLI$P 004620-R TSF$S 017452-R $CALFP 020414-R $FPHSK 035032-R $ONERG 025414-R $$DAT 006254-R MSI$IM 004602-R ROP$ 015754-R TSI$I 017464-R $CALIN 026550-R $FPUER 033504-R $OTSVA 044560-R $$MAXC 000017 MS1$01 013172-R RSI$M 004620-R TSI$M 017460-R $CCHDL 033534-R $FRCER 033524-R $OVSEG 002572-R $$TIM 006236-R NMA$1 013132-R RSI$P 004612-R TSI$P 017470-R $CCXIT 033616-R $FSS 020330-R $OVSG1 033500-R .NLUNS 002576-R NMF$ 014340-R RSM$ 006616-R TSI$S 017454-R $CFLY 003774-R $FSSCN 033214-R $OVSG2 033474-R ..CRLF 035060-R NOBRA 003556-R RST$ 007632-R TSL$M 017502-R $CHKRL 033132-R $FSSCZ 033216-R $OVSG3 033476-R ..PMD 035056-R NOI$A 004706-R RSU$ 006630-R TSL$P 017476-R $CLFQB 020220-R $FTOA 030560-R $OVSG4 033502-R ..PTXT 035064-R NOI$M 004700-R SEG$ 012350-R TSL$S 017452-R $CLOSR 015556-R $FTOAX 030564-R $POM1 007330-R ..RSTT 035036-R NOI$S 004672-R SPC$ 004066-R ULK$ 017512-R $CLSAL 015724-R $GSACM 032516-R $POS 017320-R ..SVFQ 020436-R NSS$AA 013076-R SPC$01 004066-R USE$ 017062-R $CLSFQ 020406-R $GSA1 034064-R $PRNSP 015076-R NSS$MA 013122-R SSD$ 016406-R VRI$M 020510-R $CLSHD 015712-R $GTPTN 023620-R $PRNTL 015114-R NSS$PA 013116-R SSF$ 016352-R VRI.M 020512-R $CLSTK 024120-R $GTPTR 023706-R $PROCT 032666-R *** Task builder statistics: Total work file references: 41033. Work file reads: 0. Work file writes: 0. Size of core pool: 5940. words (23. pages) Size of work file: 5120. words (20. pages) Elapsed time:00:00:36 Nq2? +-----------------------------------------------------------------+ ! 'CB Command Reference Card - V02.06' ! ! ! ! CB Commands are: ! ! ! ! /TALK n - Change talk channel to 'n'. ! ! This is the channel that you ! ! 'Transmit' on. ! ! /MONITOR n,m,..z - Monitor All channels specified ! ! If negative, Unmonitor channel. ! ! If negative, with no number, then ! ! Unmonitor ALL channels (Except TALK) ! ! /RESTRICT xxxxxx - Restrict sending message to ! ! any JOB having 'xxxxxx' as ! ! it's internal password, If no ! ! argument, then turn off password ! ! /BROADCAST nn Text- Allows a message to be sent to everyone ! ! even if a password is set. This allows a ! ! user to send text to everyone without ! ! having to reset his password, send a ! ! message and then set the password again. ! ! If 'nn' is included, then message is sent ! ! on channel #nn, else it is sent on the ! ! users' normal talk channel. ! ! /XEQ [CMD] - Open a Background job and execute the ! ! system command (CMD), if any. If the ! ! background is not currently opened, then ! ! open it. If no command is specified and ! ! the background is open, close it. ! ! $ (Escape key) - this command may be thought ! ! of as a /XEQ shift-lock. While in this ! ! mode, no CB prompt is displayed and all ! ! terminal entry is sent to the BG job unless ! ! prefixed by '..' which will execute as a ! ! CB command or message. ! ! /CALL Kbn# - Send a message to specified terminal ! ! requesting that they enter CB ! ! /SPY (PRIV) - Allows operator to recieve Restricted ! ! messages without knowing PASSWORDS ! ! /KILL n (PRIV) - Clear out job specified by 'n'. ! ! This removes job from tables and ! ! KILLs job off system (Logs out). ! ! /DETACH (PRIV) - Detach from the current terminal ! ! /ALL Txt (PRIV) - Send message to all CB users. ! ! /OPEN (PRIV) - Opens CB to allow non-privileged users ! ! access to CB. ! ! /CLOSE (PRIV) - Closes CB from usage by non-privileged ! ! user. ! ! /TIME - Display current Date/Time. ! ! /DATE - Display current Date/Time. ! ! /KB - Toggle KB on message switch ! ! /PPN - Toggle PPN on message switch ! ! /JOB - Toggle JOB on message switch ! ! /UPPER - Toggle Upper/Lower Translation switch ! ! /AT Filename or @ - Execute commands from a command file. Note ! ! that only 1 level of indirect is allowed. ! ! /WIDTH [n] - Sets terminal wraparound width to 'n'. If ! ! 'n' is not specified, current width is ! ! displayed. DEFAULT is 78. ! ! /LIST [n] - List current users on CB. ! ! If 'n' is specified, then list ! ! only that user ! ! /WATCH [n] - List all users WATCHING channel 'n' ! ! If 'n' is not entered, then all users on ! ! current talk channel are shown. ! ! /STAT - display CB statistics. ! ! /HELP - This message ! ! /EXIT - Exit CB ! ! ! ! Note: ^Z and ^C act like '/EXIT' was entered ! ! All commands may be abbreviated to 2 letters. ! ! Note: V8 or earlier, PRIV= [1,*] user, V9, user with USER8 ! ! (V9, may be changed by system manager) ! ! Note: More complete descriptions of each command can be found ! ! in the documentation for CB. ! +-----------------------------------------------------------------+ [2? CB - Citizens Band Radio Emulator - Version 02.06 30-MAY-1986 ================================= Philip Hunt System Industries 1855 Barber Lane Milpitas, Ca 95035 (408)942-1212 x417 Description: ------------ CB is a very versitile program running in 2K of user space that will allow any users on the system to communicate with each other as they would on a citizen's band radio. A 'Talk' channel is used to send messages to anyone currently 'Monitoring' that channel. A user may monitor any or all of the 40 'channels' avail- able, but may only talk on one. Note that channel 40 is a privileged-only channel and may not be used by non-privileged users. Commands are defined to allow the user to change talk channels, monitor and unmonitor channels, list users by user or by channel, set 'Restricted' messages that will only be recieved if the sender and reciever (or recievers) have the same password set, etc. A user may even execute system commands while still in CB through the use of a FG/BG (Foreground/Background) arrangement. Note: CB will NOT execute correctly on systems before RSTS V7.0 because shared resident library support is required. Program Entry: -------------- When the user enters the program, they must enter a 12 character 'handle' that will be transmitted everytime he sends a message. The prompt for sending messages is a 'T' with the channel number you are currently talking on included, example: 'T19>' would mean you are currently talking on channel #19. If an extra bracket ('>') is included in the prompt, it would indicate that the user has a password set for his messages and that only people with the same password will recieve them. For entry by CCL, see CCL/LOGGED-OUT formats. CB will execute a command file called 'CB.INI' in the users' account for start-up initialization changing CB standard defaults. If the command file does not exist, no error is generated at start-up. As noticed, anything not beginning with a '/' are sent to other CB users on the users current TALK channel. The slash indicates a command entry. Note: If a blank line is entered (i.e., a carriage return is struck without any other user entry), CB will print its' version number and return for more commands/messages. On RSTS v7.1 (or later), if a terminal has a 'SET GAG' executed, then CB will set the terminal to NO GAG, when CB is exited, it will reset the terminal to GAG. Note on privileged users in CB: A privileged user in CB is defined for RSTS V8 or earlier as a user in group 1, such as [1,*]. In version 9 or later, a privileged user is anyone with 'USER8' privileges. The default privilege required may be changed to any RSTS privilege by placing the file 'CBPRIV.CB' in LB: with user read access, The privilege specified in that file will be used instead of 'USER8'. If that file does not exist, is blank or contains an invalid priv name, then 'USER8' is used. Commands: --------- /TALK Chnl# This command will change the channel the user is currently transmitting on. When the user first enters CB, the channel will be set to 19. Valid channels are 01-40, any other entry will give an error message. The channel that is set for Talk will cause all messages sent to be recieved by any user currently monitoring that channel unless a password has been set (See /RESTRICT). Note: When changing Talk channels, the previously set Talk channel will still be marked for monitor. Also note that channel 40 is special and may only be used by a privileged user [1,*]. /MONITOR Chnl#,Chnl#,....,Chnl# This command will allow the user to monitor multiple channels. When the user first signs into CB, he will only be monitoring channel 19. Valid channels are 01-40, any other entry will cause an error message for that channel, but all other entries on the command line will be processed. If the channel number is entered as negative, then the channel specified will be 'UNMONITORED'. Note: You cannot unmonitor your current TALK channel. Also note that channel 40 is special and may only be monitored by a privileged user. /RESTRICT nnnnnn Restrict allows a user to set a password up to 6 characters long. When a password is set, the users' messages will only be sent to other users monitoring the channel that have the same password set. This allows private messages to be sent. Note: Privileged users can obtain Restrict passwords (See /List) and can recieve Restrict messages (See /Spy). Messages with this set will have the word 'SECRET' appended to the message (See Message Formats). If password is turned on and no password is entered, the password will be set to the first 6 characters of the entered command. If the password entered is greater than 6 characters, the first 6 will be used. /BROADCAST [Chnl#] <> This command will allow a user to send a message to any valid channel ignoring the sending users' password protection. If channel is specified, then the message will be sent to that channel, otherwise, the message will go to your current Talk channel. This command is useful if you would like to send one message to everyone on your channel, but would like to keep most of your messages 'Private'. /XEQ [command] This command will activate/deactivate Background (BG) processing. If entered without the command and the user has activated BG, then BG will be turned OFF. If entered without the command and BG has not been activated, it will be activated. Once activated, more /XEQ commands can be entered to execute. anything that is legal to be entered at a terminal may be entered to BG mode. I.E. You can do SYSTAT, enter a new program, edit a file etc. If your BG job generates large amounts of output, you may ^C (Control/C) interrupt the background job. THIS WILL ONLY WORK WHILE IN BG OUTPUT MODE, if entered at other times, CB will be exited. Note: If command entered is '<>', it will be translated to NULL line (i.e. only), it a line contains anything of the form '^n' where 'n' is a letter, that combination will be translated to CTRL/n. To override this, the user must append an underscore ('_') to the control sequence. If the user would like to send an underscore, they must enter 2 underscores which will translate to 1. Also note that if the BG job does not enter a KB wait or I/O state within appoximately 10 seconds, the user will be placed back in CB command mode. A scan for BG I/O will occur appoximately every 3 seconds. This scan will be invisible to the user as he may enter CB commands during these scans. Only when I/O is found, will the user be interrupted to show this I/O. If the BG job is running, then any attempt to send a command to the background (except '/XEQ ^ctrl/char') will cause an error and the command will NOT BE SENT. Note that '/XEQ ^C' will interrupt the BG and cause it to enter KB state. (NOTE: ON VERSION 9 systems, accounts with HASHED passwords must actually 'login' on the pseudo keyboard as CB cannot lookup a password to login. $ (ESCAPE KEY) The escape key allows the user to enter or exit a 'locked' background environment. This environment is equivalent to an ATPK run using KB: for input file. If currently in locked background mode, another entered Escape character will unlock the background, BUT LEAVE BG mode open allowing for re-entry by entering another escape. NOTE: Control characters such as CTRL/C, CTRL/T, CTRL/Z should be entered as 'uparrow letter' (^n) to be recognized as background control characters, otherwise, it is possible that they might be interpreted as forground control. To send a message while in 'locked' mode, append 2 periods ('..') to the beginning of the message, they will be removed and the message sent on your talk channel. Note: You may also execute CB commands by entering '../command' as you can think of '..' as a reverse-shift. (NOTE: ON VERSION 9 systems, accounts with HASHED passwords must actually 'login' on the pseudo keyboard as CB cannot lookup a password to login. /CALL Kb# This command will send a message to the specified terminal currently NOT running CB, to request that they do run CB. The message sent is of the form: **CB - User: Handle - Please enter CB on Channel #n** where: Handle is the current user NAME n is the current users' TALK channel NOTE: If the specified job is already in CB, an error message is generated and the message is not sent. /TIME /DATE These commands will display the current date and time. This is useful when using CB for an extended period of time. /KB KB will toggle a bit in the user flag word allowing him to recieve KB numbers when a message is recieved by him (See Message Formats). The default for this is 'OFF'. /PPN PPN will toggle a bit in the user flag word allowing him to recieve user PPN numbers when a message is recieved by him (See Message Formats). The default for this is 'OFF'. /JOB JOB will toggle a bit in the user flag word allowing him to recieve JOB numbers when a message is recieved by him (See Message Formats). The default for this is 'OFF'. /UPPER Toggles the user flag word informing CB to start or stop translate all MESSAGES (sent or recieved) to UPPER case. The default for this is 'OFF'. /AT or @ Process commands from the file entered. Note that anything that is not a command (beginning with '/') or a comment is executed as a message as if it was entered at the terminal. A comment is valid ONLY in a command file and is ignored. A comment begins with ';' or '!'. These are useful in the file to comment steps in the procedure. /WIDTH n This command sets the terminal message wraparound at character n. The default for CB is a wraparound at position 78. All characters after position 78 or a set value will be displayed on subsequent lines with '--> ' prepended. If 'n' is not specified, then current width is displayed. Note: The minimum width allowed is 28 and the maximum is 133. Also, if the current width is set less than the number of characters required to display at least all header options requested (/KB,/PPN etc.), width is set to 78 until an one or more options are toggled 'OFF'. /LIST [Job#] List all users currently using CB. A list of their TALK channel, channels they are monitoring, their 'Handles', Job #, KB #, User PPN and JOB attributes (See Attributes) are listed. If you are currently privileged, then any currently set Restrict password is also printed. If the job listed is attached to a dial-up line, a star is appended to the KBnn: display. Note: If Job# is entered, then the listing will be only for that Job#. /WATCH [Chnl#] This command will give a list of users currently monitoring a channel. Their KB#, Job #, Handles and Job attributes are printed. If the job listed is attached to a dial-up line, a star is appended to the KBnn: display. If Chnl# is not entered, then the list will be entered for the current Talk channel. Note: If /Watch is entered as a CCL command, then a Chnl# MUST be specified (See CCL/LOGGED-OUT formats). /STAT Display CB statistics. Init date, last use date and user counts are displayed as well as a lines sent count. /HELP Prints a Help message for CB. It is very similar to the reference card in format. /EXIT (^Z, ^C) Exit CB. Note: ^Z and ^C act as if an /EXIT command has been entered. If the user has opened a BG job, that job will terminate in an orderly fashion. **Privileged ONLY commands:** These commands, when executed by a non-privileged user, will generate an error message, and NOT be executed. /SPY Toggles a bit in the user job attributes that allows a privileged user to recieve Restrict messages even though he might have no password or a different password set. The default is 'OFF'. a message recieved by /SPY being set will have '+SPY+' appended to it. /KILL Job# Clear the job specified from CB and kill the job. A check is made to be sure the job specified is in CB. A message is sent to the JOB (Unless detached) informing him that his job has been killed, and all users recieve the 'Leaving CB' message with the phrase '(Involuntarily)' appended to it (See Message Formats). THIS COMMAND SHOULD BE USED TO KILL A CB JOB, NOT THE RSTS 'UTILTY' COMMAND. UNDER NORMAL CIRCUMSTANCES, CB WILL CORRECT ITSELF on the next item sent across the CB network if UTILTY KILL is used though, there is no need to worry!! /OPEN Opens CB to allow non-privileged users access to CB. /CLOSE Closes CB from usage by non-privileged users. /DETACH Detach from current Keyboard. This allows a user to change keyboards or leave CB for a while without having to exit and then enter CB again. /ALL text Send a message to ALL CB users on all channels, the message part usually displayed as 'Cxx' or 'Bxx' indicating channel number is replaced by the string 'OPR' Start-Up Switches: ------------------ Certain switches may be entered to CB while entering the user Handle. They are as follows: /DBG (PRIV) - Allows a privileged user to recieve all internal data as CB executes a command. This is 'debug'. Note: All debug logic and the command are commented out on the distributed source to save program space. they must be uncommented to execute this command. /CLR (PRIV) - Allows a privileged user to clear the CBLIB area of memory if it ever gets corrupted. ALL USERS SHOULD HAVE /EXITed CB BEFORE THIS IS EXECUTED or BEWARE!!! /HIDE (PRIV) - Allows a privileged user to enter and exit a current CB session without the startup/exit messages sent to all users that normally occur. These commands MUST be entered when the CB handle is requested in the form: What is your handle? HANDLE/COMMAND This will satisfy the CB parsing algorithms. Note in the '/CLR' command, the handle is ignored and reprompted when the command is complete. Note: These commands may NOT be entered as part of a CCL entered handle. Attributes: ----------- Job attributes associate special processing modes with a specific job. Special modes cause different forms of the broadcast header to be displayed upon recieving a message. The mode or attributes set cause different information to be displayed (See Message Formats). Message Formats: ---------------- Messages recieved are displayed in different formats depending on the Job attributes set. See below for description: #DBG#+SPY+SECRET (Cxx/KBxxx:*[PPN]HANDLE#xx) Message text here ! ! ! ! PnnJjj ! ! ! ! ! ! ! ! ! ! ! ! +----Message sent. Note: If ! ! ! ! ! ! ! ! Message is too long to ! ! ! ! ! ! ! ! fit on 1 line of output ! ! ! ! ! ! ! ! terminal screen, it is ! ! ! ! ! ! ! ! broken into multiple ! ! ! ! ! ! ! ! messages, with a '->>' ! ! ! ! ! ! ! ! prepended to the ! ! ! ! ! ! ! ! remaining message text. ! ! ! ! ! ! ! +------------Job sending message. ! ! ! ! ! ! ! This can be displayed ! ! ! ! ! ! ! if /JOB is toggled ON. ! ! ! ! ! ! +------------------Sending Jobs' handle ! ! ! ! ! +----------------------Job PPN sending Msg. ! ! ! ! ! This can be d isplayed ! ! ! ! ! if /PPN is toggled ON ! ! ! ! +-----------------------------Job KB# sending Msg. ! ! ! ! This can be displayed ! ! ! ! if /KB is toggled ON. ! ! ! ! If the KB is on a ! ! ! ! dial-up line, the star ! ! ! ! shown is displayed. ! ! ! +----------------------------------Channel message sent ! ! ! on (xx), If message ! ! ! sent by broadcast, ! ! ! then Bxx is displayed ! ! ! If message is sent by ! ! ! /ALL then OPR is ! ! ! displayed ! ! +-----------------------------------------This is displayed if ! ! the message sent has ! ! the /RESTRICT option ! ! set. ! +----------------------------------------------This is displayed if ! the message is sent ! with the /RESTRICT ! option, but recieved ! with the /SPY option ! set, which is ! privileged. +---------------------------------------------------Debug message display, Currently commented out of the CB source code, therefore never displayed. System Messages =============== CB system messages are also sent when a user enters or exits CB. The format for CB system messages is: **<<>>** CB data requests are not preceded by the '**' characters. The format for CB data requests is: ? --Answer in response-- A complete list of possible messages/requests follows: %Initializing CBLIB This is an informative message that the resident common library has just been loaded and is being initialized to empty by the first user requesting CB. It will also occur if the internal /CLR option when Handle requested is invoked. Handle ? CB is requesting the 12 character phrase to call your CB job when sending a message. %%Debug ENABLED The internal option /DBG has been invoked. This will allow a programmer to see the internal workings of CB for debug purposes. Note '/DBG' is commented out of the source to save memory area, it must be enabled by removing comments and recompiling. **CB is closing, please finish up** An operator is currently shutting down CB, no new users are allowed to access CB, please use a '/EXIT' command as soon as possible. **CB - Vxx.xx** If in talk mode and a carriage return only is entered, CB will display its version number x.xx where this represents a number. **Now talking on channel xx A /TALK command has been executed and all future transmissions will occur on channel xx until another /TALK command is executed. **All channels except xx reset** A '/MON -' has been executed, resetting all channels currently being monitored. The channel xx is your current Talk channel and has not been reset. **Now monitoring channels: xx,yy,zz....,nn When a /MONITOR command is executed, a display of all channels currently being monitored is shown. No users on this channel A /WATCH command has been executed in which no users are currently using the channel specified. No users A /LIST command has been executed, and there currently are no users on CB Really CLEAR job # xx ? A /KILL command has been executed, and the specified job 'xx' is currently using CB. This is a request to verify that you will kill that job. /KILL aborted! A /KILL has been executed, and anything but 'Y' has been entered to the verification request. The specified job has NOT been killed. **!!Your Job has just been cleared from CB by the operator!!** A /KILL has been executed by an operator that killed this users' job. **Job # xx KILLed** A /KILL has been executed and job xx has been cleared from CB and killed off the system. This message will show up on the terminal of the user (operator) who did the /KILL command. **CB - User: HANDLE - Enter CB on Channel # xx** A /CALL command has been executed by a CB user transmitting under the name 'HANDLE' and currently transmitting on channel # xx. That user would like the user on the recieving job to enter CB and talk to them. **Request sent** A /CALL has been executed successfully and a message has been sent to the specified keyboard. **Width set to xx** A /WIDTH command was entered and the current width is now 'xx' for wraparound. **BG ON** A /XEQ command has been executed by the user for the first time this session. **BG OFF** A /XEQ command has been executed with no command, while the user was already in active BG mode. BG has been turned OFF or an /EXIT or ^Z or ^C has been entered by the user and one or more BG jobs are currently in use. They will be shutdown in an orderly fashion as if a blank /XEQ command was entered for each BG job. **BG has no I/O** A BG job has started the execution of a program and has not displayed any I/O for about 15 seconds. The user is placed back in CB command mode and a scan is made on the BG job every 5 seconds for I/O. **KB On** The /KB toggle has been set allowing a user to recieve KB numbers on messages transmitted. **KB Off** The /KB toggle has been reset. **SPY On** The privileged /SPY has been set. This allows messages normally requiring a /RESTRICT password to be transmitted to this operator job even though no /RESTRICT is set for the operator. **SPY Off** The privileged /SPY has been reset. **PPN On** The /PPN toggle has been set allowing a user to recieve PPN numbers on messages transmitted. **PPN Off** The /PPN toggle has been reset. **UPPER ONLY On** The /UPPER toggle has been set. This allows a given user to send and recieve in only UPPER CASE. Normal system messages though are not translated. **UPPER ONLY off** The /UPPER toggle has been reset. **JOB On** The /JOB toggle has been set, allowing a user to recieve job numbers along with messages. **JOB Off** The /JOB toggle has been reset. **Password on** A /RESTRICT toggle has been set and the specified password has been set, if none specified, first 6 characters of the command line are used. If password entered was too long, the first 6 characters are used. **Password off** A /RESTRICT toggle has been reset. The users password field has been cleared. **Detaching from terminal** A privileged /DETACH has been executed, detaching a CB job from its' terminal. **dd-mmm-yy at hh:mm xm** A /TIME or /DATE has been executed showing the current Date (DD-MMM-YY) and Time (HH:MM xM) **CB open** The operator '/OPEN' command has been executed. **CB closed** The operator '/CLOSE' command has been executed. Error Messages ============== CB error messages are printed when an error in encountered in the execution of a CB command. Their format is as follows: **??<>** A complete list of possible error messages follows: ?CBLIB version NOT compatable with CB ?CBLIB version: xx.xx CB version: xx.xx ?Contact system manager..... The CBLIB resident library is not the same version of CB as the CB source. The system manager probably built it wrong or used old CBLIB sources. **??Login PLEASE??** CB has been entered as a logged out command with a specified Handle. A logged-out user may only execute certain commands, but may not talk through CB unless they login first. (In V9 systems, no logged out commands are possible) **??Invalid [CCL], Type '/HELP'??** An illegal command has been entered. Certain valid commands are invalid during CCL entry and these will be flagged with the 'CCL' specified in the message. **??12 character max??** This message will occur if you enter more than 12 characters for your user Handle. **??'Handle' IN-USE??** A user entered a valid Handle to CB, but it is in currently in use, enter another. **??Illegal Channel??** A bad channel number was entered as an argument to a command requiring a channel as an argument. (I.E. /TALK 42 or /TALK C) **??Already monitoring channel xx??** A /MONITOR xx command was executed, but the user is already monitoring the channel xx specified. **??Not monitoring channel xx??** A /MONITOR -xx command was executing trying to UNMONITOR the channel xx, but the user is not currently monitoring that channel. **??Illegal MONITOR channel 'xx'??** A /MONITOR xx command was executed with xx being a bad channel number, i.e. /MONITOR 42 or /MONITOR C. **??Cannot UNMONITOR your TALK channel??** A /MONITOR command was entered with the users current TALK channel specififed for UNMONITOR. This is illegal. **??Illegal channel specified??** A /WATCH command was executed with a bad channel number specified. **??40 - ??Privileged Operation??**" A /TALK or /MONITOR command was executed with channel 40 specified as the argument by a non-privileged user. Channel 40 is reserved for privileged users ONLY!! **??CB is CLOSED??** CB has been closed by an operator. Ask the system manager to open CB for normal processing. **??Illegal Job number??** A /KILL or /LIST command was entered with a bad job number, i.e. /KILL 67 or /KILL C. Job numbers may only be 1-63. **??Job not in CB??** A /KILL was entered with as valid job number, but that job is currently not using CB, therefore, it cannot be CLEARED. **??No BG available??** All Background devices are currently in use or there were no Pseudo-keyboards generated during RSTS system generation. If pseudo-keyboards are available to the user, try the command again later. **??BG busy??** A '/XEQ [command]' has been attempted, but the Background job is currently executing a program and cannot recieve any commands at the moment, try again later or send a '/XEQ ^C' command to interrupt the BG program in progress. **??No HELP AVAILABLE??** The CB help file 'CBHLP.DOC' cannot be found in the account that CB resides in or is protected against the current user. See system manager. **??Bad KB number specified??** A /CALL xx command was entered with a bad Keyboard number, it could be out of range 0-127 or it might not exist on the system. **??KB specified already in CB??** A /CALL was entered with a valid keyboard number, but that keyboard is already using CB, so a /CALL would not be appropriate. **??Nothing to send??** A /ALL command was executed with no message specified to send to all users. **??Privileged operation??** The specified command is legal but is a privileged command and the current user is not privileged. (i.e. [1,*]). **??Job detached-Cannot /KILL ??** The job specified is currently executing CB, but is detached and therefore cannot be /KILL ed. **??BG aborted??** The background job this user was attached to was logged out, either by the user logging it out or by an operator killing the job. **??Bad File??** A '/AT' or @ command was executed with a file that could not be opened. **??Multiple indirect NOT allowed??** Only one indirect command file may be opened at a time. therefore, the '/AT' or @ in your indirect file has been ignored. **??Logins Disabled??** A /XEQ was attempted and a 'NO LOGINS' is in effect. The command cannot be completed. **??Bad RSTS priv??** A file named LB:CBPRIV.CB was found but contained an invalid RSTS privilege name. 'USER8' is being used. ??SPR - No OPN A fatal system error has occured, CB tries to recover by executing a /EXIT but recovery might not be complete. This error should never occur. ?CB - FATAL ERROR - nn at xxxxx A fatal system error has occured, CB tries to recover by executing a /EXIT but recovery might not be complete. This error should never occur. Sign-On/Off Messages ==================== When a new user signs on to CB, all current CB users recieve a message informing them of that fact. The CB sign-on messages appear as follows: **New User - Job #xx (HANDLE) has signed on to CB** Where: xx = The new users' job number HANDLE = The new users' Handle When a CB user signs off of CB, all current CB users recieve a message informing them a user has left CB. The CB sign-off message appear as follows: **User #xx (HANDLE) is [leaving] CB [(Involuntarily)] ** [ABORTING] [DETACHING] Where: xx = The users' job number HANDLE = The users' Handle The message will contain either 'leaving' or 'ABORTING from' depending on the conditions of the users exit. The 'ABORTING from' means a system error has occurred in that users' CB job and the library 'CBLIB' may or may not be corrupt. The 'ABORTING from' message should never occur and it has not occurred since release V0.01. Due to improved recovery, even if it occurs, there is very little chance that it will affect any user but the one listed. The 'Detaching' message is a special case that only occurs when CB is executed on a 'dial-up' line. Under certain unusual RSTS timing errors, I/O may be queued for a terminal that detaches due to dial-up line carrier lost. Most occurances of this will cause CB to go into 'HB' state and mark the job detached, recovering where it left off when 'attached' to. If this is not possible, the job is closed orderly by CB, then killed. The '(Involuntarily)' messages occurs when a user is being KILLed by the operator with the /KILL command. When the /CALL command is used, the following message is sent to the keyboard specified: **CB - User: HANDLE - Please enter CB on Channel # yy** Where: HANDLE = The handle of the user using /CALL yy = The channel that user is currently Transmitting on. CCL/LOGGED-OUT Formats: ----------------------- CB can be set up by the operator to be called by CCL for certain functions (See Installation for installation instructions). Commands that are valid through CCL are: /LIST - list jobs on CCL /WATCH n - Watch jobs on a certain channel. Note: For CCL, channel number MUST be specified. /HELP - Display help message /KILL xx - PRIV - Kill a job in CB, user must be privileged to do this. /TIME - Display current Date/Time /STAT - Display CB statistics. /OPEN - Open CB for non-privileged use (PRIV only). /CLOSE - Close CB for non-privileged use (PRIV only). CB may also be entered with the HANDLE in place of the command. Example: CB LONESTAR will enter you into CB with the handle set to 'LONESTAR'. Note: If CB is set up to be entered logged-out (See Installation), all CCL commands are valid EXCEPT entering CB with a 'handle' set, /OPEN, /CLOSE which give an error messages. Installation: ------------- CB is designed to be executed by many users at a time. Therefore, the following method will allow CB to use the least amount of user memory possible, while sharing the code/ data areas that are non-volatile. CB requires certain options be present in the RSTS environment to execute: A) Resident library support be present B) RSX monitor emulation be present in the monitor If either of these options are not present, than CB will not run correctly. NONE OF THE FOLLOWING STEPS SHOULD GENERATE AN ERROR, IF THEY DO, A PROBLEM HAS DEVELOPED THAT MUST BE SOLVED BEFORE PROCEEDING!!! The CB command '/XEQ' will not be allowed if the current RSTS system was generated with NO pseudo-keyboards. Any attempt to use the /XEQ command will generate the '**No BG available**' error message. 0) The tape contains 2 accounts (DOS format). The files in [1,4] are the sources and command files needed to build CB from the beginning. The files in [1,3] are a PREBUILT set of files from a RSTS V9.1 system. They should be runnable on ANY CPU (RSTS V8 or V9) without any extra work to do except copying them to the appropriate places as specified below. If they do not work, then revert to the following instructions to rebuild CB. 1) Obtain the following files for installation: CB.B2S , CB.CMD, CBLIB.MAC, CBLIB.CMD, CBHLP.DOC, CB.HLP If the command files are not available, the following files may be entered under the names specified: **CB.CMD** **CBLIB.CMD** CB/MU/FP,CB,CB=CB,LB:BP2OTS/LB CBLIB/-HD/PI,CBLIB,CBLIB=CBLIB / / TASK=..CB.. STACK=0 UNITS=12 // // 2) Macro assemble the communications library: RUN $MAC MAC>CBLIB=CBLIB MAC>^Z 3) TKB the library with the following: TKB @CBLIB.CMD 4) Run MAKSIL to turn it into a resident library: RUN $MAKSIL Resident Library name ? CBLIB Task-Built Resident Library input file ? Include symbol table (Yes/No) ? NO Resident Library output file ? CBLIB built in 3 K-words, 0 symbols in directory CBLIB.TSK renamed to CBLIB.TSK<40> 5) Move CBLIB.LIB, CBLIB.STB, CBLIB.OBJ, CBLIB.TSK to LB: PIP LB:<40>=CBLIB.OBJ,CBLIB.STB PIP LB:<40>/mo:16=CBLIB.LIB PIP LB:/MO:16=CBLIB.TSK 6) Add library with Utilty: V8 or earlier: UT ADD LIBRARY LB:CBLIB<0>/ADDR:xxx/RW/STAY V9 : INSTALL/LIBRARY/NOADDR/NOREAD/PROT=0/LOCK LB:CBLIB (xxx=memory address to located library, it is site-dependant, The <0> allows writing to the library). Note: The /RW or /NOREAD is important as it allows the communication between jobs by specifying the library is Read/Write and not Readonly. If the library is not made permanent with the /STAY or /LOCK shown above, when there are no CB users and your system starts swapping, CBLIB will leave memory, causing the first new CB user to get a message stating the library is being re-initialized. This will not hurt anything, but may be annoying. If the library is not ADDed with a protection code of <0>, then PROTECTION VIOLATION errors will occur when running CB. 7) Compile CB using Basic-Plus 2: (Tested through BP2 V2.3) RUN $BASIC2 (or BP2) OLD CB.B2S COM/OBJ/LINE/CHAIN 8) TKB the resulting file: $TKB @CB.CMD Note: The CB.CMD file might require modifications of the name 'B23OTS.OLB' to your BP2 library name. 9) Run MAKSIL to turn it into a resident library: RUN $MAKSIL Resident Library name ? CBCODE Task-Built Resident Library input file ? CB.TSK Include symbol table (Yes/No) ? NO Resident Library output file ? CB.TSK CBCODE built in 2 K-words, 0 symbols in directory CB.TSK renamed to CB.TSK<104> 10) Move CB.TSK,CBHLP.DOC to execution account: Move CBCODE.LIB TO LB: PIP LB:/MO:16=CBCODE.LIB PIP [PPN]<232>=CB.TSK PIP [PPN]<40> =CBHLP.DOC Note: [PPN] is the project,programmer that the task will execute from. Program MUST be set privileged (i.e. <232>)!! FILES: CB.B2S,CB.OBJ,CB.CMD,CBLIB.CMD may now be removed if space is needed. 11) Add the second resident library CBCODE: V8 or earlier: UT ADD LIBRARY LB:CBCODE/ADDR:xxx/STAY V9 : INSTALL/LIBRARY/NOADDR/READ/LOCK LB:CBCODE (xxx=memory address to located library, it is site-dependant). STAY is optional is you have alot of memory 12) **OPTIONAL** (V9 or greater) Create the file 'LB:CBPRIV.CB' to contain the defined CB privileged user RSTS privilege. If not defined, 'USER8' will be used. 13) **OPTIONAL** Add CCL to allow CB to run direct (See CCL Format): V8 or earlier: UT ADD CCL CB-=[PPN]CB.TSK;PRIV 30000 V9 : DEFINE/SYSTEM/COMMAND CB- [PPN]CB.TSK/Line=CCL/PRIV Note: [PPN] is from step 15 above. 14) **OPTIONAL** CB can also be entered from LOGIN by entering a statement into LOGIN.BAS and recompiling it into $. The statement follows: 32256 DATA CB, "[PPN]CB",2, 4 This allows all commands that CCL entry allows except except entry to CB with a specified handle. Note: [PPN] is from step 15 above. Note: This option is not available for RSTS V9 or greater. 15) **OPTIONAL** A CB Help facility is available and may be added to the SYSTEM help file. The following lines must be added to the system file named 'HELP.HLP': *CB @_SY:[ACCT]CB.HLP Where: _SY:[ACCT] = The account that your Help facility is located on your system. Note that the file 'CB.HLP' must be moved to your Help facility account witha protection of <40>: PIP SY:[ACCT]<40>=CB.HLP for more information on the use of RSTS Help, see the RSTS/E Managers' guide and/or the RSTS/E Users' Guide. 16) Execute CB by CCL or otherwise. A SYSTAT of the job should show "..CB.." as the jobname. Also note that the message, '%%Initializing CBLIB" should appear. If the library is initialized by a non-privileged user, CB will also automatically execute a '/CLOSE' command, otherwise CB will execute an automatic '/OPEN' command. *** NOTE: On RSTS v7.1 (or later), if a terminal has a 'SET GAG' *** *** executed, then CB will set the terminal to NO GAG, when CB is *** *** exited, it will reset the terminal to GAG. *** Sample Run of CB: ----------------- A sample run of CB demonstrating most commands in regular as well as CCL formats follow: SY/L Resident Libraries: Name Prot Acct Size Users Comments EDT < 42> DR0:[ 0,1 ] 20K 1 Perm, Addr:853 CBCODE < 42> DR0:[ 1,1 ] 18K 0 Perm, Addr:827 CBLIB < 0> DR0:[ 1,1 ] 3K 0 Perm, Addr:835, R/W CB CB - V02.06 RSTS V9.1-05 SYSTM #1 11/70 What is your 'Handle' ? TEST PERSON **??GAG set??** T19>/EXIT Ready SET NO GAG Ready CB CB - V02.06 RSTS V9.1-05 SYSTM #1 11/70 What is your 'Handle' ? TEST PERSON T19>/LI CB User list: #24 [1,10] P2J20 TEST PERSON Talk: 19 Att: None Wdth: 78 Mon: 19 T19> **New User - Job #15 (PHIL) has signed on to CB** /LI CB User list: #15 [1,10] KB20: PHIL Talk: 19 Att: None Wdth: 78 Mon: 19 #24 [1,10] P2J20 TEST PERSON Talk: 19 Att: None Wdth: 78 Mon: 19 T19> (PHIL/C19) HELLO TEST PERSON T19>HELLO PHIL T19>/WA 19 Users on Channel # 19 #24 [1,10] P2J20 TEST PERSON Monitor, Talk #15 [1,10] KB20: PHIL Monitor, Talk T19>/JO JOB numbers will be printed T19>/KB KB numbers will be printed T19/XEQ **BG on** T19>/XEQ SY/L Resident Libraries: Name Prot Acct Size Users Comments Name Prot Acct Size Users Comments EDT < 42> D R0:[ 0,1 ] 20K 1 Perm, Addr:853 CBCODE < 42> DR0:[ 1,1 ] 18K 0 Perm, Addr:827 CBLIB < 0> DR0:[ 1,1 ] 3K 0 Perm, Addr:835, R/W Ready T19>/XEQ **BG OFF** T19>/PP PPN numbers will be printed T19> (KB20:[1,10](15)PHIL/C19) HOW DOES THIS READ T19>LETS GO TO CHANNEL 23 T19> (KB20:[1,10](15)PHIL/C19) OK, LETS (KB20:[1,10](15)PHIL/C19) GO T19>/TALK 23 **Now talking on channel 23 T23>/WA 23 Users on Channel # 23 #24 [1,10] P2J20 TEST PERSON Monitor, Talk T23>/WATCH 19 Users on Channel # 19 #24 [1,10] P2J20 TEST PERSON Monitor #15 [1,10] KB20: PHIL Monitor, Talk T23>/TIME **26-May-86 at 12:33 PM** T23> **CB - V02.06** T23>/WA Users on Channel # 23 #24 [1,10] P2J20 TEST PERSON Monitor, Talk #15 [1,10] KB20: PHIL Monitor, Talk T23> (KB20:[1,10](15)PHIL/C23) IM AM HERE!!!!!!! T23>/MON **Now monitoring channels: 19 23 T23>/MON -19 **Now monitoring channels: 23 T23>LETS GET SECRET USING YOUR LAST NAME T23>/RES PLOMPR **Password set** T23>> (KB20:[1,10](15)PHIL/C23) OK, SOUNDS GOOD T23>>/WA 23 Users on Channel # 23 #24 [1,10] P2J20 TEST PERSON Monitor, Talk, PSWD #15 [1,10] KB20: PHIL Monitor, Talk, PSWD T23>>I AM DONE T23>> SECRET(KB20:[1,10](15)PHIL/C23) DO YOU READ ME???????????????? T23>>/WA 19 Users on Channel # 19 #15 [1,10] KB20: PHIL Monitor T23>>/LIST CB User list: #15 [1,10] KB20: PHIL Talk: 23 Att: PSWD PERSON Wdth: 78 Mon: 19 23 #24 [1,10] P2J20 TEST PERSON Talk: 23 Att: JOB KB PPN PSWD PERSON Wdth: 78 Mon: 23 T23>> SECRET(KB20:[1,10](15)PHIL/C23) I AM LEAVING SEE YOU LATER T23>>OK, BYE T23>> **User #15 (PHIL) is leaving CB** T23>>/EX Ready CB/LI CB User list: No users Ready CB/G **Invalid CCL command, Type '/HELP'** Ready CB/WA 19 Users on Channel # 19 No Users on this channel Ready CB/CL 19 **??Specified job not in CB??** CB PHIL2 T19>/LI Current CB User list: #24 [1,10] P2J20 PHIL2 Talk: 19 Att: None Wdth: 78 Mon: 19 T19>/EX Ready +-----------------------------------------------------------------+ ! 'CB Command Reference Card - V02.06' ! ! ! ! CB Commands are: ! ! ! ! /TALK n - Change talk channel to 'n'. ! ! This is the channel that you ! ! 'Transmit' on. ! ! /MONITOR n,m,..z - Monitor All channels specified ! ! If negative, Unmonitor channel. ! ! If negative, with no number, then ! ! Unmonitor ALL channels (Except TALK) ! ! /RESTRICT xxxxxx - Restrict sending message to ! ! any JOB having 'xxxxxx' as ! ! it's internal password, If no ! ! argument, then turn off password ! ! /BROADCAST nn Text- Allows a message to be sent to everyone ! ! even if a password is set. This allows a ! ! user to send text to everyone without ! ! having to reset his password, send a ! ! message and then set the password again. ! ! If 'nn' is included, then message is sent ! ! on channel #nn, else it is sent on the ! ! users' normal talk channel. ! ! /XEQ [CMD] - Open a Background job and execute the ! ! system command (CMD), if any. If the ! ! background is not currently opened, then ! ! open it. If no command is specified and ! ! the background is open, close it. ! ! $ (Escape key) - this command may be thought ! ! of as a /XEQ shift-lock. While in this ! ! mode, no CB prompt is displayed and all ! ! terminal entry is sent to the BG job unless ! ! prefixed by '..' which will execute as a ! ! CB command or message. ! ! /CALL Kbn# - Send a message to specified terminal ! ! requesting that they enter CB ! ! /SPY (PRIV) - Allows operator to recieve Restricted ! ! messages without knowing PASSWORDS ! ! /KILL n (PRIV) - Clear out job specified by 'n'. ! ! This removes job from tables and ! ! KILLs job off system (Logs out). ! ! /DETACH (PRIV) - Detach from the current terminal ! ! /ALL Txt (PRIV) - Send message to all CB users. ! ! /OPEN (PRIV) - Opens CB to allow non-privileged users ! ! access to CB. ! ! /CLOSE (PRIV) - Closes CB from usage by non-privileged ! ! user. ! ! /TIME - Display current Date/Time. ! ! /DATE - Display current Date/Time. ! ! /KB - Toggle KB on message switch ! ! /PPN - Toggle PPN on message switch ! ! /JOB - Toggle JOB on message switch ! ! /UPPER - Toggle Upper/Lower Translation switch ! ! /AT Filename or @ - Execute commands from a command file. Note ! ! that only 1 level of indirect is allowed. ! ! /WIDTH [n] - Sets terminal wraparound width to 'n'. If ! ! 'n' is not specified, current width is ! ! displayed. DEFAULT is 78. ! ! /LIST [n] - List current users on CB. ! ! If 'n' is specified, then list ! ! only that user ! ! /WATCH [n] - List all users WATCHING channel 'n' ! ! If 'n' is not entered, then all users on ! ! current talk channel are shown. ! ! /STAT - display CB statistics. ! ! /HELP - This message ! ! /EXIT - Exit CB ! ! ! ! Note: ^Z and ^C act like '/EXIT' was entered ! ! All commands may be abbreviated to 2 letters. ! ! Note: V8 or earlier, PRIV= [1,*] user, V9, user with USER8 privs! ! (V9, may be changed by system manager) ! ! Note: More complete descriptions of each command can be found ! ! in the documentation for CB. ! +-----------------------------------------------------------------+ Questions or comments: ---------------------- Questions or comments about CB? You may write or call directly to the below address: Philip Hunt System Industries 1855 Barber Lane Milpitas, CA 95035 (408)942-1212 x417 ?T2?***05/30/86*** ****THIS IS CB - VERSION 02.06**** ****AN annotated directory of the tape may be found in 'CB.DIR'**** THE TAPE IS DOS/1600 BP1. COPY ALL FILES TO DISK AND READ THE INSTALLATION INSTRUCTIONS CONTAINED IN THE FILE 'CB.DOC'. Account [1,3] on this tape contains PREBUILT CB images, [1,4] contains source images. THIS VERSION OF CB CORRECTS SOME MINOR 'BUGS' AND IS MUCH MORE VERSITILE THEN PREVIOUS VERSIONS OF 'CB' VERSION 01.04 ADDS MODEM SUPPORT ON DISPLAY. A TERMINAL CONNECTED TO A DIAL-UP LINE WILL HAVE A '*' APPENDED TO THE KB NUMBER. VERSION 01.05 ADDS 'GAG' SUPPORT FOR RSTS V7.1 VERSION 01.06 ADDS UNBUNDLED HELP FILE, PK /XEQ COMMAND. VERSION 01.07 ADDS ENHANCED /XEQ CTRL CHAR SUPPORT, FIXES /CLEAR ON PK TERMS VERSION 01.08 ADDS ESCAPE KEY PROCESSING (/XEQ LOCK) VERSION 02.01 SPEEDS UP LIST/CHANNEL PROCESSING VERSION 02.02 FIXES WRAP-AROUND MESSAGE PROCESSING FOR ALL CASES VERSION 02.06 V9 RSTS support, all items updated to reflect this ANY PROBLEMS, PLEASE CONTACT ME: PHIL HUNT System Industries 1855 Barber Lane MS 401 Milpitas, CA 95035 M[2?Commands for CB-V02.06 are: /TALK n - Change talk channel to 'n'. This is the channel that you 'Transmit' on. If 'n' is not specified, then the current talk channel is displayed. /MONITOR n,m,..z - Monitor All channels specified. If negative, Unmonitor channel. If negative, with no number, then Unmonitor ALL channels (Except TALK). /RESTRICT xxxxxx - Restrict sending message to any JOB having 'xxxxxx' as it's internal password, If no argument, then turn off password. /BROADCAST nn Text- Allows a message to be sent to everyone even if a password is set. This allows a user to send text to everyone without having to reset his password, send a message and then set the password again. If 'nn' is included, then message is sent on channel #nn, else it is sent on the users' normal talk channel. /XEQ [CMD] - Open a Background job and execute the system command (CMD), if any. If the background is not currently opened, then open it. If no command is specified and the background is open, close it. If CMD equals '^Z','^C','<>' only, then they are translated to CTRL/Z (EOF), CTRL/C (Interrupt), and NULL LINE respectively. $ (Escape key) - This command may be thought of as a /XEQ shift-lock. While in this mode, no CB prompt is displayed and all terminal entry is sent to the BG job unless prefixed by '..' which will execute as a CB command or message. /CALL Kbn# - Send a message to specified terminal requesting that they enter CB. /SPY (PRIV) - Allows operator to recieve Restricted messages without knowing PASSWORDS. /KILL n (PRIV) - KILL CB job specified by 'n'. This removes job from tables and KILLs job off system (Logs out). /OPEN (PRIV) - Opens CB to allow non-privileged users access to CB. /CLOSE (PRIV) - Closes CB from usage by non-privileged user. /DETACH (PRIV) - Detach from the current terminal. CB will mark job DETACHED and will continue where left off upon system ATTACH (Through LOGIN). /TIME - Display current Date and Time. /DATE - Display current Date and Time. /ALL Txt (PRIV) - Send message 'Txt' to all CB users. /KB - Toggle KB message switch. /PPN - Toggle PPN message switch. /JOB - Toggle JOB message switch. /AT Filename or @ - Execute commands from a command file. Note that only 1 level of indirect is allowed. /WIDTH [n] - Sets terminal wraparound width to 'n'. If 'n' is not specified, current width is displayed. /UPPER - Toggle Upper/Lower Translation switch. When 'ON', only UPPER CASE will be sent in MESSAGES, normal system messages will still be sent Upper/Lower case. /LIST [n] - List current users on CB. If 'n' is specified, then list only that user. /WATCH [n] - List all users WATCHING channel 'n'. If 'n' is not entered, then all users on current talk channel are shown. /STAT - Display CB statistics. /HELP - This message. /EXIT - Exit CB. Note: ^Z and ^C act like '/EXIT' was entered All commands may be abbreviated to 2 letters. Note: V8 or earlier RSTS, PRIV = [1,*] user, V9, a user with 'USER8' privs. (This value is changeable by the system manager) Note: More complete descriptions of each command can be found in the documentation for CB. 32? !HELP FILE FOR CB PROGRAM !THIS IS TO BE ADDED TO THE RSTS HELP FACILITY PACKAGE AND A FEW LINES !ADDED TO THE RSTS FILE 'HELP.HLP'. SEE INSTALLATION INSTRUCTIONS !FOR DETAILED INSTRUCTIONS. ! ! PJH01 072583 OLFBP Worthington, OH 43085 ! PJH02 053086 SI MILPITAS, CA 95035 ! CB - Citizens Band Radio Emulator - Version 02.06 05/30/86 CB is a very versitile program running in 2K of user space that will allow any users on the system to communicate with each other as they would on a citizen's band radio. A 'Talk' channel is used to send messages to anyone currently 'Monitoring' that channel. A user may monitor any or all of the 40 'channels' avail- able, but may only talk on one. Commands are defined to allow the user to change talk channels, monitor and unmonitor channels, list users by user or by channel, set 'Restricted' messages that will only be recieved if the sender and reciever (or recievers) have the same password set, etc. A user may even execute system commands while still in CB through the use of a FG/BG (Foreground/Background) arrangement. Note: CB will NOT execute correctly on systems before RSTS V7.0 because shared resident library support is required. *Program Entry When the user enters the program, they must enter a 12 character 'handle' that will be transmitted everytime he sends a message. The prompt for sending messages is a 'T' with the channel number you are currently talking on included, example: 'T19>' would mean you are currently talking on channel #19. If an extra bracket ('>') is included in the prompt, it would indicate that the user has a password set for his messages and that only people with the same password will recieve them. For entry by CCL, see CCL/LOGGED-OUT formats. CB will execute a command file called 'CB.INI' in the users' account for start-up initialization changing CB standard defaults. If the command file does not exist, no error is generated at start-up. As noticed, anything not beginning with a '/' are sent to other users on the users current TALK channel. The slash indicates a command entry. Note: If a blank line is entered (i.e., a carriage return is struck without any other user entry), CB will print its' version number and return for more commands/messages. *Privs A user is considered privileged to CB in a RSTS V8 or earlier system if they are a meneber of the [1,*] group. In V9 or greater RSTS systems, PRIV is defined as a user with 'USER8' privileges. (This value is changeable by the system manager). *Commands *|Switches Commands to CB modify default conditions set up upon initialization of CB. /TALK /TALK Chnl# This command will change the channel the user is currently transmitting on. When the user first enters CB, the channel will be set to 19. Valid channels are 01-40, any other entry will give an error message. The channel that is set for Talk will cause all messages sent to be recieved by any user currently monitoring that channel unless a password has been set (See /RESTRICT). Note: when changing Talk channels, the previously set Talk channel will still be marked for monitor. /MONITOR /MONITOR Chnl#,Chnl#,....,Chnl# This command will allow the user to monitor multiple channels. When the user first signs into CB, he will only be monitoring channel 19. Valid channels are 01-40, any other entry will cause an error message for that channel, but all other entries on the command line will be processed. If the channel number is entered as negative, then the channel specified will be 'UNMONITORED'. Note: You cannot unmonitor your current TALK channel. /RESTRICT /RESTRICT nnnnnn Restrict allows a user to set a password up to 6 characters long. When a password is set, the users' messages will only be sent to other users monitoring the channel that have the same password set. This allows private messages to be sent. Note: Privileged users can obtain Restrict passwords (See /List) and can recieve Restrict messages (See /Spy). Messages with this set will have the word 'SECRET' appended to the message (See Message Formats). /BROADCAST /BROADCAST [Chnl#] <> This command will allow a user to send a message to any valid channel ignoring the users' password protection. If channel is specified, then the message will be sent to that channel, otherwise, the message will go to your current Talk channel. This command is useful if you would like to send one message to everyone on your channel, but would like to keep most of your messages 'Private'. /XEQ /XEQ [command] This command will activate/deactivate Background (BG) processing. If entered without the command and the user has activated BG, then BG will be turned OFF. If entered without the command and BG has not been activated, it will be activated. Once activated, more /XEQ commands can be entered to execute. anything that is legal to be entered at a terminal may be entered to BG mode. I.E. You can do SYSTAT, enter a new program, edit a file etc. If your BG job generates large amounts of output, you may ^C (Control/C) interrupt the background job. THIS WILL ONLY WORK WHILE IN BG OUTPUT MODE, if entered at other times, CB will be exited. Note: If command entered is '<>', it will be translated to NULL line (i.e. only), it a line contains anything of the form '^n' where 'n' is a letter, that combination will be translated to CTRL/n. To override this, the user must append an underscore ('_') to the control sequence. If the user would like to send an underscore, they must enter 2 underscores which will translate to 1. Also note that if the BG job does not enter a KB wait or I/O state within appoximately 10 seconds, the user will be placed back in CB command mode. A scan for BG I/O will occur appoximately every 3 seconds. This scan will be invisible to the user as he may enter CB commands during these scans. Only when I/O is found, will the user be interrupted to show this I/O. If the BG job is running, then any attempt to send a command to the background (except '/XEQ ^ctrl/char') will cause an error and the command will NOT BE SENT. Note that '/XEQ ^C' will interrupt the BG and cause it to enter KB state. Note: A user on a V9 RSTS system with a HASHED password will be required to login the background job with PPn, password information. /ESCAPE KEY ($) $ (ESCAPE KEY) The escape key allows the user to enter or exit a 'locked' background environment. This environment is equivalent to an ATPK run using KB: for input file. If currently in locked background mode, another entered Escape character will unlock the background, BUT LEAVE BG mode open allowing for re-entry by entering another escape. NOTE: Control characters such as CTRL/C, CTRL/T, CTRL/Z should be entered as 'uparrow letter' (^n) to be recognized as background control characters, otherwise, it is possible that they might be interpreted as forground control. To send a message while in 'locked' mode, append 2 periods ('..') to the beginning of the message, they will be removed and the message sent on your talk channel. Note: You may also execute CB commands by entering '../command' as you can think of '..' as a reverse-shift. Note: A user on a V9 RSTS system with a HASHED password will be required to login the background job with PPn, password information. /CALL /CALL Kb# This command will send a message to the specified terminal currently NOT running CB, to request that they do run CB. The message sent is of the form: **CB - User: Handle - Please enter CB on Channel #n** where: Handle is the current user NAME n is the current users' TALK channel Note: If the specified job is already in CB, an error message is generated and the message is not sent. /TIME /TIME This command will display the current date and time. This is useful when using CB for an extended period of time. /KB /KB KB will toggle a bit in the user flag word allowing him to recieve KB numbers when a message is recieved by him (See Message Formats). The default for this is 'OFF'. /PPN /PPN PPN will toggle a bit in the user flag word allowing him to recieve user PPN numbers when a message is recieved by him (See Message Formats). The default for this is 'OFF'. /JOB /JOB JOB will toggle a bit in the user flag word allowing him to recieve JOB numbers when a message is recieved by him (See Message Formats). The default for this is 'OFF'. /UPPER /UPPER Toggles the user flag word informing CB to start or stop translate all MESSAGES (sent or recieved) to UPPER case. The default for this is 'OFF'. /AT (or @) /AT or @ Process commands from the file entered. Note that anything that is not a command (beginning with '/') or a comment is executed as a message as if it was entered at the terminal. A comment is valid ONLY in a command file and is ignored. A comment begins with ';' or '!'. These are useful in the file to comment steps in the procedure. /WIDTH n /WIDTH n This command sets the terminal message wraparound at character n. The default for CB is a wraparound at position 78. All characters after position 78 or a set value will be displayed on subsequent lines with '--> ' prepended. If 'n' is not specified, then current width is displayed. Note: The minimum width allowed is 28 characters and the maximum is 133. Also, if your width command is set less than the number of characters required to display at least all header options requested (/KB,/PPN etc.), width is set to 78 until an one or more options are toggled 'OFF'. /LIST /LIST [Job#] List all users currently using CB. A list of their TALK channel, channels they are monitoring, their 'Handles', Job #, KB #, User PPN and JOB attributes (See Attributes) are listed. If you are currently privileged, then any currently set Restrict password is also printed. If the job listed is attached to a dial-up line, a star is appended to the KBnn: display. Note: If Job# is entered, then the listing will be only for that Job#. /WATCH /WATCH [Chnl#] This command will give a list of users currently monitoring a channel. Their KB#, Job #, Handles and Job attributes are printed. If the job listed is attached to a dial-up line, a star is appended to the KBnn: display. If Chnl# is not entered, then the list will be entered for the current Talk channel. Note: If /Watch is entered as a CCL command, then a Chnl# MUST be specified (See CCL/LOGGED-OUT formats). /HELP /HELP Prints a Help message for CB. It is very similar to the reference card in format. /EXIT /EXIT (^Z, ^C) Exit CB. Note: ^Z and ^C act as if an /EXIT command has been entered. If the user has opened a BG job, that job will terminate in an orderly fashion. /SPY /SPY Toggles a bit in the user job attributes that allows a privileged user to recieve Restrict messages even though he might have no password or a different password set. The default is 'OFF'. a message recieved by /SPY being set will have '+SPY+' appended to it. /KILL /KILL Job# KILL the job specified from CB. A check is made to be sure the job specified is in CB. A message is sent to the JOB (Unless detached) informing him that his job has been killed, and all users recieve the 'Leaving CB' message with the phrase '(Involuntarily)' appended to it (See Message Formats). THIS COMMAND SHOULD BE USED TO KILL A CB JOB, NOT THE 'UTILTY' COMMAND OR THE CB LIBRARY WILL BECOME CORRUPTED!!! Note: A job that id currently detached cannot be killed using /KILL, it must be attached to be KILLed. /OPEN /OPEN Open CB to allow non-privileged user to access CB. /CLOSE /CLOSE Close CB from further non-privileged user usage. Note that users currently in CB will recieve a message BUT WILL REMAIN IN CB. /DETACH /DETACH Detach from current Keyboard. This allows a user to change keyboards or leave CB for a while without having to exit and then enter CB again. /ALL /ALL text Send a message to ALL CB users on all channels, the message part usually displayed as 'Cxx' or 'Bxx' indicating channel number is replaced by the string 'OPR' /STAT /STAT Display CB statistics. Init date, last use date and user counts. *Attributes Job attributes associate special processing modes with a specific job. Special modes cause different forms of the broadcast header to be displayed upon recieving a message. The mode or attributes set cause different information to be displayed (See Message Formats). *Message Formats Messages recieved are displayed in different formats depending on the Job attributes set. See below for description: +SPY+SECRET (KBxxx:*[PPN](xx)HANDLE/Cxx) Message text here | | PnnJjj | | | | | | | | | | | | +----Message sent | | | | | | +-------------Channel message sent | | | | | | on (xx), If message | | | | | | sent by broadcast, | | | | | | then Bxx is displayed | | | | | | If message is sent by | | | | | | /ALL then OPR is | | | | | | displayed | | | | | +--------------------Sending Jobs' handle | | | | +------------------------Job sending message. | | | | This can be displayed | | | | if /JOB is toggled ON | | | +----------------------------Job PPN sending Msg. | | | This can be displayed | | | if /PPN is toggled ON | | +-----------------------------------Job KB# sending Msg. | | This can be displayed | | if /KB is toggled ON. | | If the KB is on a | | dial-up line, the star | | shown is displayed. | +-------------------------------------------This is displayed if | the message sent has | the /RESTRICT option | set. +------------------------------------------------This is displayed if the message is sent with the /RESTRICT option, but recieved with the /SPY option set, which is privileged. *Ccl-logged-out CB can be set up by the operator to be called by CCL for certain functions (See Installation for installation instructions). Commands that are valid through CCL are: /LIST - list jobs on CCL /WATCH n - Watch jobs on a certain channel. Note: For CCL, channel number MUST be specified. /HELP - Display help message /KILL xx - PRIV - Kill a job in CB, user must be privileged to do this. /TIME - Display current Date/Time CB may also be entered with the HANDLE in place of the command. Example: CB LONESTAR will enter you into CB with the handle set to 'LONESTAR'. Note: If CB is set up to be entered logged-out (See Installation), all CCL commands are valid EXCEPT entering CB with a 'handle' set, which gives an error message. *AUTHOR Philip Hunt System Industries 1855 Barber Lane M/S 401 Milpitas, CA 95035 (408)942-1212 x417 2? 10 %TITLE "CB - System Communication Utility" %SBTTL "Disclaimer" %IDENT 'V02.06' !=========================================================== ! ! PROGRAM: ..CB.. ! AUTHOR : PHILIP HUNT (OLFBP) ! INITIAL DATE: 02/26/82 ! EDIT: V02.06 ! EDIT DATE: 05/30/86 ! !=========================================================== ! ! (c)1986, Philip Hunt ! ! This software is furnished under a license and may ! be used and copied only in accordance with the ! terms of such license and with the inclusion of ! the above copyright notice. This software or any ! other copies thereof may not be provided or other- ! wise made available to any other person. No title ! to and ownership of the software is hereby trans- ! ferred. No SOURCE code can be copied. ! ! The information in this software is subject to ! change without notice and should not be construed ! as a commitment by the author. ! ! The author has no commitment to support this ! software package at this time, unless stated ! elsewhere in writing. ! !=========================================================== ! ! Problems and "SPR"s will be gratefully? ! acknowledged by the author at the following ! address: ! ! Philip Hunt ! System Industries ! 1855 Barber Lane ! Milpitas, CA 95035 ! ! (408)942-1212 x417 ! !=========================================================== %SBTTL "Description/History" %PAGE ! ! Description: ! ! CB allows any user on a RSTS/E system to communicate with ! any other user on the same system through an emulation of ! a citizens' band radio. Each user has a 'HANDLE' that is ! transmitted along with any messages intended for another ! user monitoring the same channel. Multiple users may be ! monitoring any or all CB channels. There are 40 channels ! for communication as well special modes to send/recieve ! only upper case, send messages only to people knowing a ! changeable password, etc. ! ! There are special options that allow a privileged user to ! detach from a keyboard, kill a CB job, send messages to ! all users on CB, etc. ! ! CB uses 2 resident libraries and uses only 2-3K of user ! space to allow many CB jobs from using a large amount of ! memory. ! !=========================================================== ! ! ! M O D I F I C A T I O N H I S T O R Y ! ! ! Date Edit BY Reason ! 022782 v00.01 pjh Test version. ! 030182 v01.00 pjh Original Issue. ! 030282 v01.00a pjh Put BP2 threads into CBLIB. ! 030582 v01.01 pjh Put object code into CBCODE. ! 032582 v01.02 pjh Add /CALL,/TIME commands. ! Fix /CLEAR for kill on ! current job number. ! Add ST2NM macro code for ! conversions to speed up. ! 033082 v01.03 pjh RSTS Professional Release ! 041982 v01.04 pjh Add MODEM display support ! 042082 v01.04A pjh Fix /TALK multiple monitor ! problem ! 042382 v01.05 pjh Add RSTS V7.1 Terminal GAG ! checking ! 042982 v01.06 pjh Add PK terminal (/XEQ) ! Make Channel 40 privileged ! 052182 v01.07 pjh Enhance PK/XEQ ctrl char ! processing, fix /CLEAR bug ! Change /CLEAR to /KILL ! Add /OPEN and /CLOSE. ! 060282 v01.07a pjh Fix /DET with /XEQ BG open ! causing I/O errors ! 061082 v01.08 pjh Add ESC for /XEQ lock ! command ! 070782 v01.08a pjh Fix I/O det kb error to ! orderly exit. Add '/HIDE'. ! 072482 v01.09 pjh Speed up list/channel ! processing. ! 082782 v02.01 pjh Fix message wrap-around ! processing for ALL cases. ! Add /WIDTH command. ! Add indirect commands, ! CB.INI on start-up. ! 088282 v02.02 pjh Fix all?? corrupt library ! condition windows, self- ! correcting libry implemented ! Error processing 'holes' ! plugged up. ! 071883 v02.03 pjh Enhance source for V2.1 BP2. ! Remove ST2NM and NM2ST, use ! byte variable types. ADD /STAT function ! 081783 V02.04 pjh Fix bug. /XEQ with NO LOGINS dies. ! 082784 V02.05 pjh Chg CVT$$ to edit$ ! Fix Pseudo print to inc ":" on end ! 053086 V02.06 pjh Add V9 rsts support ! BG require PW if hashed PW in effect ! PRIV now a flag based upon USER8 (V9) ! (USER8 can be chgd to any using ! LB:CBPRIV4.CB file ! allow @LB:CB.INI first (system deflts) !=========================================================== %SBTTL 'Variable Descriptions' %PAGE 20 ! ! ! V A R I A B L E D E F I N I T I O N S ! ! ! ANS$ - User reponse holder var ! ANY.USERS% - /WATCH any usr for msg flg ! ARG% - Def argument Utility var ! ARG1% - Def argument Utility var ! ARG1$ - Def argument Utility var ! AT.PROC% - Currently proc indirect fl ! AT.FILE$ - Indirect cmd file name ! BCST.CHNL$ - FNBRODCAST Msg channel hld ! BCST.TYPE$ - FNBRODCAST Typ:/B,/C, /OPR ! BELL$ - Bell character ! BFLAG% - FNBRODCAST send type flag ! BG.OPT - BG open option flag ! BRDCST% - Channel to send on /BROAD ! CB.CLOSED - CBLIB - Usage not allowed ! CB.LAST.CB.DATE=9 - STATS last CB user date ! CB.LAST.CB.TIME=8 - STATS last CB user time ! CB.LAST.INIT.DATE=9 - STATS last CB init date ! CB.LAST.INIT.TIME=8 - STATS last CB init time ! CB.LINE.COUNTS (LONG) - STATS Lines transmitted ! CB.LINE.COUNT(40) (LONG)- STATS Lines transmitted by channel ! CB.USER.COUNTS - STATS CB users since full init ! CB.PKG$ - Where CB came from ! CB.PASS - Currently parsed password ! CB.PASS(63)=6 - CBLIB - User /Res Pswrds ! CB.PROG(63) - CBLIB - User progmmr nos. ! CB.PROJ(63) - CBLIB - User project nos. ! CBLIB.VERSION=6 - CBLIB version, must match CB vers ! CCL.ENTRY% - CCL FLAG,1=Command,2=Handle ! CHANNEL(40)=64 - CBLIB - All CB chnls array ! CHANNEL.USED(40%) - CBLIB - Chnl used ever flg ! CHHN$ - Hold Utility Variable ! CHN% - Channel # hold var as int% ! CHN$ - Channel # hold var as str$ ! CHR6$ - CHR$(6%) constant ! CLR% - /CLR internal command flag ! CM% - Index on Command type ! CMD$ - User entered Command/Msg ! CNL$ - CHANNEL() holder MAPPED ! CNL(64) - CNL$ redef as BYTE data ! COMMON.IN.USE - CBLIB - Common locked flag ! COMMON.INIT - CBLIB - Common initialized ! CRLF$ - CR/LF Hold string ! CTRL.LINE$ - FNQUOTE/CTRL utility var ! CTYP$ - Command entered (2 lettrs) ! CXX% - Index Utility Variable ! DEBUG% - DEBUG on flag ! DUMMY% - Hold Utility Variable ! DUMMY$ - Hold Utility Variable ! DUMMY2% - Hold Utility Variable ! EDIT.VAL% - Used for Msg Snd/Rcv EDIT$ ! EL% - ERROR trapping util var ! EN% - /LIST command utility var ! ER% - ERROR trapping util var ! ERTMP% - ERROR trapping hold var ! FALSE - FALSE value bit mask ! FIP%(30) - SYS Call array holder ! FIRST.CUR.SEND% - FNBROADCAST 1st send flag ! FLAG% - Hold Utility Variable ! FLAGS% - Hold Utility Variable ! HANDLE(63)=12 - CBLIB - User handles ! HIDE% - No announce entry/exit ! HLD.ARG$ - FNBROADCAST$ hold msg$ ! HNDL$ - Accepted HANDLE ! HOLD.TMO% - Hold timeout value ! Hashed.pw% - Hashed password, no BG (V9) ! I% - Utility Variable ! I2% - Utility Variable ! II% - Utility Variable ! JBNO% - Utility Variable ! JBNUM% - Utility Variable ! JOB$ - FNBROADCAST$ usr.job% as $ ! JOB.FLAGS(63) - CBLIB - User job attrbutes ! JOBCNT% - Count of jobs on system ! JOBMAX% - System allowable jobmax =1 if nologin ! JOBMAX$ - Monitor call table hold variable ! JOBTBL% - RSTS job table address ! JOB.OPT - /JOB option bits values ! KB% - FNKB.NUMBER$ hold kb dcder ! KB$ - /LIST formatted kb# hold ! KB.KILL% - /KILL on KB flag ! KB.DDB% - Device blk for term addr ! KB.OPT - /KB option bits value ! KB.SND% - FNBROADCAST$ kb# to snd to ! KBN% - FNKB.NUMBER$ kb# decoded ! KBN$ - FNKB.NUMBER$ formtted hold ! KBS$ - FNBROADCAST$ - Utility Var ! LOGGED.OUT% - Curr user not logged in ! LONG.MSG.FLAG% - If fnbrdcst msg > ter max ! MCNT% - Utility Variable ! MIN.WIDTH - Minimum /WIDTH allowed ! MAX.WIDTH - Maximum /WIDTH allowed ! MSG$ - FNBROADCAST$ - msg to send ! MSG.MAX% - User term max allowed ! OLD.INIT.VAL% - Saved COMMON.INIT opn/cls ! OLD.USER% - 1st time thru flag, cb.ini ! ONE.USER% - /LIST no user flags ! OPEN.POS% - Utility Variable ! OPNX% - Utility Variable ! OTHER.POS% - Utility Variable ! OTHER.USER% - /KILL - Position of a usr ! OUSRX% - Utility Variable ! PKG.LOC$ - FNPKG.LOC utility var ! PK.BUSY% - Flag, no pk available ! PK.CMD$ - Command sent string /XEQ ! PK.CTRL.T% - Processing ^T in /XEQ flag ! PK.LOCK% - ESC entered /XEQ toggle ! PK.NOECHO% - PK-Noecho /XEQ I/O flag ! PK.I.O - PK I/O check timeout ! PK.OPEN% - PK (/XEQ) in use ! PK.RCV% - Flag, rcvd pk i/o, reprmpt ! PK.RCV$ - PK i/o recieved buffer ! PK.SCAN% - Scanning-only pk flag ! PK.SND% - Flag to stop echo aftr cmd ! PK.SPCL% - Flag temp PK.LOCK if login needed ! PK.TMO% - Timeout count for BG/PK ! PK.TYPE% - Command snd type,reg/force ! PK.UNIT% - /XEQ PK unit in use ! POS0$ - Dummy CNL(0) position mapped ! PPN% - Initial current user ppn ! PPN$ - FNBROADCAST$ ppn formatted ! PPN.OPT - /PPN opt bits value ! PRIV% - RSTS priv user value flag ! PRIV.RQD$ - Required priv for CB privs ! PS$ - FNBROADCAST - Util Varble ! RSTS.VER - Version of rsts running ! RUNNING.IN.ERROR% - A Fatal error occured flag ! RUNNING.IN.ZAP% - Internal /ZAP* cmd (ABORT) ! SECRET.OPT - /RESTRICT opt bits value ! SILENT% - /AT silent sw, /AT CB.INI ! SND.HDR$ - FNBROADCAST$ hdr build var ! SND.JOB% - FNBROADCAST$ job sndng to ! SPY.OPT - Spy option bits value ! ST% - /LIST start position ! STRT.ARG% - Start pos of cmd argument ! TALK% - Current usr talk chnl hold ! TALK.CHAN(63) - CBLIB - User talk channels ! TER.SYS$ - Term Characteristics const ! TIMEOUT.MAX - PK timeout maximum ! T0% - FNQUOTE/CTRL utility var ! T0$ - FNQUOTE/CTRL utility var ! TMP% - Public temp integer field ! TRUE - TRUE value bit mask ! TTINTF% - Terminal interface flag ! TTY.WIDTH(63) - CBLIB - User term width ! TYP$ - For error, CCL/reg entry ! TYP2$ - /EXIT utility variable ! UFLAG% - User attribute flag hold ! UPPER.OPT - Upper case only opt bits ! USER.JOB% - Current user job number ! USER.POS% - FNUSER.POS% utility var ! USER.PROG% - Current user progmmr # ! USER.PROJ% - Current user project # ! USER.PSSWRD$ - Pswrd of curr user for XEQ ! USER.SPY% - FNBROADCAST - Util Varble ! USR% - Utility Hold Variable ! USRX% - Utility hold Variable ! VALID$ - Valid commands check var ! VERSION - CB Version number ! WAS.GAGGED% - KB was gagged on entry flg ! WIDTH.DEFAULT - Std message width for term ! WX% - Utility Index Variable ! X% - Utility Index Variable ! XXX% - Utility Index Variable ! Y% - Utility Index Variable ! YX% - Utility Index Variable ! !=========================================================== %SBTTL 'User functions' %PAGE ! ! ! U S E R - D E F I N E D F U N C T I O N S ! ! ! FNBROADCAST%( ) - Broadcast to a channel func ! FNDGT2$( ) - Display 2-digit no, ldng 0s ! FNGET.CHAN%( ) - Get a chnl $ to int array ! FNKB.NUMBER$( ) - Format a KB number ! FNDET% - Logical KB detached flag ! FNEXIT.JOB%( ) - Exit/Clear a job from CB ! FNLOCK.COMMON% - Lock cblib common area ! FNOPEN.POSITION% - Find open position in chnl ! FNOTHER.POSITION%( ) - Find user in a channel ! FNPUT.CHAN%( ) - Put a chnl int array to $ ! FNUNLOCK.COMMON% - Unlock cblib common area ! FNUSER.POSITION% - Find curr user in a channel ! FNPKG.LOC$ - Find program location ! FNQUOTE$ - XEQ cmd line unquoter "_" ! FNCTRL$ - XEQ cmd line ctlr "^n" ! FNCHECK.JOB% - Check for CB usage subroutine ! FNTOGGLE$( ) - Toggle job.flag% bits ! FNSET.CHNL$( ) - Set user in channel ! !=========================================================== %SBTTL 'I/O Channels/Common Areas/Libs/Subprgs' %PAGE ! ! ! I / O C H A N N E L S ! ! ! Channel # Description of Use ! 1% Terminal Command/Message reciever ! Indirect channel file channel ! 2% BG (PK:) device channel (/XEQ) ! 3% /HELP file channel ! 4% LB:CBPRIV.CB file channel ! !=========================================================== ! ! ! C O M M O N A R E A S ! ! ! CBLIST COMMON DATA AREA IN CBLIB.LIB ! COMMON.IN.USE - Lock common flag ! COMMON.INIT - Common init flag ! CBLIB.VERSION =6 - Common reslib version number ! CB.CLOSED - CB usage not allowed ! CB.USER.COUNTS - CB total number of users since init ! CHANNEL.USED(40%) - Channel ever used flag ! CHANNEL(40) =64 - 40 channel user table ! HANDLE(63) =12 - User Handle Table ! TALK.CHAN(63) - User Transmit Chnl Tbl ! TTY.WIDTH(63) - User terminal width ! CB.PROJ(63) - User project number Tbl ! CB.PROG(63) - User progmmr number Tbl ! JOB.FLAGS(63) - User job attributes Tbl ! CB.PASS(63) =6 - User /RESTRICT Passwrds ! CB.LAST.CB.DATE =9 - Last User CB Date ! CB.LAST.CB.TIME =8 - Last User CB Time ! CB.LAST.INIT.DATE=9 - When CB was last initted ! CB.LAST.INIT.TIME=8 - When CB was last initted ! CB.LINE.COUNTS - CB lines transmitted total ! CB.LINE.COUNT(40%) - CB lines transmitted by channel ! !=========================================================== ! ! ! S U B P R O G R A M S C A L L E D ! ! **NONE** ! !=========================================================== ! ! ! R E S I D E N T L I B R A R I E S U S E D ! ! ! CBLIB .LIB/RO - COMMON DATA AREA ! CBCODE.LIB/RW - OBJECT CODE / BP2 THREADS ! !=========================================================== %SBTTL 'Map/Common Definitions' %PAGE 100 MAP (USERRD) POS0$=1%, & CNL$ =64% & MAP (USERRD) BYTE CNL(64) !0-64 0=POS0$ !Storage offset COMMON (CBLIST) INTEGER COMMON.IN.USE, !0-1 & INTEGER COMMON.INIT, !2-3 & STRING CBLIB.VERSION=6, !4-9 & INTEGER CB.CLOSED, !10-11 & LONG CB.USER.COUNTS, !12-15 & BYTE CHANNEL.USED(40%), !16-56 & STRING CHANNEL(40%)=64%, !57-2680 & STRING HANDLE(63%)=12%, !2681-3448 & BYTE TALK.CHAN(63%), !3449-3512 & BYTE FILL, !3513-3513 & INTEGER TTY.WIDTH(63%), !3514-3641 & INTEGER CB.PROJ(63%), !3642-3769 & INTEGER CB.PROG(63%), !3770-3897 & INTEGER JOB.FLAGS(63%), !3898-4025 & STRING CB.PASS(63%)=6%, !4026-4409 & STRING CB.LAST.CB.DATE =9, !4410-4418 & STRING CB.LAST.CB.TIME =8, !4419-4426 & STRING CB.LAST.INIT.DATE=9, !4427-4435 & STRING CB.LAST.INIT.TIME=8, !4436-4443 & LONG CB.LINE.COUNTS, !4444-4447 & LONG CB.LINE.COUNT(40) !4448-4611 ! !=========================================================== !COMMON DATA AREA FORMAT: ! COMMON.IN.USE = WHETHER ANOTHER CB JOB ! HAS THE COMMON LOCKED FOR UPDATE ! 0=NO, ANY OTHER VALUE = YES ! (COMMON IN USE=JOB# LOCKING ! COMMON.INIT = WHETHER COMMON HAS BEEN ! INITIALIZED, IF YES = 378% ELSE ! if = 457%, reinit required else ! IF = 991%, SOMEONE ELSE IS INITIALIZING ELSE ! GARBAGE ! CBLIB.VERSION = VERSION OF RESLIB COMMON, MUST MATCH ! CB VERSION OR ABORT ! CB.CLOSED = CB USAGE NOT ALLOWED EXCEPT BY ! [1,*] USERS IF THIS IS NON-ZERO. ! CB.USER.COUNTS=Number of CB USERS SINCE LAST FULL INIT ! CHANNEL.USED()= ALL CHANNELS FLAG SPECIFYING ! WHETHER ANY ONE CHANNEL WAS EVER USED. ! CHANNEL() = ALL CHANNELS, PACKED JOB ! NUMBERS CURRENTLY MONITORING THIS CHAN ! CHANNEL(0) IS SPECIAL, IT CONTAINS ! ALL JOBS USING CB CURRENTLY, THIS IS ! USED FOR BROADCAST PURPOSES ! HANDLE() = ALL JOBS USING CB HANDLES ! TTY.WIDTH(63%)= TERM WIDTH (DEFLT TO 78) for wrap ! TALK.CHAN() = ALL JOBS USING CB CURRENT ! CHANNEL THEY ARE TALKING ON ! CB.PROJ() ! CB.PROG() = PPN OF CB USER ! JOB.FLAGS() = CURRENT OPTIONS A CB USER HAS ! SET, CURRENTLY DEFINED ARE: ! BIT 0 ON = PRINT PPN WHEN ! GETTING A MESSAGE ! BIT 1 ON = PRINT KB# WHEN ! GETTING A MESSAGE ! BIT 2 ON = PRINT JOB WHEN ! GETTING A MESSAGE ! BIT 3 ON = THIS JOB HAS A ! SECRET PASSWORD SET ! BIT 4 ON = SPY BIT SET. A PRIV ! USER MAY RCV MESSAGES ! RESTRICTED WITHOUT ! KNOWING PASSWORD ! BIT 5 ON = PRINT TO TERM IN UPR ! CASE ONLY ! BIT 6 0N = BG JOB IN USE ! BIT 7 TO 15 - NOT USED ! CB.PASS() = PASSWORD MULTIPLE USERS ! MUST ENTER TO RECIEVE SECRET ! MESSAGES ! CB.LAST.CB.DATE= DATE OF LAST CB USAGE ! CB.LAST.CB.TIME= TIME OF LAST CB USAGE ! CB.LAST.INIT.DATE=DATE OF LAST CB INIT ! CB.LAST.INIT.TIME=TIME OF LAST CB INIT ! CB.LINE.COUNTS= LINES TRANSMITTED BY CB SINCE LAST INIT ! CB.LINE.COUNT()= LINES TRANSMITTED BY CB SINCE LAST INIT BY CNL ! !=========================================================== %SBTTL 'Constant Definitions' %PAGE ! DEFINE JOB.FLAGS() BITS AND OTHER COMPILE-TIME VARIABLES: DECLARE WORD CONSTANT & PPN.OPT = 1, !/PPN & KB.OPT = 2, !/KB & JOB.OPT = 4, !/JOB & SECRET.OPT = 8, !/RESTRICT & SPY.OPT = 16, !/SPY & UPPER.OPT = 32, !/UPPER & BG.OPT = 64 !/XEQ DECLARE WORD CONSTANT & FALSE = 00, !INT WORD FALSE BITS & TRUE = -1 !INT WORD TRUE BITS ! DEFINE SYSTEM DEPENDANT VARIABLES IN R/O MEMORY DECLARE STRING CONSTANT & VERSION = "V02.06", !PROGRAM VERSION & NULL = "" !NULL ARGUMENT DECLARE WORD CONSTANT & WIDTH.DEFAULT = 78, !Terminal width dflt & MIN.WIDTH = 28, !Min /WIDTH allowed & MAX.WIDTH = 133, !Max /WIDTH allowed & TIMEOUT.MAX= 10, !10 SECOND WAIT-PK & PK.I.O = 2 !PK I-O CHECK TMOUT DECLARE STRING & ZAP.CMD !ZAP INTERNAL COMMAND %SBTTL 'Program Sections' %PAGE 110 Start.program: ON ERROR GOTO Error.section DIM FIP%(30%) !DEFINE CURRENT USER ITEMS: CB.PKG$ = FNPKG.LOC$ !GET CB LOCATION USER.JOB% = (PEEK(518%) AND 255%)/2% !GET JOBNO PPN% = PEEK(PEEK(PEEK(520%)+8%)+24%) !GET PPN USER.PROJ%= SWAP%(PPN%) AND 255% USER.PROG%= PPN% AND 255% CHR6$ = CHR$(6%) ZAP.CMD = CHR$(25%)+CHR$(25%) !ZAP COMMAND BELL$ = chr$(7%) nl$ =chr$(0%) rsts.ver = val(mid(ert$(0%),7%,3%)) tmp$="USER8" !assume user8 open "LB:CBPRIV.CB" for input as file 4% input #4%, tmp$ close #4% 113 tmp$=edit$(tmp$,-1%) tmp$=tmp$+nl$ until len(tmp$)>=6% !must be six chars priv.rqd$=left(tmp$,6%) !make sure priv%=0% !assume not priv'ed if rsts.ver<9.0 then !8 or earlier, 1,* priv priv%=-1% if user.proj%=1% else change sys(chr6$+chr$(32%)+chr$(1%)+string$(3%,0%)+ & priv.rqd$+string$(18%,0%)) to fip% priv%= (fip%(3%)=0%) !user has rqd priv end if TER.SYS$ = CHR6$+CHR$(16%)+CHR$(0%)+CHR$(255%)+ & STRING$(23%,0%) GOTO End.of.program IF FNDET% !CANNOT SPAWN CB JOB GOTO Start.user.intf IF LOGGED.OUT% !NO ACCT IF OUT CHANGE SYS(CHR6$+CHR$(14%)) TO FIP% !GET USER ACCTNH USER.PSSWRD$=RAD$(FIP%(09%)+SWAP%(FIP%(10%)))+ & RAD$(FIP%(11%)+SWAP%(FIP%(12%))) !USER PSSWRD hashed.pw%=0% !assume ok password if user.psswrd$=" " then hashed.pw%=-1% !hashed, so flag it 115 Start.user.intf: CHANGE SYS(CHR6$+CHR$(-3%)) TO FIP% !GET RSTS JOB TABLE JOBTBL% = FIP%(11%)+SWAP%(FIP%(12%)) !SAVE IT PK.LOCK% = FALSE !clear PK lock flag !PRINT HEADER, PROGRAM IDENTIFICATION (IF NEEDED) PRINT "CB - ";VERSION,ERT$(0%)+CR+LF UNLESS CCL.ENTRY% !CHECK FOR GAG ON RSTS 7.1 OR LATER if cblib.version <> version then PRINT PRINT "?CBLIB version NOT compatible with CB" PRINT "?CBLIB version: ";CBLIB.VERSION,"CB version: ";VERSION PRINT "?Contact SYSTEM Manager......" GOTO 32767 end if GOTO Common.init.check IF RSTS.ver < 7.1 !DO NOT DO ON RSTS V7.0 DUMMY$ = SYS(TER.SYS$) !GET CURR TTY CHARACTERSTICS WAS.GAGGED% = FALSE !ASSUME NOT GAGGED IF ASCII(MID(DUMMY$,28%,1%)) = 255% then WAS.GAGGED% = TRUE !SEE IF WAS GAGGED DUMMY$=SYS(TER.SYS$+CHR$(128%)) !CLEAR GAG FOR CB end if Common.init.check: GOTO No.common.init IF COMMON.INIT=378% !NORMAL !INITIALIZE RESIDENT LIBRARY IF THIS IS THE FIRST USER !SINCE LIBRARY WAS LOADED GOTO Common.init.check IF COMMON.INIT = 991% !SOMEONE ELSE INITNG OLD.INIT.VAL%=COMMON.INIT !SAVE INIT TYPE PRINT "%Initializing CBLIB" & unless OLD.init.VAL% = 457% COMMON.INIT = 991% !SAY WE ARE INITING COMMON.IN.USE=USER.JOB% !JUST IN CASE PRINT FOR X%= 0% TO 40% !INIT CHANNLE STUFF CHANNEL(X%)=STRING$(64%,99%) CHANNEL.USED(X%) = FALSE NEXT X% FOR X%= 0% TO 63% CB.PROG(X%), & CB.PROJ(X%), & TTY.WIDTH(X%), & TALK.CHAN(X%), & JOB.FLAGS(X%)= FALSE HANDLE(X%), & CB.PASS(x%)= NULL NEXT X% IF OLD.INIT.VAL% <> 457% THEN CB.last.init.date = date$(0%) !STATS init date CB.Last.init.time = time$(0%) !Stats init time CB.LINE.COUNTS = 0% !STATS RESET CB.LINE.COUNT(X%) = 0% FOR X%=0% TO 40% !STATS RESET CB.USER.COUNTS = 0% !STATS RESET CB.LAST.CB.DATE = "NONE " !STATS RESET CB.LAST.CB.TIME = "NONE " !STATS RESET ELSE GOTO Finish.init !REINIT, NO CLOSE END IF CB.CLOSED = TRUE !CLOSE CB TIL [1,*] CB.CLOSED = FALSE IF PRIV% !PRIV,SO OPN Finish.init: COMMON.INIT = 378% !SET INIT FLAG COMMON.IN.USE= 0% !UNLOCK CORE No.common.init: IF (CB.CLOSED) AND (PRIV%=0%) !CLOSED, NOT PRIV & THEN PRINT "**??CB closed??**" GOTO End.of.program !CLOSED, TELL USER End if Get.user.handle: IF (CCL.ENTRY%=1%) then GOTO Process.command END IF GOTO Logout.error IF LOGGED.OUT% !CANT ENTER NOT LOGGED IN ! ACCEPT USER ID UNLESS CCL ENTERED. CHECK FOR 'HIDDEN' ! OPTIONS. '/DBG'= DEBUG, '/CLR' = FORCE CBLIB INIT if (ccl.entry%=0%) then LINPUT "Handle ";HNDL$ end if CCL.ENTRY% = 0% !Assume not a ccl if hndl entered !II%= INSTR(1%,HNDL$,"/DBG") DEBUG MODE, HIDDEN CLR%=INSTR(1%,HNDL$,"/CLR") !CLEAR LIB HIDDEN FUNC HIDE%=INSTR(1%,HNDL$,"/HIDE") !DONT ANNOUNCE ENTRY/EXIT CLR%,HIDE% = FALSE IF PRIV%=0% IF CLR% THEN COMMON.INIT=FALSE GOTO Common.init.check END IF HNDL$=LEFT(HNDL$,HIDE%-1%) !CLEAR '/HIDE' & IF HIDE% DEBUG%=FALSE ! IF II% THEN ! HNDL$=LEFT(HNDL$,II%-1%) ! PRINT "%%Debug ENABLED" ! DEBUG%=TRUE ! END IF GOTO Bad.handle IF HNDL$= NULL OR LEN(HNDL$)>12% GOTO Handle.inuse IF HNDL$=HANDLE(X%) & FOR X%=1% TO 63% GOTO Set.defaults Bad.handle: PRINT "**12 character max**" GOTO Get.user.handle Handle.inuse: PRINT "**??'Handle' IN-USE??**" GOTO Get.user.handle Logout.error: PRINT "**??Login PLEASE??**" GOTO End.of.program Set.defaults: !SETUP THE USER ITEMS FOR THIS RUN , DEFAULTS= ! TALK ON CHANNEL 19, MONITOR 19, NO FLAGS SET ! **TELL THE WORLD WE ARE HERE** PRINT DUMMY%=FNLOCK.COMMON% DUMMY$=SYS(CHR6$+CHR$(-7%)) !CTRL/C TRAP TMP%=FNSET.CHNL%(0%) !PUT IN CHANNEL 0 TMP%=FNSET.CHNL%(19%) !PUT IN CHANNEL 19 HANDLE(USER.JOB%) = EDIT$(HNDL$,128%) JOB.FLAGS(USER.JOB%) = FALSE !DEF TO NO FLAGS SET TTY.WIDTH(USER.JOB%) = WIDTH.DEFAULT !DEF TO /WIDTH 78 CB.PROJ(USER.JOB%) = USER.PROJ% CB.PROG(USER.JOB%) = USER.PROG% CB.PASS(USER.JOB%) = NULL TALK.CHAN(USER.JOB%) = 19% !TALK TO 19 FIRST CB.last.cb.date = date$(0%) !STATS cb date CB.Last.cb.time = time$(0%) !Stats cb time CB.USER.COUNTS = CB.USER.COUNTS + 1% !STATS DUMMY% = FNUNLOCK.COMMON% CMD$="**New User - Job #"+NUM1$(USER.JOB%)+" ("+HNDL$+ & ") has signed on to CB**" !SEND STD SYS MESSAGE DUMMY%=FNBROADCAST%(0%,CMD$,-1%) & UNLESS HIDE% !tell everyone 500 Get.command: ! PROMPT THE CURRENT USER WITH HIS TALK CHANNEL NUMBER ! ADD AN EXTRA '>' IF HE HAS A PASSWORD SET ! ACCEPT COMMAND OR MESSAGE, IF IT BEGINS WITH '/', ! THEN ASSUME IT IS A PROGRAM COMMAND. IF WE ARE PROCESSING ! AN INDIRECT FILE, THEN A LINE STARTING WITH A ';' OR 'EXCL' ! IS IGNORED. FIRST TIME THRU, SETUP COMMAND AS '@CB.INI' TO ! EXECUTE INITIALIZER FILE IF IT EXISTS, NO ERROR IF IT ! DOESN'T. PK.LOCK% = FALSE IF NOT(PK.OPEN%) !FORCE PROMPT, NO PK GOTO Prompt.complete IF PK.LOCK% or silent% !NO PROMPT IF LOCKED IF OLD.USER%=0% THEN SILENT% = TRUE old.user%=1% !we are doing second ini CMD$ = "@LB:CB.INI" !SETUP INIT COMMAND GOTO 552 !PRETEND WE ENTERED END IF IF OLD.USER%=1% THEN SILENT% = TRUE old.user%=2% !we are doing second ini CMD$ = "@CB.INI" !SETUP INIT COMMAND GOTO 552 !PRETEND WE ENTERED END IF SLEEP 1% FOR TMP%=1% UNTIL NOT(FNDET%) !DO NOT PRMPT IF DET PRINT "T"+FNDGT2$(TALK.CHAN(USER.JOB%))+">"; PRINT ">"; IF JOB.FLAGS(USER.JOB%) AND SECRET.OPT !FLAG IF PASSWORD (/RESTRICT) SET 540 Prompt.complete: WAIT PK.I.O IF PK.OPEN% !CHECK PK IF OPEN goto Get.command.input if at.proc% !do not open if @ OPEN "_KB:CB.CMD" AS FILE 1% !OPEN COMMAND CHANEL 550 Get.command.input: INPUT LINE #1, CMD$ !GET COMMAND W/TERMS print cmd$; if at.proc% and not(silent%) !echo cmd from file TYP$ = LEFT(CMD$,1%) !GET 1ST CHAR, REM? IF (TYP$=";" OR TYP$="!") AND (AT.PROC%) then !YES a comment... GOTO Get.command.input end if 552 if cmd$=chr$(27%) then !esc toggles lock pk.lock%=not(pk.lock%) print if((pk.lock%=false) or (pklock% and pk.open%)) then goto get.command end if end if 555 CMD$ = EDIT$(CMD$,4%) !CLEAR TERMINATOR if (PK.lock%) then !locked stuff check if cmd$=null then cmd$="<>" end if xtmp$=left$(cmd$,2%) if xtmp$<>".." then cmd$="/XEQ "+CMD$ else cmd$=right(cmd$,3%) !not locked on end if end if !***the following is incorporated in above 'IF' !CMD$ = "<>" IF (PK.LOCK%) AND (CMD$=NULL) !CMD$ = "/XEQ "+CMD$ IF PK.LOCK% UNLESS LEFT(CMD$,2%)=".." !CMD$ = RIGHT(CMD$,3%) IF LEFT(CMD$,2%)=".." AND PK.LOCK% WAIT 0% CLOSE #1% UNLESS AT.PROC% !CLOSE GOTO Zap.command IF CMD$= ZAP.CMD !/KILL FROM AN OPER GOTO Check.command 560 !WAIT TIMEOUT PK.SCAN% = TRUE !TELL PK DVR SCANNNG HOLD.TMO%, PK.TMO% = 0% !SET TIMEOUT GOSUB PK.scan.routine !ANY PK STUFF PK.SCAN% = FALSE !RESET IN CASE WAIT 0% !STOP TIMEOUT IF PK.RCV% GOTO Get.command !REPROMPT IF I/O ELSE GOTO Get.command.input end if Check.command: EDIT.VAL%=8% EDIT.VAL%=40% IF JOB.FLAGS(USER.JOB%) AND UPPER.OPT CMD$=EDIT$(CMD$,EDIT.VAL%) !NO LDNG SPCS TYP$ = LEFT(CMD$,1%) !ISOLATE CHARACTER CMD$="/AT "+RIGHT(CMD$,2%) IF TYP$="@" !INDIRECT ENTERED GOTO Process.command IF LEFT(CMD$,1%)="/" !COMMAND IF CMD$=NULL THEN !NOTHING PRINT "**CB - ";VERSION;"**" !..SO GIVE VERS GOTO get.command !AND GET MORE END IF !MESSAGE TO BROADCAST ! WE JUST SEND A MESSAGE TO ALL USERS ON THE CURRENT USERS' ! TALK CHANNEL WITH A HEADER PREPENDED TO IT. DUMMY%=FNBROADCAST%(TALK.CHAN(USER.JOB%),CMD$,0%) GOTO get.command Process.command: !COMMAND CTYP$=EDIT$(MID(CMD$,2%,2%),32%) !cmd in upper case & UNLESS CCL.ENTRY% CTYP$=LEFT(EDIT$(CMD$,40%),2%) IF CCL.ENTRY% CTYP$=EDIT$(CTYP$,-1%) CTYP$="LI" IF CTYP$="L" !ALLOW LIST.... CTYP$="HE" IF CTYP$="H" !...HELP TO BE ONE LTR CTYP$="*" IF (LEN(CTYP$)<>2%) & OR (INSTR(1%,CTYP$,".")<>0%) & OR (CTYP$="^^") !SNEAKY TO TRY ON CCL ENTRY VALID$="TA.BR.MO.WA.LI.AT.HE.WI.KI.EX.CA.XE.KB.SP."+ & "PP.UP.JO.AL.RE.DE.TI.DA.CL.OP.ST" VALID$="^^.^^.^^.WA.LI.^^.HE.^^.KI.^^.^^.^^.^^.^^."+ & "^^.^^.^^.^^.^^.^^.TI.DA.CL.OP.ST" & IF CCL.ENTRY% CM%=INSTR(1%,VALID$,CTYP$) !CHECK IF LEGAL CM%=INT(CM%/3%)+1% IF CM% !OFFSET COMMAND GOTO Do.dispatch IF CM% TYP$= NULL TYP$=" CCL" IF CCL.ENTRY% !SAY CCL PROBLEM PRINT "**??Invalid"+TYP$+", Type '/HELP'??**" IF CCL.ENTRY% THEN goto end.of.program ELSE goto get.command end if Do.dispatch: !DO DISPATCH, GO BACK FOR MORE STRT.ARG%=INSTR(1%,CMD$," ") ON CM% GOSUB 2000,2800,3000,3800,4000,4700,5000,5200,5500, & 6000,6500,6700,7000,7500,8000,8500,8700,8900,9500, & 9800,9900,9900,9950,9960,9970 ! COMMAND DISPATCH TABLE VALUES: ! 2000 - TALK ! 2800 - BROADCAST ! 3000 - MONITOR ! 3800 - WATCH ! 4000 - LIST ! 4700 - AT OR @ ! 5000 - HELP ! 5200 - WIDTH ! 5500 - KILL ! 6000 - EXIT ! 6500 - CALL ! 6700 - XEQ ! 7000 - KB ! 7500 - SPY ! 8000 - PPN ! 8500 - UPPER ! 8700 - JOB ! 8900 - ALL BROADCAST ! 9500 - RESTRICT ! 9800 - DETACH ! 9900 - TIME/DATE ! 9950 - CLOSE ! 9960 - OPEN ! 9970 - STATS IF CCL.ENTRY% THEN GOTO End.of.program ELSE GOTO Get.command End if %SBTTL 'Talk Command' %PAGE 2000 Talk.command: ! **TALK COMMAND** ! CHANGE A USERS CURRENT TALK CHANNEL, THEY MUST BE PRIV. TO ! USE CHANNEL 40, OTHERWISE JUST CHECK FOR VALID RANGE. ! NOTE THAT /TALK ALSO SETS THE NEW TALK CHANNEL AS /MON TOO GOTO Display.talk IF STRT.ARG%=FALSE CMD$=RIGHT(CMD$,STRT.ARG%+1%) TALK%=VAL(CMD$) GOTO CHNL.40.error IF (TALK%=40%) AND (PRIV%=0%) !CHAN 40 SPECIAL GOTO Ill.channel IF TALK%<1% OR TALK%>40% !NO SUCH CHANNEL DUMMY% =FNLOCK.COMMON% TALK.CHAN(USER.JOB%)=TALK% DUMMY2% =FNGET.CHAN%(TALK%) DUMMY% = FNUSER.POSITION% !SEE IF ALREADY MONITORING TMP% =FNSET.CHNL%(TALK%) !DO THE SET IN MONITOR & IF DUMMY% = -1% !UNLESS ALREADY MONITORNG DUMMY%=FNUNLOCK.COMMON% Display.talk: PRINT "**Talking on channel "; & FNDGT2$(TALK.CHAN(USER.JOB%)) RETURN %SBTTL 'Broadcast command' %PAGE 2800 Broadcast.command: ! **BROADCAST COMMAND** ! BROADCAST TO A SPECIFIC CHANNEL, BUT IF CHANNEL IS NOT ! SPECIFIED, BROADCAST ON CURRENT USERS TALK CHANNEL. NOTE ! THAT BROADCAST WILL SEND THE MESSAGE WITH NO PASSWORD CHECKS ! OR /RESTRICT CHECKS GOTO Ill.channel IF STRT.ARG%=FALSE !ILLEGAL IF NO ARG BRDCST%=TALK.CHAN(USER.JOB%) !ASSUME STD CHN I2%=INSTR(STRT.ARG%+1%,CMD$," ") !CHN TYPED? GOTO All.chnl.brdcst IF I2%=FALSE !NO CHN SPECFD CHN$=MID(CMD$,STRT.ARG%+1%,I2%-STRT.ARG%-1%) !GET CHNL BRDCST%=VAL(CHN$) !SAVE IT STRT.ARG%=I2% !POINT PAST CHNL All.chnl.brdcst: MSG$=RIGHT(CMD$,STRT. ARG%+1%) ! GOTO chnl.40.error IF (BRDCST%=40%) AND (PRIV%=0%) !CHAN 40 SPECIAL GOTO Ill.channel IF BRDCST%<1% OR BRDCST%>40% !ILLEGAL, SORRY DUMMY%=FNBROADCAST%(BRDCST%,MSG$,1%) !SEND, NO PSWD RETURN %SBTTL 'Monitor command' %PAGE 3000 Monitor.command: ! **MONITOR COMMAND** ! ADD OR SUBTRACT CHANNELS TO BE MONITORED, NOTE THAT YOU CAN ! NOT SUBTRACT YOUR CURRENT TALK CHANNEL. ALSO, A '/MON -' ! COMMAND WILL DROP ALL CHANNELS FROM THE USERS MONITOR LIST ! EXCEPT THE CURRENT USER TALK CHANNEL GOTO Display.monitor IF STRT.ARG%=FALSE !SHOW CUR IF NO ARG CMD$=RIGHT(CMD$,STRT.ARG%+1%) talk% = TALK.CHAN(user.job%) !get talk chnl lclly DUMMY%=FNLOCK.COMMON% 3010 GOTO Monitor.NOP IF CMD$= NULL I2%=INSTR(1%,CMD$,",") CHN$=CMD$ CMD$=NULL IF I2%=FALSE !NO MORE GOTO 3050 IF I2%=FALSE !MUST BE LAST ONE CHN$= LEFT(CMD$,I2%-1%) CMD$=RIGHT(CMD$,I2%+1%) 3050 GOTO 3100 IF CHN$="-" CHN%=ABS(VAL(CHN$)) GOTO Chnl.40.error IF CHN%=40% AND PRIV%=0% !CHAN 40 SPC GOTO Ill.mon.channel IF CHN%=0% OR CHN%>40% GOTO 3110 IF INSTR(1%,CHN$,"-") !DELETE 3060 DUMMY2%=FNGET.CHAN%(CHN%) DUMMY%=FNUSER.POSITION% IF DUMMY%<>-1% THEN PRINT "**??Already monitoring channel "; & FNDGT2$(CHN%);"??**" GOTO 3010 !do another END IF 3070 TMP% = FNSET.CHNL%(CHN%) !PUT US IN THIS CHANNEL GOTO 3010 3100 Unmon.loop: FOR WX%=1% TO 40% ITERATE Unmon.loop IF WX%=TALK% & OR CHANNEL.USED(WX%)=FALSE !CANT UNMONITOR USERS' TLK CHAN !OR UNUSED CHANNEL DUMMY2%=FNGET.CHAN%(WX%) DUMMY%=FNUSER.POSITION% ITERATE Unmon.loop IF DUMMY%= -1% !NOT ON CHANNEL CNL(DUMMY%)= 00% DUMMY2%=FNPUT.CHAN%(WX%) NEXT WX% DUMMY%=FNUNLOCK.COMMON% PRINT "**All channels except "; & TALK%;" reset **" PRINT RETURN 3110 GOTO Ill.unmon.channel IF CHN%=TALK% !CANT UNMONITOR TALK CHANNEL DUMMY2%=FNGET.CHAN%(CHN%) DUMMY%=FNUSER.POSITION% IF (DUMMY%= -1%) THEN PRINT "**??Not monitoring channel "; & FNDGT2$(CHN%);"??**" GOTO 3010 !do another end if 3120 CNL(DUMMY%)= 00% DUMMY2%=FNPUT.CHAN%(CHN%) GOTO 3010 Monitor.NOP: DUMMY%=FNUNLOCK.COMMON% Display.monitor: PRINT "**Monitoring channels: " MCNT%= 0% Mon.loop: FOR X%=1% TO 40% ITERATE Mon.loop IF CHANNEL.USED(X%) = FALSE !NEVR USED ! PRINT "MONITOR - CHANNEL CHECKING=";X% ! IF DEBUG% DUMMY2%=FNGET.CHAN%(X%) DUMMY%=FNUSER.POSITION% ITERATE Mon.loop IF DUMMY%= -1% !NOT ON CHANNEL MCNT%=MCNT%+1% PRINT FNDGT2$(X%);" "; IF MCNT%>15% THEN MCNT%= 0% PRINT end if NEXT X% PRINT cr+lf RETURN Ill.mon.channel: PRINT "**??Illegal MONITOR channel '";CHN$;"'??**" GOTO 3010 Ill.unmon.channel: PRINT "**??Cannot UNMONITOR your TALK channel??**" GOTO 3010 Chnl.40.error: PRINT "**??40 -"; gosub Priv.error !priv operation msg goto 3010 %SBTTL 'Watch command' %PAGE 3800 Watch.command: ! **WATCH (USERS ON A SPECIFIC CHANNEL)** ! GET A LIST BY CHANNEL OF WHO IS ON THE SYSTEM UNDER A ! SPECIFIC CHANNEL GOTO Ill.channel IF (STRT.ARG%=FALSE) AND (CCL.ENTRY%) !MUST BE GIVEN A CHANNEL TO CHECK !IF CCL ENTRY ANY.USERS%=FALSE GOTO Process.watch.arg IF STRT.ARG%<>0% CHN%=TALK.CHAN(USER.JOB%) GOTO Do.watch Process.watch.arg: CMD$=RIGHT(CMD$,STRT.ARG%+1%) CHN%=VAL(CMD$) Do.watch: GOTO Ill.channel IF (CHN%<=0%) OR (CHN%>40%) PRINT "Users on Channel #";CHN%;CR+LF GOTO No.users IF CHANNEL.USED(CHN%)=FALSE !NEVER USED DUMMY2%=FNGET.CHAN%(CHN%) Watch.loop: FOR CXX%=1% TO 63% ITERATE Watch.loop IF CNL(CXX%)=00% !NOT IN THIS POSITION GOTO No.users IF CNL(CXX%)=99% !END OF USERS USR%=CNL(CXX%) KBN$=FNKB.NUMBER$(USR%) ITERATE Watch.loop IF KBN$="ILL:" !DONT REPORT KILLED JOBS PRINT "#";NUM1$(USR%);TAB(6%); & "[";NUM1$(CB.PROJ(USR%))+","+ & NUM1$(CB.PROG(USR%));"]";TAB(18%); & KBN$;TAB(27%); & HANDLE(USR%);TAB(46%); PRINT "Monitor"; PRINT ", Talk"; IF TALK.CHAN(USR%)=CHN% PRINT ", PSWD"; IF (JOB.FLAGS(USR%) AND SECRET.OPT) & AND (TALK.CHAN(USR%)=CHN%) PRINT ANY.USERS%=TRUE NEXT CXX% No.users: PRINT "No Users on this channel" IF NOT(ANY.USERS%) PRINT RETURN %SBTTL 'List command' %PAGE 4000 List.command: ! **LIST (USERS) COMMAND** ! LIST CURRENT CB USERS. NOTE IF A USER IS SPECIFIED, ONLY ! JOB NUMBER IS REPORTED ST%=1% EN%=63% CM% = 0% !RESET FLAG ONE.USER%=FALSE GOTO No.list.arg IF STRT.ARG%=FALSE !CHK IF WE HAVE ARG CM%=VAL(RIGHT(CMD$,STRT.ARG%+1%)) GOTO No.list.arg IF CM% = 99% !ALL JOB FLAG SET GOTO Ill.jobno IF CM%<1% OR CM%>63% ONE.USER%=TRUE ST%,EN% = CM% !SET STRT,END No.list.arg: PRINT "CB is CLOSED"+CR+LF+LF IF CB.CLOSED AND PRIV%=0% PRINT "CB User list:" UNLESS ONE.USER% ANY.USERS%=FALSE PRINT List.loop: FOR X%=ST% TO EN% ITERATE List.loop IF CB.PROJ(X%)= 0% KB$=FNKB.NUMBER$(X%) ITERATE List.loop IF KB$="ILL:" AND CM%=FALSE !DONT REPORT KILLED JOBS ANY.USERS%=TRUE PRINT "#"+FNDGT2$(X%);" ["+NUM1$(CB.PROJ(X%))+ & ","+NUM1$(CB.PROG(X%))+"]"; & TAB(14%);KB$;TAB(21%); & EDIT$(HANDLE(X%),128%);TAB(34%); & "Talk: "; & FNDGT2$(TALK.CHAN(X%)); PRINT TAB(43%);"Att: "; FLAGS% = JOB.FLAGS(X%) PRINT "JOB "; IF FLAGS% AND JOB.OPT PRINT "KB "; IF FLAGS% AND KB.OPT PRINT "PPN "; IF FLAGS% AND PPN.OPT PRINT "PSWD "; IF FLAGS% AND SECRET.OPT PRINT "SPY "; IF FLAGS% AND SPY.OPT PRINT "UPR "; IF FLAGS% AND UPPER.OPT PRINT "BG "; IF FLAGS% AND BG.OPT PRINT "None"; IF FLAGS%=FALSE PRINT cr+lf;" Wdth: ";TTY.WIDTH(x%); PRINT tab(12%);EDIT$(CB.PASS(X%),-1%); & IF (PRIV%) ! OR (((JOB.FLAGS(X%) AND ! SECRET.OPT) <>0%) ! AND (DEBUG%<>0%)) PRINT TAB(19%);"Mon: "; MCNT%= 0% List.channel.loop: FOR Y%=1% TO 40% ITERATE List.channel.loop IF CHANNEL.USED(Y%) = FALSE DUMMY2%=FNGET.CHAN%(Y%) OTHER.USER%=FNOTHER.POSITION%(X%) ITERATE List.channel.loop IF OTHER.USER%=-1% !NOT ON CHANNEL PRINT FNDGT2$(Y%);" "; MCNT%=MCNT%+1% IF MCNT%>15% THEN MCNT%= 0% PRINT cr+lf;TAB(24%); end if NEXT Y% PRINT NEXT X% PRINT "No users " IF NOT(ANY.USERS%) PRINT RETURN %SBTTL 'AT (@) command' %PAGE 4700 At.Command: ! **INDIRECT FILE PROCESSING** ! ! PROCESS AN INDIRECT FILE, THIS CODE IS EXECUTED AT STARTUP ! TO PROCESS 'CB.INI' IN THE CURRENT USERS ACCOUNT, BUT NO ! ERROR WILL OCCUR IF IT DOES NOT EXIST. ONLY ONE INDIRECT ! FILE CAN BE OPENED, AND A '/AT' OR '@' COMMAND FROM A FILE ! WILL GENERATE AN ERROR goto Too.many.at if at.proc% !ALREADY PROCESSING goto Bad.at.file if STRT.ARG%=FALSE !no filename, error AT.FILE$ = EDIT$(RIGHT(CMD$,strt.arg%),-1%) !GET FILENAME OPEN AT.FILE$ FOR INPUT AS FILE #1% AT.PROC% = TRUE !SET OPEN FLAG RETURN Bad.at.file: !OPEN ERROR OCCURED PRINT "**??Bad file??**" UNLESS SILENT% silent% = FALSE !make sure public RETURN Too.many.at: !MULT INDIRECT NOT ALLOWED PRINT "**??Multiple indirect NOT ALLOWED??**" RETURN %SBTTL 'Help command' %PAGE 5000 Help.command: ! **HELP COMMAND** ! ! READ THE CBHLP.DOC FILE IN READ-ONLY MODE FROM THE ACCOUNT ! THAT CB RESIDES IN. AN ERROR IS GENERATED IF THE HELP FILE ! DOES NOT EXIST. OPEN CB.PKG$+"CBHLP.DOC/RO" FOR INPUT AS FILE 3% GOTO Display.help !A-OK 5010 PRINT "**??No HELP AVAILABLE??**" RETURN 5020 Display.help: LINPUT #3%, MSG$ !GET A LINE PRINT MSG$ GOTO 5020 5030 CLOSE #3% !WE ARE DONE RETURN %SBTTL 'Width command' %PAGE 5200 Width.command: ! **WIDTH COMMAND** ! ! SET THE TERMINAL WRAP-AROUND WIDTH TO A SPECIFIC VALUE. IF ! A VALUE IS ILLEGAL OR NOT SPECIFIED, THEN THE CURRENT VALUE ! IS RETURNED AND DISPLAYED. A VALUE BELOW MIN.WIDTH OR ! ABOVE MAX.WIDTH IS ILLEGAL GOTO Width.done IF STRT.ARG% = FALSE !DISPLAY CUR WIDTH CMD$=RIGHT(CMD$,STRT.ARG%+1%) tmp%=VAL(CMD$) GOTO Wi dth.done IF (tmp%< MIN.WIDTH) OR !MIN TO ALLOW & (tmp%> MAX.WIDTH) !MAX TO ALLOW DUMMY% = fnlock.common% TTY.WIDTH(USER.JOB%) = tmp% !SET NEW WIDTH DUMMY% = fnunlock.common% Width.done: PRINT "**WIDTH set to ";TTY.WIDTH(USER.JOB%);"**" RETURN %SBTTL 'Kill command' %PAGE 5500 Kill.command: ! **KILL JOB COMMAND (PRIV)** ! KILL A JOB RUNNING CB BY FORCING INTERNAL ABORT COMMANDS TO ! IT. A JOB IN CB THAT IS DETACHED CANNOT BE KILLED UNTIL IT ! IS DETACHED. GOTO Priv.error IF PRIV%=0% !PRIV FUNCTION ONLY GOTO Ill.jobno IF STRT.ARG%=FALSE !WE MUST HAVE AN ARG CMD$=RIGHT(CMD$,STRT.ARG%+1%) JBNUM%=VAL(CMD$) GOTO Ill.jobno IF JBNUM%<1% OR JBNUM%>63% DUMMY%=FNLOCK.COMMON% DUMMY2%=FNGET.CHAN%(0%) OTHER.USER%=FNOTHER.POSITION%(JBNUM%) !USER ON CB???? DUMMY%=FNUNLOCK.COMMON% GOTO Not.CB.error IF OTHER.USER%= -1% !NO, CANT KILL PRINT "Really KILL job #";JBNUM%; WAIT 60% !JUST IN CASE INPUT ANS$ WAIT 0% GOTO Do.Kill IF EDIT$(LEFT(ANS$,1%),-1%)="Y" Kill.Aborted: PRINT "/KILL aborted!" WAIT 0% RETURN Do.kill: KB$=FNKB.NUMBER$(JBNUM%) GOTO Det.Job.Abort IF KB$="ILL:" OR KB$="Det" KB.SND%=KBN% !RTNED FRM FN CALL HNDL$=EDIT$(HANDLE(JBNUM%),128%) !SAVE USER HANDLE MSG$= CR + ZAP.CMD + CR !SEND INTERNAL ABORT DUMMY$ =SYS(CHR6$ +CHR$(-4%)+CHR$(KB.SND%)+MSG$) !force to offending terminal SLEEP 2% Kill.Successful: PRINT "**Job #";JBNUM%;" KILLed**" RETURN Ill.channel: PRINT "**??Illegal Channel??**" RETURN Ill.jobno: PRINT "**??Illegal Job number??**" RETURN Not.CB.error: PRINT "**??Job not in CB??**" RETURN Det.Job.Abort: PRINT "**??Job Detached-Cannot /KILL??**" RETURN %SBTTL 'Zap/Exit command' %PAGE Zap.command: ! **INTERNAL /ZAP* COMMAND** RUNNING.IN.ZAP% = -1% 6000 Exit.command: ! **EXIT COMMAND (^Z OR ^C TOO)** ! **ANY FATAL OR WEIRD ERRORS COME HERE TOO** ! A FLAG 'RUNNING.IN.ERROR%' WILL BE SET ON THE LATTER ! NOTE: IF ENTRY IS MADE AT Zap.command ABOVE THEN AN EXIT WILL ! OCCUR WITH SPECIAL EXIT MSGS, THIS ENTRY OCCURS ! ON AN OPERATOR JOB /KILL COMMAND cur.job%=user.job% !setyup for call clearing.job% = 0% !return dumy2% = fnexit.job%(cur.job%) !do exit cleanup GOTO End.of.program %SBTTL 'Call command' %PAGE 6500 Call.command: ! **CALL COMMAND** ! ! Send message of form: ! '**CB - User: Handle - Please enter CB on Channel #n**' GOTO Bad.KB.no IF STRT.ARG%=FALSE !NOTHING SPECIFIED ST%=VAL(RIGHT(CMD$,STRT.ARG%+1%)) GOTO Bad.KB.no IF ST%<0% OR ST%>127% DUMMY2%=FNGET.CHAN%(0%) Call.loop: FOR X%=1% TO 63% ITERATE Call.loop IF CNL(X%)= 00% !NO JOB THERE KB$=FNKB.NUMBER$(CNL(X%)) !GET JOB KB if kbn% = st% then !KB in CB - abort PRINT "**??KB in CB??**" RETURN end if NEXT X% MSG$=BELL$+"**CB - User: "+ & EDIT$(HANDLE(USER.JOB%),16%)+" - "+ & "Enter CB on Channel # "+ & NUM1$(TALK.CHAN(USER.JOB%))+"**" MSG$= CR + LF +MSG$+ CR + LF +BELL$ DUMMY$ = SYS(CHR6$+CHR$(-5%)+CHR$(ST%)+MSG$) PRINT "**Request sent**"+CR+LF RETURN Bad.KB.no: PRINT "**??Bad KB number??**" RETURN %SBTTL 'XEQ Command' %PAGE 6700 XEQ.command: ! **XEQ COMMAND** ! ! ATPK-TYPE routine to process commands at a pseudo-keyboard ! while still in CB. The PK buffers are checked reqularly for ! I/O on an asynchronous operation. ! GOTO 6950 IF (PK.OPEN%) & AND (STRT.ARG%=FALSE) !USER WANTS OUT... JOBMAX$=SYS(CHR6$+CHR$(-12%)) !monitor tables JOBCNT%= PEEK(ASCII(MID(JOBMAX$,13%,1%))+ & SWAP%(ASCII(MID(JOBMAX$,14%,1%)))) JOBMAX% = SWAP%(JOBCNT%) AND 255% JOBCNT% = JOBCNT% AND 255% IF JOBMAX%<= JOBCNT% AND PK.OPEN%=0% THEN !NO LOGINS, DONT ALLOW PRINT "**??Logins disabled??**" RETURN end if PK.CMD$=RIGHT(CMD$,STRT.ARG%+1%) !WHAT TO SEND? PK.CMD$= NULL IF STRT.ARG%=FALSE !NO MSG GOTO 6880 IF PK.OPEN% !WEVE BEEN HERE B4. PK.UNIT%, PK.BUSY% = 0% !LETS FIND OPEN 6705 OPEN "PK"+NUM1$(PK.UNIT%)+":" AS FILE #2%, RECORDSIZE 134% PK.OPEN% = TRUE !WE GOT A GOOD ONE GOTO 6710 ! 6707 GOTO 6960 IF PK.BUSY% !ALL IN USE PK.UNIT% = PK.UNIT%+1% GOTO 6705 !TRY AGAIN 6710 pk.spcl%=false !assume okey-dokey if hashed.pw% then !force user to enter pw if hashed if(pk.lock%=false) then pk.spcl%=true !flag temp lock needed pk.lock%=true !flagged temp maybe end if print "Password"; !get password xtmp$=sys(chr$(3%)) !turn off echo input user.psswrd$ xtmp$=sys(chr$(2%)) !echo ON... end if PRINT #2%, RECORD 1%, "HELLO "+NUM1$(USER.PROJ%)+ & ","+NUM1$(USER.PROG%)+CR+USER.PSSWRD$+CR; PK.NOECHO% = TRUE PK.TMO% = TIMEOUT.MAX - 30% !TMO FOR 30 SEC GOSUB 6805 !SEND HELLO STUFF JOB.FLAGS(USER.JOB%)=JOB.FLAGS(USER.JOB%) XOR BG.OPT PRINT "**BG ON**" UNLESS FNDET% !tell user if(pk.spcl%)then pk.lock%=false !force from login sequence end if if pk.spcl%=-2% then !invalid password goto 6955 !so close up end if IF PK.CMD$<>NULL THEN 6880 ELSE 6870 !IF CMD, DO IT 6805 HOLD.TMO% = PK.TMO% !SAVE COUNTER 6810 RETURN IF PK.SCAN% !AT NOTHING,SCAN RTN SLEEP 1% PK.TMO%=PK.TMO%+1% !INC TIMEOUT IF PK.TMO% > TIMEOUT.MAX THEN PRINT "**BG has no I/O**" UNLESS FNDET% OR PK.LOCK% & or PK.CTRL.T% GOTO 6870 !RETURN TO CB CMD end if 6815 PK.Scan.routine: PK.RCV% = FALSE 6820 GET #2 FIELD #2, RECOUNT AS PK.RCV$ PK.RCV$ = RIGHT(PK.RCV$,LEN(PK.CMD$)+PK.SND%) IF PK.SND% PK.SND% = FALSE PK.RCV% = TRUE PK.TMO% = HOLD.TMO% !CLR TIMEOUT COUNT if instr(1%,pk.rcv$,"?Invalid entry") and pk.spcl% then print "**??Bad Password??**" pk.spcl%=-2% !force exit goto 6870 end if PRINT PK.RCV$; UNLESS PK.NOECHO% or fndet% !cant i/o det kb GOTO 6820 6860 PUT #2%, RECORD 4%, COUNT 0% !SEE IF PK IN WAIT !>>6810 - not in KB 6870 !WE ARE IN PK WAIT FOR INPUT, GO BACK TO USER PK.TMO% = HOLD.TMO% !CLEAR TMOUT COUNTER RETURN 6880 FIELD #2%, 134% AS PK.SND$ PK.CMD$=NULL IF PK.CMD$="<>" !XLATE null line PK.CMD$=FNQUOTE$(PK.CMD$) !DO "_" STUFF PK.CMD$=FNCTRL$ (PK.CMD$) !DO ^X STUFF PK.CMD$=PK.CMD$+CR UNLESS LEN(PK.CMD$)=1% AND & ASCII(PK.CMD$)<32% LSET PK.SND$ = PK.CMD$ PK.NOECHO% = FALSE PK.TYPE% = 1% !SPECIAL SEND PK.TYPE% = 0% UNLESS LEN(PK.CMD$)=1% AND & ASCII(PK.CMD$)<32% 6890 TMP% = LEN(PK.CMD$) !SAVE LENGTH PUT #2%, RECORD PK.TYPE%, COUNT TMP% PK.SND% = 0% !IF CTRL, ECHO CMD PK.SND% = 2% UNLESS TMP%= 1% AND & ASCII(PK.CMD$)<32% PK.SND% = 3% IF TMP% = 1% AND & (ASCII(PK.CMD$)=10% OR ASCII(PK.CMD$)=13%) PK.SND% = 4% IF TMP% = 1% AND & (ASCII(PK.CMD$)=03% OR ASCII(PK.CMD$)=26%) PK.SCAN%, HOLD.TMO%, PK.TMO%, PK.CTRL.T% = FALSE !RESET SOME FLAGS PK.CTRL.T% = TRUE IF (TMP%=1%) AND (ASCII(PK.CMD$)=20%) PK.TMO%, HOLD.TMO% = TIMEOUT.MAX - 2% IF (PK.LOCK%) OR & (PK.CTRL.T%) !ALMOST NO TMO IF $ !OR ^T GOSUB 6820 !SEE IF I/O GOTO 6870 !RETURN 6895 !PK IN USE, IT IS BUSY, CANNOT SEND DATA PRINT "**??BG busy??**" UNLESS FNDET% GOTO 6870 !RETURN 6950 !TURN OFF THE XEQ STUFF PUT #2%, RECORD 6%, COUNT 0% !IF AT CMD LEVEL GOTO 6955 !THEN NO ^Z,^C NDED 6953 FIELD #2%, 128% AS PK.SND$ LSET PK.SND$=CHR$(26%) !SETUP CTRL/Z PUT #2%, RECORD 1%, COUNT 1% !SEND IT PK.SCAN% = FALSE !LETS GET I/O PK.TMO% = TIMEOUT.MAX - 5% !.BUT FOR 5 SEC ONLY HOLD.TMO% = PK.TMO% !...SAVE IT SLEEP 1% !WAIT A SECOND.. GOSUB PK.scan.routine !SNATCH SOME I/O LSET PK.SND$=CHR$(3%) !SETUP CTRL/C PUT #2%, RECORD 1%, COUNT 1% !SEND IT PK.SCAN% = FALSE ! GOSUB PK.Scan.routine !WAIT FOR COMPLETE 6955 CLOSE #2% !EXIT THE PK PK.OPEN%, PK.UNIT%=FALSE !RESET FLAG JOB.FLAGS(USER.JOB%)=JOB.FLAGS(USER.JOB%) XOR BG.OPT PRINT "**BG OFF**" UNLESS FNDET% !tell user & OR ((RUNNING.IN.ZAP%) AND (RUNNING.IN.ERROR%)) RETURN !DONE WIT H IT 6958 PRINT "**??BG Aborted*??**" UNLESS FNDET% !Something wrong & OR ((RUNNING.IN.ZAP%) AND (RUNNING.IN.ERROR%)) PK.LOCK% = FALSE !RESET LOCK GOTO 6955 !PK logged out??? 6960 PRINT "**??No BG available??**" RETURN 6980 !CTRL/C TRAP FOR PK ONLY FIELD #2%, 128% AS PK.SND$ LSET PK.SND$=CHR$(3%) PUT #2, RECORD 1%, COUNT 1% GOTO 6820 6990 !^Z ON USER INPUT DURING PK.LOCK% CMD$ = "^Z" !AS A LOCK EXIT GOTO 555 !PROCESS USER ^Z 6995 !^C ON USER INPUT DURING PK.LOCK% CMD$ = "^C" !AS A LOCK EXIT GOTO 555 !PROCESS USER ^C %SBTTL 'KB/Spy/PPN/UPR/Job toggle commands' %PAGE 7000 Kb.Command: ! **KB TOGGLE COMMAND** ! Toggle /KB user job flag DUMMY% = FNTOGGLE%("KB",KB.OPT) RETURN 7500 Spy.Command: ! **SPY TOGGLE COMMAND** ! ALLOW A PRIV USER TO WATCH RESTRICTED MESSAGES ! Toggle /SPY user job flag GOTO Priv.error IF priv%=0% DUMMY% = FNTOGGLE%("SPY",SPY.OPT) RETURN 8000 PPN.Command: ! **PPN toggle COMMAND** ! Toggle /PPN user job flag DUMMY% = FNTOGGLE%("PPN",PPN.OPT) RETURN 8500 Upper.Command: ! **UPPER CASE toggle COMMAND** ! Toggle /UPPER user job flag DUMMY% = FNTOGGLE%("UPPER ONLY",UPPER.OPT) RETURN 8700 Job.Command: ! **JOB toggle COMMAND** ! Toggle /JOB user job flag DUMMY% = FNTOGGLE%("JOB",JOB.OPT) RETURN %SBTTL 'ALL command' %PAGE 8900 All.Command: ! **ALL (BROADCAST) COMMAND** ! Send a message across channels to all users on CB. This is ! a privileged function. GOTO Priv.error IF PRIV%=0% !PRIV FUNCTION IF STRT.ARG%=FALSE THEN PRINT "**??Nothing to send??**" RETURN END IF MSG$=RIGHT(CMD$,STRT.ARG%+1%) DUMMY%=FNBROADCAST%(0%,MSG$,2%) !SEND IT RETURN Priv.error: PRINT "**??Privileged operation??**" RETURN %SBTTL 'Restrict/Detach/Date/Time Command' %PAGE 9500 Restrict.command: ! **RESTRICT (PASSWORD) COMMAND** ! ! Set or reset a password associated with messages that are ! sent by the current user. A priv user with /SPY can see ! /RESTRICTed messages whether he has /RESTRICT set or not. ! If no arg is sent but password turned on, set psswrd to ! 1st six chars of entered command line PS$=EDIT$(RIGHT(CMD$,STRT.ARG%+1%),-1%) dummy%= fntoggle%("Password",SECRET.OPT) !TURN OFF PS$ = NULL if dummy%=FALSE !RESET CB.PASS(USER.JOB%)=PS$ RETURN 9800 Detach.command: ! **DETACH (PRIV) COMMAND** ! ! Detach a privileged user from CB. A /LIST command will ! show this user on kb 'Det' GOTO Priv.error IF PRIV%=0% PRINT "**Detaching from terminal**"+cr+LF+cr+LF DUMMY$=SYS(CHR6$+CHR$(7%)) !do the detach RETURN 9900 Dattime.command: ! **DATE or TIME FUNCTION** ! ! Return current system date and time PRINT "**"+DATE$(0%)+" at "+TIME$(0%)+"**"+CR+LF RETURN %sbttl 'OPEN/CLOSE Commands' %PAGE 9950 Close.command: ! **CLOSE COMMAND** ! Allows a privileged user to close CB from further usage by ! non-privileged users. All users get a closing message sent ! to their terminals GOTO Priv.error IF PRIV%=0% !PRIV FUNCTION ONLY CB.CLOSED = TRUE !CLOSE CB MSG$ = "**CB is closing, please finish up**"+BELL$ DUMMY% = FNBROADCAST%(0%,MSG$,2%) !TELL EVERYBODY PRINT "**CB closed**" RETURN 9960 Open.command: ! **OPEN COMMAND** ! Allows a privileged user to open CB to use by non-privileged ! users. GOTO Priv.error IF PRIV%=0% !PRIV FUNCTION ONLY CB.CLOSED = FALSE !OPEN CB PRINT "**CB open**" RETURN %SBTTL 'STAT command' %PAGE 9970 Stat.command: ! **STAT** COMMAND ! PRINT "CB ";VERSION;" Statistics" PRINT PRINT "Last init Date: ";CB.LAST.INIT.DATE PRINT "Last init Time: ";CB.LAST.INIT.TIME PRINT PRINT "Last use Date: ";CB.LAST.cb.DATE PRINT "Last use Time: ";CB.LAST.cb.TIME PRINT PRINT "CBLIB Version : ";CBLIB.VERSION PRINT PRINT "Lines sent : ";CB.LINE.COUNTS PRINT "Users count : ";cb.user.counts PRINT RETURN %SBTTL 'Lock/Unlock/Open common functions' %PAGE User.Functions: ! ***USER DEFINED FUNCTIONS** Lock.Common: DEF FNLOCK.COMMON% ! LOCK THE COMMON AREA SO OTHER USERS CANNOT ! UPDATE WHILE WE ARE !PRINT "LOCK.COMMON%" IF DEBUG% Lock.sleep.loop: ! PRINT "LOCK.COMMON/USER JOB = ";USER.JOB% SLEEP 1% IF COMMON.IN.USE<>USER.JOB% & AND COMMON.IN.USE<>0% GOTO Lock.sleep.loop IF COMMON.IN.USE<>USER.JOB% & AND COMMON.IN.USE<>0% COMMON.IN.USE=USER.JOB% & UNLESS COMMON.IN.USE<>USER.JOB% & AND COMMON.IN.USE<>0% GOTO Lock.sleep.loop IF COMMON.IN.USE<>USER.JOB% & AND COMMON.IN.USE<>0% !PRINT "LOCK.COMMON% FINISHED" IF DEBUG% & FNEND Unlock.common: DEF FNUNLOCK.COMMON% ! UNLOCK THE COMMON AREA, WHEN WE ARE FINISHED !PRINT "UNLOCK.COMMON%" IF DEBUG% ! PRINT "UNL.COMMON/USER JOB = ";USER.JOB%,COMMON.IN.USE COMMON.IN.USE=FALSE IF COMMON.IN.USE=USER.JOB% FNEND Open.position: DEF FNOPEN.POSITION% ! FIND OPEN POSITION IN CNL() ARRAY FOR THIS ! JOB !PRINT "FNOPEN.POSITION%" IF DEBUG% FOR OPNX%=1% TO 63% IF CNL(OPNX%)= 00% OR CNL(OPNX%)=99% THEN OPEN.POS%=OPNX% FNOPEN.POSITION% = OPEN.POS% ! PRINT "OPEN.POSITION FOUND = ";OPEN.POS% IF DEBUG% exit def END IF NEXT OPNX% PRINT "?SPR - No OPN?" RUNNING.IN.ERROR% = TRUE cur.job% = user.job% !save user job dumy2% = fnexit.job%(cur.job%) !kill it STOP !will never get here FNEND %SBTTL 'User/Other position functions' %PAGE 10020 DEF FNUSER.POSITION% & ! FIND A USER JOB SLOT IN THE CNL() ARRAY & ! IF NOT FOUND, RETURNS -1 & & !PRINT "FNUSER.POSITION%" IF DEBUG% & FOR USRX%=1% TO 63% IF CNL(USRX%) = 99% THEN USER.POS% = -1% FNUSER.POSITION% = -1% EXIT def end if IF CNL(USRX%)=USER.JOB% THEN USER.POS%=USRX% FNUSER.POSITION% = USRX% exit def end if NEXT USRX% USER.POS% = -1% FNUSER.POSITION% = -1% FNEND 10042 DEF FNOTHER.POSITION%(ARG%) ! FIND ALTERNATE USERS JOB SLOT IN CNL() ARRAY ! RETURNS -1 IF NOT FOUND !PRINT "FNOTHER.POSITION%",ARG% IF DEBUG% FOR OUSRX%=1% TO 63% IF CNL(OUSRX%) = 99% THEN OUSRX% = 999% !END LOOP GOTO Nxt.fnother end if IF CNL(OUSRX%)=ARG% THEN OTHER.POS%=OUSRX% GOTO Finish.fnother end if Nxt.fnother: NEXT OUSRX% OTHER.POS%= -1% !USER NOT FOUND-LEGAL Finish.fnother: FNOTHER.POSITION% = OTHER.POS% !PRINT "FNOTHERPOSITION - FOUND POSITION ";OTHER.POS% ! IF DEBUG% FNEND %SBTTL 'Exit job function' %page Exit.job: DEF FNEXIT.job%(arg%) ! Do setup to exit from arrays all use by job arg% DUMMY%=FNLOCK.COMMON% TMP% = USER.JOB% !SAVE JOB NUM USER.JOB% = ARG% !get job to clear !CLEAR USER STUFF TALK.CHAN(USER.JOB%), & CB.PROG(USER.JOB%), & CB.PROJ(USER.JOB%), & TTY.WIDTH(USER.JOB%), & JOB.FLAGS(USER.JOB%)=FALSE HNDL$=EDIT$(HANDLE(USER.JOB%),128%) CB.PASS(USER.JOB%), & HANDLE(USER.JOB%)= NULL Exit.loop: FOR YX%= 0% TO 40% ITERATE Exit.loop IF CHANNEL.USED(YX%) = FALSE !NEVR USED DUMMY2%=FNGET.CHAN%(YX%) DUMMY% =FNUSER.POSITION% ITERATE Exit.loop IF DUMMY% = -1% CNL(DUMMY%)= 00% !CLOSE US OUT DUMMY2%=FNPUT.CHAN%(YX%) !UPDATE CHANNEL NEXT YX% DUMMY%=FNGET.CHAN%(0%) !GET MASTER USER CHANNEL USRX% = 0% !LETS CNT REM USERS FOR Y% = 1% TO 63% USRX% = USRX%+1% & IF CNL(Y%)<>0% AND CNL(Y%)<>99% NEXT Y% COMMON.INIT = 457% IF USRX%= 0% !NO REMAINING USRS USER.JOB% = TMP% !RESTORE USER.JOB NUMBER exit def if clearing.job% !cleared another user, so return TYP$="leaving" TYP$="ABORTING" IF RUNNING.IN.ERROR% TYP$="DETACHing" IF RUNNING.IN.ERROR% AND & RUNNING.IN.ZAP% !USER DETACHED TYP2$=NULL TYP2$=" (Involuntarily)" IF RUNNING.IN.ZAP% CMD$="**User #"+NUM1$(USER.JOB%)+" ("+HNDL$+")"+ & " is "+TYP$+" CB"+TYP2$+"**" DUMMY%=FNUNLOCK.COMMON% DUMMY%=FNBROADCAST%(0%,CMD$,-1%) & UNLESS HIDE% !DO NOT SAY LEAVING fnexit.job% = -1% fnend %SBTTL 'Check Job for CB usage function' %PAGE Check.job: DEF FNcheck.job%(arg%) ! ! THIS ROUTINE WILL CHECK THAT A JOB TO BE SENT TO IS INDEED ! IN '..CB..', ELSE IT'S CB LIB STUFF WILL BE CLEARED AND THE ! Subroutine WILL RETURN TRUE in fNCHECK.JOB% on error goto check.job.error.section CLEARING.JOB% = FALSE !ASSUME OK DUMMY$ = NULL !BADNAME CHANGE SYS(CHR6$ +CHR$(26%)+CHR$(ARG%)+CHR$(0%)+ & STRING$(26%,0%)) TO FIP% !GET JOB STATUS DUMMY$ = RAD$(FIP%(17%)+SWAP%(FIP%(18%)))+ & RAD$(FIP%(19%)+SWAP%(FIP%(20%))) FNCHECK.JOB% = FALSE !ASSUME OK 10049 Check.job.finish: EXIT DEF IF DUMMY$="..CB.." !YES, OK CLEARING.JOB% = ARG% !FLAG CLEARING JOB dumy2%=fnexit.job%(clearing.job%) !CLEAR IT W/exit function FNCHECK.JOB% = TRUE !SAY WE CLEARED EXIT DEF check.job.error.section: RESUME 10049 FNEND %SBTTL 'DGT2/Toggle functions' %PAGE 10050 DEF FNDGT2$(ARG%) ! PRINT A NUMBER (USUALLY CHANNEL #) LEADING ! ZERO FILLED !PRINT "FNCHAN%",ARG% IF DEBUG% CHHN$=NUM1$(ARG%) CHHN$="0"+CHHN$ IF ARG%<10% FNDGT2$=CHHN$ FNEND 10060 DEF FNTOGGLE%(ARG1$,ARG%) ! TOGGLE A BIT IN THE USER JOB FLAGS WORD, THE ! CALLER SENDS WHAT TO ACKNOWLEDGE AND THE BIT TO ! TOGGLE, IT IS ACKNOWLEDGED WHEN THE OPERATION ! IS COMPLETE. It also returns TRUE or FALSE in ! the call name to specify whether bits now set, or ! reset DUMMY%=FNLOCK.COMMON% JOB.FLAGS(USER.JOB%)=JOB.FLAGS(USER.JOB%) XOR ARG% DUMMY%=FNUNLOCK.COMMON% tmp% = ((JOB.FLAGS(user.job%) and arg%)<>FALSE) typ$ = "On" typ$= "Off" IF NOT(tmp%) PRINT "**";ARG1$;" ";TYP$;"**" fntoggle% = tmp% !set return of tru/f FNEND %SBTTL 'BROADCAST to terminal function' %PAGE 10100 DEF FNBROADCAST%(ARG1%,ARG1$,BFLAG%) ! BROADCAST A MESSAGE TO ALL USERS ON THE ! CHANNEL SPECIFIED BY ARG1%, IF FLAG% IS SET, ! THEN DO NOT APPEND A HEADER ! BFLAG% VALUES: ! 0 =SEND WITH HEADER ! -1=SEND NO HEADER (SYS MSG) ! 1 =BYPASS PASSWRD CHECKS ! 2 =ALL CMD (/OPR, NOT /Cnn) ! V2.2 WILL CHECK THAT JOB CNL(CXX%) IS REALLY IN '..CB..' ! IF NOT, IT WILL CLEAR IT FROM TABLES, THIS SHOULD ! CLEAR UP CORRUPTED CB LIBRARY ERRORS FROM 'UT KILLs' !PRINT "FNBROADCAST% ";ARG1%,ARG1$,FLAG% IF DEBUG% HLD.ARG$=ARG1$ KB$=FNKB.NUMBER$(USER.JOB%) KB%= KBN% !KBN RTD FRM CALL JOB$=NUM1$(USER.JOB%) PPN$="["+NUM1$(USER.PROJ%)+","+NUM1$(USER.PROG%)+"]" USER.SPY%=((JOB.FLAGS(USER.JOB%) AND SECRET.OPT) <> 0%) USER.SPY%=FALSE IF (BFLAG%=1%) OR (BFLAG%=2%) !USER DOING BROADCAST 10110 exit def IF CHANNEL.USED(ARG1%) = FALSE !NEVER USED DUMMY2%=FNGET.CHAN%(ARG1%) Broadcast.loop: FOR CXX%=1% TO 63% SND.JOB% = CNL(CXX%) !GET NUMBER ITERATE Broadcast.loop IF SND.JOB% = 00% !NO JOB SLOT exit def IF SND.JOB% = 99% !END OF JOB SLOTS ! PRINT "LOOKUP OF JOB ";CXX% IF DEBUG% dummy%=FNcheck.job%(snd.job%) !chk for in CB ITERATE Broadcast.loop IF DUMMY% !no, dont display KBS$=FNKB.NUMBER$(SND.JOB%) ! PRINT "KB OF ACTIVE CB JOB ";CXX%,KBN% ! IF DEBUG% ITERATE Broadcast.loop IF KBN$="ILL:" KB.SND%=KBN% ITERATE Broadcast.loop IF KB.SND%=KB% !AND DEBUG%=FALSE ITERATE Broadcast.loop IF (KB.SND% < 0%) & OR (KB.SND% > 127%) !DETACHED IN CB?? - NO SEND FLAGS% = JOB.FLAGS(SND.JOB%) !GET FLAG WORD ARG1$=HLD.ARG$ ARG1$=EDIT$(ARG1$,32%) & IF FLAGS% AND UPPER.OPT ITERATE Broadcast.loop IF ((FLAGS% AND SECRET.OPT)=FALSE) AND & ((FLAGS% AND SPY.OPT)=FALSE) AND & (USER.SPY%) !SEND RESTR, RCV, NO !SKIP IF....... !SENDER HAS /RESTRICT SET !RCEVER HAS /RESTRICT CLR !RCEVER HAS /SPY CLR ITERATE Broadcast.loop IF ((FLAGS% AND SECRET.OPT)<>0%) & AND (USER.SPY%) & AND ((FLAGS% AND SPY.OPT)=FALSE) & AND (CB.PASS(USER.JOB%) <> & CB.PASS(SND.JOB%)) !SKIP IF....... !SENDER HAS /RESTRICT SET !RCEVER HAS /RESTRICT SET !RCEVER HAS /SPY CLR !RCEVER / SENDER PSSWRDS DIF ! PRINT "BROADCAST - PSWRDS '"; ! CB.PASS(USER.JOB%);"', "; ! "'";CB.PASS(SND.JOB%);"'", ! "FLAGS SEND/RCV "; ! JOB.FLAGS(USER.JOB%),FLAGS% ! IF DEBUG% BCST.TYPE$ = "C" !CHANNEL BCST.TYPE$ = "B" IF BFLAG%=1% !BROADCAST BCST.TYPE$ = BCST.TYPE$+FNDGT2$(ARG1%)+"/" BCST.TYPE$ = "OPR/" IF BFLAG%=2% !ALL COMMAND SND.HDR$="("+BCST.TYPE$ SND.HDR$=SND.HDR$+KB$ & IF FLAGS% AND KB.OPT SND.HDR$=SND.HDR$+PPN$ & IF FLAGS% AND PPN.OPT SND.HDR$=SND.HDR$+ & EDIT$(HANDLE(USER.JOB%),128%) SND.HDR$=SND.HDR$+"#"+JOB$ & IF FLAGS% AND JOB.OPT SND.HDR$ = SND.HDR$ + ") " SND.HDR$=" " IF (BFLAG%= -1%) !IF NO HDR REQUESTED..... !THEN FORCE CLEAR ! SND.HDR$="#DBG#"+SND.HDR$ IF DEBUG% & ! AND KB.SND%=KB% !SAY DEBUG IF....... !KB TO SEND= USER.JOB KB SND.HDR$="SECRET"+SND.HDR$ IF (USER.SPY%<>0%) & AND (CB.PASS(USER.JOB%) = & CB.PASS(CNL(CXX%))) !SAY SECRET IF....... !SENDER HAS /RESTRICT SET !RCEVER / SENDER PSSWRDS SME SND.HDR$="+SPY+"+SND.HDR$ IF (USER.SPY%) & AND ((FLAGS% AND SPY.OPT)<>0%) & AND (CB.PASS(USER.JOB%) <> & CB.PASS(SND.JOB%)) !SAY SPY IF....... !SENDER HAS /RESTRICT SET !RCEVER HAS /SPY SET !RCEVER / SENDER PSSWRDS DIF MSG.MAX% = TTY.WIDTH(SND.JOB%) - LEN(SND.HDR$) !GET MAX FOR A LINE MSG.MAX% = WIDTH.DEFAULT & IF (MSG.MAX% < 2%) !DO NOT BLOW UP ON OBSCURE !CONDITION first.cur.send% = TRUE !SETUP as 1st send Do.long.msg: MSG$= ARG1$ !GET TOTAL MESSAGE LONG.MSG.FLAG% = FALSE !ASSUME STD MSG LEN IF LEN(MSG$) > MSG.MAX% THEN LONG.MSG.FLAG% = TRUE ARG1$ = "--> "+RIGHT(MSG$,MSG.MAX%+1%) MSG$ = LEFT(MSG$,MSG.MAX%) !CUT MSG DOWN end if DUMMY$ = SND.HDR$ + MSG$ + CR + LF !SETUP MESSAGE DUMMY$ = CR + LF + DUMMY$ & IF (FIRST.CUR.SEND%) FIRST.CUR.SEND% = FALSE !RESET SEND FLAG DUMMY$=SYS(CHR6$+CHR$(-5%)+CHR$(KB.SND%)+DUMMY$) CB.LINE.COUNTS = cb.line.counts + 1% !add for stats CB.LINE.COUNT(ARG1%) = cb.line.count(ARG1%) + 1% !add for stats goto do.long.msg IF LONG.MSG.FLAG% NEXT CXX% FNEND %SBTTL 'GET/PUT/SET channel functions' %PAGE Get.channel: DEF FNGET.CHAN%(ARG%) ! MOVE CHANNEL() FROM COMMON TO CNL$ (MAPPED TO CNL() ! PRINT "GET.CHANNEL/USER JOB = ";USER.JOB%,ARG% CNL$ = CHANNEL(ARG%) FNEND Put.channel: DEF FNPUT.CHAN%(ARG%) ! MOVE CNL$ TO COMMON CHANNEL(ARG$) ! PRINT "PUT.CHANNEL/USER JOB = ";USER.JOB%,ARG% CHANNEL(ARG%) = CNL$ FNEND Set.channel: DEF FNSET.CHNL%(ARG%) ! GETS A CHANNEL SETS THE USER.JOB% IN THE CHANNEL, ! REWRITES THE CHANNEL. THIS ROUTINE WILL NOT LOCK COMMON. !PRINT "FNSET.CHNL%" IF DEBUG% DUMMY2% = FNGET.CHAN%(ARG%) ARG1% = FNOPEN.POSITION% CNL(ARG1%) = USER.JOB% !SETUP IN CUR USER LIST ! PRINT "SET.CHANNEL/USER JOB = ";USER.JOB%,ARG%,ARG1% DUMMY2% = FNPUT.CHAN%(ARG%) CHANNEL.USED(ARG%) = TRUE FNEND %SBTTL 'KB Number functions' %PAGE 10300 KB.number: DEF FNKB.NUMBER$(JBNO%) ! FORMAT A KB NUMBER AS TO DET OR PSEUDO OR ! REGULAR, IF NO KB ON JBNO% SPECIFIED, ! RETURNS 'ILL:' ! **V01.04 - APPENDS A '*" IF USER ON A MODEM, ONLY SHOWS ! 2 DIGIT NUMBER IF KB<100 on error goto kb.error.section KBN$="ILL:" CHANGE SYS(CHR6$+CHR$(26%)+CHR$(JBNO%)+CHR$(0%)) TO FIP% KBN%=FIP%(4%) KBN$="Det" GOTO Finish.kb IF KBN%<0% OR KBN%>127% !DET JOB GOTO Pseudo.setup IF FIP%(5%)<>0% !PSEUDO KB KBN$=NUM1$(KBN%) tmp% = 3% tmp% = 2% IF KBN%<100% KBN$="KB"+LEFT("000",tmp%-LEN(KBN$))+KBN$+":" JDB%=PEEK(JOBTBL%+(JBNO%*2%)) GOTO Finish.Kb IF JDB%=FALSE KB.DDB%=PEEK(PEEK(JDB%)) TTINTF%=PEEK(KB.DDB%+30%) KBN$=KBN$+"*" IF (TTINTF% AND 16384%)<>0% GOTO Finish.KB Pseudo.setup: KBN$="P"+NUM1$(KBN%-1%)+"J"+FNDGT2$((FIP%(5%)-1%)/2%)+":" goto finish.kb kb.error.section: resume 10301 10301 Finish.Kb: FNKB.NUMBER$=KBN$ FNEND %SBTTL 'Detached Job/Package Loc functions' %PAGE Det.job.fnc: DEF FNDET% ! ! RETURNS TRUE IF USER IS DETACHED, ELSE RETURNS FALSE ! KBN$= FNKB.NUMBER$(USER.JOB%) !GET KB NAME FNDET% = FALSE !ASSUME ATTACHED IF KBN$="Det" or KBN$="ILL:" then !..but be flexible FNDET% = TRUE end if FNEND Pkg.loc: DEF FNPKG.LOC$ ! ! Function FNPKG.LOC This function returns the PPN of the last ! opened file, usually the first program in ! a package of programs. This information ! is returned in FSPEC format with a device ! suffixed if the device is not public. ! CHANGE SYS(CHR$(12%)) TO FIP% PKG.LOC$ = "["+NUM1$(FIP%(6%))+","+NUM1$(FIP%(5%))+"]" PKG.LOC$ = "_"+CHR$(FIP%(23%))+CHR$(FIP%(24%))+ & NUM1$(FIP%(25%))+":"+PKG.LOC$ & IF FIP%(26%) AND 1% FNPKG.LOC$ = PKG.LOC$ FNEND %SBTTL 'Quote/Control characters functions' %PAGE Quote.ctrl.line: ! F N Q U O T E $ ( C T R L . L I N E $ ) ! P A R S E F O R Q U O T E C H A R S DEF FNQUOTE$(CTRL.LINE$) FNQUOTE$=CTRL.LINE$ T0%=FALSE ! INITIALIZE TO PARSE FOR QUOTE CHARACTER. Quote.loop: T0%=INSTR(T0%,CTRL.LINE$,"_") ! FIND NEXT QUOTE CHARACTER IN LINE. IF T0% THEN ! WE FOUND ONE. FNQUOTE$,CTRL.LINE$=LEFT(CTRL.LINE$,T0%-1%) & +CHR$(ASCII(MID(CTRL.LINE$,T0%+1%,1%)) OR 128%) & +RIGHT(CTRL.LINE$,T0%+2%) ! TAKE OUT QUOTE CHARACTER AND SET PARITY BIT ! ON NEXT CHARACTER. GOTO Quote.loop ! SEE IF WE HAVE ANOTHER QUOTE CHARACTER. end if FNEND Ctrl.ctrl.line: ! F N C T R L $ ( C T R L . L I N E $ ) ! P A R S E F O R C T R L C H A R S DEF FNCTRL$(CTRL.LINE$) T0%=FALSE ! INITIALIZE FOR SEARCH FOR CTRL CHARS. T0$=EDIT$(CTRL.LINE$,4%) ! STRIP LINE TERMINATOR. IF ASCII(T0$)=94% AND LEN(T0$)=2% THEN CTRL.LINE$=EDIT$(T0$,32%) ! IF LINE CONTAINS ONLY UPARROW FOLLOWED BY SGL CHAR ! DISCARD THE LINE TERMINATOR. end if Ctrl.loop: T0%=INSTR(T0%,CTRL.LINE$,"^") ! FIND NEXT (UNQUOTED) UPARROW IN LINE. IF T0% THEN CTRL.LINE$= & LEFT(CTRL.LINE$,T0%-1%) & +chr$(ascii(EDIT$(mid(ctrl.line$,t0%+1%,1%),32%))-64%) & +RIGHT(CTRL.LINE$,T0%+2%) ! TAKE OUT UNQUOTED UPARROW AND UNSET BITS ! ON NEXT CHARACTER MAKING IT A CONTROL CHARACTER. GOTO Ctrl.loop ! SEE IF WE HAVE ANOTHER UPARROW. end if FNCTRL$=EDIT$(CTRL.LINE$,1%) FNEND ! END OF FNCTRL$(CTRL.LINE$) %SBTTL 'Error trapping routine' %PAGE 19000 Error.section: !**ERRORS SECTION** ERTMP% = ERL !GER OFFEND LINE NO RESUME 19001 IF ERTMP%>18999% AND & ERTMP%<20000% !ERR IN ERR?? ER% = ERR !NO, SO GET ERROR EL% = ERTMP% !SAVE STD FOR LINE RESUME 19001 !RESUME TO PROC ERR 19001 DUMMY$=SYS(CHR6$+CHR$(-7%))+SYS(CHR$(0%)) !RENABL ^C,RSTR ECHO GOTO 6953 IF el%=6950% !ANY PK EOF ER% GOTO 6980 IF ER%=28% AND & (el% >= 6700% AND el% < 6980%) !OR PK.OPEN%) GOTO 6995 IF ER%=28% AND PK.LOCK% !PROCESS USER ^C GOTO 6000 IF ER%=28% !^C AT CMD,EXIT goto 113 if el%=110 !CBPRIV open error GOTO 5010 IF el%=5000% !NO HELP GOTO 5030 IF el%=5020% !EOF IN HELP GOTO kill.aborted IF el%=5500% AND ER%=15% !CLR VERIF TMOUT GOTO ill.jobno IF el%=4000% !GOTO Finish.KB IF el%=10300% in kb section now GOTO Ill.channel IF el%=2000% GOTO Ill.mon.channel IF el%=3050% GOTO All.chnl.brdcst IF el%=2800% GOTO Ill.channel IF el%=3805% GOTO Width.done if el%=5200% !bad width GOTO ill.jobno IF el%=5500% GOTO Bad.KB.no IF el%=6500% GOTO End.of.program IF el%=115% AND ER%=11% GOTO Bad.at.file IF el%=4700% !BAD INDIRECT FILE if er%=5% and el%=113% then !Bad priv name tmp$="USER8" !.so assume regular print "**??Bad RSTS priv??**" !..but tell them goto 113 end if IF ER%=11% AND el%=550% AND (AT.PROC%) THEN tmp%=SILENT% !SAVE SILENT FLAG SILENT%, & AT.PROC% = FALSE AT.FILE$ = NULL CLOSE #1% !CLOSE CMD CHANNEL GOTO Get.command IF tmp% !PROMPT IF WE WERE GOTO 540 !EOF ON INDIRECT FLE END IF GOTO 6990 IF el%=550% AND ER%=11% AND PK.LOCK% GOTO 6000 IF el%=550% AND ER%=11% IF ER%=31% THEN PRINT "?CB - Program too large" GOTO End.of.program end if IF ER%=6% AND el%=6705% THEN PK.BUSY% = -1% GOTO 6707 end if GOTO 6860 IF ER%=11% AND el%=6820% !NO I/O, SEE IF KB GOTO 560 IF el%=550% AND ER%=15% !TIMOUT ON KB FOR PK GOTO 6707 IF el%=6705% AND ER%=8% !PK IN USE GOTO 6958 IF el%=6860% AND ER%=5% !PK IN LOGED-OUT GOTO 6895 IF el%=6890% !PK BUSY ON CMND GOTO 6810 IF ER%=3% AND el%=6860% !PK NOT IN KB GOTO 6980 IF ER%=28% AND (el% >= 6700% AND el% <= 6920%) IF ER%=27% THEN RUNNING.IN.ERROR% = TRUE GOTO Zap.command !SET 'ZAP,ERROR' End if PRINT "?CB - Fatal Error -";ERT$(ER%);" ";er%;" at ";el% RUNNING.IN.ERROR% = TRUE GOTO Exit.command !TRY TO /EXIT %SBTTL 'CCL/Login entry points' %PAGE 30000 CCL.Entry.point: ! ***CCL ENTRY POINT*** CMD$=SYS(CHR$(7%)) !GET CORE COMMON I%=INSTR(1%,CMD$,"/") IF I% THEN CMD$=EDIT$(RIGHT(CMD$,I%+1%),16%+32%+64%) CCL.ENTRY%=1% !MARK AS SWITCH ENTERED GOTO Start.program End if I%=INSTR(1%,CMD$," ") GOTO Start.program IF I%=FALSE HNDL$=RIGHT(CMD$,I%+1%) CCL.ENTRY%= 2% !MARK AS HANDLE ENTERED GOTO Start.program 32000 Login.entry.point: ! ***LOGIN ENTRY POINT*** LOGGED.OUT%=TRUE !LETS CHECK THIS LATER GOTO CCL.Entry.point !TREAT JUST LIKE CCL %SBTTL 'End of program routines' %PAGE 32700 End.of.program: !CLOSE-UP PROCESSING PK.CLOSING% = 0% PK.NOECHO% =TRUE !DONT ECHO DIE STUFF GOSUB 6950 IF PK.OPEN% !CLOSE UP PK CLOSE #1%, #2%, #3% !CLOSE TERM, PK, HELP DUMMY$=SYS(TER.SYS$+CHR$(255%)) !SET GAG WHEN LEAVING CB & IF WAS.GAGGED% !...IF IT WAS SET IF RUNNING.IN.ZAP% THEN PRINT CR + BELL$ + LF + LF + LF + & "**!!You have just been cleared from CB "+ & "by the operator!!**"+ & BELL$ + CR + LF + LF + LF & UNLESS (RUNNING.IN.ZAP%) AND & (RUNNING.IN.ERROR%) FIP%(X%) = 0% FOR X%= 0% TO 30% FIP%(00%)=30% FIP%(01%)=6% FIP%(02%)=8% FIP%(03%)=USER.JOB% FIP%(28%)=255% CHANGE FIP% TO DUMMY$ !KILL JOB STUFF DUMMY$=SYS(DUMMY$) !KILL OURSELVES end if %SBTTL '' 32767 END ^2? PԳjklL;=TsBvL@n'@^@@Sū@S;@d@y@ q;@Sū@˫@S۪@az@@+˫@@$"@R@f@Sū@Sժ@r@9@ irȪ@;@!@q@Y@D@K@@ @+@Q@L@Ȫ@ժ@Ѫ@ @YȪ@S۪@y@_@y@z@@ Ȫ@Sɪ@}@YȪ@K@@Y @ Ȫ@p@@ū@:@g@; @Sժ@S5@Ȫ@XȪ@# 8@ N@@S@  Nɪ@<@ N@u~@@S@{L@):@:@@,L@:@_Ȫ@c8@@ S)@S۪@˫@@^\@!˫@x@8Ȫ@@3:@L@q@.@5M@v:@ ˫@.@.@۪@L@Oq@z۪@@ժ@yg@e@L@*}@ū@:@ a@S@&L@<9@ q@d'@< @y@M@|g@~@^@Ȫ@y@=@ s@@Ȫ@z˫@T۪@z;@"@""@L@ū@@E@t!@ K@Z@d@p@"l@+@ 6m;@+:+:+:@ 6m;@+:+:+:@G0 Da  ,a 0̫rG?pa i ,1zhG(  +:  p  Z  d  K( ( "l0 0 "l8 8 p@ @ pp p +~ ~ Da ?(CA33B "by the operator!!**:'**!!You have just been cleared from CB f?CB - Fatal Error -~?CB - Program too large ":Hf`~ **??Bad RSTS priv??**^_JP000--> +SPY+SECRET ) (OPR/ B $*06>FPZbhnv  COff On&0,..CB..6 CB> is F)L**User #X (Involuntarily)l DETACHingzABORTINGle   &,(60>8F>LJX^llzx aving?SPR - No OPN?Users count : Lines sent : CBLIB Version : Last use Time: Last use Date  0DXl : Last init Time: Last init Date: 0 Statistics@CB H **CB open**X **CB closed**j#**CB is closing, p .0>@FHVXhj |lease finish up** at **Detaching from terminal** **??Privileged operation??****??Nothing to send??** Bb JOB UPPER ONLYPPNSPY KB&^C,^Z2**??No BG available??**N**??BG Aborted*??**f **BG OFF**  "* 0&6,<2XNpf pt**??BG busy??****??Bad Password??**?Invalid entry**BG has no I/O** **BG ON**HELLO Password t0BXfp :PK**??Logins disabled??****Request sent** ***??Bad KB number??**DEnter CB on Channel # ^ -  ,B*\Dv^ bf **CB - User: x**??KB in CB??**!**??Job Detached-Cannot /KILL??****??Job not in CB??****??Illegal Job fx*Pj number??****??Illegal Channel??** KILLed****Job # Det(/KILL aborted!:Y@Really KILL job #V *8D L(^:d@zV V**WIDTH set to j**??No HELP AVAILABLE??** CBHLP.DOC/RO%**??Multiple indirect NOT ALLOWED??****??Bad file?? j2Bl ** No users Mon:  Wdth: NoneBG UPR SPY PSWD $PPN ,KB 4JOB <Att: FTalk *2: BJT$\,d4l<vF J: P [VCB is CLOSED j CB User list:|No Users on this channel, PSWD, TalkMonitor][ P V j2|NXbntz #ILL:Users on Channel #**??40 - ***??Cannot UNMONITOR your TALK channel??**('??**2**??Illegal $06d(n2 >MONITOR channel 'T**Monitoring channels: p**??Not monitoring channel  reset ****All channels except  T2pR`z ??****??Already monitoring channel -,**Talking on channel  , Type '/HELP'??**& **??Invalid ,28R Xn& 26 CCL>J^^.^^.^^.WA.LI.^^.HE.^^.KI.^^.^^.^^.^^.^^.^^.^^.^^.^^.^^.^^.TI.DA.CL.OP.STJTA.BR.MO.WA.LI.AT.HE.WI.KI.EX.CA 6 >Z .XE.KB.SP.PP.UP.JO.AL.RE.DE.TI.DA.CL.OP.ST^^.*HHELLI ** **CB -  / @" /AT .4:@FLRX ^ j p v" & * /XEQ 4 ..: <>@ !F ;L _KB:CB.CMDZ >` Tf @CB.INIr @LB:CB.INI ) has signed on to CB**  ( * 4 : @  F &L 4Z :` @f Lr Z v  **New User - Job # **??Login PLEASE??** **??'Handle' IN-USE??** **12 character max** /HIDE /CLR Ha   2 N f p x  ndle " **??CB closed??**8 NONE D NONE R %Initializing CBLIBj ?Contact SYSTEM Manager...... CB ver  "  8 ,D :R Rj t  sion: ?CBLIB version: %?CBLIB version NOT compatible with CB   CB -  LB:CBPRIV.CB US   H N T ^ h x  ER8 V02.06      ,a &   L; * @)  L; 2 @)9  L;9 :  @y  L;y B @@y  L;y J D@  L; R D@:  L;: Z D@  L; b D@:  L;: j @  L; r :  L;: v C  L;C z K  L;K ~ T  L;T  H)`  L;`  @  =Ts  @A  =Tsi  ,0d4n8qs"&B ( + 0   G, G0 G4 G8 G G G" "G &GB *G .G 2G 6G :G 8   n  * >& 0 ^"\xNb  G G Gn G G* G> G "G^ &G *G" .Gx 2G 6GN :Gb pP|(p$dF,136!!`!l!"  G G G( G$ GF G G "G &G *G! .G! 2G`! 6Gl! :G" "(""#&#)$+t$.$0$D %N@%SN%X\%Lv%  G" G(" G" G# G# G$ Gt$ "G$ &G$ *G % .G@% 2GN% 6G\% :Gv% @%4!%!%"%%R&H&&&&&"'&l'&'$'*:'*A'N.B'.  G% G% G% G% GR& G& G& "G"' &Gl' *G' .G* 2G* 6GN. :G. L'.t'/~'Z0<(05=(68J|99J90u=}==?  G. G/ GZ0 G05 G6 G|9 G9 "G= &G= *G= .G?G &w  G 6m; G    i j +: , , Da Da ,a dCB  ̫r a p , dnn9B7 vLvL vLvLn'^9B7 Sū "̫r$S;(d*S;.y0q;4Sū 6,a ` S;d S;˫dS;˫dSū ,a S۪ ,a "az$S;(y*Sū ,,a  S۪ ,a S; ySū ,a S;Sū ̫rS; "S;&(+˫*Sū ,̫r  S; Sū ̫rSū ̫r$"S; S;$R&(f*Sū ,,a  | |q| Sժ Da  ̫r| r Da Da 0S;496irȪ 8̫r|:;S;BqDvLHirȪ J̫r| &|q|R| YDSū ̫r| n'irȪ ̫r|K RirȪ ̫r|"irȪ $̫r&+(Sū L|.q|x  ̫r|Q. n'irȪ ̫r|S;LSū ̫rxȪ ,a  ժ ",a $Da & ( r  Ѫ ,a   YȪ ,a QS;S۪ ̫r y"+˫$_&(+˫*S; x y+˫  irȪ ̫rx+S;y+˫z "&Sū (,a * Ȫ " "   Da " Sɪ ,a  } S;YȪ Da " KSū ,a S;"$S۪ &̫r(y*+˫ t6= +˫ S;+˫S;y+˫Sū ̫rt "6$&Y (*Q,= " Ȫ ,a Y  " QS;S۪ ̫ry+˫ z"$(Sū *,a  >"  " " "  Ȫ Da " Sɪ ,a  }S;YȪ Da " S;YȪ Da " az ˫"p$S;(YȪ *Da " f " pp S;YȪ Da "  az˫p+˫Sū ̫rpȪ ,a irȪ ̫rp irȪ "Da $& ss YȪ ,a  vLn'S;S۪ ̫ry+˫ "z$&*Sū ,,a . Ȫ "  " "  Da " Sɪ ,a  } S;YȪ Da " S;YȪ Da " azSū ,a "ū $,a &Ȫ     ,a Ȫ ,a   :irȪ Da girȪ Da  g"$$"&(irȪ  &  v  Da + irȪ Da +g!irȪ Da & irȪ Da   "Y $v& $ :irȪ Da   g!:irȪ Da g! :"irȪ $Da &g*irȪ L&   f ?  Da & g irȪ Da girȪ Da  g!: irȪ "Da f $g(!*Q,? vtll ժ ,a Da   QirȪ ̫rtzSū ̫rlȪ ,a  irȪ "̫rl$S; t _R ;  YȪ ,a S;S۪ ̫rt"y$+˫&(z*Sū lsz  ̫rln' Ѫ L;QѪ L; "Q$&Sժ (L; *,a ,Ѫ N   ,a Y   :irȪ Da N g!S5 L; Sժ ",a $L;&(:*irȪ  0hs  Da  g ! Ȫ ,a Ȫ ,a XȪ ,a Da 0Qh n'$S۪ &,a (# 8 :6 @c. s  Da 6 S; S;y NS۪ ,a  Ȫ Da .  S"n'&XȪ (,a *Da  b0ss 0Ȫ ,a  n'Ȫ ,a Ȫ ,a XȪ ,a Da Q "n'&S۪ (,a ^ V N F  Ȫ Da ^ S۪ ,a   Ȫ Da V S۪ ,a  Ȫ Da N S۪ ,a  Ȫ Da F  S۪ ",a f  Ȫ Da f Ȫ ,a  Sɪ ,a SSɪ ,a Sɪ ,a Sɪ ,a "S۪ > n  s  ,a # 8 Da >  S۪ ,a # 8 Da n Sժ Da  ̫r Nɪ ̫r Nɪ ̫r n'$XȪ stz  ,a Da  Ȫ ,a n'Ѫ ,a Y t< " N $Da z &(u~ ~ \2T  N Da ~   Sū L;\Ȫ ,a Ȫ ,a XȪ ,a Da  2"Q$T 2s s2s n'S۪ ,a   Ȫ Da Sn'XȪ ,a Da  2"Ȫ $,a &n'* Z @ r 4 v x Sū L;  irȪ Da @  N Da r irȪ Da 4  N Da v QxQ "YȪ $L; | szs Ȫ ,a Y   Ȫ L; n'S5 L;Ȫ L;n'"S۪ $L; &Ѫ (,a ,K  =s| yY   :irȪ Da  g!Q=n'"Ѫ $,a (*,Q.|  h Ȫ ,a Y   QѪ ,a {L): irȪ "Da  $g(irȪ *̫rh h h ;!Ȫ ,a  _irȪ ̫rhirȪ Da :Sū ,a _irȪ ̫rh"irȪ $Da 6F :Sū ,a  Ѫ ,a 6Ȫ ,a Sժ ,a ,a Ȫ ,a "Y $F&Ȫ @^hh  L;Q Ȫ ,a Y ^irȪ ̫rhS۪ ,a LSū ̫rh"Ȫ $,a bh h  irȪ ̫rhirȪ Da   KirȪ ̫rhK,L: Y "$Q&(_Ȫ s> h  ,a Ȫ ,a  XȪ ,a Da Qn'S۪ ,a c8 Da > "irȪ $̫rh& sss Q  n'XȪ ,a Da Ȫ ,a n' Q"$n'(*:,irȪ .Da s s g! Q n':irȪ Da g! Q"$n'(*:,irȪ .Da =s ( g! Q =n':irȪ Da  g! "($Sū &,a (S;,.S۪ 0l44  ̫ry+˫  zSū ̫rl4Sū ,a S; "4$Sū &,a (S۪ V> hf  ,a # 8 Da >  irȪ ̫rhS;D NS۪ ,a  Ȫ Da f  "S۪ $,a xN NV ^  Ȫ Da N S) S۪ ,a  Ȫ Da V Sɪ ,a S۪ ,a  Ȫ Da ^  Sɪ ",a $S۪ n  F r  ,a # 8 Da n  Nɪ Da  S۪ ,a  Ȫ Da F S;S <"$ N &Da r v :) u~ N Da v _S۪ L; ˫Sū L; :) Sū ",a $S۪  h  ,a ^\ S۪ Da y+˫irȪ Da +irȪ ̫rh +"$irȪ | d"d/  Da | +Sū ̫rd Ȫ ,a "S۪ ̫rdY/ Sū ",a $vL &:N n'S۪ ,a  !˫Y :Ȫ ,a S۪ ,a S۪ ,a  :"$Y &N(Q Ljn d  Ѫ ,a  jYȪ ,a _Ȫ ,a Sժ Da n ̫rdQ "Ѫ $,a ( rb d 6 YȪ ,a  S5 ,a Sժ Da b ̫rdQ _Ȫ ,a n'"$6&!˫(* F . _x n'8Ȫ ,a Qn':S۪ ,a "YȪ $Da F &(.*S۪ \ V f   Da \ y+˫  irȪ Da V +g!S۪ ,a YȪ Da f "S;&y( V   Y  : irȪ Da V g!vLn' Ȫ ,a "Y $ &S;*,Ȫ .,a   F H &&d Y  Q F  r Da  Da H 2vL6n':_<3:>irȪ @̫rdB;D!FS۪ H,a J!˫ \ v dd` S۪ ,a y  Y v :irȪ ̫rdg!irȪ ̫rd"_$L&Sū (̫r`  `B `< irȪ ̫r`irȪ Da B  KirȪ ̫r`irȪ Da < K:S۪ ,a "y$  F (d Y  Q F  vLS;irȪ ̫rd "S۪ $,a &!˫(Sū *,a   :irȪ Da   g!Ѫ ,a KS۪ ,a S۪ ,a "y$:&(Y  &+ddd d  Q& vLirȪ ̫rdS;DSū ̫rdS۪ ,a  "Y $d &irȪ (̫rd*irȪ   ( 6 dd\\0  Da   (  Sժ Da 6 ̫rdirȪ ̫rdS;LSū ̫r\ irȪ "̫r\$irȪ &Da 0 > V & ddd dd Y V  irȪ Da & irȪ ̫rd+Sū ̫rdQd irȪ ̫rd S;$q&Sū (̫rd d t d  Ȫ ,a  t _qirȪ ̫rdirȪ ̫r "Q$&Q  0d!  vL YȪ ,a Ȫ ,a Sժ ,a ,a .d!Ȫ ,a  "$Ȫ &,a  &F 0f ( Y  Q & QF n'S5 ,a S۪ ,a YȪ Da f "S;&y(*Y , .S5  ddd``  ,a irȪ ̫rd S۪ ,a DSū ̫rdirȪ ̫rd_LSū ̫r` irȪ "̫r`    d dd irȪ Da     irȪ ̫rdS;qS۪ Da  y+˫ Sū "̫rd$irȪ &̫rd   2 | d b _L irȪ Da  2 Q| irȪ ̫rdirȪ Da   "$b & B   &F :irȪ Da   girȪ Da  girȪ Da g! Q"&$S۪ &,a (YȪ *Da F j d/&0 d S۪ ̫rd  /Sū ,a Q&n'Ȫ ,a  "irȪ $̫rd&S;*S;  X d( RS; DSū ̫rXȪ ,a Y  irȪ ̫rdS;"D$&S;*L,Sū  XXXX X  ̫rXirȪ ̫rX Y DSū ̫rXirȪ ̫rXirȪ Da   Sժ "Da  $̫rX  X XX irȪ ̫rXirȪ Da   Sժ Da  ̫rXirȪ ̫rXK"5M$_&irȪ  XX.  ̫rXirȪ Da  : 5M:irȪ ̫rXirȪ Da K :"$Y &. ( XTB :TT Sժ Da  ̫rX Sժ Da  ̫rTȪ ,a Y B Sժ Da : ̫rT_ irȪ "̫rT H Xr  irȪ ̫rX: Sū ,a Ȫ ,a Y r S۪ ,a q; v:"_$&˫ l ~  ` 2 .Sū ,a  Ȫ ,a Y ~ Q Sժ Da  ̫r`Ȫ ,a  Y " $Sժ &Da 2  `"`   ̫r`: irȪ Da "irȪ ̫r`+irȪ Da +g"!$Ȫ &,a  =&0d~ Y  Q = Q&n'_irȪ ̫rdirȪ Da : Sū ",a ~$S۪ &,a (.  "x($F\%v%%%%%R&&&&"'l''     "x($F\%v% %"%$%&%(R&*&,&.&0"'2l'4'6Ȫ 8,a   =&~6 d~ Y  Q = Q&vLn'Ѫ ,a ~ 6 "Q$ &irȪ (̫rd*_,۪ .,a ~ @ dd||( qSū ̫rd irȪ ̫rdf.Sū ,a |Ѫ ,a |KѪ ,a $K&y( f n ||( ( Y n Q  Ѫ ,a |LѪ ,a |,L: Y " $Q&(*(,Sū  F ||d4z*  ,a S۪ ,a   Ȫ Da F S۪ ,a |SS۪ ,a |d4Sū ,a z"$*  |4:) Sū ,a Ѫ ,a  S۪ ,a |4Sū ,a  :)"Sū $,a &n'*  F . ~ :irȪ Da  gS۪ ,a YȪ Da F .g !"Oq$vL(n',Ѫ .,a ~ F x~d Q  S۪ ,a YȪ Da F Sū ,a x_۪ ,a ~irȪ ̫rd"irȪ $Da  *vv>jd~v :Sū ,a v Ѫ ,a v>QjirȪ ̫rd_۪ ,a ~"S۪ $,a v&z۪ N~PPxv~  ,a ~R Sū ̫rPirȪ ̫rPf.Sū ,a xSժ ,a v ,a ~ n'$irȪ pd~Lx(  ̫rd_۪ ,a ~ qSū ̫rLѪ ,a xKѪ ,a  K"y$&Y ( xx(xL QѪ ,a xLѪ ,a x,L:Y  Q"$S۪ &,a x(S۪ *̫rL / ~d _/ Sū ,a OqvLn'Ѫ ,a ~ "Q$&irȪ (̫rd*_,۪ ~dF |( d  ,a ~qSū ̫rd S۪ ,a YȪ Da F Sū ,a |(Sū ,a  vL$irȪ &̫rd   dvd irȪ Da    Q_irȪ ̫rdirȪ Da :Sū ,a v"Sժ $̫rd .Pv@ dvNnd  ̫rPѪ ,a v @Sժ Da  ̫rdѪ ,a vN Q"n$irȪ &̫rd(S۪ TvPdvd P  ,a vL Sū ̫rPirȪ ̫rd_۪ ,a vqSū ̫rdvL"irȪ $̫rP v>Ptt( irȪ Da   Q>irȪ ̫rPf.Sū ,a t Ѫ ",a t&K(Ѫ tt(  ,a K y Y QѪ ,a tKѪ ,a t$,L&:(*Y , TP td4 QT_ irȪ ̫rPirȪ Da :Y QvL"S۪ $,a t&(d4*Sū z**t  ,a z* Sū ,a Ѫ ,a Y *:irȪ Da  g$S۪ &,a t( . t4 .g irȪ Da g!QvLS۪ ,a t"$4&Sū (,a *Q,.vL B rrrZ r| n'_Ȫ ,a r Ȫ ,a rXȪ ,a r Da ZQn' ժ ",a r $,a |&K(S۪ hr. rd4z  ,a rYȪ Da .  K:Y QS۪ ,a r "d4$Sū &,a z( * r *Sū ,a  Ѫ ,a QS۪ ,a  Ȫ Da  "$S&S۪ (,a r 4z rZr :) 4Sū ,a z n'XȪ ,a r Da ZȪ ,a rn' ":)$Sū &,a (*:  | irȪ Da g S۪ ,a |ygirȪ Da g! :"irȪ $Da  &g*!,Oq & t|ztd4z* vLժ ,a t ,a |QzS۪ ,a td4Sū ,a z"$*&Sū (,a ,^lt. Ѫ ,a   ^:irȪ Da lgS۪ ,a t ."$g(irȪ *Da ,g X0 t4z !Q vLS۪ ,a  Ȫ Da SS۪ ,a t "4$Sū &,a z(Q ~0 :)0 Pp0 n'  :)Sū ,a n':irȪ Da Pg"!$Ȫ &,a p(n',_Ȫ .,a @0 . 0 Ȫ ,a XȪ ,a Da Q@n'S۪ ,a YȪ Da .  $&(Q*0 d4z*0p S۪ ,a  d4 Sū ,a z*Sū ,a Ѫ ,a  "Q$0&8Ȫ (,a p .p0p :S۪ ,a  .girȪ Da g! Ѫ ",a p&e(0*Ȫ ,,a p " 0 0 :irȪ Da   g!n'XȪ ,a Da Ȫ ,a "n'&(:*irȪ J0 .P$  Da g ! Oqn':irȪ Da .girȪ ̫rP"g&irȪ (Da $*g.! v0 0  Qn' :irȪ Da g!Qn'"$:&irȪ (Da *g.! >&~n .>&Q  vLn'Ѫ ,a ~KS۪ ,a  y"$Y &(Q*,Ȫ .,a n ~F t d Ѫ ,a ~ Y  QS۪ ,a YȪ Da F Sū ,a tQ "n'&irȪ (̫rd*_ ~ddttt( ۪ ,a ~q Sū ̫rdirȪ ̫rdf.Sū ,a tn'Ѫ ,a t$L&Ѫ (,a t ,t ,L: Y  ,Q:irȪ Da gS۪ ,a t"yg&irȪ (Da *g Ht. ^td4z !S۪ ,a t YȪ Da . ^QS۪ ,a t d4"Sū $,a z&n'*_Ȫ pllll   ,a lȪ ,a l XȪ ,a l Da Qn'S۪ ,a lYȪ Da "&( l cl j QS۪ ,a l YȪ Da QS۪ ,a l YȪ "Da $Sū &,a j(S۪ j<5HH  ,a j<5 Sū ̫rHirȪ ̫rHirȪ Da Q ":$irȪ &Da  jj gS۪ ,a j ^\gS;*}g"irȪ $Da &g*S۪ ,,a j.YȪ  V j^  Da V ^\  irȪ Da +S۪ ,a jYȪ Da ^ ^\+˫ "g&irȪ 0Hj>  Da g S;*}girȪ ̫rHgS;"*}$&g*S۪ ,,a j.c8 0Da > ^.jF gS; *}g!:irȪ Da g"!$S۪ &,a j(YȪ *Da F ,ū tjf j  ,a t  :irȪ Da g!S۪ ,a jYȪ Da f  S;$y&S۪ (,a j F t YȪ Da F ū ,a t KyY :irȪ Da g"!$&:(irȪ  nlln  Da  g ! YȪ ,a nn'XȪ ,a l Da Ȫ ,a l n'$n'(S۪ *,a n,!˫ x  Y   :irȪ Da xg!:irȪ Da   g$!&Oq(vL,n' *h?fd~Jd _Ȫ ,a hS5 ,a fȪ ,a Ȫ ,a dѪ ,a ~J Q"$irȪ &̫rd(_ P~cn ۪ ,a ~q  f.Sū ,a Ѫ ,a nQ "Ѫ $,a (L*Ѫ x?dffh  ,a ,L : Y QYȪ ,a dSժ ,a ,a f Sժ ",a f $,a h&n'  Rd Ѫ ,a  K S۪ L; yY :irȪ Da R g$!&Ȫ (,a d fn   : irȪ Da fg!Ȫ ,a n:irȪ Da  "g&!(n',Sժ fbhbJ  ,a f ,a bSժ ,a h ,a Ȫ ,a XȪ ,a ,a bQJn'"S۪ $,a V :<5DD YȪ Da V   Q:S۪ ,a <5Sū ̫rD irȪ "̫rD$irȪ &Da ( 6L:n. KѪ ,a  KyY LQ:YȪ ,a n :"S۪ $,a &(. \V L S۪ Da y +˫ gS۪ ,a YȪ Da V ^\S۪ Da L"y$+˫& ^  irȪ Da + S۪ ,a YȪ Da ^ ^\+˫irȪ Da + "g&S; D> *}g irȪ ̫rDgS;*}g S۪ ",a $c8 &Da > (S;,D. "BF . gS; *}girȪ Da BgS۪ ,a  YȪ "Da F $&.(*g.!0 +8f `` :S; *} girȪ Da 8g!S۪ ,a  YȪ "Da f $Sū &,a `(S۪ *,a ` (B0`` S;y  Y B:irȪ Da 0g!S۪ ,a `"S;&y(*Y ,` R(`|  :irȪ Da ( g!S۪ ,a `_yY | ":$irȪ &Da (g z`` !S۪ ,a ` S;yY :irȪ Da g"!$S۪ &,a `(S;,y `  Y   :irȪ Da g!S۪ ,a `S; y"$Y &(*: `@ irȪ Da g !S۪ ,a `S;yY  :"irȪ $Da &g*!,Ѫ `   ,a `  :irȪ Da g!:irȪ Da "g&irȪ (Da *g  N \ S۪ ,a YȪ Da N  yg!S۪ ,a Y \: S;$*}&(g,S۪ Jn   ,a c8 Da n  Y Dg!:S;*} "g&irȪ (Da *g tp^^^(^ !Ȫ ,a p n'_Ȫ ,a ^Ȫ ,a ^XȪ ,a ^ Da Q ("n'&S۪ (,a ^ . ^d4z* YȪ Da .  QS۪ ,a ^d4Sū ,a z S۪ ",a $&*(Sū \\^.  ,a \Ѫ ,a \ Q:S۪ ,a ^. "g&irȪ (Da *g ppp !8Ȫ ,a p Ѫ ,a peȪ ,a p:irȪ Da  g$S;(*}* ^^  g! n'XȪ ,a ^ Da Ȫ ,a ^n' :"irȪ $Da  &g*!,n' >bnh XȪ ,a ,a b  Ȫ ,a n'S۪ ,a n!˫Y h ":$irȪ &Da  b \\ g!  :irȪ Da  g!OqvLn'"Ȫ $,a &Y (*Q,.Ѫ ~d~@  ,a ~  QirȪ ̫rdS۪ ,a ~qYD Sū "̫r@$r .Da  @\  ̫r@YȪ ,a "Oq$n'(Ȫ *,a ,.02:4irȪ 6Da 8gȪ @,a \ Oqn'  :irȪ Da g!OqvLn'"irȪ $̫r&irȪ (Da *+,Sū "ff  ̫rr Da  ̫r,Q.f0vL46:8irȪ :Da f gS۪ ,a  YȪ Da N ygirȪ Da g!Oq vL$n'(Ѫ *,a .0> :>&~Ld~dd Q>&Ѫ ,a ~LQirȪ ̫rd_۪ ,a ~ q"Sū $̫rd&irȪ (̫rd `ZZZ?( f.Sū ,a Z Ѫ ,a ZLѪ ,a Z,L: Y "$Q&(*( d4zZ*\:) Sū ,a   d4Sū ,a zS۪ ,a Z*Sū ,a \ :)"Sū $,a &Ѫ \<Z<  ,a \  Q:irȪ Da <gS۪ ,a Z yg$!&S;*,.9 <<6 irȪ ̫r<; ! irȪ ̫r<_LYD irȪ "Da 6$ |$|Z Q  n':irȪ Da $g! "Oq$n'(S۪ *,a Z, $<5DDD <5Sū ̫rD irȪ ̫rDirȪ Da KirȪ ̫rDirȪ Da  K":$ FNVXZ> h Y NQ  Sժ ,a V ,a XS۪ ,a Zc8 Da > S;D Sū "̫rh$irȪ &Da j LX irȪ ̫r+  irȪ Da +Sū ̫rLS;S۪ ̫r y"+˫$S۪ &,a X Ll| +˫ irȪ ̫rL+zSū ̫rlS;xn'"$:&irȪ (Da  Z| gS۪ ,a Z ygirȪ Da g!Oqn' ":$irȪ &Da (g,!.Oq ||| n' : irȪ Da g!Oqn': irȪ "Da $g(!*Oq,n'0 |TppRP :irȪ Da  g!Oqn'YȪ ,a TvLn'"Sժ $,a &,a R(Ȫ *,a P,S۪ 8R8+N=dd~\d  ,a R8+ Sū ,a NQ=vLn'Ѫ ,a ~ "\$Q&(irȪ *̫rd,_ b~hhh ۪ ,a ~q  f.Sū ,a hѪ ,a hLѪ ,a h",L$:&(Y d4zd Q  d4Sū ,a zn'_Ȫ ,a Ȫ ,a  XȪ ",a $Da &(Q d  <5 n' S۪ ,a YȪ Da QS۪ ,a "YȪ $Da &(<5*Sū DVhtd  ̫rDժ ,a V ,a h :irȪ Da tg!Oq n'$XȪ &,a (Da  db>  Ȫ ,a  n'irȪ ̫rirȪ Da b+S۪ ,a c8 Da >  S;$D&+˫( "Z@F irȪ Da Z+  irȪ Da @+S۪ ,a YȪ Da F ^\+˫ "irȪ $Da DLL +Sū ̫rL irȪ Da irȪ ̫rL+irȪ Da +irȪ Da "+$ fLh irȪ ̫r+ Sū ̫rLS;S۪ ̫ry+˫S۪ ,a h "+˫$&irȪ Lld  ̫rL+ z Sū ̫rl:irȪ Da g!Oq n'$&:(irȪ &,,~#  Da &g ! OqvLn'S۪ ,a Ѫ ,a ~ K"y$&Y (*Q,#.S; 88 S۪ ̫r y +˫zSū ̫r8irȪ ̫r8S;_ R"$; &irȪ 8LL  ̫r8S; _ R; az˫dSū ,a LS۪ ,a L az"S;&y(Sū (JLLJL  ,a JS; S۪ ,a LySū ,a Lժ ,a J ,a LLѪ ,a "K$y& L`d~4 Y ` : irȪ Da g!OqirȪ ̫rd_۪ ,a ~"q$Sū &̫r4 p~ 4("FF Ѫ ,a ~  Sժ Da  ̫r4Ȫ ,a Y Q(" Ȫ ",a F$Sժ &,a F H1H  ,a HvL S۪ ,a H^\S۪ Da y+˫irȪ Da  +"Sū $̫r&r 3F$H  Da  ̫r Da  YȪ ",a $Q&(vL,Ȫ .,a F0Y 24Q6$88Ȫ :,a H!04>0 < Ȫ ,a > Y  !irȪ ̫r0irȪ ̫r4KS۪ ,a >˫q Sū "̫r0$Ȫ !>0D  ,a >YȪ ,a  Sժ ,a ,a _irȪ ̫r0irȪ Da :S۪ ,a D y" !!D"6B Y ! : irȪ Da g!S5 ,a DQ" "6$S۪ &,a B(:* !"0l!  " : irȪ ̫r0g!Ql!vLS;"S;&(y*M .Da 0vL  ",46 Sժ ,a ,a  Oq vLS;<9S;irȪ ̫r,d' < "irȪ $̫r4&irȪ (Da 6 * H"R" 4484484 R"Sժ Da  ̫r4S۪ ̫r48Sū ̫r4S۪ ̫r4 8"Sū $̫r4 j"44 "4 irȪ ̫r4K KirȪ ̫r4; Ly ""$irȪ &̫r4(irȪ *Da "44,B<4 +Sū ̫r4 irȪ ̫r4 N ̫r,Ȫ ,a B_Ȫ ,a <irȪ ̫r4K $K "4 "<4 irȪ ̫r4;  Ly"Ȫ ,a <vL irȪ "̫r4$K&Sū (,a "<>4 S;S۪ ,a < yM ,a Ȫ ,a >Ѫ ,a  K"irȪ $̫r4&; (,L ##>4 4 y # S5 ,a >Ѫ ,a KirȪ ̫r4;  $K&irȪ (̫r4*; ,# B#>4 K : yY B#S5 ,a >Ѫ ,a  K"irȪ $̫r4&; (,K.irȪ X#4r#>@@  ̫r4;  K:yY r#S5 ,a >Ȫ ,a @"Sժ $,a @ &,a (Sժ ~#@@4  ,a @ ,a Sժ ,a @ ,a Ѫ ,a KirȪ ̫r4;  K"y$&Y ##@@# #YȪ ,a @ S۪ ,a S۪ ,a @:Y #S5 ,a  Sժ ",a $,a &. #l!"6#p"& l!Q" vL6#:irȪ Da p g$!&Q("*vL.S;2S; # t$), yM Da Qt$vLS;<9S; irȪ "̫r,$d'&< (S;,.0 N &$,  ̫r,S; _ yM Da Ȫ ,a S5 ,a  Sժ ",a $,a &_(x L$d!,d!+ .d!S;  N ̫r,S;_yM "Da $Ȫ &,a (.*d!,vL x$HHf f @ S;q Ȫ ,a HSժ ,a H ,a S۪ ,a  Ȫ Da f S۪ ,a  YȪ "Da f $S; $6T:$b aS 6 S۪ ,a TS۪ ,a :y:$ :"irȪ $Da b&g $.6T:$J !OqvL 6S۪ ,a TS۪ ,a :y: $"$:&irȪ (Da J $t$0.D g! Ȫ ,a Qt$vL:irȪ Da .g"!$Oq&vL*S;.<90S; %,,l!N irȪ ̫r,d' <  S; N ̫r,S;_ y"M &Da (Q*l!,vL D%(d S"d XX Sժ Da ( ̫rd Q vLSժ Da " ̫rdQ vL n'$S۪ &Da (S;, n%.LL%>&. .Sū ,a  Oq vLn'Ѫ ,a %Q >&"S۪ $Da &S;*,..Sū 0,a %@@ .4!4! . OqvL n'S۪ Da _.Sū ,a OqvL"n'&S۪ (Da *S;.0. %!!."" Sū ,a Oq vLn'S۪ Da S;.Sū ,a "Oq$vL(n',Ѫ .,a %&>&~&d &Q >& Ѫ ,a ~&:irȪ Da g"!$Oq&irȪ (̫rd*_  &~LL/" ۪ ,a ~q Sū ̫rLS۪ ̫rLS;/Sū ,a  Oq"n'&(: F&%%d~ irȪ Da g !OqvLn'irȪ ̫rd_۪ ,a ~"q$&Y(D*Sū n&(.& (  ̫r(S۪ Da  S;.Sū ,a Ѫ ,a & Sժ "Da  $̫r(&S۪ (,a &n (H&H&&>& # 8 Da n  Nɪ ̫r( OqvLn'Ѫ ,a & Q">&$&:(irȪ *Da ,g &l&& !S;  S۪ ̫ry+˫zSū ̫rlOqvL"n'&(:*,< &  S۪ Da y +˫ irȪ Da +u~+˫irȪ Da  +"$irȪ  ' &&8'>&  Da + irȪ Da +g!OqvLn'"Ѫ $,a (*8',Q.>& 8' fLL/ YȪ L; irȪ Da f irȪ ̫r+Sū ̫rLS۪ ̫rLS; "/$Sū &,a \'T&&'>& :irȪ Da T g!OqvLn'Ѫ ,a "$'&Q(>&*Ȫ ,L; . 'D&&< :irȪ Da D g!OqvLn':irȪ Da <"g&irȪ (Da  *g.irȪ ', z  Da ,g ! :irȪ Da  g!:irȪ Da "g&irȪ (Da z *g '~  !: irȪ Da girȪ Da ~ g!: irȪ "Da  $g(!* (r v :irȪ Da  girȪ Da r g!:irȪ Da  g$irȪ &Da v (g,! 0( & :irȪ Da   g!:irȪ Da girȪ Da & "g&!(*: X( \ irȪ Da  g !:irȪ Da gS۪ L;\|g"!$&:(irȪ *Da  (  &2).) gS۪ L;  |g!:irȪ Da  g! Oq"n'&Q(2)*~0^2.) (&&( Ȫ ,a n' n'ժ L; ,a 5MѪ L;5M y"$Y &((_*x ((( ժ L; ,a  5M Ѫ L;5MyY (Q( ժ "L; $,a &5M () Ѫ L; 5M y)Sժ ,a L;ժ L; ,a  5M"Ѫ $L;(5M ").)(& ^)Z)& yY  .) Q(Ȫ ,a n'Q^)~"^$Z)&Ȫ (,a *n'.ժ 0L; P)Z)&**&8  ,a Z) Ȫ L;Ȫ ,a n'Q*~ ^"*$Ȫ &,a (n',_Ȫ .,a 8 |)88))&8 8 Ȫ ,a 8XȪ ,a 8 Da )Q)n'S۪ ,a 8YȪ Da  $K&S۪ (,a 8 ) c)866)& YȪ Da  K:Y )Sժ ,a 8 ,a 6Sժ ,a 6 ,a "Q$)&n' )8)8&: XȪ ,a 8 Da  ) Ȫ ,a 8n':irȪ Da g !"YȪ $,a :&Sժ (,a )RR8+N&$'**  ,a RS۪ ,a R  8+Sū ,a Nyn'Ȫ ,a vL Q"*$~*^,*.Ȫ *$'4444**$'4  ,a n' _Ȫ ,a 4Ȫ ,a 4XȪ ,a 4 Da 4*Q*n'"S۪ $,a 4&YȪ (Da @*cT*2*4 t*  T* YȪ ,a 2YȪ ,a Q*S۪ ,a 4YȪ Da  ū ",a $&t*(Sժ f*424*$'44*4$'2  ,a 4 ,a 2Sժ ,a 4 ,a Q*n'XȪ ,a 4 Da 4*Ȫ ,a 4"n'&YȪ (,a 2 *$':'0+$+:'0 YȪ ,a n' Ȫ ,a vLQ0+~ ,a "^$$+&Ȫ (,a *n'._Ȫ 0,a 0 *00*+:'0 c*0 Ȫ ,a 0XȪ ,a 0 Da *Q+n'S۪ ,a 0YȪ Da  $&*(S5 ,,a 0 *+0 +0.+:'0 Q+S۪ ,a 0 YȪ Da ū ,a +Sժ ,a 0 ,a .Q +"n'&XȪ (,a 0  +*0:'.:'.:'  Da *Ȫ ,a 0 n'YȪ ,a .n'Sժ ,a . ,a = ",a &Ȫ (,a *n' 4+- - :'( Q-~ ,a S۪ ,a S۪ ̫r^-Ȫ ,a "n'&((*Sū ,,a .Sժ `+ F ^  ,a ,a Sժ ,a  ,a S۪ ,a  Ȫ Da F S۪ ,a  Ȫ Da ^ S۪ ,a ~+V N f   Ȫ Da V S۪ ,a   Ȫ Da N S۪ ,a  Ȫ Da f Ȫ ,a Sɪ ,a  Sɪ ",a  +> h Sɪ ,a Sɪ ,a  SS۪ ,a c8 Da > S;D Sū "̫rh$S۪ &,a +n >  :', # 8 Da n S۪ ,a  # 8 Da > Sժ Da  ̫r Nɪ ̫r Nɪ ̫rn'"Ȫ $,a , +,,+X,:',. ,H, Ȫ ,a ,XȪ ,a , Da +QX,n'S۪ ,a ,YȪ Da .  $& ,(Q*H,  ,,d4z*.,H, S۪ ,a , d4 Sū ,a z*Sū ,a Ѫ ,a  .,"Q$H,&S۪ (,a 2, ,4z:',+  Ȫ Da   SS۪ ,a ,4Sū ,a zn'XȪ ,a , "Da $+&Ȫ V,,:'d44^^^  ,a ,n'  d4Sū ,a Ȫ ,a 4_Ȫ ,a ^Ȫ ,a ^ XȪ ",a ^ $Da  x,~,,:'^ ^ c ~,Q, n'S۪ ,a ^YȪ Da 5MS۪ ,a ^ YȪ "Da $(5M*y, ,,4:'^~,^:'4, Y ,8Ȫ ,a 4 n'XȪ ,a ^ Da ~,Ȫ ,a ^n' Ѫ ",a 4&(,*S5 .L; ,P,-`:, Sժ ,a ,a  Ȫ ,a PY ,Q-Sժ Da  ̫r`Ȫ ,a : Y ",$Sժ ,v`:T -h` $  Da v ̫r`S۪ ,a : S۪ ,a TyY  -Sժ Da h ̫r`Sժ Da  "̫r$ -T-T$H Ȫ ,a TY  - Sժ Da T ̫r$S۪ ,a ^\S۪ Da Hy +˫"$irȪ 2- hB:`  Da + irȪ ̫rh+irȪ Da B+irȪ Da :+ "irȪ $̫r` T-2$ d:) +irȪ Da 2 +irȪ ̫r$+irȪ Da +Sū ̫rd"$:) v--d/ :' Sū ,a Ȫ ,a  -S۪ ̫rdY/Sū ,a  YȪ ",a $n' -  :'.. Sū ̫rSū ,a  = ,a Ȫ ,a n'Q. ~ &,a *^,..Ȫ 0,a  -:'.P l n'^ . Ȫ ,a PSժ Da  ̫rlS;S۪ ̫r y"+˫$S۪ &,a ( -"  +˫ +˫ S;y+˫z Sū ",a $ Ȫ &Da " (Sɪ *,a  ." " " " }S; YȪ Da " S;YȪ Da " az˫pS; YȪ "Da " $S;(YȪ *Da " ,az @.lA'A'l(h. ˫p+˫ Sū ̫rlȪ ,a vLn'irȪ ̫rlirȪ Da ("$&h.(Q f..PP8+N.A'N.A' .Sժ ,a  ,a P S۪ ,a P8+Sū ,a NYȪ ,a Q. n'$s&N.(n' .B'..B' = ,a  Ȫ ,a vLQ.~ ,a "^$.&(Sū *̫r,n'0S۪ 2,a  .  ." ^\Sū ̫r  Ѫ ,a  .irȪ Da "irȪ ̫r + Sū "̫r $Sժ &̫r .L'/ /L'  ̫r= ,a Ȫ ̫rvLQ/~ ,a  $̫r(^*/,Ȫ .,a 0n'4 /(f f :) (Sū ,a  S۪ ,a  Ȫ Da f S۪ ,a YȪ Da f S۪ ,a a S"$:) 6/f ` Sū ,a S۪ ,a  YȪ Da f S۪ ,a y5MSū ,a  Sժ "Da  $̫r` X/j/` S۪ ,a !˫  Y j/Sժ Da  ̫r`:irȪ Da g"irȪ $̫r&g ~/`  irȪ Da g irȪ ̫r`girȪ Da g!Sժ ,a ",a $= (,a  ,̫r /t'\4 H4t' Ȫ ,a vL Q\4~ ,a  ̫r ,a "^$H4&Ȫ (,a *n'.Sժ 0̫r 2̫r /<5DV* S۪ ,a  <5 Sū ̫rDSժ ,a V ,a *S۪ ,a ^\Sū ̫r"S۪ $,a / ^\S۪ Da  y+˫irȪ Da +S۪ ,a ^\ +˫"$irȪ 0f (  Da +Sū ̫r S۪ ,a YȪ Da f S;y5M Sū ",a ($Ѫ &,a  D0Z0(~'. KѪ ,a  K:Y Z0Ȫ ,a (vLS۪ ,a "YȪ $Da . &* l0r0D4d4z~'lll r0QD4 S۪ ,a d4Sū ,a zn'_Ȫ ,a lȪ ,a l"XȪ $,a l &Da  00@4~'l &&004&c 0Q@4 n'S۪ ,a lYȪ Da Sū ,a &Ѫ ,a & "0$Q&04(Ѫ *,a & 00D4&-004& 0Q D4 S۪ ,a &-Sū ,a Ȫ ,a Y 0 Q"04$S۪ &,a &( 0<5H004VXX <5Sū ̫r irȪ ̫rHirȪ Da  0Q04Sժ ,a V ,a X"ժ $,a X 1* 104XX(104&  ,a * 1 Q 04Ѫ ,a XLѪ ,a X,L: "Y $(1&Q(04*S۪ ,,a & ,1f `` X1 YȪ Da f Sū ,a ` Sժ ̫r ̫rS۪ ,a `S;yY  X1"irȪ $̫r&S; R1`` DSū ̫r S۪ ,a `S;yKS۪ ,a `S;"y$(K*y,S۪ |1(104`(`  ,a (y Y  1Q04S۪ ,a `S;y 5M"S۪ $,a (&y(S۪ *,a ` 1n &n S;y KyS۪ ,a c8 Da n S۪ ,a &c8 Da n "$5M&y( 1104 1  Y 1Q 04 Sժ Da  ̫r Ѫ ,a 1Sժ Da  ̫r "S۪ $,a & 1.  2 .S۪ ̫r  y +˫irȪ Da  +Sū ̫r Ѫ ,a  "2$Sժ &Da  2 `@2  ̫r irȪ Da  irȪ ̫r +Sū ̫rS۪ ,a `S;y Y "@2$irȪ &̫r 62D`\2 irȪ ̫rD+ Sū ̫rS۪ ,a `_yY \2irȪ ̫r irȪ "̫r$+ X2> ` Sū ̫rS۪ ,a  c8 Da > S;DS۪ ̫ry+˫Sū ̫r"S۪ $,a ` z22 S;y  Y 2irȪ ̫rirȪ Da +irȪ ̫r +"Sū $̫r&irȪ 22(  ̫rirȪ Da  + Sū ̫rѪ ,a 2Sժ Da ̫r Ѫ ",a (&5M 2n l n 2 S۪ ,a c8 Da n  S۪ ,a lYȪ Da c8 Da n Ky Y "2$irȪ 2(`  Da irȪ ̫r + Sū ̫rS۪ ,a (S۪ ,a `S;y"5M$y&S۪ (,a  3n &n 03 c8 Da n S۪ ,a & c8 Da n 5MyY 03irȪ Da  irȪ "̫r$+ ,3&N $$T3N Sū ̫rS۪ ,a & YȪ Da N irȪ ̫rKz˫Sū ,a $Ѫ ,a $" $T3&S5 R3$"~'L L$3  ,a $YȪ ,a " n'Sժ ̫r ̫rLȪ ,a irȪ ̫rLKū ,a $"e$3 t3 L$L YȪ ,a irȪ ̫rL _۪ ,a $qS۪ Da y+˫Sū ̫r irȪ "̫rL 3$LL S۪ ,a $L Sū ̫rLirȪ ̫rirȪ ̫rL+irȪ Da + "irȪ $Da 3l"3ll" +Sū ̫rl S۪ ,a "Y 3irȪ Da irȪ ̫rl+Sū ̫rl"Ȫ $,a " 3Xl S; S۪ ̫ry+˫S۪ ,a X+˫irȪ ̫rl +"$z&Sū 3l\\   ̫rl_ S۪ L;\˫Sū L;\S۪ ,a  Ȫ Da S۪ ,a  YȪ "Da 4 04X3~'l0l~' _˫ S Ȫ ,a Y 04QX3n'XȪ ,a l Da "0$Ȫ &,a l(n' D4~'~'4 "4 ~' n'= ,a  ̫r ,a Ȫ ,a n' Q"4$~ *,a ".^042Ȫ 4,a 6n' z4"6 " ~'4 &4 S۪ ,a "c8 Da 6  N Da = ,a "Ȫ ,a n' Q"4$~ *,a &.^04 4$~'&6 &$~'05  Ȫ ,a $n' S۪ ,a &# 8 Da 6  Nɪ Da = ,a & Ȫ ",a $$n'(Q*05,~ 4*$5(~'*d4zf)  ,a *^ $5 Ȫ ,a (n'S۪ ,a *d4Sū ,a z "f)$Sū &,a (S۪ *,a  4 *4z*.  Ȫ Da S۪ ,a  SS۪ ,a *4Sū ,a zS۪ ,a *  Ȫ "Da . $Y  5*(<(<(6,6<( S= ,a *Ȫ ,a (vLn'Q6 ~ &,a ,*^,6.0Sū 2̫r4n' T56H, ^6Sժ Da  ̫rHS;S۪ ̫ry+˫S۪ ,a , "+˫$& x5" " V +˫z  Sū ,a  Ȫ Da " Sɪ ,a }S;"YȪ $Da " &Sū (,a V 5HVV56" Sժ Da  ̫rH Ѫ ,a VLѪ ,a V,L:Y  5"Q$6&S;*YȪ ,Da " 556VHVd5 Y  5 Q6S۪ ,a V^\Sū ̫rHS5 ,a "Ѫ $,a V( *5,S5 5H  ,a irȪ Da  irȪ ̫rHKS۪ ,a yz˫LS۪ Da y +˫"$irȪ 6HH,  ̫rH+ irȪ Da +Sū ̫rHS;T۪ ,a ,۪ ,a  d"Sū $,a  86F66 Ѫ ,a   F6Q6S۪ ,a ddSū ,a S;"۪ $,a &d(Sū *,a  `6@6HH6<( S۪ ,a S; yY 6irȪ ̫rHirȪ Da + Sū "̫rH$Q&6(n',S۪ 6V"   ,a V ^\ S۪ Da y+˫irȪ Da +S; YȪ "Da " $&q; 6.H6<(6=(=(H .+˫  irȪ Da +Sū ̫rHQ6n's 6"vL&n'*Sժ ,̫rH 6,=(:767.=(  ̫r= ,a ,Ȫ ̫rn'Q:7~ ^"67$Ȫ &,a .(n',S۪ .,a 0 7<5H.HH <5Sū ̫rH Ȫ ,a .irȪ ̫rHirȪ Da KirȪ ̫rHirȪ Da "$K *767..=(88=( :Y  67 YȪ ,a .Ȫ ,a .n'Q8~"^$8&(Sū *̫r,n' V7 " " S;  zSū ,a  Ȫ Da " Sɪ ,a  }"S;&YȪ (Da " * ~7" ^\S۪ Da  y +˫irȪ Da +S;YȪ Da "  ^\"+˫$&irȪ 7" 7"  Da +Sū ̫r S;YȪ Da " _yY 7S;"YȪ $Da " &(S۪ 7" "   Da y+˫ S;YȪ Da " +˫S;YȪ Da "  ^\"+˫$&irȪ (Da  7=(8 +irȪ ̫r +Sū ̫rSժ ̫r ̫rȪ ̫rn' Q"8$~ *̫r 88=(=( ^8 Sū ̫rn'Sժ ̫r ̫rȪ ,a n' S۪ ",a $irȪ &̫r(irȪ >88  Da :Sū ,a  Ȫ ,a Y 8irȪ ̫rS۪ ,a L irȪ "̫r$_ `8 ۪ ,a _ R ; S;:+˫irȪ ̫rS;"۪ $,a &q(+˫ 808=(|9 Sū ̫rSժ ̫r ̫rQ08= ̫rȪ ̫rn'"Q$|9&~ ,̫r0^ 8p9=(^ p9Sū ̫r n'Ȫ ,a irȪ ̫rS;DSū ̫r"irȪ $̫r&; ( 89 =( KirȪ ̫r K KyY 9irȪ ̫rS;"D$Sū &̫r(n',S۪ 9d9  ,a irȪ ̫r irȪ Da :Sū ,a Ȫ ,a Y d9irȪ ̫r S۪ ",a  &9 @ LirȪ ̫r _۪ ,a _RS;D ; "z;&(+˫*irȪ N99  ̫rS; ۪ ,a q+˫Sū ̫rQ9irȪ ̫r_ D"Sū $̫r&= t98J8J7J N  ̫rȪ ̫r vLn'"Sū ,a Ѫ ,a  ,L"Ѫ $,a (L*y,.Y 99999J 9s9 "" Sū ,a Sժ ,a  ,a s9vLS;"$S۪ &̫r(y*+˫ 9l&9$ z  z+˫Sū ̫rlѪ ,a 9 Q"$$Ѫ &,a *K 9,D: % Ѫ ,a  L Ѫ ,a LyyY :Q %"Ѫ $,a (K*S۪ ,,a :&:N%4:$F: yY  &: QN%Ѫ ,a 4:Q$S۪ ,a "$ū &Da (*F: B:T:Nb:| QѪ ,a T:QNѪ ,a b: Q"$Ѫ &,a *K,Ѫ .,a  p:~::: Ky Y  ~:QѪ ,a :Q Ѫ ",a &(:*Q,.Ѫ : :T :j:P  ,a  : QTѪ ,a :QjѪ ,a $&:(Q*,Ѫ .,a  ::|:d:s :Q  Ѫ ,a :QѪ ,a  ":$Q&(Ѫ *,a .K : ;=\; Ѫ ,a  K yY  ;Q=Ѫ ,a  ;"Q$&Ѫ (,a ,K.Ѫ ";qH; |  ,a K y Y H;Sժ Da  ̫r|:irȪ Da  g$!&Q(*Ѫ J; &;  ,a K Ѫ ,a KyS۪ ,a yY ; Sժ ",a $,a &Ȫ (,a p; @;&& Sժ ,a ,a  Sժ Da  ̫r@_qȪ ,a Y ;Q& Q"$Ѫ &,a  ; ;@%& KѪ ,a  KyS۪ ,a yY ;Q@% Ѫ ",a &K(Ѫ *,a  ;;$;z= Ky Y  ;Q$Ѫ ,a ;: irȪ "Da z$g(!*Q,= ;1 <F Ѫ ,a  K Ѫ ,a KyY  <YȪ ,a F Q"$Ѫ &,a *K,Ѫ <&<"&B<  ,a K y Y &<Q"Ѫ ,a KѪ ,a $K&y(*Y ,B< >< 1^< Q Ѫ ,a KѪ ,a KyY ^< Q"$Ѫ &,a *K,Ѫ h<z<$<#  ,a K y Y z<Q$Ѫ ,a < Q"#$Ѫ &,a *K,Ѫ .,a  <<!, Ky Y  <Q!Ѫ ,a KѪ ,a  L"Ѫ $,a (L*y,y << %<:b Y < Q %Ѫ ,a <YȪ ,a :Q ":$irȪ &Da b(g,S۪ <  ,a $" girȪ Da gS۪ ,a ygirȪ Da "g&S۪ (,a *yg.! =:(0u0udd YȪ ,a :Q ( vLn'S;zSū ̫rd"_$irȪ &̫rd(irȪ *Da  >=l=dp :Sū ,a  Ȫ ,a Y l=irȪ ̫rd_۪ ,a q S;$D&Sū b=d<d=  ̫rd_Ȫ ,a  Q <_irȪ ̫rdirȪ Da :Sū ,a Ѫ ,a $&= =<dh<}} Q<irȪ ̫rd _۪ ,a qSū ̫rhS5 ,a Q <"vL&n'*YȪ ,,a ="= B=# Q"=vL n'Ȫ ,a YȪ ,a BȪ ,a Y = ."#$_&q(S;,q ==tlT S;q Ȫ ,a Y =S;S۪ ̫rty+˫ "z$Sū &̫rl(Ȫ *,a T >?T:|> Y ?S۪ ,a T S۪ ,a :y|>:irȪ Da  irȪ "̫r$+& &> 6 irȪ Da +  irȪ Da +irȪ Da +irȪ Da 6 +"$irȪ H>  Da + irȪ ̫r+irȪ Da +irȪ Da + "irȪ $Da j> > +irȪ Da  +g!Ȫ ,a Ȫ ,a XȪ ,a "Da $>&Q >>" > >n' S۪ ,a  Ȫ Da " n'XȪ ,a Da > Ȫ ",a $n'(* Ȫ >" " " "   Da " S) _  Ȫ Da " S)S; Ȫ Da " S) S;$ Ȫ &Da " (Sɪ *,a ,S;0 Ȫ >" " lll  Da " S) YȪ Da " ESū ̫rlirȪ ̫rlzSū ̫rl"vL&t!  xQ2? CB.TSK Memory allocation map TKB 09.105 Page 1 5-JUN-86 15:15 Task name : ..CB.. Partition name : GEN Identification : V02.06 Task PPN : [100,198] Stack limits: 001000 001777 001000 00512. PRG xfr address: 137730 Task attributes: MU Total address windows: 3. Task image size : 1312. words Task address limits: 000000 005037 R-W disk blk limits: 000002 000007 000006 00006. R-O disk blk limits: 000010 000115 000106 00070. *** Root segment: CB R/W mem limits: 000000 005035 005036 02590. R-O mem limits: 040000 145577 105600 35712. Disk blk limits: 000002 000007 000006 00006. Memory allocation synopsis: Section Title Ident File ------- ----- ----- ---- . BLK.:(RW,I,LCL,REL,CON) 002000 000000 00000. BP2OTD:(RO,D,LCL,REL,CON) 040000 000722 00466. 040000 000006 00006. $STCVT 10CM B23OTS.OLB 040006 000006 00006. $FINT 06CM B23OTS.OLB 040014 000020 00016. $ICRED 61RE B23OTS.OLB 040034 000016 00014. $STMOS 26CM B23OTS.OLB 040052 000054 00044. $STPDB 27RE B23OTS.OLB 040126 000034 00028. $IESYS 36RE B23OTS.OLB 040162 000034 00028. $FUNC2 11CM B23OTS.OLB 040216 000014 00012. $IVOPN 63RE B23OTS.OLB 040232 000152 00106. $BINIT 106RE B23OTS.OLB 040404 000272 00186. $ERROR 119RE B23OTS.OLB 040676 000004 00004. $ECONV 30CM B23OTS.OLB 040702 000006 00006. $BXTRA 06RE B23OTS.OLB 040710 000002 00002. $OVSG2 04CM B23OTS.OLB 040712 000002 00002. $OVSG3 04CM B23OTS.OLB 040714 000002 00002. $OVSG1 04CM B23OTS.OLB 040716 000002 00002. $OVSG4 04CM B23OTS.OLB 040720 000002 00002. $ERROT 103RE B23OTS.OLB BP2OTS:(RO,I,LCL,REL,CON) 040722 037376 16126. 040722 000036 00030. $EMISC 06CM B23OTS.OLB 040760 000502 00322. $FADD 12CM B23OTS.OLB 041462 000030 00024. $JADDS 03CM B23OTS.OLB 041512 000046 00038. $LADDS 03CM B23OTS.OLB 041560 000044 00036. $BTDID 05CM B23OTS.OLB 041624 000200 00128. $SSSUB 10CM B23OTS.OLB 042024 000030 00024. $SSCST 03CM B23OTS.OLB 042054 000070 00056. $STFN1 06CM B23OTS.OLB 042144 000406 00262. $CNTRL 16CM B23OTS.OLB 042552 000104 00068. $JCON1 14CM B23OTS.OLB CB.TSK Memory allocation map TKB 09.105 Page 2 CB 5-JUN-86 15:15 042656 000230 00152. $CHANG 04CM B23OTS.OLB 043106 000226 00150. $FCON1 22CM B23OTS.OLB 043334 000150 00104. $FMOV 04CM B23OTS.OLB 043504 000054 00044. $LCON2 05CM B23OTS.OLB 043560 000140 00096. $JMOVS 07CM B23OTS.OLB 043720 000124 00084. $FCMP 02CM B23OTS.OLB 044044 000040 00032. $JCMPS 03CM B23OTS.OLB 044104 000136 00094. $STCMP 04CM B23OTS.OLB 044242 000014 00012. $JCOMP 04CM B23OTS.OLB 044256 000320 00208. $STCOS 04CM B23OTS.OLB 044576 000446 00294. $STCVT 10CM B23OTS.OLB 045244 000056 00046. $TIME 12RE B23OTS.OLB 045322 000034 00028. $JNCR 05CM B23OTS.OLB 045356 000204 00132. $FUNC4 01CM B23OTS.OLB 045562 000036 00030. $JDIVS 04CM B23OTS.OLB 045620 000160 00112. $ICFLD 07CM B23OTS.OLB 046000 000026 00022. $ICEND 07CM B23OTS.OLB 046026 000230 00152. $ICEOL 21CM B23OTS.OLB 046256 000654 00428. $ERTHR 75CM B23OTS.OLB 047132 000426 00278. $ICINI 25CM B23OTS.OLB 047560 000102 00066. $FINT 06CM B23OTS.OLB 047662 000642 00418. $STFNS 14CM B23OTS.OLB 050524 001562 00882. $ICRED 61RE B23OTS.OLB 052306 000030 00024. $LOADS 02CM B23OTS.OLB 052336 000220 00144. $ICRFG 13CM B23OTS.OLB 052556 000200 00128. $ICRPT 14CM B23OTS.OLB 052756 000202 00130. $STLSS 08CM B23OTS.OLB 053160 000126 00086. $BMOVS 07CM B23OTS.OLB 053306 001056 00558. $STMOS 26CM B23OTS.OLB 054364 000024 00020. $JMUL 01CM B23OTS.OLB 054410 000112 00074. $JNEXT 02CM B23OTS.OLB 054522 000072 00058. $STNMF 11CM B23OTS.OLB 054614 000242 00162. $IEMSC 15RE B23OTS.OLB 055056 000666 00438. $ICWRT 42CM B23OTS.OLB 055744 000224 00148. $ICWR1 02CM B23OTS.OLB 056170 000200 00128. $ICRCL 17CM B23OTS.OLB 056370 000226 00150. $ICFNS 11RE B23OTS.OLB 056616 000356 00238. $ICROP 50RE B23OTS.OLB 057174 000236 00158. $SWPST 06CM B23OTS.OLB 057432 000676 00446. $STPDB 27RE B23OTS.OLB 060330 000030 00024. $JSUBS 03CM B23OTS.OLB 060360 001740 00992. $IESYS 36RE B23OTS.OLB 062320 000374 00252. $FUNC2 11CM B23OTS.OLB 062714 000044 00036. $TESTS 04CM B23OTS.OLB 062760 000746 00486. $IEULT 32RE B23OTS.OLB 063726 000070 00056. $STVLF 20CM B23OTS.OLB 064016 001070 00568. $IVOPN 63RE B23OTS.OLB 065106 000000 00000. $ICIO0 08CM B23OTS.OLB 065106 001404 00772. $BINIT 106RE B23OTS.OLB 066512 000154 00108. $SSOFF 04CM B23OTS.OLB 066666 001116 00590. $STMSC 28CM B23OTS.OLB 070004 000222 00146. $STGTA 04CM B23OTS.OLB 070226 000124 00084. $STXCM 02CM B23OTS.OLB 070352 001754 01004. $ERROR 119RE B23OTS.OLB 072326 000112 00074. $ICULT 05CM B23OTS.OLB CB.TSK Memory allocation map TKB 09.105 Page 3 CB 5-JUN-86 15:15 072440 000054 00044. $FFIX 04CM B23OTS.OLB 072514 000266 00182. $JCONV 03CM B23OTS.OLB 073002 002404 01284. $ECONV 30CM B23OTS.OLB 075406 000260 00176. $ICFSS 32RE B23OTS.OLB 075666 000446 00294. $LCONV 05CM B23OTS.OLB 076334 000150 00104. $IMALQ 14CM B23OTS.OLB 076504 000070 00056. $PROCT 00CM B23OTS.OLB 076574 000054 00044. $BXTRA 06RE B23OTS.OLB 076650 000062 00 050. $ICCRL 00CM B23OTS.OLB 076732 000002 00002. $OVSG2 04CM B23OTS.OLB 076734 000002 00002. $OVSG3 04CM B23OTS.OLB 076736 000002 00002. $OVSG1 04CM B23OTS.OLB 076740 000002 00002. $OVSG4 04CM B23OTS.OLB 076742 000000 00000. $BFPEI 06CM B23OTS.OLB 076742 000114 00076. $ERROT 103RE B23OTS.OLB 077056 000242 00162. RQLCB 69CM B23OTS.OLB 077320 000000 00000. $RUNDN 01CM B23OTS.OLB 077320 000002 00002. $MTRET 01CM B23OTS.OLB 077322 000646 00422. $IMGSA 15CM B23OTS.OLB 100170 000100 00064. $CCTRP 27RE B23OTS.OLB 100270 000004 00004. $BFPER 06CM B23OTS.OLB 100274 000024 00020. SAVRG 69CM B23OTS.OLB CBLIST:(RW,D,GBL,REL,OVR) 160000 011004 04612. 160000 011004 04612. CB V02.06 CB.OBJ USERRD:(RW,D,GBL,REL,OVR) 002000 000102 00066. 002000 000102 00066. CB V02.06 CB.OBJ $ARRAY:(RW,D,LCL,REL,CON) 002102 000000 00000. 002102 000000 00000. CB V02.06 CB.OBJ $CODE :(RO,D,LCL,REL,CON) 100320 037410 16136. 100320 037410 16136. CB V02.06 CB.OBJ $CODEI:(RO,I,LCL,REL,CON) 137730 000012 00010. 137730 000012 00010. CB V02.06 CB.OBJ $FLAGR:(RW,D,GBL,REL,CON) 002102 000000 00000. 002102 000000 00000. CB V02.06 CB.OBJ $FLAGS:(RW,D,GBL,REL,CON) 002102 000002 00002. 002102 000002 00002. CB V02.06 CB.OBJ $FLAGT:(RW,D,GBL,REL,CON) 002104 000000 00000. 002104 000000 00000. CB V02.06 CB.OBJ $ICIO0:(RW,D,GBL,REL,OVR) 002104 000102 00066. 002104 000000 00000. CB V02.06 CB.OBJ 002104 000000 00000. CB V02.06 CB.OBJ 002104 000102 00066. $ICIO0 08CM B23OTS.OLB $ICIO1:(RW,D,GBL,REL,OVR) 002206 000200 00128. 002206 000200 00128. CB V02.06 CB.OBJ 002206 000200 00128. CB V02.06 CB.OBJ $IDATA:(RW,D,LCL,REL,CON) 002406 000460 00304. 002406 000460 00304. CB V02.06 CB.OBJ $PDATA:(RO,D,LCL,REL,CON) 137742 005626 02966. 137742 005626 02966. CB V02.06 CB.OBJ $STRNG:(RW,D,LCL,REL,CON) 003066 000310 00200. 003066 000310 00200. CB V02.06 CB.OBJ $TDATA:(RW,D,LCL,REL,CON) 003376 000000 00000. 003376 000000 00000. CB V02.06 CB.OBJ $$BP2 :(RW,D,GBL,REL,OVR) 003376 001440 00800. 003376 001440 00800. CB V02.06 CB.OBJ CB.TSK Memory allocation map TKB 09.105 Page 4 CB 5-JUN-86 15:15 $$RESL:(RO,I,LCL,REL,CON) 145570 000000 00000. Global symbols: ABD$ 040752-R CLF$P 043406-R ECS$01 044114-R LEQ$ 052310-R MOI$IA 043612-R OGB$ 046600-R SUF$MS 040770-R ABF$ 040752-R CLF$S 043346-R EDB$M 045404-R LFN$ 052336-R MOI$IM 043606-R OGS$ 046634-R SUF$PS 040764-R ADD$ 041032-R CLI$ 043550-R EDD$M 045432-R LFR$ 052352-R MOI$IS 043574-R ONI$A 043670-R SUF$SS 041012-R ADF$MS 041002-R CLI$A 043650-R EDF$M 045424-R LFT$ 050006-R MOI$MA 043634-R ONI$M 043662-R SUI$IM 060344-R ADF$PS 040760-R CLI$M 043644-R EDI$M 045416-R LGE$ 052320-R MOI$MM 043630-R ONI$S 043654-R SUI$IS 060340-R ADF$SS 041016-R CLI$S 043640-R EDL$M 045424-R LGN$ 052372-R MOI$MS 043624-R PEE$ 054746-R SUI$MM 060354-R ADI$IM 041476-R CLL$A 043402-R EDR$M 045460-R LGR$ 052412-R MOI$SA 043570-R POS$ 050274-R SUI$MS 060350-R ADI$IS 041472-R CLL$M 043372-R EDS$M 045466-R LGT$ 052316-R MOI$SM 043564-R PVD$SI 055056-R SUI$SM 060334-R ADI$MM 041506-R CLL$P 043406-R EFL$ 045766-R LIN$ 046256-R MOS$AA 053570-R PVF$SI 055070-R SUI$SS 060330-R ADI$MS 041502-R CLL$S 043346-R END$ 046000-R LIS$ 047222-R MOS$AM 053514-R PVI$SI 055234-R SWE$ 062332-R ADI$SM 041466-R CMF$MM 044002-R EOL$ 046026-R LIT$ 047324-R MOS$AP 053530-R PVL$SI 055744-R SWI$ 041620-R ADI$SS 041462-R CMF$MP 043756-R EQI$ 041572-R LLE$ 052306-R MOS$AS 053306-R PVS$AI 055104-R SYS$ 060360-R ADL$MS 041520-R CMF$MS 043724-R ERL$ 046444-R LLT$ 052332-R MOS$MA 053674-R RAD$ 047662-R TAB$ 056370-R ADL$PS 041530-R CMF$PM 043776-R ERN$ 046424-R LMA$1 053052-R MOS$MM 054016-R RCL$ 056170-R TET$ 042702-R ADL$SS 041512-R CMF$PP 043752-R ERR$ 046462-R LNE$ 052330-R MOS$MP 053756-R RCT$ 056426-R TIM$ 045244-R ANI$ 041564-R CMF$PS 043720-R ERT$ 046474-R LPC$ 052570-R MOS$MS 053346-R REG$ 042300-R TJK$ 062320-R ARI$M 041624-R CMF$SM 044012-R ERT$X 046522-R LPN$ 052556-R MOS$PA 053700-R RFN$ 052342-R TRM$ 044576-R ARI.M 041626-R CMF$SP 043766-R EXTSP 077732-R LPR$ 052622-R MOS$PM 053522-R RFR$ 052362-R TSB$ 053250-R ARR$ 041636-R CMF$SS 043740-R FIF$ 072440-R LPT$ 052606-R MOS$PP 053752-R RGN$ 052376-R TSD$M 062726-R ARS$C 042024-R CMI$IM 044064-R FLD$ 045670-R LSS$AA 052762-R MOS$PS 053336-R RGR$ 052422-R TSD$P 062736-R ARS$M 041624-R CMI$IS 044060-R FLN$ 046256-R LSS$AM 053002-R MOS$SA 053566-R RIT$ 050054-R TSD$S 062714-R ARS.C 042026-R CMI$MI 044074-R FPUERR 002204-R LSS$AP 052756-R MOS$SM 053436-R RLI$I 043600-R TSF$M 062726-R ARS.M 041626-R CMI$MM 044100-R FSS$ 075610-R LSS$MA 053032-R MOS$SP 053366-R RLI$M 043574-R TSF$P 062736-R ASC$ 042112-R CMI$MS 044070-R GSC$ 042170-R LSS$PA 053026-R MOS$01 054130-R RLI$P 043624-R TSF$S 062720-R BEQ$ 042344-R CMI$SI 044050-R GSU$ 042144-R MAD$ 067764-R MSI$IM 043606-R ROP$ 056626-R TSI$I 062732-R BGE$ 042354-R CMI$SM 044054-R ICI$M 045326-R MGT$ 054766-R MS1$01 053342-R RPC$ 052572-R TSI$M 062726-R BGT$ 042352-R CMI$SS 044044-R ICI$P 045332-R MIS$ 050154-R MUI$IS 054376-R RPN$ 052562-R TSI$P 062736-R BLE$ 042342-R CMS$AA 044130-R ICI$S 045322-R MOB$MA 053230-R MUI$MS 054372-R RPR$ 052634-R TSI$S 062722-R BLT$ 042364-R COI$MS 044242-R IFL$ 045620-R MOB$MM 053160-R MUI$PS 054364-R RPT$ 052614-R TSL$M 062750-R BNE$ 042362-R COI$PS 044250-R III$ 047364-R MOB$MP 053202-R MUI$SS 054400-R RSI$M 043624-R TSL$P 062744-R BRA$ 042356-R COI$SS 044244-R IIN$ 047256-R MOB$MS 053214-R NDI$M 054504-R RSI$P 043616-R TSL$S 062720-R BUF$ 056574-R COS$AA 044312-R ILI$ 047344-R MOB$PA 053170-R NDI$P 054500-R RSM$ 046314-R ULK$ 062760-R CBI$ 053276-R COS$AS 044444-R ILS$ 047240-R MOB$PM 053234-R NII$M 054464-R RST$ 047132-R USE$ 062556-R CCE$ 100170-R COS$SA 044256-R INF$ 047560-R MOB$PP 053242-R NII$P 054460-R RSU$ 046326-R VLF$ 063726-R CCP$ 056452-R COS$SS 044362-R INS$ 050312-R MOB$PS 053222-R NMA$ 054614-R SEG$ 050140-R VRI$M 041654-R CCTRP 100200-R CVT$ 044602-R IOI$ 041560-R MOB$SA 053174-R NMA$1 053154-R SGD$ 040722-R VRI.M 041656-R CCX$ 100230-R DAT$ 045262-R IPR$ 047404-R MOB$SM 053162-R NMF$ 054522-R SGF$ 040730-R VRS$C 042024-R CFI$ 042560-R DCI$M 045344-R IPT$ 047410-R MOB$SP 053204-R NOBRA 042346-R SLP$ 054736-R VRS$M 041624-R CFL$ 042552-R DCI$P 045350-R IRD$ 047140-R MOF$MA 043454-R NOI$A 043712-R SPC$ 042054-R VRS.C 042026-R CHA$ 042656-R DCI$S 045340-R IVF$A 050524-R MOF$MM 043442-R NOI$M 043704-R SPC$01 042054-R VRS.M 041626-R CHR$ 042134-R DCL$ 045356-R IVI$A 050636-R MOF$MP 043462-R NOI$S 043676-R SSD$ 057260-R WAT$ 056554-R CHS$ 042762-R DII$IS 045574-R IVS$A 050676-R MOF$MS 043354-R NSS$AA 053120-R SSF$ 057224-R XOI$ 041574-R CIF$ 043106-R DII$MS 045570-R JMC$ 042244-R MOF$PA 043474-R NSS$MA 053144-R SSI$ 057174-R $ABNEX 071174-R CIL$ 043504-R DII$PS 045562-R KGE$ 042776-R MOF$PM 043470-R NSS$PA 053140-R SSL$ 057224-R $ADFPS 041004-R CLB$M 053272-R DII$SS 045576-R KIL$ 054706-R MOF$PP 043500-R NVI$M 054424-R SSS$ 057206-R $ATLIN 072042-R CLB$S 043640-R DOP$ 056616-R KTI$ 041610-R MOF$PS 043366-R NVI$P 054410-R STF$ 054536-R $ATOD 073002-R CLF$ 043214-R DPF$ 043334-R LAM$1 053004-R MOF$SA 043412-R N1F$ 054552-R STP$ 057432-R $ATOI 072514-R CLF$A 043402-R DPI$ 043560-R LAM$2 053010-R MOF$SM 043426-R OEA$ 046550-R STR$ 042062-R $ATOL 075666-R CLF$M 043372-R ECS$AA 044104-R LEN$ 042102-R MOF$SP 043436-R OEG$ 046530-R STS$ 056440-R $BALBF 076400-R CB.TSK Memory allocation map TKB 09.105 Page 5 CB 5-JUN-86 15:15 $BALMP 076362-R $CLSFQ 063654-R $EXTSP 067034-R $GTPTR 067170-R $MNIUS 067640-R $PRNSP 055522-R $STMVX 067340-R $BCL 064700-R $CLSHD 056336-R $FLSAL 046070-R $GTROM 066666-R $MNSUB 067704-R $PRNTL 055540-R $STXCM 070226-R $BINPT 063526-R $CLSTK 067402-R $FLSFR 046100-R $GTR01 070004-R $MSG 060154-R $PROCT 076504-R $SYSHD 071040-R $BOFS 064056-R $CLXRB 063510-R $FLSNL 046116-R $GTR23 070110-R $MTPSP 055040-R $PSMSK 042370-R $VALDC 072344-R $BOP 064016-R $CMR 043740-R $FLUSH 046126-R $GTSTN 067072-R $MTRET 077320-R $PSM1 046756-R $VALID 072326-R $BOPX 064034-R $CNVIA 072704-R $FMAXD 040676-R $GTSTR 067156-R $NOREX 071276-R $RAD50 047706-R $VREAD 063020-R $BOUTP 063110-R $CNVLA 076162-R $FNDMS 046676-R $ICIO0 002104-R $ODDAD 076752-R $RELCB 077056-R $XWRT 063550-R $BREAD 063244-R $CRLF 055366-R $FPASX 100272-R $ICJM1 072410-R $ODDA1 071450-R $REQCB 077160-R $$DAT 045274-R $BRTBF 076466-R $DATRC 066464-R $FPHSK 100270-R $ICRCM 052504-R $ONERG 070676-R $RSU2 070352-R $$MAXC 000017 $BRTMP 076446-R $DATRS 066442-R $FPUER 076742-R $INITM 065106-R $OTSVA 003376-R $RUNDN 077320-R $$TIM 045256-R $CALFP 063662-R $DBOUT 060022-R $FRCER 076762-R $INPTT 051300-R $OVSEG 040714-R $SAVRE 100274-R .NLUNS 040720-R $CALIN 072032-R $DMAXD 040700-R $FSS 063576-R $INTCM 066270-R $OVSG1 076736-R $SETCC 100222-R ..CRLF 076616-R $CCHDL 076772-R $DOIT 072260-R $FSSCN 075406-R $IOERV 072312-R $OVSG2 076732-R $SETSC 066116-R ..PMD 076614-R $CCXIT 077054-R $DOIT1 072302-R $FSSCZ 075410-R $IOTST 063672-R $OVSG3 076734-R $SETUP 055434-R ..PTXT 076622-R $CFLY 042564-R $DTOA 074164-R $FTOA 074116-R $IR 042560-R $OVSG4 076740-R $SPEC 062772-R ..RSTT 076574-R $CHKRL 076650-R $DTOAX 074170-R $FTOAX 074122-R $ISETP 051144-R $POM1 047026-R $SSOFF 066512-R ..SVFQ 063704-R $CLFQB 063466-R $ERRTR 076742-R $GSACM 076334-R $I4ER 050616-R $POS 056470-R $STCRE 067274-R $CLOSR 056202-R $ERRT1 070366-R $GSA1 077322-R $MEMPR 076756-R $PRLIN 057604-R $STCRX 067300-R $CLSAL 056350-R $ERTXT 071332-R $GTPTN 067102-R $MEMP1 071466-R $PRMPT 060176-R $STMOV 067326-R *** Task builder statistics: Total work file references: 187425. Work file reads: 0. Work file writes: 0. Size of core pool: 7540. words (29. pages) Size of work file: 6144. words (24. pages) Elapsed time:00:01:18 y2?~PԳDm HA HA.wHAC;H:C~ժHFC۪HBCūH6C˫H2C۪HPCSHXC˫HJCyHtC ȪHC HC" HC# 8HD# ȪHC# xHD# HCh~; HJDY HD HD HDeHDtHDHDQHDH|]HV=HxHH*]LsHPHHpEo~HjEHEH\DHE.HFF4HDGȪHVHGHFHGȪHF@HGHFHhGHG~ȪHGHGHGȪHF@HGHFժHHتHG۪HGMHGPHGSHGūH HȫHG˫HG~5H4H;H0HѪHNHtE@GH}D*(H6gD`H\DvH\DwHgDxH\DyHoDҘHHgEpHGFHuFaHr|~JKHZaH4maH"mbaH`o`;Hto;Htt]Htxt^HxxsH}sHpԀHrHnvH8LwH@LxHNL4~@HVLHMP H5HH}©H}évH~géFwH{éRwH{ĩ]HNxĩ^HRxH| H~.gHBn2gHxn3~rHmOuHp쩡uHHpyH:nyHnn+@Hu+qHDU6m;HFj64gHR6}Hl7&"Ht7 Hg:HpE;p"HdRJ"HQ~ͪSH}ͪSH6s֪;Ho֪ zHo۪+Hl`ܪgH Zܪ\qH~`qHr,H}GH(s&"Hq.wH}.wH}.wH}.wH})~OVHNOvH8]RvLH_RSH~`RZHR[RZH`[RL^HD}SCTHDSVHMHOzKH.~jHp~@Hp.XH~UH~{}HHNlXH[ȫHe˫^HJm̫Hn̫Hn̫SHn̫THn̫HpѫxH r1KHt1lLHtBlHfsHhg~` HJ H:HJcfrH}pQH}pԀH}ryH|}sHg(""H+:HD,1zH$9!H:brH:HT; zH[H,A.sH&,0zH*5 H. HsH( 2?e^ @ ؿ4xc,? ? )) Ve^@.V8??II Vؿ .SYSYSYSYTICLPԳddؿr ԳPԳ~~}}}}A~}}}}}HfVghiffHfHfe dnqs`ʉ&(|+Ȋ0Z ʎ ԏ >  & ֑0 .z\Hޚ2ZPf|pd,1f36̠ޡ衟0<֢&)֤+D.0ƥDڥNSX,LF@n4!!"%"H&n&&&<&f$'֪:'hA'B'jL't'~~'*<(=(8JL9J0u}tҿe^jL2? e^I@H4x GOO,   UPV*VlV StopWhat ? at line in SUB: statement bJabzbbdab4a6a e8e(eLef z 2  9 3#1#N , #)'#% 6 c f ~ C`B@  @  N\  $ Tv v N e\we 0 0 \ # ^\% 5^5^  0 9 Jנ'נ", &D ŀ @U͋  N ͥ   6  jwew.*@   \ \95^;A5U^f   `p00f j  @ѠѠɋ \*  `  0 5@^ 42 42 Eנ נ *5  5^DE^0  \ɋɥɥ ?ɥSɥ PɥEɥ C  f J!E^5`685`5 C5^&`W&"U^ p @ɋɥ   a0  Pɕ t Bp 0 6 ɵfŀ@Sˋŀ  5^ &U^q S  p/ & \\ H P P (& & 0 06  *,0 h 3hNA %H `~ 4\  8& &    @ @6  $*,0 h& 1h00A \  % B   @A  ~~ R\  &  & &\&\& \&\@&&%%3 \\f\  (  w*J, J, 1@Bw *U@ r E@`E@\ wwZ*C, C,w N& # * ,  ,&  & & X K& @ & @*, , ]* @, @,w" \     t  w~B .5`*5`5`"5^ E` $@S ˋ5^ 5^ W W   f&    c w&pf\ H`"wH`"w \"w \"w<      H ʥ  w0 t  j!  T!~ߕ : 8!ߕ  \"\" " \ 5`A U  2 *##  $\  ><  6  5^5@^I *0,&U^5` 5`0 f f ` *  h   .pXC `U^5^ lp \0 f5`U^wJ  F *X5 ~     U^ ʥ 0 fʥ  fl   f f E~*@@ , w*&h\*&f\  \5^f 0 f 3\VӋf*x0 x\ b& &\A A W . * ̵C" $& `55E8U ` U` P`\ 04 e$   WpeD`~\l r ef\*U@ Rf&*E@\v v  v v\ e , , e E`* x*@0  P5"& x 2ɥ  ~Cנa åCåEwwD \ 6@  * I@ d *#l%%%, @@ ~ѕ ѕ ѕ * N SS *ÜC ( *  /@ w* w #  *ÜC (  * K*B (`\\\\\\ T   zL@ W $_%U 7 _"_$&2XW *"w^ W  "." wx W @" K    *$h  a w   ŗp h  W B~  6 >0&CÊҐ"~ w0 wxW  (wPU w,&f& X "a w R& ~ !   !"$ ߋ.‹&E 5 ^0 * $$  ` %ߋ 4 ߋ dd%*,F%0  ( ~"~  B~\ < ! Ë  !"Ë+  D̋ԕ U̐e  ~‹ E 0i@΋ ȋЧ  C c#ce$ S~ %wT wT*p$ @@myr@*U@*E@E\S J" ^ D y@  $  r *@- @- @` EU \ \ \ \&R\ Ìf"   .f \!! ק *$h $&f& "h!!!0 h J0! ! 敠^*.,,!*!,!\Ɍf&5^ h!! !*_x,0 h&&*&,&&fp*p,p 21@A@ ,*f"! W 0# "\?     SS  4-.h  ߕ_ & 0~ n`  4 *$J J N \2\i5`&&   B 33 3UU e@@R U3P*˕ *%  ˕˕ ˕U U^˕  *fœ0U^E ^0\5`U`HHV  BE E U` \ e Xp5 ^U ^\ ^+5^ 5^#X ff* ,0 , 5` \ ^ߕwpwf   r E @)N  @&?e& e # j@ @ A *0 wE A* B~*e e !3&e &s s 3  ~ 6 ~3@ TI,*—)0ՀHHVpTppX0^U`E^eEW s`3"35"C *B @ 3 3see@`ei A   ~E jle2R ae>RR   ;ze<t 2E~ 5e0DeN *3$ 33 L\3 ~ ~ ~R~3 H  dW(1\  p *A&&    e "&f &f qfqeCaB a w qfqe  FE7  *U@eB B  jB B f &~Wtu` B " b 6we? WtE & fY  D  H&*U@v&*E@v B* U@fB eEB `e E@o  f&    \ `5B~ E B~ >f&*  ##   E b# 'f&B f ##! B EB BH#*u  f&*e@     | &f*@, @,  E@` `& \@A!*, , 3@sB@` Ee@"f*B, B, DF` EeDJe&*U@%v  E` E`  B&*E@ \l\  % *p^0b0$%l, $Hv  H5W 0W 2W 6 W =W W 0 ?0   R54U W HW )H&E2E5p00.wBA Ub , & ڀ 0eb  5Ee  6& & i5@ *e&B~*I5& *5& "x3& Vԕ ^Eє~ ~ARM-   6&?A6%eζ  B*Uє ee: CtEe0  Q: *wlŘ   ѕ"єBѕ" AAQ &#A&*A f e `~  e3A *~ѕ"ѕ ѕ * :f*eQe SS  *U  W  * B`.*"&`EUC`{C  %  v vf&\  6% % e@ "N' E`  Aa A@^   A ^EW W  &  ѕ-ѕ  r e0 ~ѕ e& & & *2f&&& %W% % U@     ~ p`D A @ 逎     5 Je)f W+W-W W0W9f  )m&  w    נ נ E     CPQCQ<m     p   z &   5@  B5eN N .E D A @  eb" d$    D A @ &f&f eD A @ eA @ e@ e&f&f  %PeE <%PeE D A @ E@ 6 6 L  @&f& & 6v*v6 6 @   U*2 &C ^ N    5  6 c6 m  6#m    m  6ඌ c& ʕ ʕ- F   E@ U0Ґ *ခ  ,W >ҕ C eH ~ %%K ` ҕ.  ҕ0 eҕE+-  Ґ s e0e0RCD`CE ~ ʥ0ʥ.%ʕ0 U r#.h-*.f,*W0 U ߗ _ 5$h  $ #.h  f` b w&*0   h% % e@ RNA& & D 6N D D eD eAaD e   f6*DI  D   D 慡Eť ť  &f    ӕ-ӕ A s&DE s& sA ae0 f  ~ӕ ew *" ~& & pTppXjwTjw&*5@U@ &*E@E  ( $A0% % % %      w w:wD@f* A"_*E5@Uw eE D` bl lrw H  B eE"s    s-  Cslw  wwD&*&e& :5 ACCl  rf*e <eEf (*p`E  B~ U@eB B  `B B f ,wWtu` B " b &wpe? WtE & fYf&B f ##! B EB BH#*u *5@ U@ E@E & \*A"C *5"  &f  B6dBCB L LLdLnLnXMPJW|GY|GtC|KtG|GY|G2CY|G2CYtGGC|GtCtGG|GtCtG|G\DW|G\D|G\DHW|G\DWG\DWGɆ^HG|G8HGDZLGCH|GtCeDʉGO|G8DZLLLeD|Gl]eDD]*L&L&GN|GQLGHGtCeDFGO|GDZL|GGPW|G|G$XHT|G|GXHTpCGtCeD|DL(|G\DG|GXHDȊGHtGGO|GDZLD`|GG|JPW|GGBC|,PWL |G|GXHDTD|GgAFFtGzDjJ>4Y>\DL&G>Ct(HTG>Ct(HcTpCeDG><G<DΪL&4Y>\J>L&GO|GpDZLG@GXGXJtGT_L&KL$'DhdMdG L$'G:J:4Y:DTL$'G:Ct(HcD$G8G D`G:Ct,HDDG:8G: D`L$'4Y:J:L$'G8G L$'K L:'DdMG L:'G6J64Y6濚D⫮L:'G6Ct(HcDG6DҫG6Ct,HDҫG64DꫮL:'4Y6濚J6L:'G4L:'G4 neK L:'D~dGVMjGL:'JvtGGGGC(˔GC@˔GC8˔GC0˔GCHˤGGGGGGV|VGD |GIWGDP˔GD XVVL:'G2J24Y2ĬD(L:'G2C(HDܬDG2J4tGJުtGGf|GtCeD|G>|GzHW>GfGtCeD,|G>|GJHW>GD |GIV>^HW>Gf|GtCeDl|G>|GHG|GNHW>|G>|GHW>HW>G.Gf|GtC(HTtCGDP˔G,DPXHTtCeD|G|G>HW>G,C0|G>BD`tG*|GHG|GHG|GHWG(eD|G|GHWG(|G\DV^HG^\DHG|GHG`WGhGF\JCG\G"Ch˔G"ChˬGhGJC Ge&DD(L~'4YrfJrL~'L~'ne$"K L~'Dbd (MVG&L~'G(DVlne(K&L~'Dd ,MG*L~'G,DVlne,K*L~'Dd 0MG.L~'G0J4tGJ6tG$G$Ct˔GV|VG0JjtGG0C˾GV|Vne0K.L<(L<(Dd2MFWL<(XMX~|G\DV^HG2\DHG\DHG`GEtGC˜GE|GCtG\X~ +SPY+SECRET ) (OPR/BCOffOn0..CB.. CB  is ().**User #: (Involuntarily)N DETACHing\ABORTINGhleavingt?SPR - No OPN?Users count : Lines sent : CBLIB Version : Last use Time: Last use Date: Last init Time: Last init Date:  Statistics"CB * **CB open**: **CB closed**L#**CB is closing, please finish up**t at |**Detaching from terminal** **??Privileged operation??****??Nothing to send??**JOB UPPER ONLYPPNSPYKB^C^Z**??No BG available??**0**??BG Aborted*??**H **BG OFF**V**??BG busy??**j**??Bad Password??**?Invalid entry**BG has no I/O** **BG ON**HELLO Password:PK**??Logins disabled??****Request sent** **??Bad KB number??**&Enter CB on Channel # @ - H **CB - User: Z**??KB in CB??**n!**??Job Detached-Cannot /KILL??****??Job not in CB??****??Illegal Job number??****??Illegal Channel??** KILLed****Job #Det /KILL aborted!Y"Really KILL job #8**WIDTH set to L**??No HELP AVAILABLE??**j CBHLP.DOC/ROz%**??Multiple indirect NOT ALLOWED??****??Bad file??** No users Mon:  Wdth: NoneBG UPR SPY PSWD PPN KB JOB Att: (Talk: 2 [8CB is CLOSED L CB User list:^No Users on this channelz, PSWD, TalkMonitor][#ILL:Users on Channel #**??40 - ***??Cannot UNMONITOR your TALK channel??** '??****??Illegal MONITOR channel '6**Monitoring channels: R**??Not monitoring channel r reset ****All channels except ??****??Already monitoring channel -,**Talking on channel  , Type '/HELP'??** **??Invalid CCL J^^.^^.^^.WA.LI.^^.HE.^^.KI.^^.^^.^^.^^.^^.^^.^^.^^.^^.^^.^^.TI.DA.CL.OP.STnJTA.BR.MO.WA.LI.AT.HE.WI.KI.EX.CA.XE.KB.SP.PP.UP.JO.AL.RE.DE.TI.DA.CL.OP.ST^^.*HHELLI****CB - /@/AT /XEQ ..<>"!(;. _KB:CB.CMD<>BTH@CB.INIT @LB:CB.INIb) has signed on to CB**~ (**New User - Job #**??Login PLEASE??****??'Handle' IN-USE??****12 character max**/HIDE/CLRHandle **??CB closed??**NONE & NONE 4%Initializing CBLIBL?Contact SYSTEM Manager......n CB version: ~?CBLIB version: %?CBLIB version NOT compatible with CB  CB -  LB:CBPRIV.CBUSER8V02.06@)@)9 @y@@yD@D@:D@D@:@: CK TH)`@@Ax?FxGAxGxG xG@TA' &TTTxGxG@TkcTDk$DcDGDDkc!TkTk@TA'~Lk@TA'@&T@TA'jB'RTq@%-[8B'Rk<c-EF<T[xG'xT|+[GxG,x$Gk-E!TP#T|T[T[xG%x&G@TPkcT[-Pk@&-[@TqB'jL'XTE@%K8L'Xk$*G**kc![ c![ xHx?G K k$*qG*q*kc![  K *kcT/.xHxT$HxHx Hkc*"TcT$.xH xH@Tk u@K/|@KK@K0@K.@K/|Mk c*Kk @&K@TEL'jt'^T@%*P8t'^kc*/Vk$:c![G:<kcB[Vk<c![F<Vk<c!F< #:f # 5| <c!F< # xIAd 2? 10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! JUMP & ! & !A program to duplicate and extend the POISE supplied JUMP & !program. It has two basic purposes. One is for privileged & !users and the other is for people who need convenient access & !to accounts in one project. & ! 21 !privileged use: & ! & !like the DEC program, JUMP allows you to jump from a privileged& !account to another account. It has the following extensions. & ! (1) user may specify account with or without brackets & ! (2) account logicals are interpreted (see below) & ! (3) user may continue to jump to other accounts (even if the & ! current account is not privileged) as long as the first & ! jump was from a privileged account. This option is & ! explained below. & ! 22 ! & !Account logicals. & ! & !The file $LOGIN.DAT contains a list of account logicals. JUMP & !can use these logicals. & ! 23 ! & !continued JUMPing & ! & ! When a user first JUMPs from a privileged account, this & !program creates a file [1,3]JUMPnn.TMP (where nn is the job & !number) which contains the account number from which the user & !ran the program. As long as this file exists, the user with & !the job number specified in the files name will be able to use & !this program to JUMP to any account, even if he is not & !currently in a privileged account. 24 ! & !the BACK option & ! & ! Once a privileged user has used JUMP to jump from a & !privileged account, he may use JUMP BACK to return to that & !same priviledged account, no matter how many other accounts he & !has JUMPed to in between. & ! 25 ! & !the END option & ! & ! Although the original use of JUMP END was with the non- & !privileged option, it may also be used with the privileged & !version. JUMP END will delete the "permission" file in [1,3] & !so that the user will no longer be able to use JUMP. It is & !useful if you want to let someone else use the terminal but & !don't want them to have JUMP privileges. Since this option & !would usually be used in conjunction with a JUMP to the new & !users's account, it may be combined with an account number. & !For example, JUMP 10,1 END will sign the user into account & !1,10 and eliminate the ability to JUMP further. & ! 26 ! & !the project option & ! & ! To use this option: & !(1) A privileged user adds an entry in [1,3]JUMP.DAT in the & ! following format: proj,prog:proj2:pass & ! where proj,prog is the account from which the process & ! must be inititated (called the master account), & ! proj2 is the project within which the user can JUMP & ! freely (called the permission project) ,and & ! pass is the password needed by the user. & !(2) The user signs in to the master account & !(3) To jump to an account in the permission project, the user & ! need only specify the programmer number. & !(4) The first use of the program requires the password. & ! Thereafter, the user may continue to JUMP within the & ! permission account as long as he has the same job number. & ! & ! This option works by creating a file [1,3]J2MPnn.TMP & !(where nn is the job number). The file contains the permission& !project. It is created on the first use of the option (after & !the correct password is given). LOGIN should be modified to & !delete this file, as with the privileged option. & ! & ! Note that the master account need not be in the permission & !project. Note also that the password need not be the password & !to the master account. & ! 27 ! & !***************************************************************& !***************************************************************& ! & ! W A R N I N G & ! & ! This program operates by creating files in [1,3] with & !names of the form JUMPnn.TMP or J2MPnn.TMP, where nn is the & !job number of the user. It is the existence of these files & !which allows the JUMPing to work. If the files are not & !deleted, the next user who gets that job number will have the & !privilege of JUMPing. The JUMP END option will delete these & !files, but I recommend modifying LOGIN to delete them before & !signing the user into an account. (It is easier to modify & !LOGOUT but people can be signed out by too many other means & !(like UT KILL) to trust it. To the best of my knowledge, a & !modification to LOGIN is sufficient security, but I don't & !guarantee anything. & ! & !***************************************************************& !***************************************************************& ! 28 ! & !some "global" variables: & ! & ! JUMP$ the priveleged case permission file & ! J2MP$ the single project permission file & ! ARG$ although it starts out as the argument given by & ! the user, for most of the program it is that & ! argument converted to upper case with spaces & ! removed (and the other conversions). In the & ! case of double arguments (like in JUMP 8,1 END) & ! ARG$ will start as the whole argument but will & ! later have the second argument chopped off & ! ARG1$ the first character of ARG$ & ! 80 Z$ = SYS(CHR$(6%)+CHR$(-7%)) !^C trap 90 ON ERROR GOTO 9000 100 ! & !Preliminaries & ! 110 GOSUB 1000 200 ! & !get argument from core common (if there) & ! 210 Z$ = SYS(CHR$(7%)) \ & Z$ = CVT$$(Z$,-1%) 220 ARG$ = RIGHT(Z$,5%) \ & ARG1$ = LEFT(ARG$,1%) 300 ! & !get some background data & ! 310 JDB% = PEEK(520%) \ & PPN% = PEEK( PEEK( JDB% + 8% ) + 24% ) \ & PROJ% = SWAP%(PPN%) AND 255% \ & PROG% = PPN% AND 255% & !see description of monitor tables, for example [1,21]MONITO.DOC 320 JOB% = (PEEK(518%) AND 255%) / 2% & !ditto 330 JOB$ = NUM1$(JOB%) \ & IF LEN(JOB$) = 1% THEN JOB$ = "0" + JOB$ 340 JUMP$ = "[1,3]JUMP" + JOB$ + ".TMP" \ & J2MP$ = "[1,3]J2MP" + JOB$ + ".TMP" & !These files are used a lot. They are the permission files for & !the privileged and single project cases (respectively) 400 ! & !get the argument. (failure to specify argument is only & !allowed for the original use) & ! 410 IF PROJ% = 1% & AND ARG$ = "" & THEN PRINT "Account to jump to"; \ & INPUTLINE ARG$ \ & ARG$ = CVT$$(ARG$,-1%) \ & ARG1$ = LEFT(ARG$,1%) 420 IF ARG$ = "" & THEN GOTO 32700 & !If argument is not specified by now, usage is illegal 500 ! & !Parse and execute argument & ! 510 GOSUB 2000 900 ! & !done & ! 990 GOTO 32700 1000 ! & ! & ! SUBROUTINE: Initialize & ! & ! 1100 ! & !some constants & ! 1110 BELL$ = CHR$(7%) 1120 TRUE% = -1% \ & FALSE% = 0% 1990 RETURN 2000 ! & ! & ! SUBROUTINE: parse argument & ! & ! 2100 ! & !remove ( and ) if there (note that [ or ] was converted & !earlier. Assume at most one of each. (We are going to add & !them back later, but it is convenient to have them removed at & !this stage anyway.) & !If the account was not fully specified (for example, a logical & !was given or a single number in the general project use), the & !flag PRINTFLAG% is set. When (if) the login is done, the & !program will print the account PPN. & ! 2110 J% = INSTR(1%,ARG$,"(" ) 2120 IF J% <> 0% & THEN ARG$ = LEFT(ARG$,J%-1%) + RIGHT(ARG$,J%+1%) \ & ARG1$ = LEFT(ARG$,1%) 2130 J% = INSTR(1%,ARG$,")" ) 2140 IF J% <> 0% & THEN ARG$ = LEFT(ARG$,J%-1%) + RIGHT(ARG$,J%+1%) \ & ARG1$ = LEFT(ARG$,1%) 2200 ! & !first look for END & ! 2201 !PRINT "Looking for END" 2210 J% = FNFINDEND%(ARG$) !finds END or equivalent 2220 IF J% = 0% THEN GOTO 2300 2230 ARG$ = LEFT(ARG$,J%-1%) \ & ARG1$ = LEFT(ARG$,1%) 2231 !PRINT "END deleted, argument is now "; ARG$ 2240 IF ARG$ = "" & THEN GOSUB 5000 \ & RETURN & !if no other argument, go to END routine only 2250 ENDFLAG% = TRUE% \ & GOTO 2100 & !otherwise, set a flag and go back to parse the rest of the & !argument. (We can't do the file deletion here, because the & !files must be there when we check for permission later & ! 2300 ! & !look for NEXT (and its equivalents), PREV (and its & !equivalents). In each case, the same subroutine will be used. & !Its more convenient to set the value of TOPROJ% and TOPROG% & !here, even though their use is in the subroutine. & ! 2301 !PRINT "looking for NEXT" 2310 IF FNNEXT%(ARG$) & OR ARG$ = "+" & THEN TOPROJ% = PROJ% \ & TOPROG% = PROG% + 1% \ & PRINTFLAG% = TRUE% \ & GOSUB 4000 \ & RETURN 2319 !PRINT "Looking for PREV" 2320 IF FNPREV%(ARG$) & OR ARG$ = "-" & THEN TOPROJ% = PROJ% \ & TOPROG% = PROG% - 1% \ & PRINTFLAG% = TRUE% \ & GOSUB 4000 \ & RETURN 2400 ! & !look for BACK & ! 2401 !PRINT "Looking for BACK" 2410 IF ARG$ = "BACK" & THEN PRINTFLAG% = TRUE% \ & GOSUB 6000 \ & RETURN 2500 ! & !check for general project use (single number) & ! 2501 !PRINT "Looking for single number" 2510 TOPROJ% = PROJ% \ & TOPROG% = VAL(ARG$) & !if this generates an error the error routine will branch & !to next part. TOPROJ% is set in case there is no error. 2520 GOSUB 4000 \ & PRINTFLAG% = TRUE% \ & RETURN & !since the argument was a number, it must be the project use 2600 ! & !check for general privileged use (number,number) & ! 2601 !PRINT "Looking for two numbers" 2610 J% = INSTR(1%,ARG$,",") 2620 IF J% = 0% THEN GOTO 2700 2630 TOPROJ% = VAL( LEFT(ARG$,J%-1%)) \ & TOPROG% = VAL(RIGHT(ARG$,J%+1%)) & !if either generates an error, program will resume at next part 2640 IF TOPROJ% = 0% & THEN PRINT "Invalid use." \ & GOTO 32700 2650 GOSUB 3000 \ & RETURN & !both sides of comma were valid numbers so it must be & !privileged use. It is convenient to set TOPROJ% and TOPROG% & !here, even though their use is in the subroutine. 2700 ! & !only other possibility is a logical. It may be a system & !logical. We wil use file name string scan to check this. If & !this doesn't work, we will assume it is a LOGIN logical & ! 2701 !PRINT "Looking for system logical" 2710 DIM Z%(30%) 2720 CHANGE SYS( CHR$(6%) + CHR$(-10%) + ARG$ ) TO Z% & !see RSTS programming manual & !any error will cause a resume at 2800 2730 S0% = Z%(27%) + SWAP%(Z%(28%)) 2740 IF (S0% AND 1024%) = 0% & THEN GOTO 2800 & ELSE TOPROJ% = Z%(6%) \ & TOPROG% = Z%(5%) \ & PRINTFLAG% = TRUE% \ & GOSUB 3000 2800 ! & !must be a LOGIN logical (or garbage) & ! 2801 !PRINT "Looking for LOGIN logical" 2810 GOSUB 12000 2820 IF ARG$ = "?" & THEN PRINT BELL$;"Illegal argument." \ & GOTO 32700 & !if there is no such logical, then argument must be in & !error. 2830 PRINTFLAG% = TRUE% 2840 GOSUB 3000 2990 RETURN 3000 ! & ! & ! SUBROUTINE: General privileged use & ! & ! 3010 ! & !By the time this subroutine is reached, TOPROJ% and TOPROG% & !will have already been set. BACK is handled elsewhere. If & !argument was a logical, it has been translated to an account & !number. This option has END built in (so that the possibility & !of creating and deleting the same file is avoided.) & ! 3100 ! & !if this account is privileged then skip the part where we & !look for the permission file. & ! 3110 IF PROJ% = 1% THEN 3300 3200 ! & !look for the permission file. If not there, die. If there & !skip by the creation of permission file. & ! 3210 OPEN JUMP$ FOR INPUT AS FILE #1% & !if not there error routine resumes at 3700 3220 GOTO 3500 3300 ! & !create the permission file (this is bypassed if not in a & !privileged account. If there was an END in the argument, we & !don't create it. 3310 IF ENDFLAG% = TRUE% THEN GOTO 3500 3320 OPEN JUMP$ FOR OUTPUT AS FILE #1% 3330 PRINT #1%, PROJ%;",";PROG% 3340 CLOSE #1% 3350 GOTO 3500 !don't kill the file just created 3400 ! & !if there was an END in the argument, delete the permission & !file. & ! 3410 KILL JUMP$ & !if not there, resume at 3500 3500 ! & !delete any ????nn.TMP files & ! 3510 GOSUB 11000 3600 ! & !do the login & ! 3610 GOSUB 10000 3620 GOTO 32700 3700 ! & !invalid use & ! 3710 PRINT BELL$;"Invalid use." 3720 GOTO 32700 3990 RETURN 4000 ! & ! & ! SUBROUTINE: General project use & ! & ! 4010 ! & !If there was an END, the appropriate subroutine call is & !included here. & ! 4100 ! & !look for permission file & ! 4110 OPEN J2MP$ FOR INPUT AS FILE #1% & !If not there, error routine resumes at 4200 4120 INPUT #1%, PERMISSION% 4130 IF PERMISSION% <> TOPROJ% & THEN PRINT BELL$;"Wrong project." \ & GOTO 32700 & !file is there, but wrong project. 4140 GOTO 4400 !since file is there and has right project 4200 ! & !permission file not there. Look in !JUMP.DAT to see if they & !are allowed to use this. If so, ask for password and create & !the file. If not, die. & ! 4210 GOSUB 13000 & !if they are allowed to use this option, the subroutine will & !set TOPROJ% (which could be different from current project) & !If use is not legal, program will terminate. 4400 ! & !permission file was there (or just created) & !if END was there, get rid of files & ! 4410 IF ENDFLAG% = TRUE% THEN GOSUB 5000 4500 ! & !delete the ????nn.TMP files & ! 4510 GOSUB 11000 4600 ! & !do the login and logout & ! 4610 PRINTFLAG% = TRUE% 4620 GOSUB 10000 4990 RETURN 5000 ! & ! & ! SUBROUTINE: END command & ! & ! 5010 ! & !This option may be used by itself or with another argument. & !If another argument was given, it will have already been & !processed by now. This single argument is designed for ending & !both types of operation: privileged and single project. & ! 5100 ! & !Kill the privileged jump file if there & ! 5110 KILL JUMP$ & !If not there error routine resumes at 5200 5200 ! & !Kill the single project jump file if there & ! 5210 KILL J2MP$ & !If not there error routine resumes at 5300 5300 ! & !print reassuring message & ! 5310 PRINT "JUMPing privileges have been terminated." 5990 RETURN 6000 ! & ! & ! SUBROUTINE: BACK commmand & ! & ! 6010 ! & !This option could be done by looking up the project number in & !the file and then using the general privileged use subroutine & !with a new argument. But this involves duplication of effort. & !(For example, the check for the permission file will be & !redundant.) Instead, I have put the complete code here. It & !involves duplication in writen code but not in executed code. & ! 6100 ! & !find out where to return to (or die if file not there) & ! 6110 OPEN JUMP$ FOR INPUT AS FILE #1% & !if not there, error routine resumes at 6400 6120 INPUT #1%, TOPROJ%, TOPROG% 6130 CLOSE #1% 6200 ! & !delete the ????nn.TMP files & ! 6210 GOSUB 11000 6300 ! & !log in & ! 6310 GOSUB 10000 6320 GOTO 32700 6400 ! & !file wasn't there & ! 6410 PRINT BELL$;"Can't jump back." \ & GOTO 32700 6990 RETURN 8000 ! & ! & ! FUNCTIONS & ! & ! 8100 ! & !A function to find END, /END, & !This function returns zero if none of the above appear. & !Otherwise, it returns the index of the first one. The three & !last options are included only for compatability with earlier & !versions of this program. With only the option END, this & !function becomes exactly INSTR(1%,ARG$,"END"). & !This function assumes that no more than one of these four will & !appear 8110 DEF FNFINDEND%(ARG$) 8120 J% = INSTR(1%,ARG$,"/END") \ & IF J% <> 0% & THEN FNFINDEND% = J% \ & GOTO 8190 8130 J% = INSTR(1%,ARG$,"END") \ & IF J% <> 0% & THEN FNFINDEND% = J% \ & GOTO 8190 8180 FNFINDEND% = 0% 8190 FNEND 8200 ! & !find NEXT & ! 8210 DEF FNNEXT%(A$) 8220 FNNEXT% = FALSE% 8230 IF LEN(A$) > 4% & THEN GOTO 8290 8240 IF A$ = LEFT("NEXT",LEN(A$)) & THEN FNNEXT% = TRUE% 8290 FNEND 8300 ! & !find PREV & ! 8310 DEF FNPREV%(A$) 8320 FNPREV% = FALSE% 8330 IF LEN(A$) > 8% & THEN GOTO 8390 8340 IF A$ = LEFT("PREVIOUS",LEN(A$)) & THEN FNPREV% = TRUE% 8390 FNEND 8990 RETURN 9000 ! & ! & ! Error Routine & ! & ! 9100 ! & !^C trap & ! 9110 IF ERR = 28 THEN RESUME 32700 9200 ! & !Expected errors (by line number) & ! 9210 IF ERL = 2510 THEN RESUME 2600 & !argument is not a valid number (single number case) 9220 IF ERL = 2630 THEN RESUME 2700 & !argument is not a valid number (number,number case) 9230 IF ERL = 12210 THEN RESUME 12300 & !end of file for logicals 9240 IF ERL = 3210 THEN RESUME 3700 & !permission file not there 9250 IF ERL = 3410 THEN RESUME 3500 & !tried to kill permission file when not there 9260 IF ERL = 4110 THEN RESUME 4200 & !permission file (project case) not there 9270 IF ERL = 5110 THEN RESUME 5200 & !JUMP file to kill wasn't there 9280 IF ERL = 5210 THEN RESUME 5300 & !J2MP file to kill wasn't there 9290 IF ERL = 6110 THEN RESUME 6400 & !tried JUMP BACK with no permission file 9300 ! & !more expected errors by line number & ! 9310 IF ERL = 11410 THEN RESUME 11990 & !no more temp files to kill 9320 IF ERL = 10120 THEN RESUME 10200 & !no such account 9330 IF ERL = 11110 THEN RESUME 11990 & !couln't find TEMPnn.TMP (for account [1,3] only) 9340 IF ERL = 13120 THEN RESUME 13200 & !end of file in JUMP.DAT 9350 IF ERL = 2720 THEN RESUME 2800 & !illegal file name (looking for logical) 9360 IF ERL = 10520 THEN RESUME 10530 & !account doesn't exist (actually password doesn't exist) 9370 IF ERL = 11430 THEN RESUME 11440 & !couldn't kill *.TMP file (probably because of protect bit) 9380 IF ERL = 10010 THEN RESUME 10100 & ! EMTLOG isn't running 9390 IF ERL = 12630 THEN RESUME 12640 & !entry in $LOGIN.DAT is not a valid number 9600 ! & !Expected errors (with no specific line number) & ! 9610 IF ERR = 11 THEN RESUME 32700 & !^Z 9900 ! & !Unexpected errors & ! 9910 Z$ = SYS(CHR$(6%)+CHR$(9%)+CHR$(ERR)) 9920 ERROR$ = RIGHT(Z$,4%) 9930 PRINT " I can't cope with a "; \ & PRINT ERROR$; " at line";ERL 9990 GOTO 32700 10000 ! & ! & ! SUBROUTINE: logout and login & ! & ! 10010 SENDER.PPN% = PEEK(PEEK(PEEK(520%) + 8%) + 24%) & \ SENDER.Z$ = SYS(CHR$(6%)! SYS call to FIP & + CHR$(22%) & + CHR$(-1%) & + CHR$(0%) & + 'EMTLOG' & + STRING$(10%,0%) & + CHR$(21%) & + CHR$(20%) & + CHR$(SWAP%(SENDER.PPN%) AND 255%) & + CHR$(SENDER.PPN% AND 255%) & + CHR$(213%) & + CHR$(65%) & + CHR$(0%) & + CHR$(100%) & + CHR$(TOPROJ%) & + CHR$(TOPROG%)) & 10020 SLEEP 2% & 10100 ! & !look up the password (see RSTS programming manual for an & !explanation). & ! 10110 Z$ = CHR$(6%) + CHR$(14%) + STRING$(4%,0%) + CHR$(TOPROG%) & + CHR$(TOPROJ%) 10120 CHANGE SYS(Z$) TO Z% \ & PASS$ = RAD$( Z%( 9%) + SWAP%( Z%(10%) ) ) & + RAD$( Z%(11%) + SWAP%( Z%(12%) ) ) 10130 IF INSTR(1%,PASS$,"?") & THEN PRINT "You can't JUMP to an account with no password." \ & GOTO 32767 10140 GOTO 10300 !skip error handling 10200 ! & !No such account & ! 10210 PRINT BELL$;"No such account." 10220 GOTO 32700 10300 ! & !using results of SYS call above, set up for login call (see & !RSTS programming manual again.) & ! 10310 Z%(7%+I%) = Z%(9%+I%) FOR I% = 0% TO 3% 10320 Z%(5%) = TOPROG% \ & Z%(6%) = TOPROJ% 10325 T$ = CVT%$(SWAP%(0%+2%)) \ & T1% = ASCII(LEFT(T$,1%)) \ & T2% = ASCII(RIGHT(T$,2%)) 10330 Z%(1%) = 6% \ & Z%(2%) = 4% \ & Z%(3%) = 0% \ & Z%(4%) = 0% 10340 Z%(I%) = 0% FOR I% = 11% TO 30% 10400 ! & !Logout & ! 10410 Z$ = SYS( CHR$(6%) + CHR$(5%) ) & !try logging out with a quota check first 10420 LOGOUT.STATUS% = SWAP%( ASCII(MID(Z$,3%,1%)) ) + ASCII(MID(Z$,4%,1%)) 10430 IF LOGOUT.STATUS% = 0% THEN GOTO 10500 & !if successful, skip the rest 10440 IF LOGOUT.STATUS% = -1% & AND ASCII(MID(Z$,13%,1%)) = 1% & THEN PRINT BELL$;"You are unable to JUMP because your detached job quota is exceeded." \ & PRINT "Program terminated." \ & GOTO 32767 10450 IF LOGOUT.STATUS% = -1% & AND ASCII(MID(Z$,13%,1%)) = 0% & THEN PRINT BELL$;"Your quota is exceeded. You have been signed out anyway." 10460 Z$ = SYS( CHR$(6%) + CHR$(5%) + CVT%$(SWAP%(0%+2%))) & !do it without without quota checks 10500 ! & !Login & ! 10510 CHANGE Z% TO Z$ 10520 Z$ = SYS(Z$) \ & GOTO 10600 !if error, resume at 10530 10530 PRINT "You can't jump to an account which has no password." 10540 GOTO 32767 10600 ! & !print message if desired & ! 10610 IF PRINTFLAG% = TRUE% & THEN PRINT "Jumping to account ["; \ & PRINT NUM1$(TOPROJ%); \ & PRINT ","; \ & PRINT NUM1$(TOPROG%); \ & PRINT "]." 10990 RETURN 11000 ! & ! & ! SUBROUTINE: delete temporary files & ! & ! 11100 ! & !If account is [1,3] we can't kill all temporary files or we & !will kill the permission file. In this case we will just & !delete TEMPnn.TMP & ! 11110 IF PROJ% = 1% & AND PROG% = 3% & THEN KILLFILE$ = "TEMP" + JOB$ + ".TMP" \ & KILL KILLFILE$ \ & RETURN & !if file not there, error routine will resume at the & !return statement anyway 11200 ! & !Use File Name String Scan to convert name to form needed later & !(See RSTS Programming Manual). This only needs to be done & !once, even if several files get deleted. & ! 11210 KILLFILE$ = "????" + JOB$ + ".TMP" 11220 CHANGE SYS( CHR$(6%) + CHR$(-10%) + KILLFILE$ ) TO Z% 11300 ! & !Set up for directory sys call (See RSTS Programming Manual & !again) & ! 11310 Z%(1%) = 6% \ & Z%(2%) = 17% \ & Z%(3%) = 0% \ & Z%(4%) = 0% 11320 CHANGE Z% TO Z$ 11400 ! & !This loop keeps killing files till it runs out & ! 11410 CHANGE SYS(Z$) TO Z% & !if no more files, error routine resumes at 11990 11420 FILE$ = RAD$( Z%( 7%) + SWAP%( Z%( 8%) ) ) & + RAD$( Z%( 9%) + SWAP%( Z%(10%) ) ) + "." & + RAD$( Z%(11%) + SWAP%( Z%(12%) ) ) 11430 KILL FILE$ 11440 GOTO 11300 11990 RETURN 12000 ! & ! & ! SUBROUTINE: look up account logicals & ! & ! 12100 ! & !open the file & ! 12110 OPEN "$LOGIN.DAT" AS FILE #1% 12200 ! & !look for logical equal to argument & ! 12210 INPUTLINE #1%, IN$ \ & IN$ = CVT$$(IN$,-1%) & !end of file will cause resume to 12300 12220 EQUAL% = INSTR(1%,IN$,"=") 12230 LOGICAL$ = LEFT(IN$,EQUAL%-1%) 12240 IF CVT$$(LOGICAL$,-1%) = CVT$$(ARG$,-1%) THEN GOTO 12400 12250 GOTO 12210 12300 ! & !didn't find it (end of file error resumes here) & ! 12310 ARG$ = "?" 12320 RETURN 12400 ! & !found it. Part to right of = is PPN (and maybe some junk) & ! 12401 !PRINT "Found logical: " ARG$ 12410 ARG$ = RIGHT(IN$,EQUAL% + 1%) 12500 ! & !look for ;. If there get rid of it and all following & ! 12510 J% = INSTR(1%,ARG$,";") 12520 IF J% <> 0% & THEN ARG$ = LEFT(ARG$,J%-1%) 12521 !PRINT "after ; argument is ";ARG$ 12600 ! & !may have / or ,. Either way we want TOPROJ% to be the left & !part and TOPROG% to be the right part. We will assume that & !the data in the file is correct (so that TOPROJ% and TOPROG% & !must be legal numbers) & ! 12610 J% = INSTR(1%,ARG$,",") 12620 IF J% = 0% & THEN J% = INSTR(1%,ARG$,"/") & !we assume that one of them is there 12621 !PRINT "Position of , or / is"; J% \ & !PRINT "Argument is now "; ARG$ 12630 TOPROJ% = VAL( LEFT(ARG$,J%-1%) ) \ & TOPROG% = VAL( RIGHT(ARG$,J%+1%) ) \ & GOTO 12990 12640 PRINT "Can't interpret entry in $LOGIN.DAT" \ & PRINT "Program terminated." \ & GOTO 32767 12990 RETURN 13000 ! & ! & ! SUBROUTINE: First time project use & ! & ! 13100 ! & !Look in !JUMP.DAT for their account & !(We assume that the data file is in the correct form) & ! 13101 !PRINT "first fime project use" 13110 OPEN "[1,3]JUMP.DAT" AS FILE #1% 13120 INPUTLINE #1%, IN$ \ & IN$ = CVT$$(IN$,-1%) & !if end-of-file then error routine resumes at 13200 13130 J% = INSTR(1%,IN$,",") \ & MASTERPROJ% = VAL(LEFT(IN$,J%-1%)) \ & IN$ = RIGHT(IN$,J%+1%) 13140 J% = INSTR(1%,IN$,":") \ & MASTERPROG% = VAL(LEFT(IN$,J%-1%)) \ & IN$ = RIGHT(IN$,J%+1%) 13141 !PRINT MASTERPROJ%,MASTERPROG% 13150 IF MASTERPROJ% <> PROJ% & OR MASTERPROG% <> PROG% & THEN GOTO 13120 & !keep looking for this account 13160 CLOSE #1% 13170 GOTO 13300 13200 ! & !wasn't found & ! 13210 PRINT BELL$; "You are not in the correct account." \ & GOTO 32700 13300 ! & !was found: find permision project and password & ! 13310 J% = INSTR(1%,IN$,":") \ & TOPROJ% = VAL( LEFT(IN$,J%-1%) ) \ & PASSWORD$ = CVT$$( RIGHT(IN$,J%+1%),32% ) 13400 ! & !Check the password & ! 13410 Z$ = SYS(CHR$(3%)) !cancel echo, of course 13420 INPUT "Password";USERPASS$ \ & USERPASS$ = CVT$$(USERPASS$,-1%) \ & PRINT 13430 Z$ = SYS(CHR$(2%)) !reinstate echo 13440 IF USERPASS$ = PASSWORD$ THEN 13600 13500 ! & !password was wrong & ! 13510 PRINT BELL$; "Incorrect password." 13520 GOTO 32700 13600 ! & !password was right, set up file & ! 13610 OPEN J2MP$ FOR OUTPUT AS FILE #1% 13620 PRINT #1%, TOPROJ% 13630 CLOSE #1% 13990 RETURN 32700 ! & !end of program & ! 32710 Z$ = SYS(CHR$(9%)) !Exit and clear program 32767 END f 2?10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! PRIV & ! & !A program to make a list of all privileged files on the & !system. Since the only access to protection codes are in the & !UFD, this program works through the UFD. Most of the explan- & !ation of the UFD is left out. See [1,3] UFD.BAS for that & !description. & ! 80 Z$ = SYS(CHR$(6%)+CHR$(-7%)) !^C trap 90 ON ERROR GOTO 9000 100 ! & !Initialize & ! 110 GOSUB 1000 200 ! & !Explain program & ! 210 GOSUB 2000 300 ! & !output file & ! 310 INPUT "Output file "; OUTFILE$ \ & OUTFILE$ = "PRIV.LST" IF OUTFILE$ = "" \ & OUTFILE$ = CVT$$(OUTFILE$,4%) 320 IF INSTR(1%,OUTFILE$,".") = 0% & THEN OUTFILE$ = OUTFILE$ + ".LST" 330 OPEN OUTFILE$ FOR OUTPUT AS FILE #2% 340 PRINT #2% \ & PRINT #2% \ & PRINT #2%, " Privileged accounts as of "; DATE$(0%) 400 ! & !disk & ! 410 INPUT "Disk number"; DISK$ \ & DISK$ = CVT$$(DISK$,-1%) 420 IF DISK$ = "" THEN GOTO 900 430 IF LEFT(DISK$,2%) = "DR" & THEN DISK% = VAL(MID(DISK$,3%,1%)) & ELSE DISK% = VAL(DISK$) 440 DEVICE$ = "DR" + NUM1$(DISK%) + ":" 450 PRINT #2% \ & PRINT #2%, " for ";DEVICE$ \ & PRINT #2 500 ! & !Go through accounts & ! 510 INDEX% = 0% 520 Z$ = SYS( CHR$(6%) + CHR$(25%) + & CHR$(INDEX%) + CHR$(SWAP%(INDEX%)) + & CHR$(255%) + CHR$(255%) + & STRING$(16%,0%) + & "DR" + CHR$(DISK%) + CHR$(255%) ) 530 PROJ% = ASCII(MID(Z$,6%,1%)) \ & PROG% = ASCII(MID(Z$,5%,1%)) 535 PRINT " Working on "; "["; \ & PRINT USING "###", PROJ%; \ & PRINT ","; \ & PRINT USING "###", PROG%; \ & PRINT "]" 540 IF PROJ% = 1% AND PROG% = 1% THEN GOTO 560 & !Skip [1,1] because it has the MFD 550 GOSUB 3000 !Go through UFD for this account 560 INDEX% = INDEX% + 1% 570 GOTO 520 600 ! & !another disk & ! 610 GOTO 400 900 ! & !done & ! 910 CLOSE #2% 990 GOTO 32767 1000 ! & ! & ! SUBROUTINE: Initialize & ! & ! 1100 ! & !constants & ! 1110 BELL$ = CHR$(26%) 1120 TRUE% = -1% \ & FALSE% = 0% 1990 RETURN 2000 ! & ! & ! SUBROUTINE: Description & ! & ! 2010 PRINT \ & PRINT "This program will provide a list of all files with privileged protection codes." \ & PRINT 2990 RETURN 3000 ! & ! & ! SUBROUTINE: Go thorugh UFD for one account & ! & ! 3100 ! & !open the UFD, dimension it and get cluster size & ! 3110 OPEN DEVICE$ + "[" + NUM1$(PROJ%) + "," + NUM1$(PROG%) + "]" AS FILE #1% 3120 DIM #1%, U%(3538%,7%) 3130 CLU% = U%(31%,0%) 3200 ! & !loop through name blockettes & ! 3210 PTR% = FNLINK%(U%(0%,0%)) 3220 IF PTR% = 0% THEN RETURN 3230 GOSUB 4000 !Do this file 3240 PTR% = FNLINK%( U%(PTR%,0%) ) 3250 GOTO 3220 3990 RETURN 4000 ! & ! & ! SUBROUTINE: Do one file & ! & ! 4100 ! & !quit if "wrong" protection code & ! 4110 PROT% = SWAP%( U%(PTR%,4%) ) AND 255% 4120 IF PROT% < 128% THEN RETURN 4200 ! & !print data & ! 4210 PRINT #2%, "["; \ & PRINT #2%, USING "###", PROJ%; \ & PRINT #2%, ","; \ & PRINT #2%, USING "###", PROG%; \ & PRINT #2%, "] "; 4220 PRINT #2%, RAD$( U%(PTR%,1%) ); & RAD$( U%(PTR%,2%) ); "."; & RAD$( U%(PTR%,3%) ); & !name of file 4230 PRINT #2%, USING " ###", PROT%; & !Protection 4240 AB% = FNLINK%(U%(PTR%,6%)) \ & PRINT #2%, " ";DATE$(U%(AB%,3%)) & !date of creation 4990 RETURN 8000 ! & ! & ! FUNCTIONS & ! & ! 8100 ! & !Convert a link word to a blockette number & ! 8110 DEF FNLINK%(L%) = ((( L% AND 3584%) / 512% ) * CLU% & + ( SWAP%( L% AND -4096% ) / 16% )) * 32% & + (( L% AND 496%) / 16%) 9000 ! & ! & ! Error Routine & ! & ! 9100 ! & !^C error: not caught seperately & ! 9200 ! & !Expected errors (by line number) & ! 9210 IF ERL = 520 THEN RESUME 400 & !assume an error means no more files on this disk 9600 ! & !Expected errors (with no specific line number) & ! 9900 ! & !Unexpected errors & ! 9910 Z$ = SYS(CHR$(6%)+CHR$(9%)+CHR$(ERR)) 9920 ERROR$ = RIGHT(Z$,3%) 9930 CLOSE 1% 9940 PRINT #2% \ & PRINT #2% \ & PRINT #2%, "Program ended with an error before all files were processed." \ & PRINT #2%, " "; ERROR$; " at line";ERL 9950 CLOSE #2% 32767 END ;K} 2? 10 EXTEND 20 ! & ! LAST & ! & ! A program to access the "last signed in" data in the GFD and & !print that data for specified cases. The user will specify which & !account(s), which keyboard(s) and which date(s). The program will & !print out the information for those specified combinations. & ! For account(s), user may specify a list in the form & ![proj1,prog1],[proj2,prog2],... where either proj or prog could be & !*. Limit is 50 specifications. The default is [*,*]. & ! For keyboards, the user may specify a list whose entries are in & !the form n or n-m. For example, "1,4,7-9" will include keyboards 1, & !4,7,8, and 9. User may also specify "DETACHED". Limit is 50 & !keyboards. The default is all keyboards and detached. & ! For the date, the user may specify a specific date, a range of & !dates, or all dates before (and including) a given date. The formats& !are: "##-XXX-##", "##-XXX-## TO ##-XXX-##", and "BEFORE "##-XXX-##" & !respectively. Only one can be specified. The default is all & !dates. & ! The program does not have an error trap, so it will not survive & !even the most trivial error. The program is disigned for people who & !know what they are doing and is almost devoid of error checking. & ! 100 ! & !dimension statement for storage of DCN's for GFD's & ! 110 DIM DCN.GFD%(255%) 200 ! & !some constants & ! 210 TRUE% = -1% \ & FALSE% = 0% 220 DISK$ = "DR0:" 300 ! & !dimension statements for specifications & ! 310 DIM PROJ%(50%), PROG%(50%), KB%(50%), KBS$(50%) 400 ! & !data for the function at 18400 & ! 410 DIM MON%(12%) 420 DATA 0,31,59,90,120,151,181,212,243,273,304,334 430 MAT READ MON% 440 DIM MON$(12%) 450 DATA JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC 460 MAT READ MON$ 1000 ! & ! & ! MAIN PROGRAM & ! & ! & !get the specifications & ! 1010 GOSUB 11000 2000 ! & !open disk non-file structured with buffer size large enough & !to get the second block of the MFD. & !get the pack label block & !get the version number and quit if not 1.1 & ! 2010 OPEN DISK$ AS FILE #1%, RECORDSIZE 1024% 2020 FIELD #1%, 1024% AS BUFF$ 2030 GET #1%, BLOCK 1% 2040 VERSION% = FNBYTE%(7%) \ & LEVEL% = FNBYTE%(6%) \ & IF VERSION% <> 1% & OR LEVEL% <> 1% & THEN PRINT "This program only works for 1.1 disks." \ & GOTO 32767 2050 DCN.MFD% = FNWORD%(2%) 3000 ! & !get the DCN of the MFD & ! 3010 GET #1%, BLOCK DCN.MFD% 4000 ! & !save DCN's for GFD's & !go through a second time to use them. & !Two loops are needed because there are GET's inside the loop which & !change the buffer. & ! 4010 FOR PROJ% = 1% TO 255% 4020 DCN.GFD%(PROJ%) = FNWORD%(256% + PROJ%) 4030 NEXT PROJ% 4040 FOR PROJ% = 1% TO 255% 4050 IF DCN.GFD%(PROJ%) = 0% & THEN GOTO 7010 5000 ! & !open up the GFD with correct cluster size & !get the link for this account & ! 5010 CLOSE #1% 5020 OPEN DISK$ AS FILE #1%, RECORDSIZE 16% * 512% 5030 FIELD #1%, 16% * 512% AS BUFF$ 5040 GET #1%, BLOCK DCN.GFD%(PROJ%) \ & CURRENT.CLUSTER% = 0% 6000 ! & !go through this GFD & ! 6010 FOR PROG% = 0% TO 255% 6020 LINK.NB% = FNWORD%(512% + PROG%) 6030 IF LINK.NB% <> 0% & THEN GOSUB 10000 6040 NEXT PROG% 7000 ! & !end of PROJ% loop & ! 7010 NEXT PROJ% 9000 ! & !normal exit & ! 9010 CLOSE #1% 9990 GOTO 32767 10000 ! & ! & ! SUBROUTINE: check account & ! & ! & ! & !save the cluster map & ! 10010 FOR I% = 0% TO 7% 10020 CLUSTER.MAP%(I%) = FNWORD%(249%+I%) & !these are the last eight words of the block 10030 NEXT I% 10100 ! & !get correct cluster, block and offset for this link & ! 10110 OFFSET% = FNLINK%(LINK.NB%) \ & !the function GETs the right cluster and finds the offset \ & BYTE.OFFSET% = OFFSET% \ & WORD.OFFSET% = OFFSET%/2% 10200 ! & !save the values of the other links (in case we leave this cluster & ! 10210 LINK.DTB% = FNWORD%(WORD.OFFSET% + 0%) 10500 ! & !data from date/time blockette & !(including link to password blockette) & ! 10510 OFFSET% = FNLINK%(LINK.DTB%) \ & !the function GETs the correct cluster and finds the offset \ & BYTE.OFFSET% = OFFSET% \ & WORD.OFFSET% = OFFSET%/2% 10520 KB.LAST% = FNBYTE%(BYTE.OFFSET% + 3%) 10530 DATE.LAST% = FNWORD%(WORD.OFFSET% + 2%) \ & TIME.LAST% = FNWORD%(WORD.OFFSET% + 3%) 10535 IF DATE.LAST% = 0% THEN DATE.LAST% = FNDATE.TO.NUMBER%(DATE$(0%)) 10540 IF FNCHECK% & THEN PRINT "["; \ & PRINT USING "###", PROJ%; \ & PRINT ","; \ & PRINT USING "###", PROG%; \ & PRINT "]"; \ & PRINT " Last signed in "; \ & PRINT "detached"; IF KB.LAST% = 255% \ & PRINT "at KB"; NUM1$(KB.LAST%);":"; IF KB.LAST% <> 255% \ & PRINT TAB(34);"on ";DATE$(DATE.LAST%); \ & PRINT " at ";TIME$(TIME.LAST%) 10900 ! & !done & ! 10990 RETURN 11000 ! & ! & ! SUBROUTINE: get specifications & ! & ! & ! 11100 ! & !accounts & !ask, do default, initialize counter & ! 11110 PRINT "Which accounts"; \ & INPUTLINE ACCTS$ \ & ACCTS$ = CVT$$(ACCTS$,2%+4%+32%) & !get it, remove spaces and delimiters, change to capitals, 11120 IF ACCTS$ = "" & THEN SKIP.ACCT.CHECK% = TRUE% \ & GOTO 11300 11130 I% = 0% 11200 ! & !pull them off one at a time & !not many error checks here & ! 11210 BRACKET% = INSTR(1%,ACCTS$,"]") 11220 IF BRACKET% <> 0% & THEN I% = I% + 1% & ELSE NUM.ACCTS% = I% \ & GOTO 11300 & !if there is another account, count it and continue 11230 ACCT$ = LEFT(ACCTS$,BRACKET%-1%) \ & ACCTS$ = RIGHT(ACCTS$,BRACKET%+2%) & !assume character after the bracket is a comma. Drop it and the & !bracket at the end 11240 ACCT$ = RIGHT(ACCT$,2%) & !assume first character is [ and drop it 11250 COMMA% = INSTR(1%,ACCT$,",") \ & PROJ$ = LEFT(ACCT$,COMMA%-1%) \ & PROG$ = RIGHT(ACCT$,COMMA%+1%) & !assume there is a comma 11260 IF PROJ$ = "*" & THEN PROJ%(I%) = 255% & ELSE PROJ%(I%) = VAL(PROJ$) & !assume no illegal numbers 11270 IF PROG$ = "*" & THEN PROG%(I%) = 255% & ELSE PROG%(I%) = VAL(PROG$) & !assume no illegal numbers 11280 GOTO 11210 & !try again 11300 ! & !keyboards & !ask, do default, initialize counter & ! 11310 PRINT "Which keyboards"; \ & MAT INPUT KBS$ 11320 IF KBS$(1%) = "" & THEN SKIP.KB.CHECK% = TRUE% \ & GOTO 11500 11330 I% = 0% 11400 ! & !interpret them one at a time & !note that J% counts enties and I% counts keyboards. They may not & !be the same. & ! 11410 FOR J% = 1% TO NUM 11420 IF LEFT(KBS$(J%),3%) = "DET" & THEN I% = I% + 1% \ & KB%(I%) = 255% \ & GOTO 11470 & !for detached keyboards 11430 HYPHEN% = INSTR(1%,KBS$(J%),"-") 11440 IF HYPHEN% = 0% & THEN I% = I% + 1% \ & KB%(I%) = VAL(KBS$(J%)) \ & GOTO 11470 & !single keyboard on list 11450 FIRST% = VAL( LEFT(KBS$(J%),HYPHEN%-1%)) \ & LAST% = VAL(RIGHT(KBS$(J%),HYPHEN%+1%)) & !begin case where there is a range by finding first and last KB 11460 FOR K% = 0% TO LAST% - FIRST% \ & I% = I% + 1% \ & KB%(I%) = FIRST% + K% \ & NEXT K% \ & !put in the whole range 11470 NEXT J% 11480 NUM.KBS% = I% 11500 ! & !dates & !ask, do default & ! 11510 PRINT "Which dates"; \ & INPUTLINE DATES$ \ & DATES$ = CVT$$(DATES$,-1%) 11520 IF DATES$ = "" & THEN SKIP.DATE.CHECK% = TRUE% \ & GOTO 11900 11600 ! & !look for BEFORE & ! 11610 IF LEFT(DATES$,3%) <> "BEF" THEN GOTO 11700 11620 DATES$ = RIGHT(DATES$,FNFIND.DIGIT%(DATES$)) 11630 FIRST.DATE% = 0% \ & LAST.DATE% = FNDATE.TO.NUMBER%(DATES$) 11640 GOTO 11900 11700 ! & !look for TO & ! 11710 T% = INSTR(1%,DATES$,"TO") 11720 IF T% = 0% THEN GOTO 11800 11730 FIRST.DATE% = FNDATE.TO.NUMBER%( LEFT(DATES$,T%-1%)) \ & LAST.DATE% = FNDATE.TO.NUMBER%(RIGHT(DATES$,T%+2%)) 11740 GOTO 11900 11800 ! & !only one date specified & ! 11810 FIRST.DATE% = FNDATE.TO.NUMBER%(DATES$) \ & LAST.DATE% = FIRST.DATE% 11900 ! & !done & ! 11990 RETURN 12000 ! & ! & ! FUNCTION: check specifications & ! & ! & ! 12010 DEF* FNCHECK% 12020 FNCHECK% = TRUE% & !default in case all checks are skipped 12100 ! & !check accounts & ! 12110 IF SKIP.ACCT.CHECK% THEN GOTO 12200 12120 FOR I% = 1% TO NUM.ACCTS% 12130 IF (PROJ% = PROJ%(I%) OR PROJ%(I%) = 255%) & AND (PROG% = PROG%(I%) OR PROG%(I%) = 255%) & THEN GOTO 12200 12140 NEXT I% 12150 FNCHECK% = FALSE% \ & GOTO 12900 & !didn't make it past this check 12200 ! & !check keyboards & ! 12210 IF SKIP.KB.CHECK% THEN GOTO 12300 12220 FOR I% = 1% TO NUM.KBS% 12230 IF KB.LAST% = KB%(I%) & THEN GOTO 12300 12240 NEXT I% 12250 FNCHECK% = FALSE% \ & GOTO 12900 & !didn't make it past this check 12300 ! & !check dates & ! 12310 IF SKIP.DATE.CHECK% THEN GOTO 12900 12320 IF FIRST.DATE% <= DATE.LAST% & AND DATE.LAST% <= LAST.DATE% & THEN FNCHECK% = TRUE% & ELSE FNCHECK% = FALSE% 12900 ! & !end & ! 12990 FNEND 18000 ! & ! & ! FUNCTIONS & ! & ! 18100 ! & !pull a word from the buffer & !for convenience, the words are numbered as words even though the & !buffer is character (and hence byte) oriented. Words are normally & !numbered starting at zero, but the characters in the buffer must be & !numbered starting at one, so another adjustment is needed. & ! 18110 DEF* FNWORD%(W%) 18120 FIRSTBYTE% = W% * 2% + 1% 18180 FNWORD% = ASCII( MID(BUFF$,FIRSTBYTE% ,1%) ) & + SWAP%( ASCII( MID(BUFF$,FIRSTBYTE%+1%,1%) ) ) 18190 FNEND 18200 ! & !pull a byte from the buffer & !Since the bytes are generally numbered starting at zero but the & !characters are numbered begining at one, an adjustment is needed. & ! 18210 DEF* FNBYTE%(B%) 18280 FNBYTE% = ASCII(MID(BUFF$,B%+1%,1%)) 18290 FNEND 18300 ! & !convert a link & !If the link indicates another cluster, the correct cluster is GETted & !by the function. & ! & !In a link word the bits have the following meaning: & ! & ! 0 - 8 byte within the block & ! 9 - 11 cluster (16 blocks) number & ! 12 - 15 block within the cluster & ! 18310 DEF* FNLINK%(LINK%) 18320 CLUSTER.NUMBER% = ( LINK% AND 3584% ) / 512% \ & BLOCK.NUMBER% = SWAP%( LINK% AND -4096% ) / 16% \ & BYTE.NUMBER% = LINK% AND 511% 18330 IF CLUSTER.NUMBER% <> CURRENT.CLUSTER% & THEN GET #1%, BLOCK CLUSTER.MAP%(CLUSTER.NUMBER%) \ & CURRENT.CLUSTER% = CLUSTER.NUMBER% 18380 FNLINK% = BLOCK.NUMBER% * 512% + BYTE.NUMBER% 18390 FNEND 18400 ! & !convert date to number & ! 18410 DEF FNDATE.TO.NUMBER%(D$) 18420 D$ = CVT$$(D$,-1%) \ & D$ = "0" + D$ IF LEN(D$) = 8% \ & DAY% = VAL(LEFT(D$,2%)) \ & MON$ = MID(D$,4%,3%) \ & YEAR% = VAL(RIGHT(D$,8%)) 18430 FOR M% = 1% TO 12% 18440 IF MON$(M%) = MON$ & THEN MON% = MON%(M%) \ & M1% = M% 18450 NEXT M% 18460 IF YEAR%/4%*4% = YEAR% & AND M1% > 2% & THEN MON% = MON% + 1% 18470 FNDATE.TO.NUMBER% = ( YEAR% - 70 ) * 1000 + MON% + DAY% 18490 FNEND 18500 ! & !find the first digit in a string & ! 18510 DEF* FNFIND.DIGIT%(STR$) 18520 FOR I.FIND.DIGIT% = 1% TO LEN(STR$) 18530 C% = ASCII(MID(STR$,I.FIND.DIGIT%,1%)) 18540 IF 48% <= C% AND C% <= 57% & THEN FNFIND.DIGIT% = I.FIND.DIGIT% \ & GOTO 18590 18550 NEXT I.FIND.DIGIT% 18560 FNFIND.DIGIT% = 0% 18590 FNEND 32767 END f} 2? 1 EXTEND 2 !Extended BASIC+2 & & ! P R O T E C T & & ! Program : PROTEC.BAS & ! Author : Troy Greenup & ! Version : 2 & ! Edit : 1 & ! Edit Date: 10-Nov-83 & & & ! Refer all Inquiries to: & & ! The Computer Center & ! Whittier College & ! Whittier, California & ! (213) 693-0771 x238 & & & 9 ! & & ! C O P Y R I G H T N O T I C E & & ! No Copyright (NC) & ! WHITTIER COLLEGE COMPUTER CENTER, WHITTIER, CA 90608 & ! & ! & ! This software has been furnished without a license for use & ! on any computer system that can handle it and may be copied & ! without the inclusion of this copyright notice. This & ! software, and any other copies thereof, may be provided or & ! otherwise made available to any person for whatever reason & ! or excuse for use on their system who will also agree to & ! ignore these pseudo-license terms. Title to, credit for, & ! and ownership of this software shall be given to whomever & ! will take the blame for it as well. & ! & !**************************************************************** & 20 ON ERROR GOTO 9000 & \ DIM Z%(30) & \ Z% = FNKB% & \ CLEAR$ = CHR$(26%) IF LSI% & \ CLEAR$ = CHR$(140%) IF GIGI% & \ CLEAR$= CHR$(155%) + '[2J' + CHR$(155%) + '[;H' IF VT100% OR VT125% & ! Z%() is for a FIP call. See what kind of tube we're & ! on and define CLEAR$ & 30 PPN% = PEEK(PEEK(PEEK(520%) + 8%) + 24%) & \ PROJ% = SWAP%(PPN%) AND 255% & \ PROG% = PPN% AND 255% & \ USER$ = '[' + NUM1$(PROJ%) + ',' + NUM1$(PROG%) & \ Z$ = SYS(CHR$(6%) + CHR$(9%) + CHR$(0%)) & \ USER$ = USER$ + '] Job ' & + RIGHT(NUM1$(ASCII(LEFT(Z$,1%))/2% + 100%), 2%) & ! Lookup the account number (the direct way to avoid & ! disturbing future EMT logging) and an interesting & ! (though sloppy) way of getting and converting the & ! job number into 2 digits. & 100 OPEN 'KB:' AS FILE #1%, MODE 24% & \ PRINT #1%, RECORD 256%, CHR$(128% + 79%) + CHR$(32%); & \ PRINT #1%, 'Password: '; & \ GET #1% & \ FIELD #1%, RECOUNT AS PASS$ & \ PASS$ = CVT$$(PASS$, 140%) & \ IF PASS$ = '' & THEN Z$ = SYS(CHR$(6) + CHR$(14%) + CHR$(0%) + CHR$(SWAP%(0%)) & + CHR$(0%) + CHR$(0%) + CHR$(PROG%) + CHR$(PROJ%)) & \ CHANGE Z$ TO Z% & \ PASS$ = CVT$$(RAD$(Z%(9%) + SWAP%(Z%(10%))) & + RAD$(Z%(11%) + SWAP%(Z%(12%))), 255%) & ! Mode 8 for delimiterless (fielded) input and & ! Mode 16 to stop ^Cs & ! Get the password to release the keyboard. The default is & ! the password to their account. & 110 PRINT #1%, CLEAR$ & \ PRINT #1%, FNMOVE$(3%, 17%); & '+--v---v---v---v---v---v---v---v---v---v---+' & \ FOR X% = 4% TO 10% STEP 3% & \ PRINT #1%, FNMOVE$(X%, 17%); & '| |' & \ PRINT #1%, FNMOVE$(X% + 1%, 17%); & '> <' & \ PRINT #1%, FNMOVE$(X% + 2%, 17%); & '| |' & \ NEXT X% & \ PRINT #1%, FNMOVE$(13%, 17%); & '| |' & \ PRINT #1%, FNMOVE$(14%, 17%); & '+--^---^---^---^---^---^---^---^---^---^---+' & ! Print the border & 120 PRINT #1%, FNMOVE$(5%, 33%); 'Protected by' & \ PRINT #1%, FNMOVE$(6%, 35%); 'FROBOZZ' & \ PRINT #1%, FNMOVE$(7%, 30%); 'Magic Alarm Company' & \ PRINT #1%, FNMOVE$(9%, 38%); 'for' & \ PRINT #1%, FNMOVE$(11%, 30%); 'User: ';USER$ & \ PRINT #1%, FNMOVE$(12%, 36%); TIME$(0%) & \ PRINT #1%, FNMOVE$(17%, 1%) & ! Print the inside stuff and close the KB: & 140 TOOLONG = TIME(0%)/60% + 10% & ! Protection ends in 10 minutes & 150 Z$ = SYS(CHR$(3%) + CHR$(1%)) & \ Z$ = SYS(CHR$(11%) + CHR$(1%)) & ! Cancel the echo and type ahead 160 PRINT #1%, RECORD 256%, CHR$(128% + 79%) + CHR$(32%); & \ GOSUB 3000 & \ WAIT 20% & \ GET #1% & \ FIELD #1%, RECOUNT AS GUESS$ & \ GOTO 1000 IF CVT$$(GUESS$, 4%) = PASS$ & \ GOTO 140 IF CVT$$(GUESS$, -1%) = 'EXTEND' & \ GOTO 2000 IF TIME(0%) / 60% >= TOOLONG & \ PRINT #1%, CHR$(7%); & \ GOTO 160 & ! The main loop. Check to see what's happening every & ! 20 seconds to see if time's up, updating the time left. & ! If someone typed 'EXTEND' they start a new 10 minutes. & ! Beep if a miscue. & 170 IF TOOLONG <= TIME(0%) / 60% & THEN GOTO 2000 & ELSE GOSUB 3000 & \ GOTO 160 & ! Wait error in the previous line. Update the time left. & ! If over 10 minutes, log the turkey out. & 1000 CLOSE #1% & \ Z$ = SYS(CHR$(2%)) & \ Z$ = SYS(CHR$(9%)) & !Close the KB:, resume echo, and end clearing this program & 2000 PRINT #1%, FNMOVE$(18%, 17%); ' Protection time expired ...'; & \ PRINT #1%, SPACE$(79% - POS(0%)) & ! Tell them protection ends & 2010 Z$ = SYS(CHR$(2%) + CHR$(1%)) & \ Z$ = SYS(CHR$(6%) + CHR$(5%) + CVT%$(SWAP%(2%))) & \ GOTO 32767 & ! Log them out, ignoring quota & 3000 ! U P D A T E T I M E L E F T & 3010 TIM = TOOLONG - TIME(0%) / 60% & \ MINUTES.REMAINING% = TIM & \ SECONDS.REMAINING% = (TIM - MINUTES.REMAINING%) * 60% & \ PRINT #1%, FNMOVE$(18%, 17%); 'Protection will expire in'; & \ GOTO 3020 UNLESS MINUTES.REMAINING% & \ PRINT #1%, MINUTES.REMAINING%;'minute'; & \ PRINT #1%, 's'; UNLESS MINUTES.REMAINING% < 2% & ! Calculate minutes, seconds left and print minutes & ! if necessary & 3020 GOTO 3030 UNLESS SECONDS.REMAINING% & \ PRINT #1%, SECONDS.REMAINING%;'second'; & \ PRINT #1%, 's '; UNLESS SECONDS.REMAINING% < 2% & ! Print seconds, if necessary & 3030 PRINT #1%, SPACE$(79% - POS(0%)) & \ RETURN & ! Clear to end of line and return & 9000 ! E R R O R H A N D L I N G R O U T I N E & 9010 IF ERR = 15 AND ERL = 160 & THEN GUESS$ = '' & \ RESUME 170 & ! KB Wait expired. Don't do anything but return to check & ! for time & 9020 IF ERR = 15 AND ERL = 20050 & THEN LSI% = -1% & \ FNKB% = -1% & \ RESUME 20090 & ! No response from keyboard in FNKB%, must be an LSI & ! or decwriter & 9030 IF ERL <= 110 & THEN RESUME 1000 & ELSE RESUME 160 & ! The only expected errors should occur in the main loop & ! (such things as ^Zs and such, so return them to the loop & ! unless they ^Z before they type in a password, in which & ! we release them & 20000 DEF* FNKB% & ! This function is a modified version of the standard Whittier & ! College FNKB%. Instead of returning values 0% thru 5% and & ! remembering what each stands for, all terminals in VT52 mode & ! are changed to ANSII mode, thus all we need to is what type & ! of terminal it is. The variables meant to be local to this & ! function have the prefix FUNC.KB. . The variables meant to & ! be global (the actual values to be returned) are boolean and & ! are as follows: & ! & ! LSI% if keyboard is an LSI or Decwriter & ! GIGI% if keyboard is a GIGI & ! VT100% if keyboard is a VT100 or Visual 100 & ! VT125% if keyboard is a VT125 & ! & ! FNKB% is true if one of the above was determined, else FNKB% & ! is false. The keyboard is opened on channel 12, so either it & ! it should be left available for this function or change the & ! channel of this function. & 20010 LSI% = 0% & \ GIGI% = 0% & \ VT100% = 0% & \ VT125% = 0% & \ FNKB% = 0% & ! Initialize everything to false & 20030 FUNC.KB.Z$ = SYS(CHR$(11%)) + SYS(CHR$(3%)) & \ WAIT 4% & \ OPEN 'KB:' AS FILE #12%, MODE 8% & \ PRINT #12%, CHR$(155%);'<' & ! Cancel the type ahead and echo on this keyboard. Wait & ! a few seconds then open them up in ANSII. & 20040 PRINT #12%, CHR$(155%);'Z'; & \ PRINT #12%, RECORD 256%, CHR$(128% + 3%); & ! Send out the interrogation code. & 20050 UNTIL INSTR(1%, FUNC.KB.REST.OF.RESP$, 'c') & \ PRINT #12%, RECORD 256%, CHR$(128% + 1%); & \ GET #12% & \ FIELD #12%, 1% AS FUNC.KB.1ST.RESP.CHAR$ & \ FUNC.KB.REST.OF.RESP$ = FUNC.KB.REST.OF.RESP$ + FUNC.KB.1ST.RESP.CHAR$ & \ NEXT & ! Keep looking in the buffer until we get a response. & 20060 IF INSTR(1%, FUNC.KB.REST.OF.RESP$, '?5') <> 0% & THEN FNKB% = -1% & \ GIGI% = -1% & \ GOTO 20090 & ! Keyboard is a GIGI & 20070 IF INSTR(1%, FUNC.KB.REST.OF.RESP$, '?12') <> 0% & THEN FNKB% = -1% & \ VT125% = -1% & \ GOTO 20090 & ! Keyboard is a VT125 & 20080 IF INSTR(1%, FUNC.KB.REST.OF.RESP$, '?1') <> 0% & THEN FNKB% = -1% & \ VT100% = -1% & \ GOTO 20090 & ! Keyboard is a VT100 & 20090 WAIT 0% & \ FUNC.KB.Z$ = SYS(CHR$(11%)+CHR$(12%)) & \ CLOSE #12% & \ FUNC.KB.Z$ = SYS(CHR$(2%)) & ! Kill the wait, reenable type ahead, close the channel, & ! and reset to echo . & 20100 FNEND & ! End of FNKB% & 21000 DEF* FNMOVE$(ROW%, COLUMN%) & ! The cursor control function. It is assumed that the & ! keyboard type is known and is designated as LSI%, GIGI%, & ! VT100%, or VT125% and is in ANSII mode & 21010 IF LSI% & THEN FNMOVE$ = CHR$(155%) + '=' + CHR$(ROW% + 31%) & + CHR$(COLUMN% + 31%) & ELSE FNMOVE$ = CHR$(155%) + '[' + NUM1$(ROW%) + ';' & + NUM1$(COLUMN%) + 'H' & 21020 FNEND & ! End of FNMOVE$ & 32767 END & 4R 2?10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! MFDBIT & ! & !A program to set the "marked for deletion" bit on files. When & !this bit is set, the file does not show up in a directory & !listing. CLEANing will destroy the file, but until then it is & !on the system and can be recovered by changing the bit again & ! & !This program is similar to the one called UFD. Look to that & !program for a description of the UFD. & ! 100 ! & !Get the account number & ! 110 PRINT "Account number"; \ & INPUTLINE PPN$ \ & PPN$ = CVT$$(PPN$,-1%) 120 IF PPN$ = "" THEN GOTO 900 130 BRACKET% = INSTR(1%,PPN$,"(") \ & IF BRACKET% = 0% & THEN PPN$ = "[" + PPN$ + "]" 200 ! & !get name of file & ! 210 INPUT "File name"; FILE$ 220 IF FILE$ = "" THEN GOTO 100 300 ! & !starting disk & ! 310 DISK$ = "DR0:" 400 ! & !open up and dimension the UFD; get cluster size & ! 410 OPEN DISK$ + PPN$ FOR INPUT AS FILE #1%, MODE 16384% 420 DIM #1%, U%(3583%,7%) & !up to 3584 blockettes of 8 words each 430 CLU% = U%(31%,0%) 500 ! & !look through name blockettes for it and process & ! 510 PTR% = FNLINK%(U%(0%,0%)) & !first word of first blockette is a link to first NB 520 IF PTR% = 0% THEN GOTO 600 !a zero pointer is end of NB's 530 TFILE$ = RAD$(U%(PTR%,1%)) + RAD$(U%(PTR%,2%)) + "." & + RAD$(U%(PTR%,3%)) 540 TFILE$ = CVT$$(TFILE$,2%) 550 IF TFILE$ = FILE$ & THEN GOSUB 2000 \ & GOTO 200 560 PTR% = FNLINK%(U%(PTR%,0%)) !get link to next NB 570 GOTO 520 600 ! & !couldn't find the file on DR0: & ! 610 IF DISK$ = "DR0:" & THEN DISK$ = "DR6:" \ & GOTO 400 900 ! & !done & ! 910 CLOSE #1% 920 GOTO 32767 2000 ! & ! & ! SUBROUTINE: Do a single file & ! & ! 2100 ! & !find the status byte and MFD bit & ! 2110 FSTATUS% = U%(PTR%,4%) AND 255% 2120 MFDBIT% = (FSTATUS% AND 128%) / 128% 2200 ! & !say what is now true & ! 2210 IF MFDBIT% = 0% & THEN PRINT "MFD bit is off." & ELSE PRINT "MFD bit is on." 2300 ! & !ask about new status & ! 2310 INPUT "New status of MFD bit (ON, OFF)"; BIT$ \ & BIT$ = CVT$$(BIT$,-1%) 2320 IF BIT$ = "" THEN RETURN 2330 IF BIT$ <> "ON" AND BIT$ <> "OFF" & THEN PRINT "Please specify." \ & GOTO 2310 2400 ! & !do it & ! 2410 IF BIT$ = "ON" AND MFDBIT% = 0% & THEN U%(PTR%,4%) = U%(PTR%,4%) OR 128% 2420 IF BIT$ = "OFF" AND MFDBIT% = 1% & THEN U%(PTR%,4%) = U%(PTR%,4%) AND (NOT 128%) 2990 RETURN 8000 ! & ! & ! FUNCTIONS & ! & ! 8010 ! & !convert link word to Blockette number & ! & !bits 9 to 11 are the cluster number. The first line gets & ! these bits and multiplies by cluster size & !bits 12 to 15 are block number. The next line gets these and & ! multiplies by 32 (number of blockettes per block) & !bits 4 to 8 are the blockette number. The last line adds & ! this. & !the other bits of the link are not relevant here & ! 8020 DEF FNLINK%(L%) = & ((( L% AND 3584%) / 512% ) * CLU% & + ( SWAP%( L% AND -4096% ) / 16% )) * 32% & + (( L% AND 496%) / 16%) 32767 END & 2?10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! FIND & ! & !A program to make a list of all "hidden" files on the system, & !i.e. files which have the "marked for deletion" bit set but & !are not open. This program is similar to UFD.BAS, which you & !should see for an explanation of the UFD. & ! 80 Z$ = SYS(CHR$(6%)+CHR$(-7%)) !^C trap 90 ON ERROR GOTO 9000 100 ! & !Initialize & ! 110 GOSUB 1000 200 ! & !Explain program and get disk number & ! 210 GOSUB 2000 220 INPUT "Disk number"; DISK$ 230 IF LEFT(DISK$,2%) = "DR" & THEN DISK% = VAL(MID(DISK$,3%,1%)) & ELSE DISK% = VAL(DISK$) 240 DISK$ = "DR" + NUM1$(DISK%) + ":" 300 ! & !output file & ! 310 INPUT "Output file "; OUTFILE$ \ & OUTFILE$ = "HIDDEN.LST" IF OUTFILE$ = "" \ & OUTFILE$ = CVT$$(OUTFILE$,4%) 320 IF INSTR(1%,OUTFILE$,".") = 0% & THEN OUTFILE$ = OUTFILE$ + ".LST" 330 OPEN OUTFILE$ FOR OUTPUT AS FILE #2% 400 ! & !Go through accounts & ! 410 INDEX% = 0% 420 Z$ = SYS( CHR$(6%) + CHR$(25%) + & CHR$(INDEX%) + CHR$(SWAP%(INDEX%)) + & CHR$(255%) + CHR$(255%) + & STRING$(16%,0%) + "DR" + & CHR$(DISK%) + CHR$(255%) ) & ! 430 PROJ% = ASCII(MID(Z$,6%,1%)) \ & PROG% = ASCII(MID(Z$,5%,1%)) 435 IF INSTR(1%,OUTFILE$,"KB:") = 0% & THEN PRINT "Working on "; "["; \ & PRINT USING "###", PROJ%; \ & PRINT ","; \ & PRINT USING "###", PROG%; \ & PRINT "]" 440 IF PROJ% = 1% AND PROG% = 1% THEN GOTO 460 & !Skip [1,1] because it has the MFD 450 GOSUB 3000 !Go through UFD for this account 460 INDEX% = INDEX% + 1% 470 GOTO 420 900 ! & !done & ! 990 GOTO 32767 1000 ! & ! & ! SUBROUTINE: Initialize & ! & ! 1100 ! & !constants & ! 1110 BELL$ = CHR$(26%) 1120 TRUE% = -1% \ & FALSE% = 0% 1990 RETURN 2000 ! & ! & ! SUBROUTINE: Description & ! & ! 2010 PRINT \ & PRINT "This program will print a list of all files with the 'marked for deletion' bit" \ & PRINT "set. Files which have this bet set but are not opened exist on the disk but" \ & PRINT "are not listed by DI, CAT, or PIP and are therefore effectively hidden." \ & PRINT 2990 RETURN 3000 ! & ! & ! SUBROUTINE: Go thorugh UFD for one account & ! & ! 3100 ! & !open the UFD, dimension it and get cluster size & ! 3110 OPEN DISK$ + "[" + NUM1$(PROJ%) + "," + NUM1$(PROG%) + "]" AS FILE #1% 3120 DIM #1%, U%(3538%,7%) 3130 CLU% = U%(31%,0%) 3200 ! & !loop through name blockettes & ! 3210 PTR% = FNLINK%(U%(0%,0%)) 3220 IF PTR% = 0% THEN RETURN 3230 GOSUB 4000 !Do this file 3240 PTR% = FNLINK%( U%(PTR%,0%) ) 3250 GOTO 3220 3990 RETURN 4000 ! & ! & ! SUBROUTINE: Do one file & ! & ! 4100 ! & !quit if bit not set & ! 4110 STATUSBYTE% = U%(PTR%,4%) AND 255% 4120 IF (STATUSBYTE% AND 128%) <> 128% THEN RETURN 4200 ! & !print data & ! 4210 PRINT #2%, "["; \ & PRINT #2%, USING "###", PROJ%; \ & PRINT #2%, ","; \ & PRINT #2%, USING "###", PROG%; \ & PRINT #2%, "] "; 4220 PRINT #2%, RAD$( U%(PTR%,1%) ); & RAD$( U%(PTR%,2%) ); "."; & RAD$( U%(PTR%,3%) ); & !name of file 4230 PRINT #2%, USING " ###", PROT%; & !Protection 4240 AB% = FNLINK%(U%(PTR%,6%)) \ & PRINT #2%, " ";DATE$(U%(AB%,3%)) & !date of creation 4990 RETURN 8000 ! & ! & ! FUNCTIONS & ! & ! 8100 ! & !Convert a link word to a blockette number & ! 8110 DEF FNLINK%(L%) = ((( L% AND 3584%) / 512% ) * CLU% & + ( SWAP%( L% AND -4096% ) / 16% )) * 32% & + (( L% AND 496%) / 16%) 9000 ! & ! & ! Error Routine & ! & ! 9100 ! & !^C error: not caught seperately & ! 9200 ! & !Expected errors (by line number) & ! 9210 IF ERL = 420 THEN GOTO 900 & !assume an error means no more files 9600 ! & !Expected errors (with no specific line number) & ! 9900 ! & !Unexpected errors & ! 9910 Z$ = SYS(CHR$(6%)+CHR$(9%)+CHR$(ERR)) 9920 ERROR$ = RIGHT(Z$,3%) 9930 CLOSE 1% 9940 PRINT #2% \ & PRINT #2% \ & PRINT #2%, "Program ended with an error before all files were processed." \ & PRINT #2%, " "; ERROR$; " at line";ERL 9950 CLOSE #2% 32767 END , 2? 10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! GFD & ! & !A program to access the data in the GFD. It only prints part & !of the data, but this program should be sufficent to show how & !any of the data may be printed. See GFD.DOC for a description & !of the GFD and DISK.DOC for a description of DCN 1 of the & !disk. & ! 1000 ! & ! & ! MAIN PROGRAM & ! & ! & !get the disk number & ! 1010 INPUT "Disk"; DISK$ 1020 IF DISK$ = "" THEN GOTO 9000 & !quit if no disk specified 1030 IF LEFT(DISK$,2%) <> "DR" & THEN DISK$ = "DR" + DISK$ 1040 IF RIGHT(DISK$,LEN(DISK$)) <> ":" & THEN DISK$ = DISK$ + ":" 1050 PRINT \ PRINT 2000 ! & !open disk non-file structured with buffer size large enough & !to get the second block of the MFD. & !get the pack label block & !get the version number and quit if not 1.1 & !get the DCN of the MFD & ! 2010 OPEN DISK$ AS FILE #1%, RECORDSIZE 1024% 2020 FIELD #1%, 1024% AS BUFF$ 2030 GET #1%, BLOCK 1% 2040 VERSION% = FNBYTE%(7%) \ & LEVEL% = FNBYTE%(6%) \ & IF VERSION% <> 1% & OR LEVEL% <> 1% & THEN PRINT "This program only works for 1.1 disks." \ & GOTO 32767 2050 DCN.MFD% = FNWORD%(2%) 3000 ! & !get the account number & ! 3010 PRINT "Account number"; \ & INPUTLINE PPN$ \ & PPN$ = CVT$$(PPN$,-1%) 3020 IF PPN$ = "" THEN GOTO 8000 & !if no account, ask for another disk 3030 IF LEFT(PPN$,1%) = "(" & THEN PPN$ = RIGHT(PPN$,2%) \ & PPN$ = LEFT(PPN$,LEN(PPN$)-1%) & !if [ was given, assume ] also and get rid of both & !remember that the convert will change [ to ( 3040 COMMA% = INSTR(1%,PPN$,",") \ & PROJ% = VAL( LEFT(PPN$,COMMA%-1%) ) \ & PROG% = VAL( RIGHT(PPN$,COMMA%+1%) ) 4000 ! & !get the DCN of the GFD & !if no such project, say so & ! 4010 GET #1%, BLOCK DCN.MFD% 4020 DCN.GFD% = FNWORD%(256% + PROJ%) 4030 IF DCN.GFD% = 0% & THEN PRINT "There is no such project." \ & GOTO 3000 5000 ! & !open up the GFD with correct cluster size & !get the link for this account & ! 5010 CLOSE #1% 5020 OPEN DISK$ AS FILE #1%, RECORDSIZE 16% * 512% 5030 FIELD #1%, 16% * 512% AS BUFF$ 5040 GET #1%, BLOCK DCN.GFD% \ & CURRENT.CLUSTER% = 0% 5050 LINK.NB% = FNWORD%(512% + PROG%) 5060 IF LINK.NB% = 0% & THEN PRINT "There is no such account." \ & GOTO 3000 6000 ! & !get the data for this account & ! 6010 GOSUB 10000 7000 ! & !another account & ! 7010 GOTO 3000 8000 ! & !another disk & ! 8010 GOTO 1000 9000 ! & !normal exit & ! 9010 CLOSE #1% 9990 GOTO 32767 10000 ! & ! & ! SUBROUTINE: Data from GFD & ! & ! & !save the cluster map & ! 10010 FOR I% = 0% TO 7% 10020 CLUSTER.MAP%(I%) = FNWORD%(249%+I%) & !these are the last eight words of the block 10030 NEXT I% 10100 ! & !get correct cluster, block and offset for this link & ! 10110 OFFSET% = FNLINK%(LINK.NB%) \ & !the function GETs the right cluster and finds the offset \ & BYTE.OFFSET% = OFFSET% \ & WORD.OFFSET% = OFFSET%/2% 10200 ! & !save the values of the other links (in case we leave this & !cluster) & ! 10210 LINK.DTB% = FNWORD%(WORD.OFFSET% + 0%) 10220 LINK.AB% = FNWORD%(WORD.OFFSET% + 6%) 10300 ! & !data from the name blockette & ! 10310 PROJ% = FNBYTE%(BYTE.OFFSET% + 3%) \ & PROG% = FNBYTE%(BYTE.OFFSET% + 2%) \ & PRINT "Account [";PROJ%;",";PROG%;"]" 10320 PROT% = FNBYTE%(BYTE.OFFSET% + 9%) \ & PRINT "Protection:";PROT% 10330 STAT% = FNBYTE%(BYTE.OFFSET% + 8%) \ & PRINT "Status";STAT% 10340 LOGINS% = FNBYTE%(BYTE.OFFSET% + 11%) \ & PRINT "Logins:";LOGINS% 10350 OPENS% = FNBYTE%(BYTE.OFFSET% + 10%) \ & PRINT "Opens:";OPENS% 10360 DCN.UFD% = FNWORD%(WORD.OFFSET% + 7%) \ & PRINT "DCN of UFD is"; DCN.UFD% 10400 ! & !data from accounting blockette & !(only some of the data is being printed) & ! 10410 OFFSET% = FNLINK%(LINK.AB%) \ & !the function GETs the right cluster and finds the offset \ & WORD.OFFSET% = OFFSET%/2% 10420 CONNECT% = FNWORD%(WORD.OFFSET% + 2%) \ & PRINT \ & PRINT "Connect time is "; FNTIME$(CONNECT%) 10430 QUOTA% = FNWORD%(WORD.OFFSET% + 6%) \ & PRINT "Quota:";QUOTA% 10500 ! & !data from date/time blockette & !(including link to password blockette) & ! 10510 OFFSET% = FNLINK%(LINK.DTB%) \ & !the function GETs the correct cluster and finds the offset \ & BYTE.OFFSET% = OFFSET% \ & WORD.OFFSET% = OFFSET%/2% 10520 KB.LAST% = FNBYTE%(BYTE.OFFSET% + 3%) 10530 IF KB.LAST% <> 0% & THEN PRINT "Last signed in at KB"; NUM1$(KB.LAST%);":"; \ & PRINT " on ";DATE$(FNWORD%(WORD.OFFSET% + 2%)); \ & PRINT " at ";TIME$(FNWORD%(WORD.OFFSET% + 3%)) 10540 LINK.PB% = FNWORD%(WORD.OFFSET% + 0%) 10600 ! & !data from password blockette & ! 10610 OFFSET% = FNLINK%(LINK.PB%) \ & !the function GETs the correct cluster and finds the offset \ & BYTE.OFFSET% = OFFSET% 10620 PASS$ = CHR$( FNBYTE%(BYTE.OFFSET% + 3%) ) 10630 FOR I% = 4% TO 15% 10640 PASS$ = PASS$ + CHR$( FNBYTE%(BYTE.OFFSET% + I%) ) 10650 NEXT I% 10660 !PRINT \ & !PRINT "Password: "; PASS$ 10700 ! & !print a couple of blank lines & ! 10710 PRINT \ PRINT 10900 ! & !return & ! 10990 RETURN 18000 ! & ! & ! FUNCTIONS & ! & ! 18100 ! & !pull a word from the buffer & !for convenience, the words are numbered as words even though & !the buffer is character (and hence byte) oriented. Words are & !normally numbered starting at zero, but the characters in the & !buffer must be numbered starting at one, so another adjustment & !is needed. & ! 18110 DEF* FNWORD%(W%) 18120 FIRSTBYTE% = W% * 2% + 1% 18180 FNWORD% = ASCII( MID(BUFF$,FIRSTBYTE% ,1%) ) & + SWAP%( ASCII( MID(BUFF$,FIRSTBYTE%+1%,1%) ) ) 18190 FNEND 18200 ! & !pull a byte from the buffer & !Since the bytes are generally numbered starting at zero but & !the characters are numbered begining at one, an adjustment is & !needed. & ! 18210 DEF* FNBYTE%(B%) 18280 FNBYTE% = ASCII(MID(BUFF$,B%+1%,1%)) 18290 FNEND 18300 ! & !convert a link & !If the link indicates another cluster, the correct cluster is & !GETed by the function. & ! & !In a link word the bits have the following meaning: & ! & ! 0 - 8 byte within the block & ! 9 - 11 cluster (16 blocks) number & ! 12 - 15 block within the cluster & ! 18310 DEF* FNLINK%(LINK%) 18320 CLUSTER.NUMBER% = ( LINK% AND 3584% ) / 512% \ & BLOCK.NUMBER% = SWAP%( LINK% AND -4096% ) / 16% \ & BYTE.NUMBER% = LINK% AND 511% 18330 IF CLUSTER.NUMBER% <> CURRENT.CLUSTER% & THEN GET #1%, BLOCK CLUSTER.MAP%(CLUSTER.NUMBER%) \ & CURRENT.CLUSTER% = CLUSTER.NUMBER% 18380 FNLINK% = BLOCK.NUMBER% * 512% + BYTE.NUMBER% 18390 FNEND 18400 ! & !convert a number to time & ! 18410 DEF* FNTIME$(T%) 18420 IF T% = 0% & THEN T$ = "none" \ & GOTO 18480 18430 HOURS% = T% / 60% \ & MINUTES% = T% - HOURS% * 60% 18440 T$ = NUM1$(MINUTES%) \ & IF LEN(T$) = 1% & THEN T$ = "0" + T$ 18450 IF HOURS% > 0% & THEN T$ = NUM1$(HOURS%) + ":" + T$ 18480 FNTIME$ = T$ 18490 FNEND 32767 END 4 2?10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! UFD & ! & !A program to look at the UFD (User File Directory) & ! & !Each block of the UFD is divided into 8 "blockettes". The & !dimension statement does that division (remember that all & !arrays have zero elements). 3584 is the larges number of & !blockettes possible ( 7 clusters of 16 blocks of 32 & !blockettes each). The function FNLINK% is used to convert & !a pointer into a blockette number. & ! 21 ! & !There are several kinds of blockettes. & ! & !The very first blockette is a Label Blockette (LB). Its & !layout is: & ! Word 0: Link to first NB (see below) & ! Word 1: -1 (helps to identify it as an LB & ! Words 2 through 5 are zero & ! Word 6: PPN (project and programmer number) & ! Word 7: -31692 (rad50 for 'UFD') & !Name Blockettes (NB) are described in subroutine 2000 & !Accounting Blockettes (AB) are described in subroutine 2000 & !Retrieval Blockettes (RB) have lists of DCN's and pointers & ! to more RB's & !Attribute Blockettes (ATB) are used by RSX and RMS. They are & !not discussed here. & ! 100 ! & !open up and dimension the UFD; get cluster size & ! 110 PRINT "Account"; \ & INPUTLINE PPN$ \ & PPN$ = CVT$$(PPN$,-1%) 120 OPEN PPN$ FOR INPUT AS FILE #1% & !This is how to open up the UFD 130 DIM #1%, U%(3583%,7%) & !up to 3584 blockettes of 8 words each 140 CLU% = U%(31%,0%) & ! & !Every block in the UFD has a copy of the FDCM (file Directory & !cluster map). Its first (0th) word has the cluster size. The & !other words are device cluster numbers, the physical locations & !of parts of the file. & ! 200 ! & !look through this UFD & ! 210 PTR% = FNLINK%(U%(0%,0%)) & !first word of first blockette is a link to first NB 220 IF PTR% = 0% THEN GOTO 900 !a zero pointer is end of NB's 230 GOSUB 2000 !process this file 240 PTR% = FNLINK%(U%(PTR%,0%)) !get link to next NB 250 GOTO 220 900 ! & !done & ! 910 GOTO 32767 2000 ! & ! & ! SUBROUTINE: Print data for current file & ! & ! 2100 ! & !Data from Name Blockette & ! 2110 PRINT RAD$(U%(PTR%,1%)); & RAD$(U%(PTR%,2%)); "."; & RAD$(U%(PTR%,3%)); & !file name and extension 2120 PRINT USING "<###>", SWAP%(U%(PTR%,4%)) AND 255% & !protection code 2130 ST% = U%(PTR%,4%) AND 255% 2135 PRINT "Status Byte: "; 2140 FOR I% = 7% TO 0% STEP -1% 2150 PRINT USING "#", ( (2% ^ I%) AND ST% ) / 2% ^ I%; 2160 NEXT I% 2170 PRINT 2180 PRINT "Open regardless and open count: ", & ( SWAP%(U%(PTR%,5%)) AND 255% ), ( U%(PTR%,5%) AND 255% ) 2200 ! & !data from Accounting Blockette & ! & ! word 0: link to Attribute Blockette & ! word 1: date of last access & ! word 2: file size in blocks & ! word 3: date of creation & ! word 4: time of creation & ! word 5: run-time system name & ! word 6: " & ! word 7: file clustersize & ! & !for large data files, which have no run-time system, word & !five is set to zero (which is not valid for a RTS) and word & !six is used for the most significant part of the file size. & ! 2210 AB% = FNLINK%(U%(PTR%,6%)) & !get location of Accounting Blockette 2220 PRINT 'access: '; DATE$(U%(AB%,1%)); !date of last access 2230 PRINT ' creation: '; DATE$(U%(AB%,3%)); !date of creation 2240 PRINT ' '; TIME$(U%(AB%,4%)) !time of creation 2250 SIZE = U%(AB%,2%) \ & SIZE = SIZE + 65536. IF SIZE < 0 & !get size and adjust for "negatives" 2260 SIZE = SIZE + 65536. * U%(AB%,6%) UNLESS U%(AB%,5%) & !if a large file, add high order part. 2270 PRINT USING "SIZE: ######", SIZE 2280 PRINT "Run time system: ";RAD$(U%(AB%,5%)) + RAD$(U%(AB%,6%)) 2290 PRINT "Clustersize: ";U%(AB%,7%) 2300 ! & !some space before next file & ! 2310 PRINT \ PRINT 2990 RETURN 8000 ! & ! & ! FUNCTIONS & ! & ! 8010 ! & !convert link word to Blockette number & ! & !bits 9 to 11 are the cluster number. The first line gets & ! these bits and multiplies by cluster size & !bits 12 to 15 are block number. The next line gets these and & ! multiplies by 32 (number of blockettes per block) & !bits 4 to 8 are the blockette number. The last line adds & ! this. & !the other bits of the link are not relevant here & ! 8020 DEF FNLINK%(L%) = & ((( L% AND 3584%) / 512% ) * CLU% & + ( SWAP%( L% AND -4096% ) / 16% )) * 32% & + (( L% AND 496%) / 16%) 32767 END  2? 2 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & ! This software is furnished under no license and may be used & ! and copied in accordance with the nonexistent terms of such & ! license and with or without the inclusion of the above & ! copyright notice. This software or any other copies thereof & ! may be provided or otherwise made available to any other & ! person. & ! & ! The information in this software is subject to change without & ! notice and should not be construed as a commitment by & ! Whittier College or the author. This software is & ! unconditionally guaranteed to perform without error the & ! purpose for which it is intended. Said purpose is to remain & ! the secret of the author and is subject to change without & ! notice and at the whim of the author. & ! & ! Whittier College assumes no responsibility for the use or & ! reliability of its software on equipment that is not supplied & ! by Whittier College. Whittier College supplies no equipment. & ! & ! This program was written for internal use and has not been & ! been significantly modified for export. You may need to make & ! changes to fit your system or needs. If you have any problems & ! please contact: & ! & ! David Rosales & ! Whittier College, Computer Center & ! Whittier CA 90601 & ! (213) 693-0771 ext 287 & ! & 10 EXTEND 15 ! & ! This program allows you to find the DCNs (Disk & ! Cluster Numbers) of a file and also demonstrates & ! a method for GETing the data from the DCNs of the & ! disk. & ! & ! See UFD.DOC and UFD.BAS to understand & ! how the UFD is accessed. & ! & 100 ! & ! Initialize ^C TRAP, ERROR routine and CONSTANTS. & ! & 120 ON ERROR GOTO 19000 & 140 Z$ = SYS(CHR$(6%)+CHR$(-7%)) & ! ^C Error trap & 500 GOSUB 18000 & ! Constant variables. & 1000 INPUT "Disk ";DISK$ \ & DISK$ = "DR0:" IF CVT$$(DISK$,2%) = "" \ & INPUT "Disk cluster size <4>";D.CLU% \ & D.CLU% = 4% IF D.CLU% = 0% & ! Input the disk name. & ! Input the cluster size of the disk. & 1005 PRINT "Account"; \ & INPUTLINE UFD$ \ & GOTO 1005 IF CVT$$(UFD$,2%+4%) = "" & ! Input the account number. & 1010 INPUT "File name";FILE.NAME$ \ & GOTO 1010 IF CVT$$(FILE.NAME$,2%) = "" & ! Input the file name. & 1020 PRINT.IT% = 0% \ & INPUT "Print the contents of the file ";PRINT.IT$ \ & PRINT.IT% = YES% IF LEFT(CVT$$(PRINT.IT$,32%),1%) = "Y" & ! Ask if they want to see the file. & 1040 REC.SIZE% = D.CLU% * 512% & ! Recordsize is the clustersize times the size of a block. & 1060 OPEN DISK$+UFD$ AS FILE #9% \ & DIM #9%, U%(3583%,7%) \ & OPEN DISK$ AS FILE #3% RECORDSIZE REC.SIZE% \ & FIELD #3%, REC.SIZE% AS DISK.CLUSTER$ & ! Open up the UFD. & ! Dimension the UFD. & ! Open the disk (non-file structured). & ! Field a disk cluster. & 1080 NB% = FNNB%(FILE.NAME$) \ & RB% = FNLINK%(U%(NB%,7%)) & ! Find the name blockette of the given file. & ! Find the retrieval blockette in the name blockette. & 1100 FOR WORD% = 0% TO 7% & ! Loop for all the words in each retrieval blockette. & 1120 DCN% = U%(RB%,WORD%) \ & IF WORD% = 0% & THEN & PRINT \ & PRINT "Pointer to the next retrieval "; \ & PRINT "blockette on the disk is DCN";DCN% \ & PRINT "Pointer to the next retrieval "; \ & PRINT "blockette in the array is";FNLINK%(DCN%) \ & PRINT & ! & ! Find the DCN in the WORD%'th position in the & ! retrieval blockette. & ! Word zero is the pointer to the next retrieval & ! blockette. When I get to word zero I print out & ! the different forms in which the pointer to the & ! next retrieval blockette can be interpretted. & ! & ! The DCN would be used in the case of accessing & ! the UFD non-file structured. & ! The FNLINK% version is used to access the UFD in & ! form of an array (as I have done in this program). & 1130 IF WORD% <> 0% & THEN & PRINT \ & PRINT "Word";WORD%;"points to DCN";DCN% \ & PRINT & ! If the word is not the zero word of the retrieval & ! blockette then it is reffering to a DCN on the disk. & ! Print where the DCN is pointing to. & 1140 IF DCN% <> 0% AND WORD% <> 0% AND PRINT.IT% = YES% & THEN & GET #3%, BLOCK DCN% \ & PRINT DISK.CLUSTER$ & ! If the DCN% is not pointing to DCN zero and DCN% & ! is not the pointer to the next retrieval blockette & ! and I have been asked to print out the file, then & ! I do a GET on chanel #3% and print out the cluster. & 1160 NEXT WORD% & ! Do it again. & 1180 RB% = FNLINK%(U%(RB%,0%)) \ & IF RB% = 0% & THEN & GOTO 1200 & ELSE & GOTO 1100 & 1200 CLOSE #9% \ & CLOSE #3% & ! Close the UFD. & ! Close the disk. & 17999 GOTO 32767 & 18000 ! & ! This SUBROUTINE sets up the values to some & ! constant variabales. & ! & 18010 BELL$ = CHR$(7%) + CHR$(7%) + CHR$(7%) & 18020 YES% = -1% \ & TRUE% = -1% \ & NO% = 0% \ & FALSE% = 0% & 18200 RETURN & ! Return from the MAIN SUBROUTINE. & 19000 ! & ! ERROR ROUTINE & ! & 19010 ! * * * * * * * & ! Expected Errors WITHOUT error line numbers & ! * * * * * * * & 19020 ! ^C error \ & IF ERR = 28 & THEN & Z$ = SYS(CHR$(6%)+CHR$(-7%)) \ & CLOSE #9% \ & CLOSE #3% \ & RESUME 100 & 19030 ! ^Z error \ & IF ERR = 11 & THEN & CLOSE #9% \ & CLOSE #3% \ & RESUME 32767% & 19980 ! * * * * * * * & ! Unexpected errors & ! * * * * * * * & 19985 Z$ = SYS(CHR$(6%)+CHR$(9%)+CHR$(ERR)) & 19990 ERROR$ = RIGHT(Z$,3%) & 19995 PRINT BELL$ \ & PRINT " Oh no !! Not another "; ERROR$ \ & PRINT " at line";ERL;"in program DCN !!" & 19999 GOTO 32767 & 22000 ! & ! This function finds the NB of files. & ! & 22010 DEF* FNNB%(FILE.FN$) & 22030 FILE.FN$ = CVT$$(FILE.FN$,2%+32%) \ & FILE.UFD$ = "" \ & FOUND.FILE% = 0% & ! Convert the user input to upper case with no spaces. & ! Initialize the UFD file name string. & ! Initialize the file found flag. & 22050 CLU% = U%(31%,0%) \ & NB% = FNLINK%( U%(0%,0%) ) & ! Find the clustersize of the UFD. & ! Find the pointer to the first name blockette. & 22070 UNTIL FOUND.FILE% = TRUE% \ & IF NB% = 0% & THEN & PRINT "?Can't find file ";FILE.FN$ \ & GOTO 32767 & ! Loop until we find the file in the UFD. & ! If we reach the end of the UFD & ! then & ! we could not find the file. & 22090 FILE.UFD$ = RAD$(U%(NB%,1%)) + RAD$(U%(NB%,2%)) + & "." + RAD$(U%(NB%,3%)) \ & FILE.UFD$ = CVT$$(FILE.UFD$,2%) \ & IF FILE.UFD$ = FILE.FN$ & THEN & FOUND.FILE% = TRUE% & ELSE & NB% = FNLINK%( U%(NB%,0%) ) \ & NEXT & ! Build the file name string. & ! Get rid of all the spaces in the file name string. & ! If the file names match & ! then & ! Set the file found flag. & ! else & ! Find the next name blockette. & ! Look at next name blockette. & 22100 FNNB% = NB% \ & FNEND & 22250 DEF* FNLINK%(L%) = ((( L% AND 3584%) / 512% ) * CLU% & + ( SWAP%( L% AND -4096% ) / 16% )) * 32% & + (( L% AND 496%) / 16%) & 32767 END & \qq 2?10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! RETRIE & ! & !A program to look at Retrieval Blockettes & ! & !See UFD.BAS or UFD.DOC for details on how the program works & ! 100 ! & !Get the account number & ! 110 PRINT "Account number"; \ & INPUTLINE PPN$ \ & PPN$ = CVT$$(PPN$,-1%) 120 IF PPN$ = "" THEN GOTO 900 130 BRACKET% = INSTR(1%,PPN$,"(") \ & IF BRACKET% = 0% & THEN PPN$ = "[" + PPN$ + "]" 200 ! & !open up and dimension the UFD; get cluster size & ! 210 OPEN PPN$ FOR INPUT AS FILE #1% 220 DIM #1%, U%(3583%,7%) & !up to 3584 blockettes of 8 words each 230 CLU% = U%(31%,0%) 300 ! & !get name of file & ! 310 INPUT "File name"; FILE$ 320 IF FILE$ = "" THEN GOTO 100 330 FILE$ = CVT$$(FILE$,32%) 400 ! & !look through name blockettes for it and process & ! 410 PTR% = FNLINK%(U%(0%,0%)) & !first word of first blockette is a link to first NB 420 IF PTR% = 0% THEN GOTO 500 !a zero pointer is end of NB's 430 TFILE$ = RAD$(U%(PTR%,1%)) + RAD$(U%(PTR%,2%)) + "." & + RAD$(U%(PTR%,3%)) 440 TFILE$ = CVT$$(TFILE$,2%) 450 IF TFILE$ = FILE$ & THEN GOSUB 2000 \ & GOTO 300 460 PTR% = FNLINK%(U%(PTR%,0%)) !get link to next NB 470 GOTO 420 500 ! & !couldn't find the file & ! 510 PRINT "Can't find a file by that name." 520 GOTO 300 900 ! & !done & ! 910 CLOSE #1% 920 GOTO 32767 2000 ! & ! & ! SUBROUTINE: Print data for current file & ! & ! 2200 ! & !find Retrieval Blockette & ! 2210 RB% = FNLINK%(U%(PTR%,7%)) 2300 ! & !print the data & ! 2310 FOR I% = 1% TO 7% 2320 DCN% = U%(RB%,I%) 2330 IF DCN% <> 0% THEN PRINT DCN% 2340 NEXT I% 2350 IF U%(RB%,0%) <> 0% & THEN RB% = FNLINK%(U%(RB%,0%)) \ & GOTO 2300 2400 ! & !to print the contents of the file: & !(1) open the disk non file structured with a record size equal & ! to the cluster size. (See DISK.DOC or SYS.DOC for how to & ! find the cluster size.) & !(2) field the buffer at the same size & !(3) for each value of DCN%, use GET #?, BLOCK DCN% to get the & ! appropriate cluster and then print it & ! 2900 RETURN 8000 ! & ! & ! FUNCTIONS & ! & ! 8010 ! & !convert link word to Blockette number & ! & !bits 9 to 11 are the cluster number. The first line gets & ! these bits and multiplies by cluster size & !bits 12 to 15 are block number. The next line gets these and & ! multiplies by 32 (number of blockettes per block) & !bits 4 to 8 are the blockette number. The last line adds & ! this. & !the other bits of the link are not relevant here & ! 8020 DEF FNLINK%(L%) = & ((( L% AND 3584%) / 512% ) * CLU% & + ( SWAP%( L% AND -4096% ) / 16% )) * 32% & + (( L% AND 496%) / 16%) 32767 END <i" 2?10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! DATETI & ! & !A program to find data in the Date/Time blockete of the GFD: & !last keyboard number, date and time of last login, date and & !time of last pasword change, and date and time of account & !creation. It can be accesses by FIP -25. At the time of & !writing, this form of FIP -25 is not documented in the RSTS & !Programmers Manual, but I think this program prints all the & !information from this SYS call that isn't either in the data & !passed or easily available from other SYS functions. & ! 90 ON ERROR GOTO 9000 100 ! & !preliminaries & ! 110 GOSUB 1000 120 PRINT \ & PRINT " This program prints the information available in the Date/Time blockette" \ & PRINT "of the GFD." \ & PRINT 200 ! & !get the account number & ! 210 PRINT "Account number"; \ & INPUTLINE PPN$ \ & PPN$ = CVT$$(PPN$,-1%) 220 IF PPN$ = "" THEN GOTO 900 230 IF LEFT(PPN$,1%) = "(" & THEN PPN$ = RIGHT(PPN$,2%) \ & PPN$ = LEFT(PPN$,LEN(PPN$)-1%) 240 COMMA% = INSTR(1%,PPN$,",") 250 PROJ% = VAL( LEFT(PPN$,COMMA%-1%) ) \ & PROG% = VAL( RIGHT(PPN$,COMMA%+1%) ) 300 ! & !get and print the data from the SYS call & ! 310 GOSUB 2000 400 ! & !again & ! 410 GOTO 200 900 ! & !done & ! 990 GOTO 32767 1000 ! & ! & ! SUBROUTINE: preliminaries & ! & ! 1100 ! & !some constants & ! 1110 TRUE% = -1% \ & FALSE% = 0% 1120 BELL$ = CHR$(7%) 1900 ! & !return & ! 1990 RETURN 2000 ! & ! & ! SUBROUTINE: data from SYS call & ! & ! 2100 ! & !dimension the array to store return from SYS call & ! 2110 DIM S%(30%) 2200 ! & !do the SYS call and CHANGE & ! 2210 Z$ = SYS( CHR$(6%) + CHR$(-25%) + CHR$(-1%) + CHR$(4%) & + CHR$(PROG%) + CHR$(PROJ%) ) 2220 CHANGE Z$ TO S% 2300 ! & !select the data & ! 2301 !Data in the relevant blockette is: & ! & ! bytes description & ! 0 - 1 link to next block & ! 2 last keyboard number & ! 3 4 & ! 4 - 5 Date of last login & ! 6 - 7 Time of last login & ! 8 - 9 Date of password change & ! 10 - 11 Time of password change & ! 12 - 13 Date account created & ! 14 - 15 Time account created & ! 2302 ! & !As best as I can tell, the data returned from the SYS call is & ! & ! bytes description & ! 1 Job number (times 2) & ! 2 so far this has always been 2 & ! 3 so far this has always been 255 & ! 4 so far this has always been 4 & ! 5 - 6 PPN in usual format & ! 7 so far this has always been 4 & ! 8 keyboard number last logged in to & ! 9 - 10 date of last login & ! 11 - 12 time of last login & ! 13 - 14 date of last password change & ! 15 - 16 time of last password change & ! 17 - 18 date account created & ! 19 - 20 time account created & ! 21 - 29 so far these have always been zero & ! 30 so far this has always been 50 & ! 2310 PRINT 2320 INDATE$ = DATE$( S%( 9%) + SWAP%(S%(10%)) ) \ & INTIME$ = TIME$( S%(11%) + SWAP%(S%(12%)) ) 2330 KB% = S%(8%) 2340 PRINT "Last login was at KB"; NUM1$(KB%); ":"; \ & PRINT " on ";INDATE$;" at ";INTIME$;"." 2350 CHANGEDATE$ = DATE$( S%(13%) + SWAP%(S%(14%)) ) \ & CHANGETIME$ = TIME$( S%(15%) + SWAP%(S%(16%)) ) 2360 PRINT "Password last changed on "; CHANGEDATE$; \ & PRINT " at ";CHANGETIME$;"." 2370 CREATEDATE$ = DATE$( S%(17%) + SWAP%(S%(18%)) ) \ & CREATETIME$ = TIME$( S%(19%) + SWAP%(S%(20%)) ) 2380 PRINT "Account created on "; CREATEDATE$; \ & PRINT " at ";CREATETIME$;"." 2390 PRINT \ PRINT 2900 ! & !return & ! 2990 RETURN 9000 ! & ! & ! ERROR ROUTINE & ! & ! 9100 IF ERL = 250 & THEN PRINT "Invalid account number." \ & RESUME 200 9110 IF ERL = 2210 & AND ERR = 5 & THEN PRINT "Account doesn't exist." \ & RESUME 200 9120 IF ERL = 2210 & THEN PRINT "Invalid account number." \ & RESUME 200 9120 ON ERROR GOTO 0 32767 END  & 2? 10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! BIGFIL & ! & !A program to print a list of "big" files. It prints the names & !of any files whose size is larger than the size given. User & !delete files if desired. & ! & !See UFD.BAS or UFD.DOC for a full explanation of the workings & !of this program. & ! 70 GOSUB 1000 !for initialization 80 Z$ = SYS(CHR$(6%)+CHR$(-7%)) !^C trap 90 ON ERROR GOTO 9000 100 ! & !get disk and file size to look for & ! 110 PRINT "This program will list all files larger than or equal to the given size." 120 INPUT "Disk"; DISK$ \ & DISK$ = CVT$$(DISK$,-1%) 130 IF LEFT(DISK$,2%) = "DR" & THEN DISK% = VAL(MID(DISK$,3%,1%)) & ELSE DISK% = VAL(DISK$) 140 INPUT "Minimum size"; MINSIZE 200 ! & !get the delete option & ! 210 PRINT "You have three options concerning the deletion of the large files." \ & PRINT "ALL to delete all such files" \ & PRINT "SELECT if you wish to be asked about each file" \ & PRINT "NONE to keep all files." \ & PRINT 220 INPUT "Your option (A, S or N)"; OPTION$ \ & OPT$ = CVT$$(LEFT(OPTION$,1%),-1%) 230 IF OPT$ = "A" & THEN DEL% = ALL% \ & GOTO 400 240 IF OPT$ = "S" & THEN DEL% = ASK% \ & GOTO 400 250 IF OPT$ = "N" & THEN DEL% = NONE% \ & GOTO 400 260 PRINT BELL$;'Please answer "A", "S" or "N".' \ & GOTO 200 400 ! & !preset index & ! 410 N% = -1% 500 ! & !get the next file & ! 510 N% = N% + 1% 520 Z$ = SYS( CHR$(6%) + CHR$(25%) + CHR$(N%) + CHR$(SWAP%(N%)) & + CHR$(255%) + CHR$(255%) + STRING$(16%,0%) + "DR" & + CHR$(DISK%) + CHR$(255%) ) 530 PROJ% = ASCII(MID(Z$,6%,1%)) \ & PROG% = ASCII(MID(Z$,5%,1%)) 540 PPN$ = "[" + NUM1$(PROJ%) + "," + NUM1$(PROG%) + "]" 550 PRINT " (Now working on ";PPN$;")" 600 ! & !open up and dimension the UFD; get cluster size & ! 610 IF PROJ% = 0% & THEN GOTO 510 620 IF PROJ% = 1% & AND PROG% = 1% & THEN GOTO 510 630 OPEN "DR" + NUM1$(DISK%) + ":" + PPN$ FOR INPUT AS FILE #1% 640 DIM #1%, U%(3583%,7%) 650 CLU% = U%(31%,0%) 700 ! & !go through this UFD & ! 710 PTR% = FNLINK%(U%(0%,0%)) & !first word of first blockette is a link to first NB 720 IF PTR% = 0% THEN GOTO 800 !a zero pointer is end of NB's 730 GOSUB 2000 !process this file 740 PTR% = FNLINK%(U%(PTR%,0%)) !get link to next NB 750 GOTO 720 800 ! & !go back for next account & ! 810 CLOSE #1% 820 GOTO 500 900 ! & !done & ! 910 GOTO 32767 1000 ! & ! & ! SUBROUTINE: preliminaries & ! & ! 1100 ! & !some constants & ! 1110 TRUE% = -1% \ & FALSE% = 0% 1120 BELL$ = CHR$(7%) 1200 ! & !values for DEL% option & !(the specific values are meaningless. They only need to be & !different) & ! 1210 ALL% = 1% 1220 NONE% = 0% 1230 ASK% = 2% 1990 RETURN 2000 ! & ! & ! SUBROUTINE: Find size of file and maybe print & ! & ! 2100 ! & !Data from Name Blockette & ! 2110 N$ = RAD$(U%(PTR%,1%)) + RAD$(U%(PTR%,2%)) + "." & + RAD$(U%(PTR%,3%)) & !file name and extension 2200 ! & !find the size & ! 2210 AB% = FNLINK%(U%(PTR%,6%)) & !get location of Accounting Blockette 2220 SIZE = U%(AB%,2%) \ & SIZE = SIZE + 65536. IF SIZE < 0 & !get size and adjust for "negatives" 2230 SIZE = SIZE + 65536. * U%(AB%,6%) UNLESS U%(AB%,5%) & !if a large file, add high order part. 2300 ! & !print it out if big enough & ! 2310 IF SIZE < MINSIZE THEN RETURN 2320 PRINT USING "[ ###", PROJ%; \ & PRINT ","; \ & PRINT USING "### ] ", PROG%; 2330 PRINT N$; TAB(22%); 2340 PRINT USING "######", SIZE; 2350 IF DEL% = ASK% & THEN PRINT " ";DATE$(U%(AB%,3%)); " "; TIME$(U%(AB%,4%)); 2400 ! & !go to deletion routine if desired & ! 2410 IF DEL% = ALL% & THEN GOSUB 5000 \ & PRINT " deleted." \ & RETURN 2420 IF DEL% = ASK% & THEN GOSUB 4000 \ & RETURN 2430 PRINT !to cancel last semicolon in case no deletion was requested 2990 RETURN 4000 ! & ! & ! SUBROUTINE: delete on request & ! & ! 4100 ! & !print the question and get answer & ! 4110 INPUT " Delete (Y/N)";ANSWER$ \ & ANSWER$ = CVT$$(LEFT(ANSWER$,1%),-1%) 4200 ! & !if answer is NO then return & ! 4210 IF ANSWER$ = "N" THEN RETURN 4300 ! & !if answer isn't yes, ask again & ! 4310 IF ANSWER$ = "Y" THEN GOTO 4400 4320 PRINT 'Please answer "Y" to delete or "N" to save.' 4330 GOTO 4110 4400 ! & !delete it & ! 4410 GOSUB 5000 4420 PRINT "File ";FILE$;" deleted." \ & PRINT 4990 RETURN 5000 ! & ! & ! SUBROUTINE: delete current file & ! ( [PROJ%,PROG%]N$ ) & ! & ! 5010 FILE$ = "[" + NUM1$(PROJ%) + "," + NUM1$(PROG%) + "]" + N$ 5020 KILL FILE$ 5990 RETURN 8000 ! & ! & ! FUNCTIONS & ! & ! 8010 ! & !convert link word to Blockette number & ! & !bits 9 to 11 are the cluster number. The first line gets & ! these bits and multiplies by cluster size & !bits 12 to 15 are block number. The next line gets these and & ! multiplies by 32 (number of blockettes per block) & !bits 4 to 8 are the blockette number. The last line adds & ! this. & !the other bits of the link are not relevant here & ! 8020 DEF FNLINK%(L%) = & ((( L% AND 3584%) / 512% ) * CLU% & + ( SWAP%( L% AND -4096% ) / 16% )) * 32% & + (( L% AND 496%) / 16%) 9000 ! & ! & ! Error Routine & ! & ! 9100 ! & !^C error & ! 9110 IF ERR = 28 & THEN PRINT "Aborted by ^C." \ & GOTO 32767 9200 ! & !Expected errors (by line number) & ! 9210 IF ERL = 520 THEN RESUME 900 & !account wasn't there 9220 IF ERL = 5020 THEN RESUME 5990 & !file couldn't be killed 9600 ! & !Expected errors (by type) & ! 9900 ! & !Unexpected errors & ! 9910 Z$ = SYS(CHR$(6%)+CHR$(9%)+CHR$(ERR)) 9920 ERROR$ = RIGHT(Z$,3%) 9930 PRINT " ***** Whoops! *****" \ & PRINT " "; ERROR$; " at line";ERL 9990 GOTO 32767 32767 END f 2?10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! PROBIT & ! & !A program to set the protect bit on files. When this bit is & !set the file can be neither deleted not renamed. & ! & !This program is similar to the one called UFD. Look to that & !program for a description of the UFD. & ! 100 ! & !Get the account number & ! 110 PRINT "Account number"; \ & INPUTLINE PPN$ \ & PPN$ = CVT$$(PPN$,-1%) 120 IF PPN$ = "" THEN GOTO 900 130 BRACKET% = INSTR(1%,PPN$,"(") \ & IF BRACKET% = 0% & THEN PPN$ = "[" + PPN$ + "]" 200 ! & !get name of file & ! 210 INPUT "File name"; FILE$ 220 IF FILE$ = "" THEN GOTO 100 300 ! & !starting disk & ! 310 DISK$ = "DR0:" 400 ! & !open up and dimension the UFD; get cluster size & ! 410 OPEN DISK$ + PPN$ FOR INPUT AS FILE #1%, MODE 16384% 420 DIM #1%, U%(3583%,7%) & !up to 3584 blockettes of 8 words each 430 CLU% = U%(31%,0%) 500 ! & !look through name blockettes for it and process & ! 510 PTR% = FNLINK%(U%(0%,0%)) & !first word of first blockette is a link to first NB 520 IF PTR% = 0% THEN GOTO 600 !a zero pointer is end of NB's 530 TFILE$ = RAD$(U%(PTR%,1%)) + RAD$(U%(PTR%,2%)) + "." & + RAD$(U%(PTR%,3%)) 540 TFILE$ = CVT$$(TFILE$,2%) 550 IF TFILE$ = FILE$ & THEN GOSUB 2000 \ & GOTO 200 560 PTR% = FNLINK%(U%(PTR%,0%)) !get link to next NB 570 GOTO 520 600 ! & !couldn't find the file on DR0: & ! 610 IF DISK$ = "DR0:" & THEN DISK$ = "DR6:" \ & GOTO 400 900 ! & !done & ! 910 CLOSE #1% 920 GOTO 32767 2000 ! & ! & ! SUBROUTINE: Do a single file & ! & ! 2100 ! & !find the status byte and protect bit & ! 2110 FSTATUS% = U%(PTR%,4%) AND 255% 2120 PROBIT% = (FSTATUS% AND 32%) / 32% 2200 ! & !say what is now true & ! 2210 IF PROBIT% = 0% & THEN PRINT "Protect bit is off." & ELSE PRINT "Protect bit is on." 2300 ! & !ask about new status & ! 2310 INPUT "New status of protect bit (ON, OFF)"; BIT$ \ & BIT$ = CVT$$(BIT$,-1%) 2320 IF BIT$ = "" THEN RETURN 2330 IF BIT$ <> "ON" AND BIT$ <> "OFF" & THEN PRINT "Please specify." \ & GOTO 2310 2400 ! & !do it & ! 2410 IF BIT$ = "ON" AND PROBIT% = 0% & THEN U%(PTR%,4%) = U%(PTR%,4%) OR 32% 2420 IF BIT$ = "OFF" AND PROBIT% = 1% & THEN U%(PTR%,4%) = U%(PTR%,4%) AND (NOT 32%) 2990 RETURN 8000 ! & ! & ! FUNCTIONS & ! & ! 8010 ! & !convert link word to Blockette number & ! & !bits 9 to 11 are the cluster number. The first line gets & ! these bits and multiplies by cluster size & !bits 12 to 15 are block number. The next line gets these and & ! multiplies by 32 (number of blockettes per block) & !bits 4 to 8 are the blockette number. The last line adds & ! this. & !the other bits of the link are not relevant here & ! 8020 DEF FNLINK%(L%) = & ((( L% AND 3584%) / 512% ) * CLU% & + ( SWAP%( L% AND -4096% ) / 16% )) * 32% & + (( L% AND 496%) / 16%) 32767 END  N 2?10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! ACCLST & ! & !A program to use the MFD and GFD to make a list of the accounts on & !a disk. & !See DISK.DOC, GFD.DOC, and GFD.BAS for an explanation of the MFD and & !GFD. & ! 100 ! & !dimension statement for storage of DCN's for GFD's & ! 110 DIM DCN.GFD%(255%) 1000 ! & ! & ! MAIN PROGRAM & ! & ! & !get the disk number and output file & ! 1010 INPUT "Disk"; DISK$ 1020 IF DISK$ = "" THEN GOTO 9000 & !quit if no disk specified 1030 IF LEFT(DISK$,2%) <> "DR" & THEN DISK$ = "DR" + DISK$ 1040 IF RIGHT(DISK$,LEN(DISK$)) <> ":" & THEN DISK$ = DISK$ + ":" 1050 PRINT \ PRINT 1060 PRINT "Output file"; \ & INPUTLINE OUTFILE$ \ & OUTFILE$ = CVT$$(OUTFILE$,-1%) 1070 OPEN OUTFILE$ FOR OUTPUT AS FILE #2% 1080 PRINT #2%, FOR L% = 1% TO 4% \ & PRINT #2%, "Listing of accounts on "; DISK$; " as of "; DATE$(0%) \ & PRINT #2% 1090 LINES% = 6% 2000 ! & !open disk non-file structured with buffer size large enough & !to get the second block of the MFD. & !get the pack label block & !get the version number and quit if not 1.1 & ! 2010 OPEN DISK$ AS FILE #1%, RECORDSIZE 1024% 2020 FIELD #1%, 1024% AS BUFF$ 2030 GET #1%, BLOCK 1% 2040 VERSION% = FNBYTE%(7%) \ & LEVEL% = FNBYTE%(6%) \ & IF VERSION% <> 1% & OR LEVEL% <> 1% & THEN PRINT "This program only works for 1.1 disks." \ & GOTO 32767 2050 DCN.MFD% = FNWORD%(2%) 3000 ! & !get the DCN of the MFD & ! 3010 GET #1%, BLOCK DCN.MFD% 4000 ! & !save DCN's for GFD's & !go through a second time to use them. & !Two loops are needed because there are GET's inside the loop which & !change the buffer. & ! 4010 FOR PROJ% = 1% TO 255% 4020 DCN.GFD%(PROJ%) = FNWORD%(256% + PROJ%) 4030 NEXT PROJ% 4040 FOR PROJ% = 1% TO 255% 4050 IF DCN.GFD%(PROJ%) = 0% & THEN GOTO 7010 5000 ! & !open up the GFD with correct cluster size & !get the link for this account & ! 5010 CLOSE #1% 5020 OPEN DISK$ AS FILE #1%, RECORDSIZE 16% * 512% 5030 FIELD #1%, 16% * 512% AS BUFF$ 5040 GET #1%, BLOCK DCN.GFD%(PROJ%) \ & CURRENT.CLUSTER% = 0% 6000 ! & !go through this GFD & ! 6010 FOR PROG% = 0% TO 255% 6020 LINK.NB% = FNWORD%(512% + PROG%) 6030 IF LINK.NB% <> 0% & THEN GOSUB 10000 6040 NEXT PROG% 7000 ! & !end of PROJ% loop & ! 7010 NEXT PROJ% 9000 ! & !normal exit & ! 9010 CLOSE #1% 9990 GOTO 32767 10000 ! & ! & ! SUBROUTINE: print accounts & ! & ! & ! & !check for adjacency & ! 10010 IF PROJ% = 1% & AND PROG% = 0% & THEN WORKING.PROJ% = 0% \ & FIRST.PROG% = 1% \ & LAST.PROG% = 1% 10020 IF PROJ% = WORKING.PROJ% & AND PROG% = LAST.PROG% + 1% & THEN LAST.PROG% = PROG% \ & RETURN & !if it fits in the current range, don't print it yet 10100 ! & !this account is not in current range & !if there was only one or two, print it/them & ! 10110 IF (LAST.PROG% = FIRST.PROG%) & THEN PRINT #2%, USING "[###", WORKING.PROJ%; \ & PRINT #2%, ","; \ & PRINT #2%, USING "###]", FIRST.PROG% \ & LINES% = LINES% + 1% \ & GOTO 10300 10120 IF (LAST.PROG% - FIRST.PROG%) = 1% & THEN PRINT #2%, USING "[###", WORKING.PROJ%; \ & PRINT #2%, ","; \ & PRINT #2%, USING "###]", FIRST.PROG% \ & PRINT #2%, USING "[###", WORKING.PROJ%; \ & PRINT #2%, ","; \ & PRINT #2%, USING "###]", LAST.PROG% \ & LINES% = LINES% + 2% \ & GOTO 10300 10200 ! & !if several, print them on one line & ! 10210 PRINT #2%, USING "[###", WORKING.PROJ%; \ & PRINT #2%, ","; \ & PRINT #2%, USING "###]", FIRST.PROG%; \ & PRINT #2%, " - "; \ & PRINT #2%, USING "[###", WORKING.PROJ%; \ & PRINT #2%, ","; \ & PRINT #2%, USING "###]", LAST.PROG% \ & LINES% = LINES% + 1% 10300 ! & !count lines & ! 10310 IF LINES% >= 55% & THEN PRINT #2%, CHR$(12%) \ & PRINT #2%, FOR L% = 1% TO 4% \ & LINES% = 4% 10400 ! & !begin again & ! 10410 WORKING.PROJ% = PROJ% 10420 FIRST.PROG% = PROG% \ & LAST.PROG% = PROG% 10900 ! & !done & ! 10990 RETURN 18000 ! & ! & ! FUNCTIONS & ! & ! 18100 ! & !pull a word from the buffer & !for convenience, the words are numbered as words even though & !the buffer is character (and hence byte) oriented. Words are & !normally numbered starting at zero, but the characters in the & !buffer must be numbered starting at one, so another adjustment & !is needed. & ! 18110 DEF* FNWORD%(W%) 18120 FIRSTBYTE% = W% * 2% + 1% 18180 FNWORD% = ASCII( MID(BUFF$,FIRSTBYTE% ,1%) ) & + SWAP%( ASCII( MID(BUFF$,FIRSTBYTE%+1%,1%) ) ) 18190 FNEND 18200 ! & !pull a byte from the buffer & !Since the bytes are generally numbered starting at zero but & !the characters are numbered begining at one, an adjustment is & !needed. & ! 18210 DEF* FNBYTE%(B%) 18280 FNBYTE% = ASCII(MID(BUFF$,B%+1%,1%)) 18290 FNEND 32767 END y 2? 10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You will need to make & !changes to fit your courses. If you have any problems please & !contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! CLASS & ! & !A program to create, delete and tape blocks of accounts. Its & !main purpose is for class accounts. It therefore has a data & !file which has the project numbers usually given to the & !presently known classes. If these same numbers are used each & !time, then we can have one backup tape for each class which & !is zeroed and reused each offering. In the case of Math 238 & !we may want to keep more than one offering on tape. Therefore & !the program has the option to use a different project number & !on the tape. (Several different offerings can be put on one & !tape this way). & ! 21 ! & !The data file is a virtual array with room for 20 entries & !(i.e. 20 classes). Each entry consists of: & ! class number & ! name of class (up to 16 characters) & ! usual project number & ! actual project number & ! last programmer number assigned (they are assigned in order) & ! 22 ! & !The program has these options: & ! create a project & ! tape a project & ! delete a project & ! 23 ! & !Since the [?,0] account is usually assigned to the professor & !the user is asked about it (quota, password, etc.) seperately & ! 80 Z$ = SYS(CHR$(6)+CHR$(-7%)) !^C trap 90 ON ERROR GOTO 9000 100 !Preliminaries 110 GOSUB 1000 200 !Get number of class and find in list 210 GOSUB 2000 300 !Get the option 310 GOSUB 3000 400 !Do the option 410 ON OPTION% GOSUB 11000, 12000, 13000, 14000, 900 900 !Quit 910 CLOSE #1%, #2% 990 GOTO 32767 1000 !Subroutine: preliminaries 1100 !Constants 1110 CLEAR$ = CHR$(26%) 1120 BELL$ = CHR$(7%) 1200 !Dimension 1210 DIM CLASSNO%(20%), CLASSNAME$(20%), PROJECT%(20%) 1220 DIM #2%, LAST%(20%) 1300 !Open files 1310 OPEN "[1,3]CLASS.DAT" FOR INPUT AS FILE #1% \ & OPEN "[1,3]CLASS.DA2" FOR INPUT AS FILE #2% & !Error routine branches to 1350 if not there. 1320 GOTO 1400 1350 !If data file isn't there. 1360 PRINT BELL$;"Can't find data file. Check with math department." \ & GOTO 32767 1400 !Read the file 1410 I% = I% + 1% 1420 INPUT #1%, CLASSNO%(I%), CLASSNAME$(I%),PROJECT%(I%) & !End of file will cause branch to 1450 1440 GOTO 1410 1450 !Branch to here at end of file or if it finds a comment line 1460 NOENTRIES% = I% - 1% 1990 RETURN 2000 !Subroutine: number of class 2100 !Get number of class 2110 INPUT "Number of class"; CLASSNO% 2200 !Look for it 2210 FOR I% = 1% TO NOENTRIES% 2220 IF CLASSNO%(I%) = CLASSNO% THEN 2300 2230 NEXT I% 2250 !Class not found 2260 PRINT BELL$; "Can't find this class." \ & GOTO 2110 2300 !Class found 2310 INDEX% = I% 2320 CLASSNAME$ = CLASSNAME$(INDEX%) \ & PROJECT% = PROJECT%(INDEX%) \ & LAST% = LAST%(INDEX%) 2330 ZERO$ = "[" + NUM1$(PROJECT%) + ",0]" 2400 !Print data for user 2410 PRINT \ & PRINT "Class: "; CLASSNAME$ \ & PRINT "Project number: "; PROJECT% 2420 IF PROJECT% = 141% & THEN PRINT "Sorry, project 241 is used for FORTRAN." 2430 PRINT \ & INPUT "Continue "; ANSWER$ \ & ANS$ = CVT$$(LEFT(ANSWER$,1%),32%) \ & IF ANS$ = "" THEN ANS$ = "Y" 2440 IF ANS$ <> "Y" THEN 900 2500 ! 2990 RETURN 3000 !Subroutine: Get the option 3100 !Print the list 3110 PRINT CLEAR$; 3120 PRINT "Options available are:" \ & PRINT \ & PRINT "CREATE to create accounts" \ & PRINT "TAPE to PIP accounts to tape" \ & PRINT "DELETE to delete accounts" \ & PRINT "MOVE to PIP accounts to new project" \ & PRINT "EXIT to quit the program" \ & PRINT 3200 !Get the option 3210 INPUT "Option"; OPTION$ \ & O$ = CVT$$(LEFT(OPTION$,1%),32%) 3220 IF O$ = "" THEN O$ = "E" 3300 !Which one is it 3310 OPTION% = INSTR(1%,"CTDME",O$) 3320 IF OPTION% = 0% & THEN PRINT BELL$;"That option not available." \ & GOTO 3210 3990 RETURN 9000 !Error routine 9100 !Expected errors 9110 IF ERR = 28 & THEN CLOSE #1%, #2% \ & GOTO 32767 & !^C error 9120 IF ERR = 11 THEN RESUME 300 9130 IF ERL = 1420 THEN RESUME 1450 9140 IF ERL = 11150 AND ERR = 16% THEN RESUME 11160 & !Account already exists (for zero account) 9150 IF ERL = 11440 AND ERR = 16% THEN RESUME 11460 & !Account already exists (for general case) 9160 IF ERL = 13140 AND ERR = 5 THEN RESUME 13160 & !If file to delete isn't there, just go on (zero case) 9170 IF (ERL = 13230 OR ERL = 13220) THEN RESUME 13270 & !If file to delete isn't there, just go on (general case) 9180 IF ERL = 14340 AND ERR = 16 THEN RESUME 14400 & !MOVE tried to create a file that was already there 9200 !^Z 9210 IF ERR = 11 THEN RESUME 200 9900 !Unexpected errors 9910 Z$ = SYS(CHR$(6%)+CHR$(9%)+CHR$(ERR)) 9920 ERROR$ = RIGHT(Z$,3%) 9930 PRINT " ***** I can't handle this one *****" \ & PRINT " "; ERROR$; " at line";ERL 9940 GOTO 32767 11000 !Subroutine: CREATE option & !See the RSTS/E programming manual for a description of the use & !of the SYS function used here. 11100 !Do the zero account 11120 PRINT "This program treats account ";ZERO$;" seperately." \ & PRINT "Don't worry. If the account already exists, it will not be deleted." 11130 PRINT "Password for "; ZERO$; \ & INPUT PASS$ 11140 PASS$ = FNR50$(PASS$) !Convert to Radix-50 11150 Z$ = SYS(CHR$(6%)+CHR$(0%)+STRING$(5%,0%)+CHR$(PROJECT%)+PASS$) \ & PRINT "Account "; ZERO$; ",0] created." \ & GOTO 11200 & !If account already exist, error routine will branch to 11160 11160 PRINT BELL$;"Account ";ZERO$;" already exists." \ & GOTO 11200 11200 !Ask about the other accounts 11210 PRINT \ & INPUT "How many accounts to be created"; LAST% 11230 INPUT "Password"; PASS$ \ & PASS$ = FNR50$(PASS$) & !Convert to Radix-50 11300 !set up the permanent part of the string 11310 DIM A%(30%) 11320 A%( 0%) = 30% \ & A%( 1%) = 6% \ & A%( 2%) = 0% \ & A%( 8%) = PROJECT% \ & A%(14%) = 0% \ & A%(13%) = 100% 11330 A%(8%+I%) = ASCII(MID(PASS$,I%,1)) FOR I% = 1% TO 4% 11400 !Create the accounts 11410 FOR PG% = 1% TO LAST% 11420 A%(7%) = PG% 11430 CHANGE A% TO A$ 11440 Z$ = SYS(A$) & !If account aleady exists, error routine branches to 11470 11445 PRINT "Account ["; NUM1$(PROJECT%); ","; NUM1$(PG%); & "] created." 11450 GOTO 11470 11460 PRINT BELL$; "Account ["; NUM1$(PROJECT%); ","; NUM1$(PG%); & "] already exists." 11470 NEXT PG% 11500 !Put number of accounts in the data file 11510 LAST%(INDEX%) = LAST% 11600 !Print message 11610 PRINT \ & PRINT LAST%;"accounts were created." 11700 !Password disabling? 11710 INPUT "Do you want to allow disabling of passwords"; ANSWER$ \ & ANS$ = CVT$$(LEFT(ANSWER$,1%),32%) 11720 IF ANS$ <> "Y" THEN 11800 11730 PRINT "Account from which disabling will occur"; \ & INPUTLINE ACCT$ \ & ACCT$ = CVT$$(ACCT$,-1%) 11740 INPUT "Password for disabling"; PASSWORD$ 11750 ARG$ = ACCT$ + ":" + NUM1$(PROJECT%) + ":" + PASSWORD$ 11760 Z$ = SYS(CHR$(8%)+ARG$) !put argument in core common 11770 CHAIN "[1,3]DISDAT" 10000 !DISDAT does the work 11800 ! 11990 RETURN 12000 !Subroutine: TAPE option 12010 PRINT "This part of the program will create a command file and "; \ & PRINT "chain to AT." 12100 !May want a different account number 12110 PRINT "Project number for tape <"; NUM1$(PROJECT%); ">"; \ & INPUT TAPEPROJ% 12120 IF TAPEPROJ% = 0% THEN TAPEPROJ% = PROJECT% 12130 INPUT "Zero the tape first"; ANSWER$ \ & ANS$ = CVT$$(LEFT(ANSWER$,1%),32%) 12140 IF ANS$ = "Y" & THEN ZEROTAPE% = 1% \ & GOTO 12200 12150 IF ANS$ <> "N" & THEN PRINT 'Please answer "YES" or "NO".' \ & GOTO 12130 12200 !Build the command file 12210 OPEN "CLASS.CMD" FOR OUTPUT AS FILE #3% 12220 PRINT #3%, "RUN $PIP" 12225 IF ZEROTAPE% = 1% & THEN PRINT #3%, "MT:/ZE" \ & PRINT #3%, "YES" 12230 INPUT "Tape the zero account"; ANSWER$ \ & ANS$ = CVT$$(LEFT(ANSWER$,1%),32%) \ & IF ANS$ = "Y" & THEN PRINT #3%, "MT0:[";NUM1$(TAPEPROJ%);",0] = ["; \ & PRINT #3%, NUM1$(PROJECT%);",0]/W" 12235 FOR PG% = 1% TO LAST% 12240 PRINT #3%, "MT0:[";NUM1$(TAPEPROJ%);",";NUM1$(PG%);"] = "; \ & PRINT #3%, "[";NUM1$(PROJECT%);",";NUM1$(PG%);"]/W" 12250 NEXT PG% 12260 PRINT #3%, "^Z" 12270 CLOSE #3% 12300 !Chain to AT via the CCL 12310 Z$ = SYS(CHR$(14%)+"AT CLASS") 12990 RETURN 13000 !Subroutine: DELETE option 13100 !May not want to delete the zero account 13110 PRINT "Do you want to delete "; ZERO$; \ & INPUT ANSWER$ \ & ANS$ = CVT$$(LEFT(ANSWER$,1),32%) 13120 IF ANS$ <> "Y" THEN 13200 13130 Z$ = SYS(CHR$(6%)+CHR$(13%)+STRING$(3%,0%)+CHR$(PROJECT%)) & !Zero the account 13140 Z$ = SYS(CHR$(6%)+CHR$(1%)+STRING$(5%,0%)+CHR$(PROJECT%)) \ & PRINT "Account "; ZERO$; " deleted." & !Delete the account 13150 GOTO 13200 13160 PRINT "Account "; ZERO$; " already deleted." 13200 !Do the other accounts 13210 FOR PG% = 1% TO LAST% 13220 Z$ = SYS(CHR$(6%)+CHR$(13%)+CHR$(255%)+CHR$(0%) & +CHR$(PG%)+CHR$(PROJECT%)) & !Zero the account 13230 Z$ = SYS(CHR$(6%)+CHR$(1%)+STRING$(4%,0%)+CHR$(PG%)+CHR$(PROJECT%)) & !Delete the account 13240 PRINT "Account ["; NUM1$(PROJECT%); ","; NUM1$(PG%); "] deleted." 13250 NEXT PG% 13260 GOTO 13300 13270 PRINT "Account ["; NUM1$(PROJECT%); ","; NUM1$(PG%); \ & PRINT "] can't be deleted." \ & GOTO 13250 13280 LAST%(INDEX%) = 0% 13300 ! 13990 RETURN 14000 !Subroutine: MOVE option 14010 PRINT "This part of the program will create a command file and "; \ & PRINT "chain to AT." 14100 !New account number 14110 INPUT "New account number"; NEWPROJ% 14120 IF NEWPROJ% = 0% THEN NEWPROJ% = PROJECT% 14200 !Fixed part of SYS arguments 14210 DIM CREATE%(14%) 14220 CREATE%( 0%) = 14% \ & CREATE%( 1%) = 6% \ & CREATE%( 2%) = 0% \ & CREATE%( 8%) = NEWPROJ% \ & CREATE%(14%) = 0% & !for creating the account 14230 DIM LOOK%(8%) 14240 LOOK%( 0%) = 8% \ & LOOK%( 1%) = 6% \ & LOOK%( 2%) = 14% \ & LOOK%( 8%) = PROJECT% & !for looking up password 14300 !Create the accounts 14310 FOR PG% = 0% TO LAST% 14320 LOOK%(7%) = PG% \ & CHANGE LOOK% TO Z$ \ & Z$ = SYS(Z$) \ & PASS$ = MID(Z$,9%,4%) & !look up the password. See RSTS/E programming manual 14330 IF PG% = 0% THEN CREATE%(13%) = 0% ELSE CREATE%(13%) = 100% 14340 CREATE%(7%) = PG% \ & CHANGE CREATE% TO Z$ \ & Z$ = LEFT(Z$,8%) + PASS$ + RIGHT(Z$,13%) \ & Z$ = SYS(Z$) & !create the new account. See RSTS/E programming manual 14350 NEXT PG% 14360 GOTO 14500 14400 !Tried to create an existing file 14410 PRINT BELL$; \ & PRINT "["; NUM1$(NEWPROJ%); ","; NUM1$(PG%); "] already exists." \ & PRINT "MOVE aborted." \ & RETURN 14500 ! 14800 !Build the command file 14810 OPEN "CLASS.CMD" FOR OUTPUT AS FILE #3% 14820 PRINT #3%, "RUN $PIP" 14830 FOR PG% = 0% TO LAST% 14840 PRINT #3%, "[";NEWPROJ%;",";PG%;"] = [";PROJECT%;",";PG%;"]" 14850 NEXT PG% 14860 PRINT #3%, "^Z" 14870 CLOSE #3% 14900 !Chain to AT via the CCL 14910 Z$ = SYS(CHR$(14%)+"AT CLASS") 14990 RETURN 20000 !Functions 21000 !Password to radix-50 (as four characters) & !See the RSTS/E programming manual for an explanation 21010 DEF FNR50$(P$) = MID( SYS(CHR$(6%)+CHR$(-10%)+P$), 7%,4%) 32767 END +d,F 2?10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! PACKID & ! & !A program to look up and change a disk Pack ID. & !See DISK.DOC & ! 300 ! & !constants & ! 310 TRUE% = -1% \ & FALSE% = 0% 320 BELL$ = CHR$(7%) 1000 ! & ! & ! MAIN PROGRAM & ! & ! & !get the disk number & ! 1010 PRINT "This program will find the Pack ID of a disk." \ & PRINT 1020 INPUT "Disk number"; DISK$ \ & DISK$ = CVT$$(DISK$,-1%) 1030 IF LEFT(DISK$,2%) = "DR" & THEN DISK% = VAL(MID(DISK$,3%,1%)) & ELSE DISK% = VAL(DISK$) 1040 DISK$ = "DR" + NUM1$(DISK%) + ":" 2000 ! & !open the disk non-file structured and field it & ! 2010 OPEN DISK$ AS FILE #1% 2020 FIELD #1%, 512% AS BUFF$ 3000 ! & !print current value & ! 3010 GET #1%, BLOCK 1% 3020 CHANGE MID(BUFF$,13%,4%) TO ID% 3030 ID$ = RAD$( ID%(1%) + SWAP%(ID%(2%)) ) + & RAD$( ID%(3%) + SWAP%(ID%(4%)) ) 3040 PRINT "Current Pack ID:"; ID$ 3050 PRINT 4000 ! & !ask about a change & ! 4010 INPUT "Change pack ID "; ANS$ \ & ANS$ = CVT$$(LEFT(ANS$,1%),-1%) 4020 IF ANS$ <> "Y" THEN GOTO 9000 4030 PRINT "The disk must be dismounted." \ & INPUT "Is the disk dismounted "; ANS$ \ & ANS$ = CVT$$(LEFT(ANS$,1%),-1%) 4040 IF ANS$ <> "Y" THEN GOTO 9000 5000 ! & !They wanted to make a change & ! 5010 INPUT "New pack ID"; ID$ \ & ID$ = CVT$$(ID$,-1%) 5020 Z$ = SYS( CHR$(6%) + CHR$(-10%) + ID$ ) \ & ID$ = MID(Z$,7%,4%) & !use File Name String Scan to convert to RAD50 5030 LSET BUFF$ = LEFT(BUFF$,12%) + ID$ + RIGHT(BUFF$,17%) 5040 PUT #1%, BLOCK 1% 9000 ! & !normal exit & ! 9010 CLOSE #1% 9990 GOTO 32767 32767 END 4[2? STRUCTURE OF THE UFD The UFD consists of 8-word units called "blockettes". A simple way to effect the division of a block into blockettes is by a virtual array. For example the two BASIC lines below set up the UFD for account [1,3]: OPEN "[1,3]" FOR INPUT AS FILE #1% DIM #1%, U%(3583%,7%) The largest number of blockettes possible is 3584 (7 clusters of 16 blocks of 32 blockettes.). The function FNLINK% is used to convert a pointer into a blockette number: DEF FNLINK%(L%) = ((( L% AND 3584%) / 512% ) * CLU% & + ( SWAP%( L% AND -4096% ) / 16% )) * 32% & + (( L% AND 496%) / 16%) Bits 9 to 11 are the cluster number. The first line gets these bits and multiplies by cluster size. Bits 12 to 15 are block number. The next line gets these and multiplies by 32 (number of blockettes per block). Bits 4 to 8 are the blockette number. The last line adds this. The other bits of the link refer to the byte within the blockette. They are not needed here. Every block in the UFD has a copy of the FDCM (file Directory cluster map). Its first (0th) word has the cluster size. The other words are device cluster numbers, the physical locations of parts of the file. There are several kinds of blockettes. Label Blockettes, Name Blockettes, Accounting Blockettes, Retrieval Blockettes and Attribute Blockettes. LABEL BLOCKETTES Word 0: Link to first NB (see below) Word 1: -1 (helps to identify it as an LB Words 2 through 5 are zero Word 6: PPN (project and programmer number) Word 7: -31692 (RAD50 for 'UFD') (The very first blockette is a Label Blockette. There are no others.) NAME BLOCKETTES Word 0: Link to next name blockette Words 1-2: File name in RAD50. Word 3: Extension in RAD50. Word 4: Protection Code and Status (see below) Word 5: R/O regardless open count and Open file count Word 6: Link to Accounting Blockette Word 7: Link to first Retrieval Blockette STATUS BYTE OF NAME BLOCKETTE Bit 0: 'out of SAT' (for historical purposes) Bit 1: file is placed Bit 2: write access given out Bit 3: file open in update mode Bit 4: no file extending allowed (set for contiguous files) Bit 5: No delete or rename allowed Bit 6: entry is MFD entry Bit 7: file marked for deletion ACCOUNTING BLOCKETTES Word 0: Link to Attribute Blockette Word 1: Date of Last Access Word 2: File Size in Blocks Word 3: Date of Creation Word 4: Time of Creation Words 5-6 Run-Time System Name Word 7: File Clustersize (For large non-executable files, word 5 must be zero. The hight byte of word 6 is also zero. The low byte of word six is used to store the most significant part of the file size.) RETRIEVAL BLOCKETTES Retrieval Blockettes have lists of DCN's and pointers to more RB's. ATTRIBUTE BLOCKETTES These are used by RSX and RMS. They are not discussed here. 4FO 2? 2 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & ! This software is furnished under no license and may be used & ! and copied in accordance with the nonexistent terms of such & ! license and with or without the inclusion of the above & ! copyright notice. This software or any other copies thereof & ! may be provided or otherwise made available to any other & ! person. & ! & ! The information in this software is subject to change without & ! notice and should not be construed as a commitment by & ! Whittier College or the author. This software is & ! unconditionally guaranteed to perform without error the & ! purpose for which it is intended. Said purpose is to remain & ! the secret of the author and is subject to change without & ! notice and at the whim of the author. & ! & ! Whittier College assumes no responsibility for the use or & ! reliability of its software on equipment that is not supplied & ! by Whittier College. Whittier College supplies no equipment. & ! & ! This program was written for internal use and has not been & ! been significantly modified for export. You may need to make & ! changes to fit your system or needs. If you have any problems & ! please contact: & ! & ! David Rosales & ! Whittier College, Computer Center & ! Whittier CA 90601 & ! (213) 693-0771 ext 287 & ! & 10 EXTEND & 30 ! & ! KILL0 & ! & ! The Whittier College Zero Size File Killer. & ! & ! & ! This program kills file that have a size of zero blocks. & ! If the file has a protection code of <63> then save it. & ! If the file is open the file will not be killed. & ! & 35 ! & ! EDIT DATE CHANGES MADE & ! & ! Sep/30/1983 Finished writing this program. & ! Changed by: Erasmo David Rosales. & ! & ! Dec/17/1983 Altered ^C trap to give the tally up to & ! the time when the run was aborted, then & ! close the file. & ! Changed by: Erasmo David Rosales. & ! & 100 !************************************************************* & ! & ! Initialize ^C TRAP, ERROR routine and CONSTANTS. & ! & 110 CLEAR$ = CHR$(155%) + '[2J' + CHR$(155%) + '[;H' & + CHR$(140%) + CHR$(26%) + CHR$(8%) + " " & 120 BELL$ = CHR$(7%) + CHR$(7%) & 130 YES% = -1% \ & NO% = 0% \ & TOTAL = 0% \ & SAVED = 0% \ & CANT = 0% & 200 ON ERROR GOTO 19000 & 220 Z$ = SYS(CHR$(6%)+CHR$(-7%)) & ! ^C Error trap & 1000 ! This is the intro to the program. & 1020 PRINT CLEAR$ \ & PRINT FOR CLR% = 1% TO 8% \ & PRINT " This program kills files that have a size of zero blocks." \ & PRINT " If the file has a protection code of <63> or if the" \ & PRINT " file is open the file will not be killed." \ & PRINT & 1030 Z$ = SYS(CHR$(11%)) \ & INPUT "Which disk do you want to clean up ";DISK$ \ & DISK$ = CVT$$(DISK$,32%+2%) \ & FOR D% = 0% TO 7% \ & DEV% = D% IF INSTR(1%,DISK$,NUM1$(D%)) \ & NEXT D% & ! This finds the DISK number. (DR?:) & 1040 DISK$ = "DR"+NUM1$(DEV%)+":" & ! This makes the device string based on the DEV%. & 2000 ! & ! & ! Start the actual program flow.... & ! & ! & 2020 OPEN "DEAD.DOC" AS FILE #9%, MODE 2% & ! This is the file that keeps track of the & ! files that get killed by this program. & 2040 PRINT #9% , FOR CLR% = 1% TO 5% \ & PRINT #9% , STRING$(79%,42%) \ & PRINT #9% , TAB(20%); \ & PRINT #9% , DATE$(0%);" ";TIME$(0%);" ON DISK ";DISK$ \ & PRINT #9% , STRING$(79%,42%) \ & PRINT #9% , FOR CLR% = 1% TO 3% & ! Print the Header at the Top of the page. & 2080 N% = -1% & ! Initialize the account counter. & 2100 ! & ! Get the next account. & ! & 2110 N% = N% + 1% & ! N% is the counter that increments the accounts. & ! The PPN wildcard takes the accounts in order. & 2120 Z$ = SYS( CHR$(6%) + CHR$(25%) + CHR$(N%) + CHR$(SWAP%(N%)) & + CHR$(255%) + CHR$(255%) + STRING$(16%,0%) & + "DR" + CHR$(DEV%) ) & ! This is the PPN wildcard lookup sys function. & 2130 PROJ% = ASCII(MID(Z$,6%,1%)) \ & PROG% = ASCII(MID(Z$,5%,1%)) & 2140 IF PROJ% = 0% AND PROG% = 1% & THEN & GOTO 2100 & ! This will skip over [0,1]. & 2150 IF PROJ% = 1% AND PROG% = 1% & THEN & GOTO 2100 & ! This will skip over [1,1]. & 2160 PPN$ = DISK$+" "+"["+NUM1$(PROJ%)+","+NUM1$(PROG%)+"]" & ! Put together the PPN$ & 2400 ! & ! Open up and dimension the UFD and get the cluster size. & ! & 2410 OPEN PPN$ FOR INPUT AS FILE #1% & 2420 PRINT TAB(20%);"(Now cleaning out ";PPN$;")" & 2430 DIM #1%, U%(3583%,7%) & 2440 CLU% = U%(31%,0%) & 2500 ! & ! Go through this UFD & ! & 2510 POINTER% = FNLINK%(U%(0%,0%)) & ! First word of first blockette is a link to first NB & 2520 IF POINTER% = 0% & THEN & GOTO 2600 & ! A zero pointer is end of NB's & 2530 POINT% = POINTER% & ! Set POINT% = POINTER% so that after we GOSUB 3000 & ! we will still have the correct & ! values for the pointer. & 2540 POINTER% = FNLINK%(U%(POINTER%,0%)) & ! Get link to next NB before this file possibly gets killed. & 2550 GOSUB 3000 & ! Process this file. & 2560 GOTO 2520 & 2600 ! & ! Go back for next account. & ! \ & CLOSE #1% \ & GOTO 2100 & 3000 ! & ! SUBROUTINE: Find size of file and maybe kill. & ! & 3100 ! Data from Name Blockette & 3110 N$ = RAD$(U%(POINT%,1%)) + RAD$(U%(POINT%,2%)) + "." & + RAD$(U%(POINT%,3%)) \ & N$ = PPN$ + N$ & ! [P,PN] File name and extension. & 3200 ! & ! Find the size. & ! & 3210 AB% = FNLINK%(U%(POINT%,6%)) & ! Get location of Accounting Blockette. & 3220 SIZE = U%(AB%,2%) & ! Get the size. & 3300 ! & ! Kill if size is zero. & ! & 3310 IF SIZE <> 0% & THEN & RETURN & 3320 OP% = FNOPEN%(N$) & ! Find out if the file is open. & 3330 IF OP% = YES% & THEN & GOTO 4000 & ! If the file is open then save. & 3340 PRO.CODE% = SWAP%(U%(POINT%,4%)) AND 255% \ & IF (PRO.CODE% AND 2%) = 2% & THEN & GOTO 4000 & ! If the file is write protected against owner then save it. & 3350 KILL N$ \ & TOTAL = TOTAL + 1% & ! Keep a tally of how many files get killed. & 3360 PRINT TAB(20%); \ & PRINT N$; \ & PRINT " size <";NUM1$(SIZE);"> has been killed." & ! Tell the user the file has been killed. & 3370 PRINT #9% , TAB(20%); \ & PRINT #9% , N$; \ & PRINT #9% , " size <";NUM1$(SIZE);"> has been killed." & ! Tell the user the file has been killed. & 3990 RETURN & 4000 SAVED = SAVED + 1% & ! Keep a tally of how many files get saved. & 4020 PRINT TAB(20%); \ & PRINT N$; \ & PRINT " size <";NUM1$(SIZE);"> has been saved.";BELL$ & ! Tell the user the file has been saved. & 4040 PRINT #9% , TAB(20%); \ & PRINT #9% , N$; \ & PRINT #9% , " size <";NUM1$(SIZE);"> has been saved." & ! Tell the user the file has been saved. & 4080 RETURN & 5000 ! & ! Done. & ! & 5020 TOTAL$ = NUM1$(TOTAL) \ & SAVED$ = NUM1$(SAVED) \ & CANT$ = NUM1$(CANT) \ & S1$ = "s have" \ & S2$ = "s have" \ & S3$ = "s" & ! Set the constants needed for the final output. & 5040 IF TOTAL = 1 & THEN & S1$ = " has" & ! A "1" is not plural, so don't say it plural. & 5050 IF SAVED = 1 & THEN & S2$ = " has" & ! A "1" is not plural, so don't say it plural. & 5060 IF CANT = 1 & THEN & S3$ = "" & ! A "1" is not plural, so don't say it plural. & 5070 IF TOTAL = 0 & THEN & TOTAL$ = "No" & ! I want it read "No files ..." not, " 0 files ...". & 5080 IF SAVED = 0 & THEN & SAVED$ = "No" & ! I want it read "No files ..." not, " 0 files ...". & 5090 IF CANT = 0 & THEN & CANT$ = "No" & ! I want it read "No files ..." not, " 0 files ...". & 5100 PRINT FOR CLR% = 1% TO 5% \ & PRINT TOTAL$;" zero size file";S1$;" been deleted." \ & PRINT FOR CLR% = 1% TO 2% \ & PRINT SAVED$;" zero size file";S2$;" been saved." \ & PRINT FOR CLR% = 1% TO 2% \ & PRINT CANT$;" zero size file";S3$;" could not be killed." & 5120 PRINT #9% FOR CLR% = 1% TO 5% \ & PRINT #9% TOTAL$;" zero size file";S1$;" been deleted." \ & PRINT #9% FOR CLR% = 1% TO 2% \ & PRINT #9% SAVED$;" zero size file";S2$;" been saved." \ & PRINT #9% FOR CLR% = 1% TO 2% \ & PRINT #9% CANT$;" zero size file";S3$;" could not be killed." & 5190 CLOSE #9% & ! Close "DEAD.DOC". & 5200 GOTO 32767 & 19000 !************************************************************** & ! & ! Error Routine & ! & !************************************************************** & 19100 ! ^C error \ & IF ERR = 28 AND LINE = 1030 & THEN & PRINT BELL$;"Aborted by ^C" \ & GOTO 32767 & ! Before the program flow die on the ^C error. & 19150 IF ERR = 28 AND LINE <> 1030 & THEN & CLOSE #1%, #3% \ & RESUME 5000 & ! Give the results of the run up to the ^C error. & 19175 IF ERR = 11 & THEN & PRINT BELL$;"Aborted by ^Z" \ & GOTO 32767 & ! This is the end of file error response. & 19200 ! & !Expected errors (by line number) & ! & 19210 IF ERL = 2120 & THEN & RESUME 5000 & ! Account wasn't there & 19230 IF ERL = 3350 & THEN & PRINT TAB(20%); \ & PRINT N$;BELL$; \ & PRINT " size <";NUM1$(SIZE);"> unable to kill." \ & PRINT #9% , TAB(20%); \ & PRINT #9% , N$; \ & PRINT #9% , " size <";NUM1$(SIZE);"> unable to kill." \ & CANT = CANT + 1% \ & RESUME 3990 & ! If the KILL fails for any reason. & ! (most likely the file will not exist) & ! Tell the user the file is already dead, and keep & ! a tally of how many files were dead already. & ! & ! Line 3990 is the Return for the subroutine. & 19900 ! & !Unexpected errors & ! & 19910 Z$ = SYS(CHR$(6%)+CHR$(9%)+CHR$(ERR)) \ & ERROR$ = RIGHT(Z$,3%) \ & PRINT BELL$;"You fool !!! You Caused a "; \ & PRINT ERROR$; " at line";ERL & 19990 GOTO 32767 & 20000 DEF FNOPEN%(FILE.N$) & 20030 ! & ! FUNCTION: TO FIND OUT IF A FILE IS OPEN. & ! & ! This function uses FIP -8% to tell if a file is open. & ! & 20050 ON ERROR GOTO 20400 & 20100 ! & ! Set some constants. & ! & 20110 YES% = -1% \ & NO% = 0% & 20140 DIM Z%(30%) & ! Dimension statement. & 20150 OPEN FILE.N$ FOR INPUT AS FILE #3% & ! Open the file on channel three. & 20180 ! & ! Use the FIP -8% & ! \ & Z$ = SYS(CHR$(6%)+CHR$(-8%)+CHR$(3%)+CHR$(1%)) & 20210 CHANGE Z$ TO Z% & 20230 ! & ! Select the correct data needed to see if the file is open. & ! & ! Get the number which tells how many jobs have this & ! file open, if the file is open by more than one job & ! then someone else also has the file open. & ! & 20240 OTHER% = Z%(3%) \ & REGARDLESS% = Z%(4%) \ & OPENCOUNT% = OTHER% + REGARDLESS% & 20260 CLOSE #3% & ! Finally close the file. & 20280 IF OPENCOUNT% > 1% & THEN & FNOPEN% = YES% & ELSE & FNOPEN% = NO% & 20300 ON ERROR GOTO 19000 \ & FNEND & 20400 IF ERL = 20150 & THEN & OPENCOUNT% = 0% \ & RESUME 20280 & ! This is in the case of the file not existing, & ! or any other error that may occur. & 20500 ! * * * * * * * & ! Unexpected errors & ! * * * * * * * & 20520 GOTO 19000 & ! If there is an unexpected error goto the main error routine. & 21000 ! & ! FUNCTION TO : Convert link word to Blockette number. & ! & ! Bits 9 to 11 are the cluster number. The first line gets & ! these bits and multiplies by cluster size & ! Bits 12 to 15 are block number. The next line gets these & ! and multiplies by 32 (number of blockettes per block) & ! Bits 4 to 8 are the blockette number. The last line adds & ! this. & ! The other bits of the link are not relevant here & ! & 21020 DEF FNLINK%(L%) = & ((( L% AND 3584%) / 512% ) * CLU% & + ( SWAP%( L% AND -4096% ) / 16% )) * 32% & + (( L% AND 496%) / 16%) & 21050 GOTO 32767 & 32767 END t 2?10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! BFD & ! & !A program to access the data in the BFD. & ! 1000 ! & ! & ! MAIN PROGRAM & ! & ! & !get the disk number & ! 1010 INPUT "Disk"; DISK$ 1020 IF DISK$ = "" THEN GOTO 9000 & !quit if no disk specified 1030 IF LEFT(DISK$,2%) <> "DR" & THEN DISK$ = "DR" + DISK$ 1040 IF RIGHT(DISK$,LEN(DISK$)) <> ":" & THEN DISK$ = DISK$ + ":" 1050 PRINT \ PRINT 2000 ! & !open disk non-file structured & !get the pack label block & !get the version number and quit if not 1.1 & !get the DCN of the MFD & ! 2010 OPEN DISK$ AS FILE #1%, RECORDSIZE 1024% 2020 FIELD #1%, 1024% AS BUFF$ 2030 GET #1%, BLOCK 1% 2040 VERSION% = FNBYTE%(7%) \ & LEVEL% = FNBYTE%(6%) \ & IF VERSION% <> 1% & OR LEVEL% <> 1% & THEN PRINT "This program only works for 1.1 disks." \ & GOTO 32767 2050 DCN.MFD% = FNWORD%(2%) 4000 ! & !get the DCN of the BFD & ! 4010 GET #1%, BLOCK DCN.MFD% 4020 DCN.BFD% = FNWORD%(7%) 4030 IF DCN.BFD% = 0% & THEN PRINT BELL$; "This disk has no BFD." \ & PRINT "Please correct immediately." \ & GOTO 32767 5000 ! & !open up the BFD with correct cluster size & ! 5010 CLOSE #1% 5020 OPEN DISK$ AS FILE #1%, RECORDSIZE 16% * 512% 5030 FIELD #1%, 16% * 512% AS BUFF$ 5040 GET #1%, BLOCK DCN.BFD% \ & CURRENT.CLUSTER% = 0% 6000 ! & !get the data for this account & ! 6010 GOSUB 10000 7000 ! & !another account & ! 7010 GOTO 3000 8000 ! & !another disk & ! 8010 GOTO 1000 9000 ! & !normal exit & ! 9010 CLOSE #1% 9990 GOTO 32767 10000 ! & ! & ! SUBROUTINE: Data from BFD & ! & ! & !get the links to the job blockette and cluster blockette & ! 10010 LINK.JB% = FNWORD%(0%) 10020 LINK.CB% = FNWORD%(1%) 10100 ! & !get correct cluster, block and offset for job link & ! 10110 OFFSET% = FNLINK%(LINK.JB%) \ & !the function GETs the right cluster and finds the offset \ & BYTE.OFFSET% = OFFSET% \ & WORD.OFFSET% = OFFSET%/2% 10200 ! & !data from job blockette & ! 10210 FOR I% = 1% TO 7% \ & JB%(I%) = FNWORD%(WORD.OFFSET% + I%) \ & IF JB%(I%) <> 0% & THEN PRINT "Job number for job"; I%; "is"; JB%(I%) 10220 NEXT I% 10230 NEXT.LINK% = FNWORD%(WORD.OFFSET%) 10240 IF NEXT.LINK% = 0% THEN GOTO 10400 10250 OFFSET% = FNLINK%(NEXT.LINK%) 10260 GOTO 10100 10300 ! & !get correct cluster, block and offset for job link & ! 10310 OFFSET% = FNLINK%(LINK.JB%) \ & !the function GETs the right cluster and finds the offset \ & BYTE.OFFSET% = OFFSET% \ & WORD.OFFSET% = OFFSET%/2% 10400 ! & !data from cluster blockette & ! & !word meaning & ! & ! 0 reserved & ! 1 -1 & ! 2 number of blocks in a cluster & ! 3 number of blockettes in a block & ! 4 number of words in a blockette & ! 5 number of bytes in a word & ! 6 number of bits in a byte & ! 7 RAD50 for "BFD" & ! 10410 IF FNWORD%(7%) <> 3444% & THEN PRINT BELL$; "?Corrupt BFD." \ & GOTO 32767 10420 PRINT "Number of blocks in a cluster:"; FNWORD%(2%) 10430 PRINT "Number of blockettes in a block:"; FNWORD%(3%) 10440 PRINT "Number of words in a blockette:"; FNWORD%(4%) 10450 PRINT "Number of bytes in a word:"; FNWORD%(5%) 10450 PRINT "Number of bits in a byte:"; FNWORD%(6%) 10700 ! & !print a couple of blank lines & ! 10710 PRINT \ PRINT 10900 ! & !return & ! 10990 RETURN 18000 ! & ! & ! FUNCTIONS & ! & ! 18100 ! & !pull a word from the buffer & !for convenience, the words are numbered as words even though & !the buffer is character (and hence byte) oriented. Words are & !normally numbered starting at zero, but the characters in the & !buffer must be numbered starting at one, so another adjustment & !is needed. & ! 18110 DEF* FNWORD%(W%) 18120 FIRSTBYTE% = W% * 2% + 1% 18180 FNWORD% = ASCII( MID(BUFF$,FIRSTBYTE% ,1%) ) & + SWAP%( ASCII( MID(BUFF$,FIRSTBYTE%+1%,1%) ) ) 18190 FNEND 18200 ! & !pull a byte from the buffer & !Since the bytes are generally numbered starting at zero but & !the characters are numbered begining at one, an adjustment is & !needed. & ! 18210 DEF* FNBYTE%(B%) 18280 FNBYTE% = ASCII(MID(BUFF$,B%+1%,1%)) 18290 FNEND 18300 ! & !convert a link & !If the link indicates another cluster, the correct cluster is & !GETed by the function. & ! & !In a link word the bits have the following meaning: & ! & ! 0 - 8 byte within the block & ! 9 - 11 cluster (16 blocks) number & ! 12 - 15 block within the cluster & ! 18310 DEF* FNLINK%(LINK%) 18320 CLUSTER.NUMBER% = ( LINK% AND 3584% ) / 512% \ & BLOCK.NUMBER% = SWAP%( LINK% AND -4096% ) / 16% \ & BYTE.NUMBER% = LINK% AND 511% 18330 IF CLUSTER.NUMBER% <> CURRENT.CLUSTER% & THEN GET #1%, BLOCK CLUSTER.MAP%(CLUSTER.NUMBER%) \ & CURRENT.CLUSTER% = CLUSTER.NUMBER% 18380 FNLINK% = BLOCK.NUMBER% * 512% + BYTE.NUMBER% 18390 FNEND 18400 ! & !convert a number to time & ! 18410 DEF* FNTIME$(T%) 18420 IF T% = 0% & THEN T$ = "none" \ & GOTO 18480 18430 HOURS% = T% / 60% \ & MINUTES% = T% - HOURS% * 60% 18440 T$ = NUM1$(MINUTES%) \ & IF LEN(T$) = 1% & THEN T$ = "0" + T$ 18450 IF HOURS% > 0% & THEN T$ = NUM1$(HOURS%) + ":" + T$ 18480 FNTIME$ = T$ 18490 FNEND 32767 END Iq 2? JUMP is a program which allows certain users to change accounts without knowing the passwords. Privileged users can JUMP to any account. They maintain the privilege to jump to further accounts as long as they keep the same job number, even if they JUMP to non-privileged accounts. JUMP END willl terminate the JUMPing privileges. JUMP BACK will return them to the last privileged account. Accounts may be given names (in a data file) so that the user can JUMP to an account by name rather than by number. Non-privileged users can be given access to accounts within a specified project. They must begin in a specified account and know the password which allows them access to the project. JUMP + allows them to go through the project in ascending order. WARNING: The program works by creating a file in [1,3] whose name contains the job number. As long as this file exists, the person with that job number will have JUMPing privileges. If the user does not remember to use JUMP END or if the user's job is killed before he can, then the next person to get the same job number wil have JUMPing privileges. The "permission" file must be deleted before another user gets that job number. They only sure way to do that is to modify LOGIN to delethe te permission file before it signs a user in (as described in the program). As far as we can tell, this has prevented unauthorized use of JUMP, but I can make no guarantees. We find the convenience worth the risk. Maybe you won't. KILL0 will delete files with 0 blocks. It will not delete files which are open or which have a protection code of <63> or which have the "protect" bit set (see PROBIT below). Otherwise, it automatically deletes the file. BIGFIL locates and optionally deletes large files. The user specifies a size and the program lists all files whose size is larger than or equal to the given size. The program has three deletion options: delete them all, delete none (but list them), and ask about each file. PROBIT can set and clear the "protect" bit on a file. When the protect bit is set on a file, that file can not be deleted or renamed even by a privileged user. However, the contents of the file can be changed. CLASS creates or deletes a range of accounts. It is designed for class accounts each of which has the same quota and same (initial) password. The program has a data file which has a list of the course numbers and the corresponding projects. Obviously, you will want to change the data. The program keeps track of how many accounts were created so that it can delete the accounts without having to ask you how many there were. The program will also tape the accounts (by creating a command file for PIP). ACCLST gives a list of all the accounts on the system in a compact format. No information is given about the accounts. PACKID allows you to change the ID of a disk pack. PRIV gives a list of all files which have a privileged protection code. LAST accesses the "last logged in" data in the GFD for specific accounts, keyboards, and dates. User may specify a list of accounts, each one of which may contain an * for project or programmer number. For example: [1,*],[51,2],[*,0]. User may specify as list of keyboard numbers, each entry of which may be an individual keyboard or a range of keyboards. For example: 12,14-19,20. The user may specify dates in three formats: date, BEFORE date, and date1 TO date2. The program will print out the "last logged in" data only for cases matching all three specifications. Of course, each one defaults to "ALL". WARNING: this program can not be used to find out who last used a given keyboard. The person who last used a given keyboard may have subsequently used another keyboard. The program can only list those people who have not used another keyboard since the specified one. PROTEC is a program designed to reserve a terminal for a short time. It is designed for workers in the computer center who wish to leave their terminal for a short time but do not want to sign out and sign back in. The program "locks" the keyboard by "eating" all input, including control C. Program terminates when the correct password is given. If time runs out, the program logs itself out. It is normally reserved for privileged users, but the "permission file" for JUMP is also a permission file for PROTEC. MFDBIT will set the "marked for deletion" bit on a file, making it partially invisible. PIP and DI do not ordinarily list such file, making it likely that no one will notice them. DI/S will list them. When the disk is CLEANed, the files will be deleted, so the effect can only be used temporarily. FIND will list all the files which have this bit set. GFD and UFD access the data in the GFD and UFD. The data itself is not really the point. The real purpose of the programs is to show how to access the data. BFD is included just for fun. DATETI shows how to access the data in the Date Time blockette of the GFD. Several of the programs in this package access either the MFD, GFD, or UFD. One of them accesses the Pack Label Block. The text files MFD.DOC, GFD.DOC, UFD.DOC, and PACK.DOC are explanations of them. Please let me know if the explanations are insufficient. [2? JUMP is a program which allows certain users to change accounts without knowing the passwords. KILL0 will delete files with 0 blocks. BIGFIL locates and optionally deletes large files. PROBIT can set and clear the "protect" bit on a file. When the protect bit is set on a file, that file can not be deleted or renamed even by a privileged user. CLASS creates or deletes a range of accounts. ACCLST gives a list of all the accounts on the system in a compact format. PACKID allows you to change the ID of a disk pack. PRIV gives a list of all files which have a privileged protection code. LAST accesses the "last logged in" data in the GFD for specific accounts, keyboards, and dates. PROTEC is a program designed to reserve a terminal for a short time. MFDBIT will set the "marked for deletion" bit on a file, making it partially invisible. FIND will list all the files which have this bit set. GFD and UFD access the data in the GFD and UFD. BFD is included just for fun. DCN and RETRIE both print out the contents of the Retrieval Blockette in the UFD. DATETI accesses the data in the Date/ Time blockette of the GFD. z N2? Name .Typ Size Prot Date SY:[51,101] JUMP .BAS 56 < 60> 25-Jul-84 PRIV .BAS 13 < 60> 27-Jul-84 LAST .BAS 28 < 60> 18-Jul-84 PROTEC.BAS 19 < 60> 20-Dec-83 MFDBIT.BAS 10 < 60> 27-Jul-84 FIND .BAS 12 < 60> 21-Jul-84 GFD .BAS 18 < 60> 21-Jul-84 UFD .BAS 13 < 60> 21-Jul-84 DCN .BAS 17 < 60> 25-Jul-84 RETRIE.BAS 9 < 60> 21-Jul-84 DATETI.BAS 12 < 60> 21-Jul-84 MFD .DOC 3 < 60> 29-Jul-84 GFD .DOC 5 < 60> 29-Jul-84 BIGFIL.BAS 16 < 60> 21-Jul-84 PROBIT.BAS 10 < 60> 27-Jul-84 ACCLST.BAS 15 < 60> 21-Jul-84 CLASS .BAS 25 < 60> 26-Jul-84 PACKID.BAS 7 < 60> 26-Jul-84 UFD .DOC 7 < 60> 06-Dec-83 PACK .DOC 2 < 60> 19-Nov-83 KILL0 .BAS 28 < 60> 25-Jul-84 BFD .BAS 15 < 60> 31-Jul-84 README.1ST 11 < 60> 31-Jul-84 ABSTRA.DOC 3 < 60> 31-Jul-84 DIRECT.LST 2 < 60> 31-Jul-84 Total of 356 blocks in 25 files in SY:[51,101] +dD[2? PACK LABEL BLOCK The Pack Label begins in Device Cluster Number (DCN) 1. The first blockette (8 words) is structured as below. The remainder of the block is reserved. word 0: 0 word 1: -1 word 2: DCN of MFD word 3: version / level word 4: pack clustersize word 5: pack status word (see below) words 6 and 7: Pack label PACK STATUS WORD bit 0-8: unused bit 9: new files first bit 10: unused bit 11: date of last write bit 12: read only pack bit 13: word 6 (version) is valid bit 14: pack is private or system bit 15: pack is mounted read/write 4R[2? MASTER FILE DIRECTORY The DCN of the MFD is given in word two of the Pack Label Block. (See DISK.DOC for a description of the Pack Label Block.) The MFD contains three blocks: a label block, a GFD pointer table block, and an MFD link table block. THE LABEL BLOCK The label block starts with a label blockette: word 0: 1 word 1: -1 words 2-4: 0 word 5: Pack Attribute Pointer word 6: each byte is 255 word 7: 'MFD' in RAD50 (21044) The remainder of the block is reserved for blockettes. The last blockette contains the Cluster Map for the directory. The second block of the MFD is a 256 word table. The contents of each word is the DCN of the GFD for that Project. If the entry is 0, then no accounts are set up for that Project. The last word is always zero because 255 is not a legal Project number. The third block of the MFD is reserved and filled with zero's. (It may someday be used for pointers to Project attributes, which would be stored in the blockettes of the MFD. If there are further blocks, they will be reserved for blockettes. ,[2? GROUP FILE DIRECTORIES There is one GFD for every project on the disk. Within the GFD there is a table of pointers to the UFD for each Programmer number in that project and a table of link words to the name blockettes in the GFD for the accounts in that project. The first block of the GFD contains the Label Bockette: word 0: 1 word 1: -1 words 2-5: 0 word 6: Project number (high byte) and 255 (low byte) word 7: 'GFD' in RAD50 (11444) The remainder of the block is reserved for blockettes. The last blockette of the block contains the Cluster Map for the directory. The second block of the GFD has a 256 word table with the DCN of the UFD for that Programmer number. If the entry is 0 then that Programmer number is not used. The last word is always zero because 255 is not a valid programmer number. The third block of the GFD is a 256 word table of Link words pointing to the Name blockette of each user. The name blockette is structured as follows: word 0: link to Date/Time Attribute Blockette word 1: Project number / Programmer number words 2-3: 0 word 4: Protection / Status word 5: Logins / Opens word 6: link to accounting blockette word 7: DCN of UFD The Accounting blockette is structured as follows: word 0: 1 word 1: CPU time (LSB) word 2: Connect Time word 3: KCT's (LSB) word 4: Device Time word 5: CPU and KCT MSB's word 6: Logged Out Quota word 7: UFD Clustersize The Password blockette is structured as follows: word 0: Link to Date and Time Attribute Blockette word 1: low byte is 3. High byte is part of password (see below) words 2-7: These along with the high byte of word 1 are the password. It is stored as 13 ASCII bytes. NOTE: In version 8.0, passwords are still restricted to six RAD50 characters. The Date/Time blockette is structured as follows: word 0: Link to Password Attribute Blockette word 1: last keyboard number / 4 word 2: date of last login word 3: time of last login word 4: date of password change word 5: time of password change word 6: date account created word 7: time account created s!e^ 2? 10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! ENCODE.BAS & ! & !A program to encode a text file. & !The encoding algorithm depends on a password given by the & !user. The file cannot be decoded unless the password is given.& !The password is stored in the coded file, but it is stored in & !coded form. The algorithm is not easy to invert. & ! 21 ! & !The method of encoding is designed so that the same method can & !be used to decode the file. The encoding is done with XLATE. & !The XLATE string is designed so that it exchanges pairs of & !characters. The decode program would be more difficult to & !write if control characters like carriage returns were coded. & !For that reason, control characters (1-31 and 127) are not & !coded. An exception is made for tabs. In order to preserve & !the symmetry of the translation, ^I and ^G are exchanged. & ! 22 ! & !The program works as follows: & ! & ! An XLATE string is set up which exchanges some or all of & !the characters in the range 32-126 and which exchanges ^I and & !^G. The exact method of exchange depends on the password. & ! The password is encoded using the XLATE string and the & !password is printed to the file. & ! Further exchanges are made to the XLATE string and the & !first line is encoded and printed to the file. & ! This process is repeated for each line of the file. Each & !line is coded in a way which is different from the line before.& ! 23 ! & ! Naturally, I cannot guarantee that no one will be able to & !decode the file. I tried to make it as difficult as I could & !to decode the file without the password, even with access to & !the program itself. I also tried to make it as difficult as I & !could to recover the original password from the encryped copy. & !Since the method of encrypting the password depends on the & !original password, it is not easy to recover the password even & !if given the encrypted version and the encryption algorithm. & ! & ! 100 ! & !error routine & ! 110 ON ERROR GOTO 19000 200 ! & !^C trap & ! 210 Z$ = SYS(CHR$(6%)+CHR$(-7%)) 300 ! & !constants & ! 310 TRUE% = -1% \ & FALSE% = 0% 320 BELL$ = CHR$(7%) 330 ERASE$ = CHR$(8%) + " " + CHR$(8%) 400 ! & !dimension statements & ! 410 DIM T%(127%) 500 ! & !key number & ! 510 KN% = 31415% 520 KN1% = KN%/1000% \ & KN% = KN% - KN1% * 1000% \ & KN2% = KN%/10% \ & KN3% = KN% - KN2% * 10% 1000 ! & ! & ! MAIN PROGRAM & ! & ! & !get the file & ! 1010 GOSUB 10000 1020 IF INFILE$ = "" THEN GOTO 32767 2000 ! & !create the working file, or quit if this can't be done & ! 2010 GOSUB 11000 3000 ! & !get the password & ! 3010 PRINT "In order to prevent others from decoding this file, you must supply a password." \ & PRINT "It may be up to 20 characters long and can consist of both upper and lower" \ & PRINT "case characters." \ & PRINT "The password will show on the screen as you type it and then be erased." \ & PRINT \ & PRINT "Password: "; 3020 OPEN "KB:" AS FILE #3%, MODE 8% 3030 Z$ = SYS(CHR$(11%)) !cancel type-ahead 3040 PRINT #3%, RECORD 256%, CHR$(128%+20%); 3050 GET #3% \ & FIELD #3%, RECOUNT AS PASS$ 3060 PASS$ = CVT$$(PASS$,4%) 3080 LPASS% = LEN(PASS$) 3090 PRINT ERASE$; FOR I% = 1% TO LPASS% 3100 PRINT \ PRINT 4000 ! & !initialize the XLATE string, code and print password & ! 4010 GOSUB 12000 4020 PASS$ = XLATE(PASS$,T$) 4030 PRINT #2%, FNCODE$(PASS$) & !password is printed with extra random characters 5000 ! & !encode the file & ! 5010 INPUTLINE #1%, IN$ 5020 GOSUB 13000 !update string 5030 PRINT #2%, XLATE(IN$,T$); 5040 LINES% = LINES% + 1% \ & IF LINES% / 10% * 10% = LINES% & THEN PRINT "Now working on line ";LINES% 5050 GOTO 5010 9000 ! & !normal exit: close files, delete original and rename new file & ! 9010 CLOSE #1%, #2% 9020 KILL INFILE$ 9030 NAME WORKFILE$ AS INFILE$ 9990 GOTO 32767 10000 ! & ! & ! SUBROUTINE: Open file to encode & ! & ! 10100 ! & !get its name & ! 10110 PRINT "Name of file to encode"; \ & INPUTLINE INFILE$ \ & INFILE$ = CVT$$(INFILE$,-1%) 10120 IF INFILE$ = "" THEN RETURN 10300 ! & !get the device & ! 10310 COLON% = INSTR(1%,INFILE$,":") 10320 IF COLON% <> 0% & THEN DEV$ = LEFT(INFILE$,COLON%) \ & INFILE$ = RIGHT(INFILE$,COLON%+1%) 10400 ! & !add default extension, if needed & ! 10410 DOT% = INSTR(1%,INFILE$,".") 10420 IF DOT% = 0% & THEN INFILE$ = INFILE$ + ".TXT" 10430 INFILE$ = DEV$ + INFILE$ 10500 ! & !open it up & ! 10510 OPEN INFILE$ FOR INPUT AS FILE #1% & !error routine may branch to 10600 (can't find) or & !10700 (protection violation) 10520 GOTO 10900 10600 ! & !file not there & ! 10610 PRINT BELL$;"Can't find the input file: "; INFILE$ 10620 GOTO 10000 10700 ! & !protection violation & ! 10710 PRINT BELL$;"Can't access the input file: "; INFILE$ 10720 GOTO 10000 10900 ! & !return & ! 10990 RETURN 11000 ! & ! & ! SUBROUTINE: Open working file & ! & ! 11100 ! & !open it for output. If it is there, it is an error & ! 11110 WORKFILE$ = DEV$ + "ENCODE.TMP" 11120 OPEN WORKFILE$ FOR INPUT AS FILE #2% & !an error will cause a branch to 10200 11130 PRINT "This program needs to use the file "; \ & PRINT WORKFILE$; " as a working file. Please" \ & PRINT "delete or rename the file by this name." \ & PRINT 11140 GOTO 32767 11200 ! & !file wasn't there (which is fine) & ! 11210 OPEN WORKFILE$ FOR OUTPUT AS FILE #2% 11900 ! & !return & ! 11990 RETURN 12000 ! & ! & ! SUBROUTINE: Initialize string & ! & ! 12100 ! & !set up the identity string (but with ^I and ^G reversed) & ! 12110 T%(I%) = I% FOR I% = 1% TO 127% 12120 T%(7%) = 9% \ & T%(9%) = 7% 12130 T%(0%) = 127% !length is needed for CHANGE to come later 12200 ! & !some fixed shuffling to avoid T%(I%) = I% & ! 12210 FOR I% = 0% TO 10% 12220 Z% = FNEXCHANGE%(32%+I%,98%+I%) 12230 Z% = FNEXCHANGE%(43%+I%,76%+I%) 12240 Z% = FNEXCHANGE%(54%+I%,109%+I%) 12250 Z% = FNEXCHANGE%(65%+I%,87%+I%) 12260 NEXT I% 12270 Z% = FNEXCHANGE%(120%+I%,124%+I%) FOR I% = 0% TO 2% 12300 ! & !shuffle more (dependent on password) & ! 12310 FOR SH% = 1% TO KN2% 12320 N% = N% + 1% 12330 JUNK% = RND & FOR I% = 1% TO ASCII( MID(PASS$,FNMOD%(N%),1%) ) / KN3% 12340 IND1% = FNRND% \ & IND2% = T%(IND1%) \ & IND3% = FNRND% \ & IND4% = T%(IND3%) 12350 Z% = FNEXCHANGE%(IND1%,IND3%) 12360 Z% = FNEXCHANGE%(IND2%,IND4%) 12370 NEXT SH% 12400 ! & !change to a string for XLATE & ! 12410 CHANGE T% TO T$ 12420 T$ = CHR$(0%) + T$ 12900 ! & !return & ! 12990 RETURN 13000 ! & ! & ! SUBROUTINE: update string & ! & ! 13100 ! & !some more shuffling & !(the vector version of the string is still intact, so we don't & !need to CHANGE T$ to T%) & ! 13110 FOR SH% = 1% TO KN1% 13120 N% = N% + 1% 13130 JUNK% = RND & FOR I% = 1% TO ASCII( MID(PASS$,FNMOD%(N%),1%) ) / KN3% 13140 IND1% = FNRND% \ & IND2% = T%(IND1%) \ & IND3% = FNRND% \ & IND4% = T%(IND3%) 13150 Z% = FNEXCHANGE%(IND1%,IND3%) 13160 Z% = FNEXCHANGE%(IND2%,IND4%) 13170 NEXT SH% 13200 ! & !change to string & ! 13210 CHANGE T% TO T$ 13220 T$ = CHR$(0%) + T$ 13900 ! & !return & ! 13990 RETURN 18000 ! & ! & ! FUNCTIONS & ! & ! 18100 ! & !find a number modulo length of password & ! 18110 DEF FNMOD%(N%) = N% - N% / LPASS% * LPASS% 18200 ! & !generate a random number in range 32 - 126 & ! 18210 DEF FNRND% 18220 JUNK% = RND FOR JNK% = 1% TO KN3% 18280 FNRND% = RND * 94% + 32% 18290 FNEND 18300 ! & !add random characters to password & ! 18310 DEF FNCODE$(P$) 18320 TP$ = "" 18330 FOR I% = 1% TO LEN(P$) 18340 TP$ = TP$ + MID(P$,I%,1%) + CHR$(FNRND%) 18350 NEXT I% 18380 FNCODE$ = TP$ 18390 FNEND 18400 ! & !exchange two elements of T%( ) & ! 18410 DEF FNEXCHANGE%(I%,J%) 18420 TIND% = T%(I%) \ & T%(I%) = T%(J%) \ & T%(J%) = TIND% 18480 FNEXCHANGE% = 0% 18490 FNEND 19000 ! & ! & ! Error Routine & ! & ! 19100 ! & !^C error & ! 19110 IF ERR = 28 & AND ERL = 9020 & THEN PRINT BELL$;"Original file is called ";INFILE$ \ & PRINT "Encoded file is called ENCODE.TMP" \ & PRINT "Program was unable to rename files." \ & RESUME 32767 & !^C error while killing original 19120 IF ERR = 28 & AND ERL = 9030 & THEN PRINT BELL$;"Encoded file is called ENCODE.TMP" \ & PRINT "Original file has been deleted." \ & PRINT "Program was unable to rename the file." \ & RESUME 32767 & !^C error while renaming coded file 19130 IF ERR = 28 & THEN PRINT BELL$;"Program aborted by ^C." \ & CLOSE #1%, #2% \ & KILL WORKFILE$ IF WORKFILE$ <> "" \ & RESUME 32767 & !general ^C error, return to original file 19200 ! & !Expected errors (by line number) & ! 19210 IF ERL = 19130 & THEN RESUME 32767 & !couldn't kill work file in error routine (^C) 19220 IF ERL = 5010 THEN RESUME 9000 & !end of file on input 19230 IF ERL = 11120 THEN RESUME 11200 & !working file wasn't there 19240 IF ERL = 3050 AND ERR = 11 THEN RESUME 9000 & !^Z on password accepted as a quit 19250 IF ERL = 10510 AND ERR = 5 THEN RESUME 10600 & !can't find input file 19260 IF ERL = 10510 AND ERR = 10 THEN RESUME 10700 & !protection violation for input file 19270 IF ERL = 9030 & THEN PRINT BELL$;"Unable to rename file. Encoded copy is named "; WORKFILE$ \ & GOTO 32767 19600 ! & !Expected errors (by type) & ! 19900 ! & !Unexpected errors & ! 19910 Z$ = SYS(CHR$(6%)+CHR$(9%)+CHR$(ERR)) 19920 ERROR$ = RIGHT(Z$,3%) 19930 PRINT " ***** Whoops! *****" \ & PRINT " "; ERROR$; " at line";ERL 19990 GOTO 32767 32767 Z$ = SYS(CHR$(9%)) \ & END e^ 2? 10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! DECODE & ! & !A program to decode a text file. & !See ENCODE.BAS for details. & ! 100 ! & !error routine & ! 110 ON ERROR GOTO 19000 200 ! & !^C trap & ! 210 Z$ = SYS(CHR$(6%)+CHR$(-7%)) 300 ! & !constants & ! 310 TRUE% = -1% \ & FALSE% = 0% 320 BELL$ = CHR$(7%) 330 ERASE$ = CHR$(8%) + " " + CHR$(8%) 400 ! & !dimension statements & ! 410 DIM T%(127%) 500 ! & !key number & ! 510 KN% = 31415% 520 KN1% = KN%/1000% \ & KN% = KN% - KN1% * 1000% \ & KN2% = KN%/10% \ & KN3% = KN% - KN2% * 10% 1000 ! & ! & ! MAIN PROGRAM & ! & ! & !get the file & ! 1010 GOSUB 10000 1020 IF INFILE$ = "" THEN GOTO 32767 2000 ! & !create the working file, or quit if this can't be done & ! 2010 GOSUB 11000 3000 ! & !get the password & ! 3010 PRINT "You must give the password you used when encoding the file. Without the" \ & PRINT "password, there is no way to decode the file." \ & PRINT \ & PRINT "Password: "; 3020 OPEN "KB:" AS FILE #3%, MODE 8% 3030 Z$ = SYS(CHR$(11%)) !cancel type-ahead 3040 PRINT #3%, RECORD 256%, CHR$(128%+20%); 3050 GET #3% \ & FIELD #3%, RECOUNT AS PASS$ 3060 PASS$ = CVT$$(PASS$,4%) 3080 LPASS% = LEN(PASS$) 3090 PRINT ERASE$; FOR I% = 1% TO LPASS% 3100 PRINT \ PRINT 4000 ! & !initialize the XLATE string, code and check password & ! 4010 GOSUB 12000 4020 PASS$ = XLATE(PASS$,T$) 4030 INPUTLINE #1%, PASS1$ \ & PASS1$ = CVT$$(PASS1$,4%) 4040 IF PASS1$ = FNCODE$(PASS$) & THEN GOTO 5000 4050 PRINT BELL$; FOR I% = 1% TO 5% 4060 PRINT "Incorrect password." 4070 CLOSE #1%, #2% 4080 KILL WORKFILE$ 4090 GOTO 32767 5000 ! & !decode the file & ! 5010 INPUTLINE #1%, IN$ 5020 GOSUB 13000 !update string 5030 PRINT #2%, XLATE(IN$,T$); 5040 LINES% = LINES% + 1% \ & IF LINES% / 10% * 10% = LINES% & THEN PRINT "Now working on line ";LINES% 5050 GOTO 5010 9000 ! & !normal exit: close files, delete original and rename new file & ! 9010 CLOSE #1%, #2% 9020 KILL INFILE$ 9030 NAME WORKFILE$ AS INFILE$ 9990 GOTO 32767 10000 ! & ! & ! SUBROUTINE: Open file to decode & ! & ! 10100 ! & !get its name & ! 10110 PRINT "Name of file to decode"; \ & INPUTLINE INFILE$ \ & INFILE$ = CVT$$(INFILE$,-1%) 10120 IF INFILE$ = "" THEN RETURN 10300 ! & !get the device & ! 10310 COLON% = INSTR(1%,INFILE$,":") 10320 IF COLON% <> 0% & THEN DEV$ = LEFT(INFILE$,COLON%) \ & INFILE$ = RIGHT(INFILE$,COLON%+1%) 10400 ! & !add default extension, if needed & ! 10410 DOT% = INSTR(1%,INFILE$,".") 10420 IF DOT% = 0% & THEN INFILE$ = INFILE$ + ".TXT" 10430 INFILE$ = DEV$ + INFILE$ 10500 ! & !open it up & ! 10510 OPEN INFILE$ FOR INPUT AS FILE #1% & !error routine may branch to 10600 (can't find) or & !10700 (protection violation) 10520 GOTO 10900 10600 ! & !file not there & ! 10610 PRINT BELL$;"Can't find the input file: "; INFILE$ 10620 GOTO 10000 10700 ! & !protection violation & ! 10710 PRINT BELL$;"Can't access the input file: "; INFILE$ 10720 GOTO 10000 10900 ! & !return & ! 10990 RETURN 11000 ! & ! & ! SUBROUTINE: Open working file & ! & ! 11100 ! & !open it for output. If it is there, it is an error & ! 11110 WORKFILE$ = DEV$ + "DECODE.TMP" 11120 OPEN WORKFILE$ FOR INPUT AS FILE #2% & !an error will cause a branch to 10200 11130 PRINT "This program needs to use the file "; \ & PRINT WORKFILE$; " as a working file. Please" \ & PRINT "delete or rename the file by this name." \ & PRINT 11140 GOTO 32767 11200 ! & !file wasn't there (which is fine) & ! 11210 OPEN WORKFILE$ FOR OUTPUT AS FILE #2% 11900 ! & !return & ! 11990 RETURN 12000 ! & ! & ! SUBROUTINE: Initialize string & ! & ! 12100 ! & !set up the identity string (but with ^I and ^G reversed) & ! 12110 T%(I%) = I% FOR I% = 1% TO 127% 12120 T%(7%) = 9% \ & T%(9%) = 7% 12130 T%(0%) = 127% !length is needed for CHANGE to come later 12200 ! & !some fixed shuffling to avoid T%(I%) = I% & ! 12210 FOR I% = 0% TO 10% 12220 Z% = FNEXCHANGE%(32%+I%,98%+I%) 12230 Z% = FNEXCHANGE%(43%+I%,76%+I%) 12240 Z% = FNEXCHANGE%(54%+I%,109%+I%) 12250 Z% = FNEXCHANGE%(65%+I%,87%+I%) 12260 NEXT I% 12270 Z% = FNEXCHANGE%(120%+I%,124%+I%) FOR I% = 0% TO 2% 12300 ! & !shuffle more (dependent on password) & ! 12310 FOR SH% = 1% TO KN2% 12320 N% = N% + 1% 12330 JUNK% = RND & FOR I% = 1% TO ASCII( MID(PASS$,FNMOD%(N%),1%) ) / KN3% 12340 IND1% = FNRND% \ & IND2% = T%(IND1%) \ & IND3% = FNRND% \ & IND4% = T%(IND3%) 12350 Z% = FNEXCHANGE%(IND1%,IND3%) 12360 Z% = FNEXCHANGE%(IND2%,IND4%) 12370 NEXT SH% 12400 ! & !change to a string for XLATE & ! 12410 CHANGE T% TO T$ 12420 T$ = CHR$(0%) + T$ 12900 ! & !return & ! 12990 RETURN 13000 ! & ! & ! SUBROUTINE: update string & ! & ! 13100 ! & !some more shuffling & !(the vector version of the string is still intact, so we don't & !need to CHANGE T$ to T%) & ! 13110 FOR SH% = 1% TO KN1% 13120 N% = N% + 1% 13130 JUNK% = RND & FOR I% = 1% TO ASCII( MID(PASS$,FNMOD%(N%),1%) ) / KN3% 13140 IND1% = FNRND% \ & IND2% = T%(IND1%) \ & IND3% = FNRND% \ & IND4% = T%(IND3%) 13150 Z% = FNEXCHANGE%(IND1%,IND3%) 13160 Z% = FNEXCHANGE%(IND2%,IND4%) 13170 NEXT SH% 13200 ! & !change to string & ! 13210 CHANGE T% TO T$ 13220 T$ = CHR$(0%) + T$ 13900 ! & !return & ! 13990 RETURN 18000 ! & ! & ! FUNCTIONS & ! & ! 18100 ! & !find a number modulo length of password & ! 18110 DEF FNMOD%(N%) = N% - N% / LPASS% * LPASS% 18200 ! & !generate a random number in range 32 - 126 & ! 18210 DEF FNRND% 18220 JUNK% = RND FOR JNK% = 1% TO KN3% 18280 FNRND% = RND * 94% + 32% 18290 FNEND 18300 ! & !add random characters to password & ! 18310 DEF FNCODE$(P$) 18320 TP$ = "" 18330 FOR I% = 1% TO LEN(P$) 18340 TP$ = TP$ + MID(P$,I%,1%) + CHR$(FNRND%) 18350 NEXT I% 18380 FNCODE$ = TP$ 18390 FNEND 18400 ! & !exchange two elements of T%( ) & ! 18410 DEF FNEXCHANGE%(I%,J%) 18420 TIND% = T%(I%) \ & T%(I%) = T%(J%) \ & T%(J%) = TIND% 18480 FNEXCHANGE% = 0% 18490 FNEND 19000 ! & ! & ! Error Routine & ! & ! 19100 ! & !^C error & ! 19110 IF ERR = 28 & AND ERL = 9020 & THEN PRINT BELL$;"Original file is called ";INFILE$ \ & PRINT "Decoded file is called DECODE.TMP" \ & PRINT "Program was unable to rename files." \ & RESUME 32767 & !^C error while killing original 19120 IF ERR = 28 & AND ERL = 9030 & THEN PRINT BELL$;"Decoded file is called DECODE.TMP" \ & PRINT "Original file has been deleted." \ & PRINT "Program was unable to rename the file." \ & RESUME 32767 & !^C error while renaming coded file 19130 IF ERR = 28 & THEN PRINT BELL$;"Program aborted by ^C." \ & CLOSE #1%, #2% \ & KILL WORKFILE$ IF WORKFILE$ <> "" \ & RESUME 32767 & !general ^C error, return to original file 19200 ! & !Expected errors (by line number) & ! 19210 IF ERL = 19130 & THEN RESUME 32767 & !couldn't kill work file in error routine (^C) 19220 IF ERL = 5010 THEN RESUME 9000 & !end of file on input 19230 IF ERL = 11120 THEN RESUME 11200 & !working file wasn't there 19240 IF ERL = 3050 AND ERR = 11 THEN RESUME 9000 & !^Z on password accepted as a quit 19250 IF ERL = 10510 AND ERR = 5 THEN RESUME 10600 & !can't find input file 19260 IF ERL = 10510 AND ERR = 10 THEN RESUME 10700 & !protection violation for input file 19270 IF ERL = 9030 & THEN PRINT BELL$;"Unable to rename file. Decoded copy is named "; WORKFILE$ \ & GOTO 32767 19280 IF ERL = 4080 THEN RESUME 32767 & !couldn't kill work file (wrong password exit) 19600 ! & !Expected errors (by type) & ! 19900 ! & !Unexpected errors & ! 19910 Z$ = SYS(CHR$(6%)+CHR$(9%)+CHR$(ERR)) 19920 ERROR$ = RIGHT(Z$,3%) 19930 PRINT " ***** Whoops! *****" \ & PRINT " "; ERROR$; " at line";ERL 19990 GOTO 32767 32767 Z$ = SYS(CHR$(9%)) \ & END  2?10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! DEVCNT & ! & !A program print the devices and how many of each. & ! 100 ! & !error routine & ! 110 ON ERROR GOTO 19000 300 ! & !constants & ! 310 TRUE% = -1% \ & FALSE% = 0% 320 BELL$ = CHR$(7%) 400 ! & !dimention array for SYS call returns & ! 410 DIM T%(30%) 900 ! & !explain the program & ! 910 PRINT "This program prints a list of devices on the system." \ & PRINT 1000 ! & ! & ! MAIN PROGRAM & ! & ! & !get the needed addresses from monitor tables & ! 1010 GOSUB 10000 2000 ! & !print a heading & ! 2020 PRINT "Name","Number" \ & PRINT 3000 ! & !some initialization & ! 3010 OFFSET% = -2% !so that first increment makes it zero 4000 ! & !look through device name table for correct name & ! 4010 FOR OFFSET% = 0% TO ( DEVSYN% - DEVNAM% - 2% ) STEP 2% 4020 THIS.DEVNAM% = PEEK( DEVNAM% + OFFSET% ) 4030 IF THIS.DEVNAM% = -1% & THEN GOTO 32767 4040 DEVICE.NAME$ = CVT%$( SWAP%(THIS.DEVNAM%) ) 4050 NUM.UNITS% = PEEK( DEVCNT% + OFFSET% ) + 1% 4060 IF NUM.UNITS% <> 0% & THEN PRINT DEVICE.NAME$, NUM.UNITS% 4070 NEXT OFFSET% 5000 ! & !check for synonyms & ! 5010 PRINT \ & PRINT "Synonyms:" \ & PRINT 5020 OFFSET% = OFFSET% + 2% 5030 IF PEEK( DEVNAM% + OFFSET% ) = -1% THEN GOTO 9000 5040 ORIG.OFFSET% = PEEK( DEVCNT% + OFFSET%) - DEVNAM% - 2% & !for synonymns, the value is not the number of devices, but the & !location of the original name & !I don't understand why the -2% should be necessary 5050 PRINT CVT%$( SWAP%( PEEK( DEVNAM% + OFFSET% ) ) ); \ & PRINT " = "; \ & PRINT CVT%$( SWAP%( PEEK( DEVNAM% + ORIG.OFFSET% ) ) ) 5060 GOTO 5020 9000 ! & !normal exit & ! 9990 GOTO 32767 10000 ! & ! & ! SUBROUTINE: Addresses from monitor tables & ! & ! & !Monitor tables part one & ! 10010 T$ = SYS( CHR$(6%) + CHR$(-3%) ) 10020 CHANGE T$ TO T% 10030 DEVCNT% = T%(5%) + SWAP%(T%(6%)) 10040 DEVPTR% = T%(7%) + SWAP%(T%(8%)) 10100 ! & !Monitor tables part two & ! 10110 T$ = SYS( CHR$(6%) + CHR$(-12%) ) 10120 CHANGE T$ TO T% 10130 DEVNAM% = T%( 5%) + SWAP%(T%( 6%)) 10140 DEVSYN% = T%(23%) + SWAP%(T%(24%)) 10900 ! & !return & ! 10990 RETURN 19000 ! & ! & ! Error Routine & ! & ! 19100 ! & !^C error & ! 19200 ! & !Expected errors (by line number) & ! 19210 IF ERL = 2060 THEN RESUME 2070 & !illegal number for unit 19900 ! & !Unexpected errors & ! 19910 Z$ = SYS(CHR$(6%)+CHR$(9%)+CHR$(ERR)) 19920 ERROR$ = RIGHT(Z$,3%) 19930 PRINT " ***** Whoops! *****" \ & PRINT " "; ERROR$; " at line";ERL 19990 GOTO 32767 32767 END  2? 10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! DDB & ! & !A program to find the DDB for non-disk devices and print out some & !sample data from the DDB if it is a KB & ! 100 ! & !error routine & ! 110 ON ERROR GOTO 19000 300 ! & !constants & ! 310 TRUE% = -1% \ & FALSE% = 0% 320 BELL$ = CHR$(7%) 400 ! & !dimention array for SYS call returns & ! 410 DIM T%(30%) 900 ! & !explain the program & ! 910 PRINT "This program prints out sample information from the Device Data Block for a" \ & PRINT "given device." \ & PRINT 1000 ! & ! & ! MAIN PROGRAM & ! & ! & !get the needed addresses from monitor tables & ! 1010 GOSUB 10000 2000 ! & !find out which device & ! 2010 INPUT "Device"; DEVICE$ \ & DEVICE$ = LEFT(DEVICE$,4%) \ & DEVICE$ = CVT$$(DEVICE$,-1%) 2020 COLON% = INSTR(1%,DEVICE$,":") \ & IF COLON% <> 0% & THEN DEVICE$ = LEFT(DEVICE$,COLON%-1%) 2030 IF DEVICE$ = "" THEN GOTO 9000 2040 IF LEN(DEVICE$) = 2% & THEN TYPE$ = DEVICE$ \ & INPUT "Unit number"; UNIT$ 2050 IF LEN(DEVICE$) >= 3% & THEN TYPE$ = LEFT(DEVICE$,2%) \ & UNIT$ = RIGHT(DEVICE$,3%) 2060 UNIT% = VAL(UNIT$) \ & GOTO 2080 & !Skip by error message if no error generated 2070 PRINT BELL$;"Illegal unit number." \ & GOTO 2010 2080 IF UNIT% < 0% & THEN PRINT BELL$;"Illegal unit number." \ & GOTO 2010 3000 ! & !some initialization & ! 3010 OFFSET% = - 2% !so that first increment makes it correct 4000 ! & !look through device name table for correct name & ! 4010 OFFSET% = OFFSET% + 2% 4020 THIS.DEVNAM% = PEEK( DEVNAM% + OFFSET% ) 4030 IF THIS.DEVNAM% = -1% & THEN PRINT BELL$;"There is no such device." \ & GOTO 2000 4040 DEVICE.NAME$ = CVT%$( SWAP%(THIS.DEVNAM%) ) 4050 IF DEVICE.NAME$ <> TYPE$ & THEN GOTO 4010 4060 IF OFFSET% < DEVOKB% & THEN PRINT "This program is for non-disk devices only." \ & GOTO 2000 5000 ! & !check for synonyms & ! 5010 IF DEVNAM% + OFFSET% >= DEVSYN% & THEN OFFSET% = PEEK( DEVCNT% + OFFSET%) - DEVNAM% - 2% \ & TYPE$ = CVT%$( SWAP%( PEEK( DEVNAM% + OFFSET% ) ) ) & !for synonymns, the value is not the number of devices, but & !the location of the original name & !I don't understand why the -2% should be necessary 6000 ! & !check number of units & ! 6010 NUM.UNITS% = PEEK( DEVCNT% + OFFSET% ) 6020 IF NUM.UNITS% = -1% & THEN PRINT BELL$;"There is no such device." \ & GOTO 2000 6030 IF UNIT% > NUM.UNITS% & THEN PRINT BELL$;"There are not that many units." \ & GOTO 2000 7000 ! & !find the DDB and print some data & ! 7010 DEVTBL% = PEEK( DEVPTR% + OFFSET% ) 7020 DDB% = PEEK( DEVTBL% + 2% * UNIT% ) 7030 GOSUB 11000 8000 ! & !go back for more & ! 8010 GOTO 2000 9000 ! & !normal exit & ! 9990 GOTO 32767 10000 ! & ! & ! SUBROUTINE: Addresses from monitor tables & ! & ! & !Monitor tables part one & ! 10010 T$ = SYS( CHR$(6%) + CHR$(-3%) ) 10020 CHANGE T$ TO T% 10030 DEVCNT% = T%(5%) + SWAP%(T%(6%)) 10040 DEVPTR% = T%(7%) + SWAP%(T%(8%)) 10100 ! & !Monitor tables part two & ! 10110 T$ = SYS( CHR$(6%) + CHR$(-12%) ) 10120 CHANGE T$ TO T% 10130 DEVNAM% = T%( 5%) + SWAP%(T%( 6%)) 10140 DEVOKB% = T%( 9%) + SWAP%(T%(10%)) 10150 DEVSYN% = T%(23%) + SWAP%(T%(24%)) 10900 ! & !return & ! 10990 RETURN 11000 ! & ! & ! SUBROUTINE: data from DDB & ! & ! & !job number & ! 11010 JOB% = PEEK( DDB% + 2% ) AND 255% 11020 IF JOB% / 2% * 2% <> JOB% & THEN PRINT "Device is disabled." \ & GOTO 11100 11030 JOB% = JOB% / 2% \ & JOB$ = NUM1$(JOB%) 11040 IF JOB% = 0% & THEN PRINT "Device is free." \ & GOTO 11100 11050 DDCNT.FLAGS% = PEEK( DDB% + 6% ) 11060 IF DDCNT.FLAGS% < 0% & THEN PRINT "Device was assigned by job number "; JOB$; \ & PRINT " at "; TIME$( PEEK( DDB% + 4% ) ) \ & GOTO 11100 11070 IF DDCNT.FLAGS% AND 8192% & AND TYPE$ = "KB" & THEN PRINT "Device is console terminal for job number "; JOB$ \ & GOTO 11100 11080 PRINT "Device is being used by job number "; JOB$ 11100 ! & !ownership privilege and read/write privileges & ! 11110 DDSTS.FLAGS% = PEEK( DDB% ) 11120 IF DDSTS.FLAGS% AND 256% & THEN PRINT "Ownership of device requires privilege." 11130 IF DDSTS.FLAGS% AND 512% & THEN PRINT "Read privileges are never given out." 11140 IF DDSTS.FLAGS% AND 1024% & THEN PRINT "Write privileges are never given out." 11200 ! & !for KB's only & ! 11210 IF TYPE$ <> "KB" & THEN GOTO 11300 11220 TTCHAR% = PEEK( DDB% + 28% ) 11230 IF TTCHAR% AND 32% & THEN PRINT "This keyboard is a scope terminal." & ELSE PRINT "This keyboard is not a scope terminal." 11300 ! & !this is only here as the target of a GOTO & ! 11900 ! & !return & ! 11990 RETURN 19000 ! & ! & ! Error Routine & ! & ! 19100 ! & !^C error & ! 19200 ! & !Expected errors (by line number) & ! 19210 IF ERL = 2060 THEN RESUME 2070 & !illegal number for unit 19600 ! & !Expected errors (by type) & ! 19900 ! & !Unexpected errors & ! 19910 Z$ = SYS(CHR$(6%)+CHR$(9%)+CHR$(ERR)) 19920 ERROR$ = RIGHT(Z$,3%) 19930 PRINT " ***** Whoops! *****" \ & PRINT " "; ERROR$; " at line";ERL 19990 GOTO 32767 32767 END e 2? 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 10 EXTEND 20 ! & ! PLB & ! & !A program to access the information in the Pack Label Block & ! 900 ! & !explain the program & ! 910 PRINT "This program prints the information in the Pack Label Block." \ & PRINT "See DISK.DOC for more details." 1000 ! & ! & ! MAIN PROGRAM & ! & ! & !get the disk number & ! 1010 PRINT "Disk"; \ & INPUT DISK$ 1020 IF LEFT(DISK$,2%) <> "DR" & THEN DISK$ = "DR" + DISK$ 1030 IF RIGHT(DISK$,LEN(DISK$)) <> ":" & THEN DISK$ = DISK$ + ":" 2000 ! & !open disk non-file structured & !field according to data & !and get DCN #1 & ! 2010 OPEN DISK$ AS FILE #1% 2020 FIELD #1%, 4% AS JUNK$, 2% AS DCN.MFD$, 1% AS VERSION$, & 1% AS LEVEL$, 2% AS CLUSTER.SIZE$, 2% AS STATUS.WORD$, & 4% AS LABEL$ 2030 GET #1%, BLOCK 1% 3000 ! & !print the info & ! 3030 DCN.MFD% = ASCII( LEFT(DCN.MFD$,1%) ) & + SWAP%( ASCII( RIGHT(DCN.MFD$,2%) ) ) 3040 PRINT "DCN of MFD is"; DCN.MFD% 3050 VERSION% = ASCII(VERSION$) \ & LEVEL% = ASCII(LEVEL$) \ & PRINT "Version: "; NUM1$(VERSION%);".";NUM1$(LEVEL%) 3060 PRINT "Pack cluster size is"; ASCII(CLUSTER.SIZE$) 3070 GOSUB 10000 !pack status word 3080 CHANGE LABEL$ TO LABEL% \ & LABEL$ = RAD$( LABEL%(1%) + SWAP%(LABEL%(2%)) ) & + RAD$( LABEL%(3%) + SWAP%(LABEL%(4%)) ) \ & PRINT "Pack Label: "; LABEL$ 9000 ! & !normal exit & ! 9010 GOTO 32767 10000 ! & ! & ! SUBROUTINE: Pack Status Word & ! & ! 10010 STATUS.WORD% = ASCII(RIGHT(STATUS.WORD$,2%)) & !the first byte of the status word is not used 10020 B% = ( STATUS.WORD% AND 2% ) / 2% \ & IF B% = 1% & THEN PRINT "New files listed first." & ELSE PRINT "New files listed last." 10030 B% = ( STATUS.WORD% AND 8% ) / 8% \ & IF B% = 1% & THEN PRINT "Date of last write." & ELSE PRINT "Date of last access." 10040 B% = ( STATUS.WORD% AND 16% ) / 16% \ & IF B% = 1% & THEN PRINT "Read only." 10050 B% = ( STATUS.WORD% AND 64% ) / 64% \ & IF B% = 1% & THEN PRINT "Pack is private." & ELSE PRINT "Pack is system." 10060 B% = ( STATUS.WORD% AND 128% ) / 128% \ & IF B% = 1% & THEN PRINT "Pack is mounted read/write." & ELSE PRINT "Pack is not mounted read/write." 10990 RETURN 32767 END E^ 2?10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! KBJOB & ! & !A program to find the job associated with a keyboard & ! 100 ! & !usual preliminaries & ! 110 GOSUB 1000 200 ! & !get addresses of necessary tables & ! 210 GOSUB 2000 300 ! & !input KB number & ! 310 INPUT "KB number"; KB% 320 KB$ = "KB" + NUM1$(KB%) + ":" 400 ! & !preset JOB% (which is job number times two) & ! 410 JOB% = 0% 500 ! & !next job number & ! 510 JOB% = JOB% + 2% 600 ! & !get JDB% and check for unused jobs and end of table & ! 610 JDB% = PEEK( JOBTBL% + JOB% ) 620 IF JDB% = -1% & THEN PRINT "No job is using "; KB$ \ & GOTO 32767 & !end of job table 630 IF JDB% = 0% & THEN GOTO 510 & !this job not being used 700 ! & !find the keyboard number for this job & !go to next job if not the right one & !print if the right one & ! 710 IOB% = PEEK(JDB%) 720 KB.DDB% = PEEK(IOB%) 730 UNIT% = SWAP%( PEEK( KB.DDB% + 2% ) ) AND 255% 740 IF UNIT% <> KB% THEN GOTO 500 750 PRINT KB$; " is being used by job number";JOB%/2% 760 GOTO 32767 800 ! & !go back for next job & ! 810 GOTO 500 1000 ! & ! & ! SUBROUTINE: preliminaries & ! & ! 1100 ! & !some constants & ! 1110 TRUE% = -1% \ & FALSE% = 0% 1120 BELL$ = CHR$(7%) 1200 ! & !dimension statements & ! 1210 DIM M%(30%) 1900 ! & !return & ! 1990 RETURN 2000 ! & ! & ! SUBROUTINE: get adresses from monitor tables & ! & ! 2100 ! & !monitor tables, part one & ! 2110 CHANGE SYS( CHR$(6%) + CHR$(-3%) ) TO M% 2120 JOBTBL% = M%(11%) + SWAP%( M%(12%) ) 2900 ! & !return & ! 2990 RETURN 32767 END "?[2? JOB DATA BLOCK (JDB) Offset Symbol Description 0 JDIOB address of IOB 2 JDFLG see below 4 JDIOST error code to be returned to program after the completion of current monitor call. It the JFIOST bit is set in JDFLAG, this is moved to FIRQB + 0 5 JDPOST if the JFPOST bit in JDFLAG is set, this byte specifies which information in job's work block (WRK) is to be posted to FIRQB or XRB. If JDPOST is positive, it is used as an index into a table of bit masks for posting to FIRQB. If JDPOST is negative, the low order 7 bits are used as a bit mask for posting to XRB. 6 JDWORK address of WRK for this job. 8 JDJDB2 address of JDB2. 10 JDFLG2 secondary job status flags. 11 JDSIZN size (in K) to make this job next time it is swapped in. 12 JDRTS address of runtime system descriptor block 14 JDRESQ current residency quantum. (If non-zero, job is not eligible for swapping. When first swapped into memory a job is given a residency quantum. Each time the job runs or does I/O the residency quantum is reduced proportionately. Terminal input wait sets the quantum to zero.) 16 JDMCTL memory control sub-block (see) 26 JDRESB bit mask to be posted to level three queue word (L3Q) when the job is made resident. 28 JDPRI priority 29 JDBRST run burst 30 JDSIZM private memory size maximum (255 = up to system job max) 31 JDSWAP if non-zero, contains the slot number within the swapping files that the job is swapped to. Zero if in memory JDFLG (in JDB) bit symbol description 0 JFPOST checked before making a job runable. If set, the info in JDPOST is used as mask for FIRQB or XRB. 1 JFIOKY if set when job is made runable, the jobs keyword is copied into location 400 (octal) of job's image and the contents of JDIOST are posted to FIRQB 2 JFRSX if set when job is made runable, RSX support (not the standard monitor routines) are used to post job info indicated by JFIOKY. 3 JFCC set when a ^C is typed at terminal. When job becomes runable, the pseudo-vector P.CC is taken unless JF2CC is also set 4 JF2CC set when a ^C is typed at terminal and at least one ^C has already been typed since the job was last run. When job becomes runable, the pseudo-vector P.2CC will be taken. 5 JFPPT if set when job is made runable, the floating point trap pseudo-vector P.FPP will be taken 6 JFGO if set when job is made runable the I/O redo condition specified by JFREDO is ignored. (set when user types ^C during an interuptable I/O operation) 7 JFREDO if set when job is made runable (and JFGO is not set) then the job is stalled waiting for an I/O completion and is not really runable. 8 JFSTST if set the job can use temporary privilege. 9 JFFPP is set the contents of the floating point hardware are saved and restored along with the job image. 10 JFPRIV set if the job is logged into a privileged account 11 JFSYS set if job is running with temporary privileges 12 JFNOPR set if running not logged in 13 JFBIG if set the job can exceed its private memory size (JDSIZM) 14 JFLOCK set if locked in memory 15 JFSPCL set if some special processing is required before running the job. The flag bits in JDFLG2 specify the special action JDFLG2 (in JDB) bit symbol description 0 JFCTXT set if job's context is to be saved The next five bits indicate which special action is to be taken if JFSPCL (in JDFLG) is set. If FJSPCL is set but no bits are set in JDFLG2, the current runtime system is entered at its P.STRT or P.CRAS entry point 1 JFPRTY memory parity error 2 JFRUN new program run entry request 3 JFSWPR runtime system or resident library load failure 4 JFSTAK stack overflow 5 JFSWPE swap error 6 JFKIL2 set when job is being killed and logout phase is complete. (removal of job control information should be done now) 7 JFKILL set if job is to be killed JDB2 offset symbol description 0 J2TICK incremented at each clock interrupt when job is executing. When job is descheduled this value is converted to 1/10 sec and added to J2CPU. (Amounts less than 1/10 left behind) 2 J2CPU low order 16 bits of CPU for job since last time J2TICK was posted. (in 1/10 sec) 4 J2CON total connect time in minutes for job 6 J2KCT low order 16 bits of KCT 8 J2DEV total device time in device-minutes 10 J2KCTM high order 8 bits of KCT 11 J2CPUM high orrder 8 bits of CPU time 12 J2NAME program name in RAD50 (two words) 16 J2DRTS address of runtime system descriptor block of the default RTS for this job 18 J2MPTR if job is a message receiver, this word contains the address of the receiver ID block. If not a receiver, it is zero 20 J2PPTR used as a pointer to a monitor buffer to be used to transfer information to or from a user program buffer. Normally used for large message send/receive buffer transfers. 22 J2PCNT number of bytes to transfer to or from buffer specified by J2PPTR 24 J2PPN job's PPN. (high byte is project, low is programmer) 26 J2UFDR device cluster number of first cluster on SY0: of the UFD specified in J2PPN. Undefined if not logged in. 28 J2WPTR if job is attached to a resident library, this word contains the address of the job's first window descriptor block. Otherwise zero. 30 J2CPUI CUP time used by this job as of last ^T MEMORY CONTROL SUB-BLOCKS The MCB's are parts of other structures, for example the JDB. offset symbol description 0 M.PPRV pointer to the previous memory control list at offset M.PNXT 2 M.PNXT pointer to next MCB in the memory control list 4 M.TSIZ number of K-words mapped by this MCB. (includes the amount of memory used by the MCB itself) 6 M.SIZE number of K-words used by the structure containing this MCB. (M.TSIZ - M.SIZE is the number of K-words usable) 7 M.CTRL memory status information about the portion of memory mapped by this MCB 8 M.PHYA physical starting address of the piece of memory mapped by this MCB divided by 64 M.CTRL bit symbol description 8 REQ residency is requested but the MCB is not linked into RESLST because it is currently being swapped out. 9 OUT Entry should be removed from memory or is currently removed from memory 10 IN Entry should be brought into memory. 11-13 unused 14 SWP A swap is desired. (OUT and IN determine direction) 15 LCK the memory segment described by M.SIZE is not available for allocation for other uses or swapping out. Some typical combinations are: LCK,SWP,OUT The entry is resident but should be swapped out LCK,OUT The entry is in the process of swapping out LCK,SWP,IN The entry has been allocated memory and should be swapped in now. LCK,IN The entry is in the process of swapping in. LCK The entry is not available for swapping out. OUT The entry is not currently in memory and does not desire to be made resident. IOB (I/O block) Has one entry for each of the sixteen possible channels. BASIC-PLUS only allows 12 because zero is reserved for KB and 13-15 are used internally. Each entry points to a Device Data Block (non-disk devices), a Window Control Block for files on a large-file system or the Small file Control Block for disk files on small-file systems. 8[2? LOGICAL DEVICE TABLES The tables DEVNAM, DEVCNT and DEVPTR are ordered so that once an entry is found in one table the associated information in the other tables will be found at the same offset. DEVNAM Contains the names (in ASCII) of the types of devices. Disk devices begin at address DEVNAM. SY: is located at DEVNAM - 2. The keyboards start at address DEVNAM + DEVOKB. They are followed by all other devices. Synonyms (such as TT: for KB:) begin at address DEVSYN. (Note that DEVOKB is an offset but DEVSYN is an address.) offset address description -2 ASCII value for SY 0-?? DEVNAM names of all disks in the order: DC, ... DEVOKB "KB" ?? "NL" ?? all remaining device names ?? DEVSYN synonyms: TT = KB, CR = CD, MT = MM, MT = MS, DX = DY ?? -1 for end of table DEVCNT DEVCNT has one entry for each entry in DEVNAM except the final -1. Each contains the maximum unit number for each device. An entry of -1 indicates that device is not configured. For synonyms, the entry is not the maximum unit number but the address of the entry in DEVNAM for that device. For example, the entry in DEVCNT at an offset the same as the offset of "TT" in DEVNAM is the address of the entry in DEVNAM for "KB". (The entry is the actual address, not the offset in the table DEVNAM.) DEVPTR This has pointers to one of two other tables. For disk devices the pointer is to the disk unit status table UNTCNT. For non-disk devices the pointer is to the device retrieval table DEVTBL. In both cases, the pointer is to entry for unit zero. If there are other units, they follow immeditately. DEVTBL Device Retrieval Table Has pointers to the DDB for each non-disk device. The entry for device number zero can be found in DEVPTR. Entries for other units are stored in sequential memory locations. UNTCNT Status Table and Open file Count Has entries for each disk device. The entry for device number zero can be found in DEVPTR. Entries for other units are stored in sequential memory locations. bits meaning 0-8 count of open files on disk 9 link-to-top 10 read only 11 date of last write 12 non-file-stuctured 13 locked 14 private Locating DDB's for non-disk devices (1) read through DEVNAM until you find the correct device type. You can start at an offset of DEVOKB. If the name is not a synonym (like TT, a synonym for KB), you can stop at DEVSYN - 2. The name is stored in ASCII, so CVT%$(SWAP%(PEEK(DEVNAM%+OFFSET%))) will give you the name of the type of device. (2) to find out how many units there are, look at DEVCNT for the same offset. PEEK(DEVCNT%+OFFSET%) is the largest possible unit number for device of found by PEEK(DEVNAM%+OFFSET%). Since devices are numbered starting at 0, this is not the same as the number of devices. If the value in the DEVCNT table is 0, it means there is one device. A value of -1 indicates no such devices. (Note: if you are sure that the unit number you are looking for does exist, there is no reason for finding out how many there are.) (3) For non-disk devices, PEEK(DEVPTR%+OFFSET%), for the same offset as in both steps one and two, will give you a pointer to the correct entry in DEVTBL% for that device. DEVTBL% has an entry for each device; the other tables have an entry for each device type. The pointer is for unit zero. The information for other units are stored in successive words. For example, suppose that DR is the fourth device type. The entry in DEVTBL% for DR3 is at location PEEK(DEVPTR%+4%) + 6%. The entry is DEVTBL% is a pointer for the Device Data Block for that device. (See DDB.DOC) Locating UNTCNT for disk devices (1) read through DEVNAM until you find the correct device type starting at address DEVNAM. If the name is not a synonym (like TT, a synonym for KB), you can stop at offset (not address) DEVOKB - 2. The name is stored in ASCII, so CVT%$(SWAP%(PEEK(DEVNAM%+OFFSET%))) will give you the name of the type of device. (2) see step two above. DEVCNT is the same for all devices. (3) For disk devices, PEEK(DEVPTR%+OFFSET%), for the same offset as in both steps one and two, will give you a pointer to the correct entry in UNTCNT for that device. UNTCNT has an entry for each device; the other tables have an entry for each device type. The pointer is for unit zero. The information for other units are stored in successive words. For example, suppose that DR is the fourth device type. The entry in UNTCNT for DR3 is at location PEEK(DEVPTR%+4%) + 6%. The entry in UNTCNT contains the number of files open on the system and some flags (see above). Consider a system that has five disks (DR0:, DR1:, DR2:, DM0: and DM1:), four keyboards (KB0: through KB3:), two tape drives (MT0: and MT1:) and two line printers (LP0: and LP1:). The tables DEVNAM, DEVCNT, DEVPTR, DEVTBL and UNTCNT would look like below. For DEVNAM and DEVCNT the values in the table are given. For DEVPTR, pointers are given in pictorial form. For DEVTBL an entry of the form ^ DVn: means that the pointer to the DDB for device DVn: is located there. For UNTCNT an entry of the form DVn: means that the data for DVn: is located there. DEVNAM DEVCNT DEVPTR UNTCNT DR 2 *-----------------------------------> DR0: DM 1 *------------------------------- DR1: KB 3 *------------ \ DR2: MT 1 *--------- \ DEVTBL ---> DM0: LP 1 *---- \ \ DM1: \ \ ----> ^ KB0: \ \ ^ KB1: \ \ ^ KB2: \ \ ^ KB3: \ ----> ^ MT0: \ ^ MT1: --------> ^ LP0: ^ LP1: For more information on disk devices, see DISK.DOC. [2? DEVICE DATA BLOCKS (DDB) (See also KB DDB below) offset symbol description 0 DDIDX driver index. Unique for each device type 1 DDSTS bits describing charasteristics of device 2 DDJBNO job number times two of job that has this device assigned 3 DDUNT unit number 4 DDTIME system time at which device was assigned 6 DDCNT ownership count for this device unit. (incremented each time opened and decremented each time closed) 7 device flags 8 DDFLAG device specific flag bits. Not used by monitor For PK's, this is KB number 10 DDBUFC (three words) BCB (Buffer Chain Block) The first word is the pointer to where bytes are to be removed from the small buffer chain The second word is the pointer to where bytes are to be inserted into the small buffer chain The third word is the number of small buffers remaining in the allocation for this device. When it reaches zero, the program may be stalled for small buffer wait 16 DDHORZ current horizontal position of "print head". Zero is the right hand margin. DDHORC is left hand margin 17 DDHORC device's line width plus one DDSTS Device Characteristics Flags bit symbol description 8 DDPRVO ownership requires privlege 9 DDRLO read priveges are never given for this device 10 DDWLO write privileges are never given for this device 11 DDNET device exists elsewhere in a DECNET network 12 unused 13 DDAUX device can use KMC11 bridge blocks 14 DDAUXA device is currently bridged to a KMC11 15 DDSTAT not used by monitor. Cleared each time the device is closed. Can be used by the driver DDCNT Device flags bit symbol description 8-12 unused 13 DDCONS device is owner's console terminal 14 DDUTIL temporarily assigned to FIP 15 DDASN explicitly assigned by job in DDJBNO Keyboard DDB's offset symbol description 0 DDIDX driver index 1 DDSTS status and access control byte (See general DDB) 2-5 see general DDB 6 DDCNT init count and assignment control (See general DDB) 8 DDFLAG device specific flags (See below) 10 DDBUFC BCB (Buffer Chain Block) for output. See DDB offset 10 16-17 see general DDB 18 TTINPT BCB (Buffer Chain Block) for input. See DDB offset 10 24 TTMODE mode (See below) 26 TTDLMC delimiter counter 27 TTPDLM terminal's private delimiter 28 TTCHAR terminal's characteristics (See below) 30 TTINTF terminal's interface flag (See below) 32 BCB (Buffer Chain Block) for type ahead. See DDB offset 10. 38 echo control field size and mode bits 1-6 are field size and bit 7 is mode (0 = keypunch) 39 paint character and field active flag bits 8-14 are paint character and bit 15 indicates the field is active Bits in DDFLAG bit name description 0 TTLFRC on after Force/Broadcast; off on ^C 1 TTNBIN output next in binary mode 2 TTRSX1 Current RSX mode low order bit 3 TTDDT DDT sub-mode 4 TAPE tape mode 5 NOECHO not echoing 6 LCLCPY local copy 7 TT2741 2741 type terminal 8 TTRSX2 current RSX mode high order bit 9 TTHUNG terminal "hang" pending 10 TTDFIL delay fill to next character 11 TTMSG processing incoming message 12 RUBOUT processing rubouts 13 TTSXOF send XOFF as soon as possible 14 TTXOFF an XOFF was sent 15 TTSTOP output temporarily stopped Bits in TTMODE bit name description 0 TTBIN binary input mode 1 TTTECO teco mode 2 TTCRLF no auto cr/lf mode 3 TTECTL echo control mode 4 TTGARD guarded terminal mode 5 TTPCOL check incoming XON/XOFF 6 TTFMS FMS mode 7 TTTECS TECO scope mode 8 TTESEQ Escape sequence mode 9-15 reserved Bits in TTCHAR bit name description 0 TTGAG do not broadcast/force to terminal 1 TTBRK do not equate "break" with ^C 2 TTXANY do XON on any character 3 TTFUNC disable special function characters 4 TTESC terminal has real escape 5 TTSCOP scope type terminal 6 TTESCI allow incoming escape sequences 7 TTLCOU allow lower case output 8 TTPODD desired parity is odd 9 TTPRTY check and send with parity 10 TTUPAR prefix controls with uparrow 11 TTSYNC stop output if XOFF received 12 TTXON sending XOFF will stop input 13 TTFORM hordware form feed/vertical tab exist 14 TTTAB hardware horizontal tab exists 15 TTLCIN allow lower case input Values in TTINTF bit meaning 0-7 INTFAC Interface type code (INTFAC) 0 KL11 2 DC11 4 DL11 6 DE11 8 PK11 10 DJ11 12 DH11 14 DZ11 8-11 TTSUBL sub-line number 12 TTRDRN reader run control 13 TTHPRT hardware parity 14 TTMODM modem control 15 TTMUX multiplexor S*}[2? MEMORY TABLES DEVICE related tables (see DEVICE.DOC) DEVNAM Table of device names. DEVCNT Table of maximum unit numbers for each device. This table is ordered by device names. DEVPTR Table of pointers ordered by device names. For disks, it points to the location in UNTCNT where the entries the devices with this name start. For non-disks, it points to the location in DEVTBL where the entries the devices with this name start. DEVOKB Number of disk devices times 2 in DEVNAM. This makes it the offset of the first keyboard. Note that DEVOKB is an offset, but DEVSYN is a location. DEVSYN Location of the first synonym in DEVNAM. DEVSYN - 2 is the location of the last device. Note that DEVSYN is a location but DEVOKB is an offset DISK related tables. See DISK.DOC UNTOWN Table of unit owners (low byte) and options (high byte) FCBLST Table of roots of list of file control blocks for each unit. UNTCNT Table of status bytes and number of open files for disks. UNTCLU Table of unit cluster sizes (low byte) and error counts (high byte) for disks. SATCTL Table of least significant 16 bits of free block counts for each disk. SATCTM Table of least significant 16 bits of free block counts for each disk. SATEND Table of disk sizes. UNTLVL Table of disk structure level numbers. OTHERS LOGNAM Table of system logical names. See LOGICA.BAS MEMLST List of first Memory Control Subblocks. JSBTBL Table of job status bits ordered by driver index. JOBTBL Job table JBSTAT Job status table (see JB.DOC) JBWAIT Job wait table (see JB.DOC) FREES Table of free (small and large) buffer information. Offset -2: number of free general buffers Offset +2: number of free FIP buffers CSRTBL The CSR table of physical devices. RTSLST List of Run-time system descriptor blocks. (See RST.DOC) ERLCTL Error logging control data. SNDLST List of eligible message receiving jobs {D[2? Several tables contain information about disks. Each of them is arranged in the same order as is UNTCNT. For information on how to find the entry in UNTCNT which corresponds to a given disk, see DEVICE.DOC. The same offset will apply to each of the other tables. For example, if DR1: is the second entry in UNTCNT, then the second entry in UNTCLU is also for DR1:. UNTCNT Table of status bytes and number of open files for disks. Bit meaning 0-8 count of open files on disk 9 link-to-top 10 read only 11 date of last write 12 non-file-structured 13 locked 14 private UNTCLU Table of unit cluster sizes (low byte) and error counts (high byte) for disks. UNTOWN Table of unit owners (low byte) and options (high byte) Bit meaning 1 swap file (odd owner job) 7 dirty 8 INI ? 10 DP ? FCBLST Table of roots for a linked list of file control blocks for files which are open on this device. SATCTL Table of least significant 16 bits of free block counts SATCTM Table of most significant 16 bits of free block counts SATEND Table of disk sizes. The value in SATEND is in clusters, so the cluster size is needed from UNTCLU. The disk size is ( value in SATEND + 2 ) * ( cluster size ) UNTLVL Table of disk structure level numbers. (high byte.low byte) _M?T 2?10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! LOGMSG & ! & !A program to append a given login message to the login & !messages of a given project. If there is no login message, it & !will create one. If there is one, it will place the given & !message at the top of the file. Because the message may be & !restricted to Elves, the program can be restricted to a range & !of programmer numbers within the project. & ! The program will work by creating and chaining to a & !command file for PIP. & ! 100 ! & !error routine & ! 110 ON ERROR GOTO 19000 200 ! & !^C trap & ! 210 Z$ = SYS(CHR$(6%)+CHR$(-7%)) 300 ! & !constants & ! 310 TRUE% = -1% \ & FALSE% = 0% 320 BELL$ = CHR$(7%) 900 ! & !explain the program & ! 910 PRINT \ & PRINT "This program places login messages (LOGIN.MSG) in entire projects or in a range" \ & PRINT "of accounts within a project. If there is no login mesage, one will be created." \ & PRINT "If there is a login message already present, this program will place its" \ & PRINT "message before the existing text. The message to be created/added is in a" \ & PRINT "seperate file." \ & PRINT 1000 ! & ! & ! MAIN PROGRAM & ! & ! & !name of file in which message is contained & ! 1010 PRINT "File which contains the login message "; \ & INPUTLINE MSGFILE$ \ & MSGFILE$ = CVT$$(MSGFILE$,-1%) 1020 IF MSGFILE$ = "" THEN MSGFILE$ = "LOGIN.MSG" 1030 OPEN MSGFILE$ FOR INPUT AS FILE #1% 1040 IF FILE.NOT.FOUND% & THEN PRINT BELL$;"No such file." \ & FILE.NOT.FOUND% = FALSE% \ & GOTO 1010 & !error routine sets the variable 2000 ! & !project number & ! 2010 INPUT "Number of project in which to place messages <1>";PROJ% 2020 IF PROJ% = 0% THEN PROJ% = 1% 3000 ! & !range of accounts & ! 3010 PRINT "Use a hyphen to seperate the two numbers." \ & PRINT "Range of accounts <0-254>"; \ & INPUTLINE RANGE$ \ & RANGE$ = CVT$$(RANGE$,-1%) 3020 IF RANGE$ = "" & THEN FIRST% = 0% \ & LAST% = 254% \ & GOTO 4000 3030 HYPHEN% = INSTR(1%,RANGE$,"-") 3040 IF HYPHEN% = 0% & THEN HYPHEN% = INSTR(1%,RANGE$,",") 3050 IF HYPHEN% = 0% & THEN PRINT BELL$;"Range should be two numbers seperated by a hyphen" \ & GOTO 3010 3060 IF HYPHEN% = 0% & THEN FIRST% = 1% \ & LAST% = VAL(RANGE$) \ & GOTO 4000 & !error routine handles invalid numbers 3070 FIRST% = VAL( LEFT(RANGE$,HYPHEN%-1%) ) \ & LAST% = VAL( RIGHT(RANGE$,HYPHEN%+1%) ) & !error routine handles invalid numbers 4000 ! & !open up command file & !print beginning commands & ! 4010 OPEN "LOGMSG.CMD" FOR OUTPUT AS FILE #2% 4020 PRINT #2%, "RUN $PIP" 5000 ! & !print commands for each account to command file & ! 5010 FOR PROG% = FIRST% TO LAST% 5020 GOSUB 10000 5030 NEXT PROG% 5040 IF ACCTS.FOUND% = 0% & THEN PRINT BELL$;"No accounts found within given range." \ & CLOSE #1%, #2% \ & KILL "LOGMSG.CMD" \ & GOTO 32767 6000 ! & !end the file and close it & ! 6010 PRINT #2%, "^Z" 6020 PRINT #2%, "UNSAVE LOGMSG.CMD" 6030 CLOSE #2% 7000 ! & !chain to AT with this file for the command file & ! 7010 Z$ = SYS( CHR$(14%) + "AT LOGMSG" ) 9000 ! & !normal exit & ! 9990 GOTO 32767 10000 ! & ! & ! SUBROUTINE: Print the command for one account & ! & ! & !does the account exist? & ! 10010 Z$ = SYS( CHR$(6%) + CHR$(14%) + STRING$(4%,0%) + CHR$(PROG%) & + CHR$(PROJ%) + CHR$(1%+0%) ) 10020 IF ACCOUNT.NOT.FOUND% & THEN ACCOUNT.NOT.FOUND% = FALSE% \ & RETURN & !error routine sets variable 10100 ! & !see if LOGIN.MSG is already there and branch accordingly & ! 10110 PPN$ = "[" + NUM1$(PROJ%) + "," + NUM1$(PROG%) + "]" \ & OPEN PPN$ + "LOGIN.MSG" FOR INPUT AS FILE #1% 10120 IF FILE.NOT.FOUND% & THEN FILE.NOT.FOUND% = FALSE% \ & GOTO 10300 10200 ! & !account was there & ! 10210 ACCTS.FOUND% = 1% & !I don't really care how many are found, only whether any are & !found at all 10220 PRINT #2%, PPN$ + "LOGIN.MSG = " + MSGFILE$ + "," + PPN$ + "LOGIN.MSG" 10230 RETURN 10300 ! & !account was not there & ! 10310 PRINT #2%, PPN$ + "LOGIN.MSG = " + MSGFILE$ 10320 RETURN 10900 ! & !return & ! 10990 RETURN 19000 ! & ! & ! Error Routine & ! & ! 19100 ! & !^C error & ! 19110 IF ERR = 28 & THEN PRINT "Program aborted." \ & GOTO 32767 & !^C error 19200 ! & !Expected errors (by line number) & ! 19210 IF ERL = 1030 & THEN FILE.NOT.FOUND% = TRUE% \ & RESUME 1040 & !message file not found 19220 IF ERL = 3040 & OR ERL = 3050 & THEN PRINT BELL$;"Illegal number." \ & RESUME 3000 19230 IF ERL = 10010 & THEN ACCOUNT.NOT.FOUND% = TRUE% \ & RESUME 10020 & !no such account number 19240 IF ERL = 10110 & THEN FILE.NOT.FOUND% = TRUE% \ & RESUME 10120 & !no such file (LOGIN.MSG in individual account) 19600 ! & !Expected errors (by type) & 19900 ! & !Unexpected errors & ! 19910 Z$ = SYS(CHR$(6%)+CHR$(9%)+CHR$(ERR)) 19920 ERROR$ = RIGHT(Z$,3%) 19930 PRINT " ***** Whoops! *****" \ & PRINT " "; ERROR$; " at line";ERL 19990 GOTO 32767 32767 END xeɻ 2? 10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! PIP2KB & ! & !A program to copy files to the keyboard. It is much like PIP & !except that it has many fewer options. The one thing it will & !do that PIP doesn't is print only parts of a file. It is & !designed for files which have lines which are more than 80 & !columns wide. It will display only a certain range of columns & !The default range is 1-78 (to avoid the margin bell). & ! & !CCL syntax is PIP2KB filename;firstcolumn-lastcolumn & ! 80 Z$ = SYS(CHR$(6%)+CHR$(-7%)) !^C trap 90 ON ERROR GOTO 9000 100 ! & !preliminaries & ! 110 GOSUB 1000 200 ! & !if no file name is given, ask for one & ! 210 IF FILE$ <> "" THEN 300 220 PRINT "File name"; \ & INPUTLINE FILE$ \ & FILE$ = CVT$$(FILE$,-1%) 230 IF FILE$ = "" THEN GOTO 900 !quit if no file given 300 ! & !find out if file is there and we can access & ! 310 GOSUB 3000 320 IF ERROR% <> 0% THEN GOTO 900 !quit if can't open 400 ! & !if not specified get column range & ! 410 GOSUB 2000 500 ! & !do it & ! 510 GOSUB 4000 !copy 520 GOTO 900 800 ! & !^C exit & ! 810 PRINT BELL$;"Program aborted by ^C." 900 ! & !normal exit & ! 910 CLOSE #1% 990 GOTO 32767 1000 ! & ! & ! SUBROUTINE: preliminaries & ! & ! 1100 ! & !some constants & ! 1110 TRUE% = -1% \ & FALSE% = 0% 1120 BELL$ = CHR$(7%) 1900 ! & !return & ! 1990 RETURN 2000 ! & ! & ! SUBROUTINE: Find columns to print & ! & ! 2100 ! & !ask & ! 2110 IF COLS$ <> "" THEN GOTO 2200 2120 PRINT "Columns to print <1-78>"; \ & INPUTLINE COLS$ \ & COLS$ = CVT$$(COLS$,-1%) !no spaces 2130 IF COLS$ = "" THEN COLS$ = "1-78" 2200 ! & !parse column range & ! 2210 HYPHEN% = INSTR(1%,COLS$,"-") 2220 IF HYPHEN% = 0% & THEN LCOL% = 1% \ & RCOL% = VAL(COLS$) 2230 IF HYPHEN% <> 0% & THEN LCOL% = VAL( LEFT(COLS$,HYPHEN%-1%) ) \ & RCOL% = VAL( RIGHT(COLS$,HYPHEN%+1%) ) 2300 ! & !ask again if it doesn't make sense & ! 2240 IF LCOL% > RCOL% & THEN PRINT BELL$;"Right column must be larger than left column." \ & COLS$ = "" \ & GOTO 2100 2300 ! & !skip by error routines & ! 2310 GOTO 2900 2400 ! & !illegal number for column & ! 2410 PRINT BELL$;"Please input two numbers seperated by a hyphen." 2420 COLS$ = "" 2430 GOTO 2100 2900 ! & !return & ! 2990 RETURN 3000 ! & ! & ! SUBROUTINE: open the file & ! & ! 3100 ! & !open it & ! 3110 OPEN FILE$ FOR INPUT AS FILE #1% 3120 RETURN 3200 ! & !file not found & ! 3210 ERROR% = 1% 3220 PRINT BELL$;"Can't find "; FILE$ 3230 RETURN 3300 ! & !protection violation & ! 3310 ERROR% = 2% 3320 PRINT BELL$;"I don't have access to ";FILE$ 3330 RETURN 3900 ! & !return & ! 3990 RETURN 4000 ! & ! & ! SUBROUTINE: copy the file & ! & ! 4100 ! & !print heading & ! 4110 PRINT " ***** file begins *****" 4200 ! & !input a line & ! 4210 INPUTLINE #1%, IN$ \ & IN$ = CVT$$(IN$,4%) 4300 ! & !adjust for tabs & ! 4310 I% = INSTR(1%,IN$,CHR$(9%)) 4320 IF I% = 0% THEN GOTO 4400 4330 R% = (I% - 1%) - (I% - 1%) / 8% * 8% 4340 SP% = 8% - R% & ! The character after a tab should be in positions 9, 17, 25, & ! 33, etc. They are all one more than a multiple of 8. The & ! part of the string before the tab must be expanded with & ! with spaces so that it is the next multiple of eight. & ! R% = (I% - 1%) - (I% - 1%) / 8% * 8% is how far past a & ! multiple of eight this string is. The number of spaces to & ! is then 8% - R%. & ! 4350 IN$ = LEFT(IN$,I%-1%) + SPACE$(SP%) + RIGHT(IN$,I%+1%) 4360 GOTO 4310 4400 ! & !select range & ! 4410 IN$ = MID(IN$,LCOL%,RCOL%-LCOL%+1%) 4500 ! & !print it & ! 4510 PRINT IN$ 4600 ! & !go back for another line & ! 4610 GOTO 4200 4900 ! & !return & ! 4910 CLOSE #1% 4920 PRINT " ***** end of file *****" 4990 RETURN 5000 ! & ! & ! SUBROUTINE: & ! & ! 5900 ! & !return & ! 5990 RETURN 6000 ! & ! & ! SUBROUTINE: & ! & ! 6900 ! & !return & ! 6990 RETURN 7000 ! & ! & ! SUBROUTINE: & ! & ! 7900 ! & !return & ! 7990 RETURN 8000 ! & ! & ! FUNCTIONS & ! & ! 8100 ! & !& ! 8200 ! & !& ! 8300 ! & !& ! 8400 ! & !& ! 8500 ! & !& ! 8990 RETURN 9000 ! & ! & ! Error Routine & ! & ! 9100 ! & !^C error & ! 9110 IF ERR = 28 THEN RESUME 800 9200 ! & !Expected errors (by line number) & ! 9210 IF ERL = 2220 & OR ERL = 2230 & THEN RESUME 2400 & !illegal number for column 9220 IF ERL = 4210 THEN RESUME 4900 & !end-of-file on input 9600 ! & !Expected errors (by type) & ! 9610 IF ERR = 5 THEN RESUME 3200 & !can't find file 9620 IF ERR = 10 THEN RESUME 3300 & !protection violation 9900 ! & !Unexpected errors & ! 9910 Z$ = SYS(CHR$(6%)+CHR$(9%)+CHR$(ERR)) 9920 ERROR$ = RIGHT(Z$,3%) 9930 PRINT " ***** Whoops! *****" \ & PRINT " "; ERROR$; " at line";ERL 9990 GOTO 32767 30000 ! & ! & ! CCL entry & ! & ! 30100 ! & !check for correct entry & ! 30110 ARG$ = SYS(CHR$(7%)) 30111 IF LEFT(ARG$,1%) = "Q" & THEN ARG$ = "PIP2KB" + RIGHT(ARG$,2%) !* D 30120 IF LEFT(ARG$,6%) <> "PIP2KB" & THEN PRINT 'Incorrect CCL. Use "PIP2KB".' \ & GOTO 32767 30200 ! & !pull off argument & ! 30210 ARG$ = RIGHT(ARG$,7%) \ & ARG$ = CVT$$(ARG$,-1%) 30300 ! & !seperate file name and column specification & ! 30310 SEMI% = INSTR(1%,ARG$,";") 30320 IF SEMI% = 0% & THEN FILE$ = ARG$ \ & COLS$ = "" 30330 IF SEMI% <> 0% & THEN FILE$ = LEFT(ARG$,SEMI%-1%) \ & COLS$ = RIGHT(ARG$,SEMI%+1%) 30400 ! & !branch to beginning & ! 30410 GOTO 80 32767 END ""` 2?10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! ERROR & ! & !A program to print error messages and error numbers. & !If the argument is a number, the program will print the error & !message. If the argument is not a number, it will print any & !error messages which have the indicated text. Since it does & !INSTR, it is not necessary to get the text exactly correct. & !If there is a comma in the text, then the program will regard & !it as a list of things to be matched. For example: & !ERROR DEVICE will cause several messages to be printed (?Bad & !directory for device, ?Account or device in use, and several & !others. However, ERROR DEVICE,ROOM would print only the & !error message "?No room for user on device." & ! 90 ON ERROR GOTO 9000 100 ! & !preliminaries & ! 200 ! & !get argument if necessary & ! 210 IF ARG$ = "" & THEN PRINT "Error number or message to match"; \ & INPUTLINE ARG$ \ & ARG$ = CVT$$(ARG$,4%+32%) 220 IF ARG$ = "" & THEN GOTO 32767 300 ! & !See if argument is a number & ! 310 ERROR% = VAL(ARG$) & !if error, resume at 500 400 ! & !No error, therefore a number & ! 410 Z$ = SYS( CHR$(6%) + CHR$(9%) + CHR$(ERROR%) ) 420 ERROR$ = RIGHT(Z$,3%) 430 PRINT 440 PRINT NUM1$(ERROR%);": ";ERROR$ 450 GOTO 32767 500 ! & !Error, so not a number & ! 510 GOSUB 2000 520 IF ARG$ = "" & THEN GOTO 200 & !if message couldn't be found the first time, let & !them try again 900 ! & !done & ! 990 GOTO 32767 1000 ! & ! & ! SUBROUTINE: preliminaries & ! & ! 1100 ! & !some constants & ! 1110 TRUE% = -1% \ & FALSE% = 0% 1120 BELL$ = CHR$(7%) 1990 RETURN 2000 ! & ! & ! SUBROUTINE: find and print matching error messages & ! & ! 2100 ! & !expand argument into list if needed & ! 2110 DIM MATCH$(20%) !this should be big enough 2120 M% = 0% 2130 COMMA% = INSTR(1%,ARG$,",") 2140 IF COMMA% = 0% & THEN M% = M% + 1% \ & MATCH$(M%) = ARG$ \ & NMATCH% = M% \ & GOTO 2200 2150 M% = M% + 1% 2160 MATCH$(M%) = LEFT(ARG$,COMMA%-1%) \ & ARG$ = RIGHT(ARG$,COMMA%+1%) 2170 GOTO 2130 2200 ! & !loop through error messages & ! 2210 FOR MSG% = 1% TO 255% 2220 ERROR$ = SYS( CHR$(6%) + CHR$(9%) + CHR$(MSG%) ) \ & ERROR$ = RIGHT(ERROR$,3%) \ & CERROR$ = CVT$$(ERROR$,32%) 2230 FOR M% = 1% TO NMATCH% 2240 IF INSTR(1%,CERROR$,MATCH$(M%)) = 0% THEN 2280 2250 NEXT M% 2260 PRINT NUM1$(MSG%);": ";ERROR$ 2270 FOUND% = 1% 2280 NEXT MSG% 2300 ! & !if none were found, say so & ! 2310 IF FOUND% = 0% & THEN PRINT BELL$;"There is no error message matching that description." \ & ARG$ = "" 2990 RETURN 9000 ! & ! & ! Error Routine & ! & ! 9200 ! & !Expected errors (by line number) & ! 9210 IF ERL = 310 THEN RESUME 500 !illegal number 9600 ! & !Expected errors (with no specific line number) & ! 9900 ! & !Unexpected errors & ! 9910 Z$ = SYS(CHR$(6%)+CHR$(9%)+CHR$(ERR)) 9920 ERROR$ = RIGHT(Z$,3%) 9930 PRINT " ***** Whoops! *****" \ & PRINT " "; ERROR$; " at line";ERL 9990 GOTO 32767 30000 ! & ! & ! CCL entry point & ! & ! 30100 ! & !is this the right program & ! 30110 ARG$ = SYS( CHR$(7%) ) 30120 IF LEFT(ARG$,5%) <> "ERROR" & THEN GOTO 32767 30200 ! & !get the argument & ! 30210 ARG$ = RIGHT(ARG$,6%) 30220 ARG$ = CVT$$(ARG$,2%+4%+32%) 30300 ! & !begin at begining & ! 30310 GOTO 10 32767 END pp߻ 2?10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! RAD50 & ! & !A program to demonstrate a function to convert a string to & !RAD50. The built-in function RAD$ will convert from RAD50. & !The file name string scan function can be used to convert to & !RAD50, but can't convert strings which have periods in them. & ! 21 ! & ! Pedantic lecture: & ! & ! "Radix" is a mathematic term for "base", as in "base 2" & !( = binary) or "base 8" ( = octal). There are 40(decimal) & !characters in RAD50. Each one is considered as a "digit" in & !base 40(decimal). A group of three characters is regarded as & !a three digit number in base 40 and converted to decimal. The & !decimal valuee is the RAD50 value of the string. Note that the& !largest possible number which need be stored is 40 ^ 3 - 1 = & !63999. 41 characters would require numbers as large as 68920, & !too big for 16 bits. Numbers larger than 63999 do not & !correspond to any string. & ! The point of this discussion is that the correct & !pronunciation of RAD50 is "radix fourty" or "radix five zero", & !not "radix fifty". Note that 50(octal) = 40(decimal) & ! 100 ! & !Get a string & ! 110 PRINT "String to convert (<= 3 characters)"; \ & INPUTLINE S$ \ & S$ = CVT$$(S$,4%) 120 IF S$ = "" THEN GOTO 900 130 S$ = LEFT(S$+" ",3%) 200 ! & !Print converted form and convert back & ! 210 PRINT FNRAD50%(S$), RAD$(FNRAD50%(S$)) 300 ! & !go back & ! 310 GOTO 100 900 ! & !done & ! 990 GOTO 32767 8000 ! & ! & ! FUNCTIONS & ! & ! 8100 ! & !convert three character string to RAD50 & !illegal characters are changed to blanks and a flag is set & ! 8110 DEF FNRAD50%(S$) 8115 T% = 0% 8120 FOR I% = 1% TO 3% 8125 S% = ASCII(LEFT(S$,1%)) \ & S$ = RIGHT(S$,2%) 8130 IF 65% <= S% AND S% <= 90% & THEN S% = S% - 64% \ & GOTO 8175 8135 IF 48% <= S% AND S% <= 57% & THEN S% = S% - 18% \ & GOTO 8175 8140 IF S% = 32% & THEN S% = 0% \ & GOTO 8175 8145 IF S% = 36% & THEN S% = 27% \ & GOTO 8175 8150 IF S% = 46% & THEN S% = 28% \ & GOTO 8175 8155 IF S% = 63% & THEN S% = 29% \ & GOTO 8175 8170 ILLEGALCHARACTER% = -1% \ & FNRAD50% = 0% \ & GOTO 8190 8175 T% = T% * 40% + S% 8180 NEXT I% 8185 FNRAD50% = T% 8190 FNEND 32767 END * 2? 2 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & ! This software is furnished under no license and may be used & ! and copied in accordance with the nonexistent terms of such & ! license and with or without the inclusion of the above & ! copyright notice. This software or any other copies thereof & ! may be provided or otherwise made available to any other & ! person. & ! & ! The information in this software is subject to change without & ! notice and should not be construed as a commitment by & ! Whittier College or the author. This software is & ! unconditionally guaranteed to perform without error the & ! purpose for which it is intended. Said purpose is to remain & ! the secret of the author and is subject to change without & ! notice and at the whim of the author. & ! & ! Whittier College assumes no responsibility for the use or & ! reliability of its software on equipment that is not supplied & ! by Whittier College. Whittier College supplies no equipment. & ! & ! This program was written for internal use and has not been & ! been significantly modified for export. You may need to make & ! changes to fit your system or needs. If you have any problems & ! please contact: & ! & ! David Rosales & ! Whittier College, Computer Center & ! Whittier CA 90601 & ! (213) 693-0771 ext 287 & ! & 10 EXTEND & 30 ! & ! WORDS & ! & ! The Whittier College Word Counter. & ! & ! & 35 ! & ! EDIT DATE CHANGES MADE & ! & ! AUG/19/1983 Finished writing this program. & ! Changed by: Erasmo David Rosales. & ! & ! & ! ???/?/19?? ????? ????? ????? ????? ????? ????? ????? & ! Changed by: ?????? ????? ???????. & ! & 100 !************************************************************** & ! & ! Initialize ^C TRAP, ERROR routine and CONSTANTS. & ! & 110 CLEAR$ = CHR$(155%) + '[2J' + CHR$(155%) + '[;H' & + CHR$(140%) + CHR$(26%) + CHR$(8%) + " " & 120 BELL$ = STRING$(3%,7%) & 130 DIM TABLE%(127%) \ & MAT TABLE% = ZER \ & TABLE%(0%) = 127% & ! Dimension the array, zero it and give the value for SUB(0). & 140 FOR SET% = 1% TO 127% \ & TABLE%(SET%) = SET% \ & NEXT SET% & ! Give the array the correct values for the ASCII characters. & 150 TABLE%(34%) , TABLE%(39%) , TABLE%(40%) , & TABLE%(41%) , TABLE%(91%) , TABLE%(93%) , & TABLE%(123%) , TABLE%(125%) = 0% & ! <"> , <'> , <(> , <)> , <[> , <]> , <{> , <}> = Null. & 160 TABLE%(10%) , TABLE%(12%) , TABLE%(13%) = 32% & ! , , = A Space. & 170 TABLE%(33%) , TABLE%(63%) = 46% & ! , = A Period. & 180 CHANGE TABLE% TO TABLE$ \ & TABLE$ = CHR$(0%) + TABLE$ & ! Create the translation string. & 200 ON ERROR GOTO 19000 & 220 Z$ = SYS(CHR$(6%)+CHR$(-7%)) & ! ^C Error trap & 240 YES% = -1% \ & NO% = 0% \ & SENT = 0% \ & WORDS = 0% \ & AVER = 0% & ! Set the main variables. & 500 !************************************************************** & ! & ! This part of the program tells what its purpose is & ! and then inputs a file name to be processed. & ! & 520 PRINT CLEAR$ \ & PRINT FOR CLR% = 1% TO 3% & 540 PRINT TAB(17);"THIS PROGRAM PRINTS A REPORT ON A GIVEN FILE." \ & PRINT FOR CLR% = 1% TO 2% \ & PRINT "The report contains:" \ & PRINT \ & PRINT " Number of sentences." \ & PRINT " Number of words." \ & PRINT " Average # of words per sentence." \ & PRINT FOR CLR% = 1% TO 2% & 560 Z$ = SYS(CHR$(11%)) & ! Cancel the type ahead on the file input. & 580 PRINT "Enter the filename you want to process"; \ & INPUT LINE FILE$ \ & FILE$ = CVT$$(FILE$,4% + 16% + 32%) & ! Use input line to allow commas in the name of the file. & 600 IF FNFOUND%(FILE$) = NO% & THEN & GOTO 500 & 620 OPEN FILE$ AS FILE #1% , RECORDSIZE 512% \ & FIELD #1% , 512% AS WHOLE.THING$ & 1000 !************************************************************** & ! & ! This part of the program does the searching & ! counting of the words in the file. & ! & 1010 IF INSTR(1%,WHOLE$,". ") = NO% & THEN & WHOLE$ = CVT$$(WHOLE$ + FNGET$,8%) & ! This conversion makes sure a record does not begin with a & ! sentence AND a space. This may happen when, WHOLE$ is null & ! (if WHOLE$ is null it means that a sentence follows), and a & ! record begins with a space. & 1030 IF END.OF.FILE% = YES% & THEN & GOTO 7000 & ! Print the results when there is no more data. & 1040 SENT.PLACE% = INSTR(1%,WHOLE$,". ") \ & WORD.PLACE% = 0% & ! Find the first sentence in the string. & ! Set the word pointer at the beginning of the sentence. & 1060 WHILE SENT.PLACE% > WORD.PLACE% & ! Keep looping while the sentence has uncounted words. & 1070 TMP.PLACE% = INSTR(WORD.PLACE%,WHOLE$," ") & ! Find the next word using the last's words place & ! as a starting point for the search. & 1080 IF TMP.PLACE% & THEN & WORDS = WORDS + 1% & ! Count the words that are found. & 1100 WORD.PLACE% = TMP.PLACE% + 1% & ! Make the present's word position the new & ! starting point for the next search. & 1120 NEXT & ! Go back to the while statement. & 1150 WHOLE$ = RIGHT(WHOLE$,SENT.PLACE% + 2%) & ! Cut off the sentence in which the words were counted. & 1170 SENT = SENT + 1% & ! Count the sentences. & 1500 GOTO 1000 & ! Get another sentence and process it. & 7000 !************************************************************** & ! & ! Print the resulting report on the screen. & ! & 7030 IF SENT = 0% & THEN & GOTO 7060 & ! Prevent a division by zero in line 7040. (next line) & 7040 AVER = (WORDS * 1.) / SENT & ! Calculate the average words per sentence. & 7060 PRINT CLEAR$ \ & PRINT CHR$(7%) FOR CLR% = 1% TO 5% & 7080 PRINT "REPORT ON ";'"';FILE$;'"';"." \ & PRINT FOR CLR% = 1% TO 2% \ & PRINT "THIS FILE CONTAINS EXACTLY";SENT;"SENTENCES." \ & PRINT FOR CLR% = 1% TO 2% \ & PRINT "THIS FILE CONTAINS EXACTLY";WORDS;"WORDS." \ & PRINT FOR CLR% = 1% TO 2% \ & PRINT "THE AVERAGE NUMBER OF WORDS PER SENTENCE IS "; \ & PRINT USING "##.##" , AVER \ & PRINT FOR CLR% = 1% TO 3% & 18999 GOTO 32767 & 19000 !************************************************************** & ! & ! ERROR ROUTINE & ! & 19020 ! * * * * * * * & ! Expected Errors WITHOUT error line numbers & ! * * * * * * * & 19040 ! ^C error \ & IF ERR = 28 & THEN & CLOSE #1% \ & GOTO 32767 & 19060 ! ^Z error \ & IF ERR = 11 AND ERL <> 600 & THEN & CLOSE #1% \ & GOTO 32767 & 19900 ! * * * * * * * & ! Unexpected errors & ! * * * * * * * & 19995 Z$ = SYS(CHR$(6%)+CHR$(9%)+CHR$(ERR)) \ & ERROR$ = RIGHT(Z$,3%) \ & PRINT BELL$ \ & PRINT " Oh no !! Not another "; ERROR$ \ & PRINT " at line";ERL;"in program WORDS !!" \ & GOTO 32767 & 20000 !  & ! FUNCTION: TO GET A RECORD. & ! & 20010 DEF FNGET$ \ & ON ERROR GOTO 20250 \ & Z$ = SYS(CHR$(6%) + CHR$(-7%)) & ! Set up the function's error routine. & 20030 GET #1% & 20050 IF END.OF.FILE% & THEN & CLOSE #1% \ & GOTO 20190 & ! When the end of the file is reached close the file & ! and end the function. & 20060 WHOLE.E$ = XLATE(WHOLE.THING$,TABLE$) & ! Translate the whole string according to the table. & 20070 WHOLE.E$ = CVT$$(WHOLE.E$, 16%) & ! Make spaces single. & 20080 FNGET$ = WHOLE.E$ & ! Return the translated and converted string. & 20190 FNEND \ & ON ERROR GOTO 19000 & ! Reset the error routine to 19000. & 20250 ! & ! Error routine for the GET FUNCTION. & ! & 20260 ! ?End of file on device. \ & IF ERR = 11 AND ERL = 20030 & THEN & END.OF.FILE% = -1% \ & RESUME 20050 & 20270 ! ?End of file on device. OR ?Programmable ^C trap. \ & IF ERR = 11 OR ERR = 28 & THEN & Z$ = SYS(CHR$(6%) + CHR$(-7%)) \ & RESUME 20010 & ! Reset the ^C trap and resume the function's beginning. & 20290 ! * * * * * * * & ! Unexpected errors & ! * * * * * * * & 20295 Z$ = SYS(CHR$(6%)+CHR$(9%)+CHR$(ERR)) \ & ERROR$ = RIGHT(Z$,3%) \ & PRINT BELL$ \ & PRINT " Oh no !! Not another "; ERROR$ \ & PRINT " at line";ERL;"in FNGET$ !!" \ & GOTO 32767 & 21000 ! & ! FUNCTION: TO FIND A GIVEN FILE. & ! \ & DEF FNFOUND%(FILE.EDR$) & 21010 YES% = -1% \ & NO% = 0% \ & FOUND.EDR% = YES% & ! Get ready to start the function. & 21030 ON ERROR GOTO 21080 & ! Set the error routine for this function. & 21040 IF FILE.EDR$ = "" & THEN & FILE.EDR$ = "that file" & ! If the FILE.EDR$ is null then look for a dummy file & ! to cause a (Can't find file or account) error. & 21050 OPEN FILE.EDR$ FOR INPUT AS FILE #9% \ & CLOSE #9% & ! Open the file for input to see if it exists. & 21060 IF FOUND.EDR% = NO% & THEN & FNFOUND% = NO% & ELSE & FNFOUND% = YES% & ! If the file does not exist then return the answer in FNFOUND% & 21065 IF FOUND.EDR% = NO% & THEN & PRINT BELL$ \ & PRINT "?Can't find ";FILE.EDR$;" please check the name." \ & SLEEP 5% & ! If the file does not exist then tell them so. & 21070 ON ERROR GOTO 19000 \ & FNEND & ! Before ending the function reset the on error goto. & 21080 ! & ! Error routine for FNFOUND% & ! & 21090 FOUND.EDR% = NO% \ & RESUME 21060 & ! On any error set this flag and resume 21060 & 21100 GOTO 32767 & ! Just making sure the program doesn't run out through here. & 32767 END S0% 2? 10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! MODE8 & ! & !A program to demonstrate the use of MODE 8 & ! 21 ! & ! General instructions for mode 8 input. (There are further & !explanations later). & ! Many people think of a field as a fixed part of a screen. The & !only aspect of this that mode 8 input actually does is the fixed & !number of characters input. By proper positioning of the cursor & !before each input, the illusion of fixed areas can be created. This & !is why the instructions mention cursor positioning. & ! & !(1) Open the keyboard in mode 8 on any non-zero channel. & ! (Note: if you print to the keyboard on channel zero, mode 8 & ! will be automatically cancelled. & !(2) Cancel type ahead if desired. & !(3) Clear the screen if desired. & !(4) Print any prompt text or paint characters. & ! (Be sure to do this on a non-zero channel) & !(5) Position the cursor as desired & !(6) Declare the field & !(7) Input the data with a GET & ! 200 ! & !some constants & ! 210 CLEAR$ = CHR$(155%) + "[2J" 1000 ! & ! & ! MAIN PROGRAM & ! & ! & !open the keyboard & ! 1010 OPEN "KB:" AS FILE #1%, MODE 8% 2000 ! & !Normal mode & ! 2010 GOSUB 10000 2020 CALL% = FNPAUSE% 3000 ! & !Keypunch mode & ! 3010 GOSUB 11000 3020 CALL% = FNPAUSE% 4000 ! & !demonstrate paint character & ! 4010 GOSUB 12000 4020 CALL% = FNPAUSE% 5000 ! & !use of mode 8 to "field" input & ! 5010 GOSUB 13000 5020 PRINT FNMOVE$(20%,1%); 9000 ! & !normal exit & ! 9010 CLOSE #1% 9990 GOTO 32767 10000 ! & ! & ! SUBROUTINE: Normal Mode & ! & ! & ! In normal mode the input must be terminated by a delimiter. The & !usual delimiters are Line Feed, Carriage Return, Escape, and Form & !Feed. In mode 8, ^C is also treated as a delimiter. (^C will & !behave as it usually does except when your program is requesting & !input.) The field size puts a limit on how many characters can be & !entered. Fewer characters can be entered by typing a delimiter & !before the limit is reached. Once the full number of characters is & !typed, no more characters (except delimiters) will be accepted. If & !a non-delimiter is typed, it will be echoed as a BEL (character 7). & !Delimiters typed either before or after the limit will terminate the & !input. & ! 10100 ! & !clear the screen and print prompts & ! 10110 PRINT #1%, CLEAR$; 10120 PRINT #1%, FNMOVE$(2%,15%); "***** Normal mode field size five *****"; 10130 PRINT #1%, FNMOVE$(7%,20%); "Field"; \ & PRINT #1%, FNMOVE$(7%,40%); "Echo"; 10200 ! & !input & ! 10210 SIZE% = 5% 10220 FOR I% = 1% TO 5% 10230 PRINT #1%, FNMOVE$(8%+I%,20%); 10240 PRINT #1%, RECORD 256%, CHR$(0%+SIZE%); & ! & !SIZE% is the number of characters to be input, the size of the & !field. It must be less than or equal to 128%. Numbers larger & !than 128% indicate keypunch mode (see below). The 0% is, of & !course, not necessary. It is there to stress the fact that 128% & !was not added to the field size to indicate keypunch mode. & !Be sure to include the ; at the end of the print. If you don't & !the first delimiter printed by the PRINT will be taken as the & !paint character. (See description of the paint character below) & ! 10250 GET #1% \ & FIELD #1%, RECOUNT AS IN$ \ & OUT$ = IN$ + "" & !Mode 8 input must be by GET and not INPUT & !need to save contents of IN$ before the print statement below & !changes the contents of the buffer. 10260 PRINT #1%, FNMOVE$(8%+I%,40%); CVT$$(OUT$,4%); & !OUT$ will have the delimiters, so they must be chopped off & !before it is printed 10270 NEXT I% 10900 ! & !return & ! 10990 RETURN 11000 ! & ! & ! SUBROUTINE: Keypunch mode & ! & ! & ! Keypunch mode differs in that it does not need a delimiter. If & !a delimiter is typed before the field is full, it behaives the same & !as in normal mode. Once the full number of characters is typed, the & !input is complete; no delimiter is necessary. & ! 11100 ! & !clear the screen and print prompts & ! 11110 PRINT #1%, CLEAR$; 11120 PRINT #1%, FNMOVE$(2%,15%); "***** Keypunch mode field size five *****"; 11130 PRINT #1%, FNMOVE$(7%,20%); "Field"; \ & PRINT #1%, FNMOVE$(7%,40%); "Echo"; 11200 ! & !input & ! 11210 SIZE% = 5% 11220 FOR I% = 1% TO 5% 11230 PRINT #1%, FNMOVE$(8%+I%,20%); 11240 PRINT #1%, RECORD 256%, CHR$(128%+SIZE%); & ! & !SIZE% is the number of characters to be input as before. The & !fact that the character printed has an ASCII value larger than & !128% indicates Keypunch mode. (Of course, the number does not & !need to be written as a sum). The other comments in the part on & !normal mode apply. & ! 11250 GET #1% \ & FIELD #1%, RECOUNT AS IN$ \ & OUT$ = IN$ + "" 11260 PRINT #1%, FNMOVE$(8%+I%,40%); CVT$$(OUT$,4%); 11270 NEXT I% 11900 ! & !return & ! 11990 RETURN 12000 ! & ! & ! SUBROUTINE: Paint character & ! & ! & ! In mode 8 (as in ordinary input), a delete character causes the & !previous character to be removed from the input string and causes & !a space to be printed in place of that character. You can specify & !some other character to be used as a "paint" character. You may & !also want to fill in the field with that paint character before & !requesting the ipnut. I have done this only for some of the inputs & ! 12100 ! & !clear the screen and print prompts  & ! 12110 PRINT #1%, CLEAR$; 12120 PRINT #1%, FNMOVE$(2%,15%); "***** Normal mode field size five *****"; 12130 PRINT #1%, FNMOVE$(3%,25%); "Paint character is _"; 12140 PRINT #1%, FNMOVE$(7%,20%); "Field"; \ & PRINT #1%, FNMOVE$(7%,40%); "Echo"; 12200 ! & !print paint characters in some of the fields & ! 12210 FOR I% = 3% TO 5% 12220 PRINT #1%, FNMOVE$(8%+I%,20%);"_____"; & !so only the last three have the paint character filled in 12230 NEXT I% 12300 ! & !input & ! 12310 SIZE% = 5% 12320 FOR I% = 1% TO 5% 12330 PRINT #1%, FNMOVE$(8%+I%,20%); 12340 PRINT #1%, RECORD 256%, CHR$(0%+SIZE%) + CHR$(95%); & !the first character means the same as before. The second & !character is the paint character. In this case it is an underline 12350 GET #1% \ & FIELD #1%, RECOUNT AS IN$ \ & OUT$ = IN$ + "" 12360 PRINT #1%, FNMOVE$(8%+I%,40%); CVT$$(OUT$,4%); 12370 NEXT I% 12900 ! & !return & ! 12990 RETURN 13000 ! & ! & ! SUBROUTINE: "Fielding" input with mode 8 & ! & ! & !clear screen and print prompts & ! 13010 PRINT #1%, CLEAR$; 13020 PRINT #1%, FNMOVE$(2%,5%);"Input your phone number: ( ) - "; 13100 ! & ! Move cursor in place for area code and input it keypunch mode. & !This will make it impossible to correct the area code once three & !digits have been typed since the input will be automatically & !satisfied. While this may not be desirable, the purpose of this & !part of the program is to demonstate how it can be done. & ! 13110 PRINT #1%, FNMOVE$(2%,31%); 13120 PRINT #1%, RECORD 256%, CHR$(128%+3%); 13130 GET #1% 13140 FIELD #1%, RECOUNT AS IN$ 13150 AREA.CODE$ = IN$ + "" 13200 ! & !same for first three digits of number & ! 13210 PRINT #1%, FNMOVE$(2%,36%); 13220 PRINT #1%, RECORD 256%, CHR$(128%+3%); 13230 GET #1% 13240 FIELD #1%, RECOUNT AS IN$ 13250 FIRST.THREE$ = IN$ + "" 13300 ! & !get rest of number normal mode & ! 13310 PRINT #1%, FNMOVE$(2%,40%); 13320 PRINT #1%, RECORD 256%, CHR$(0%+4%); 13330 GET #1% 13340 FIELD #1%, RECOUNT AS IN$ 13350 LAST.FOUR$ = IN$ + "" 13400 ! & !print out data & ! 13410 PRINT #1%, FNMOVE$(4%,10%);"Area code: "; AREA.CODE$; 13420 PRINT #1%, FNMOVE$(5%,10%);"Prefix: "; FIRST.THREE$; 13430 PRINT #1%, FNMOVE$(6%,10%)"Number: "; LAST.FOUR$; 13900 ! & !return & ! 13990 RETURN 14000 ! & ! & ! FUNCTIONS & ! & ! & !Cursor control(for a terminal in ANSII mode) & ! 14010 DEF* FNMOVE$(ROW%,COL%) = CHR$(155%) + "[" + NUM1$(ROW%) + ";" & + NUM1$(COL%) + "H" 14100 ! & !Pause for input & ! 14110 DEF* FNPAUSE% 14120 PRINT #1%, FNMOVE$(20%,1%); "Hit RETURN to continue "; \ & PRINT #1%, RECORD 256%, CHR$(128%+1%); \ & GET #1% \ & FIELD #1%, 1% AS DUMMY$ 14190 FNEND 32767 END !r 2? 2 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & ! This software is furnished under no license and may be used & ! and copied in accordance with the nonexistent terms of such & ! license and with or without the inclusion of the above & ! copyright notice. This software or any other copies thereof & ! may be provided or otherwise made available to any other & ! person. & ! & ! The information in this software is subject to change without & ! notice and should not be construed as a commitment by & ! Whittier College or the author. This software is & ! unconditionally guaranteed to perform without error the & ! purpose for which it is intended. Said purpose is to remain & ! the secret of the author and is subject to change without & ! notice and at the whim of the author. & ! & ! Whittier College assumes no responsibility for the use or & ! reliability of its software on equipment that is not supplied & ! by Whittier College. Whittier College supplies no equipment. & ! & ! This program was written for internal use and has not been & ! been significantly modified for export. You may need to make & ! changes to fit your system or needs. If you have any problems & ! please contact: & ! & ! David Rosales & ! Whittier College, Computer Center & ! Whittier CA 90601 & ! (213) 693-0771 ext 287 & ! & 10 EXTEND & 30 ! & ! ALARM & ! & ! The Whittier College Alarm Queuer. & ! & ! & 35 ! & ! EDIT DATE CHANGES MADE & ! & ! AUG/1/1983 Finished writing this program. & ! Changed by: Erasmo David Rosales. & ! & ! & ! ???/?/19?? ????? ????? ????? ????? ????? ????? ????? & ! Changed by: ?????? ????? ???????. & ! & 50 ! & ! ALARM & ! & ! This program gets information from people that want & ! to be reminded of something through the alarm program & ! and places the information in the data file which is & ! used by the ALARM0 which is the program that actually & ! does the reminding. & ! & ! Type of information taken: & ! Name of user. & ! Time to be alarmed. & ! Reason for alarm. & ! (KB number is looked up) Keyboard number. & ! & 100 !************************************************************* & ! & ! Initialize ^C TRAP, ERROR routine and CONSTANTS. & ! & 150 DIM #1%, NAME2$(50%) = 32% , & ALARMTIM2$(50%) = 16% , & KBNUM2%(50%) , & REASON2$(50%) = 128% \ & NUM.OF.PLACES% = 50% & ! If the data file containing the user's information & ! keeps getting filled up and you want to expand the & ! size of the array you must set NUM.OF.PLACES% to & ! the size of the dimension. & 200 PRIVILEGED$ = "" \ & PRIV$ = "" & 210 Z$ = SYS(CHR$(6%) + CHR$(14%)) \ & PROJ% = ASCII(MID(Z$,8%,1%)) \ & PROG% = ASCII(MID(Z$,7%,1%)) & 220 IF PROJ% = 1% AND PROG% = 2% THEN PRIVILEGED$ = "YES" & ! Find the account number. & ! If the account number is [1,2] then extra & ! options are given to the user. & 230 IF PROJ% = 1% THEN PRIV$ = "YES" & ! Find the account project number. & ! If the project number is 1% then the user will & ! later be given the option to be alarmed at the & ! keyboard specified by the user. & 300 Z$ = SYS(CHR$(6%) + CHR$(9%) + CHR$(0%)) \ & KBNUM1% = ASCII(MID(Z$,2%,1%)) / 2% \ & KBNUMSAVE% = KBNUM1% & ! Finds the users KEYBOARD number. & 320 CLEAR$ = CHR$(155%) + '[2J' + CHR$(155%) + '[;H' & + CHR$(140%) + CHR$(26%) + CHR$(8%) + " " & 330 Z$ = SYS(CHR$(6%) + CHR$(-3%)) \ & MAXKB% = ASCII(MID(Z$,3%,1%)) & ! Find the maximum keyboard configured on the system. & 340 BELL$ = CHR$(7%) + CHR$(7%) + CHR$(7%) & 500 ON ERROR GOTO 19000 & 550 Z$ = SYS(CHR$(6%)+CHR$(-7%)) & ! ^C Error trap & 600 OPEN "[1,2] ALARM.VIR" FOR INPUT AS FILE #1% \ & CLOSE #1% & ! Open the file for input to see if it exists. & 610 IF NOT.FOUND% & THEN & Z% = FNCREATE% & ! If the file does not exist then create the file. & 1000 !************************************************************* & ! & ! This ask the user what option they want to take. & ! & 1030 CLOSE #1% & ! Close it just to be safe. & 1050 IF PRIVILEGED$ = "YES" THEN GOTO 6000 & 1100 PRINT CLEAR$ & 1120 PRINT FOR CLR% = 1% TO 6% & 1140 PRINT ,"Your options are:" \ & PRINT & 1160 PRINT ,,"(1) SET THE ALARM" & 1180 PRINT ,,"(2) MODIFY YOUR TIME SETTING" & 1200 PRINT ,,"(3) ABORT YOUR ALARM SETTING" & 1220 PRINT ,,"(4) EXIT THIS PROGRAM" & 1240 PRINT FOR CLR% = 1% TO 3% & 1260 Z$ = SYS(CHR$(11%)) \ & INPUT "What option do you want to take <4>";OPT% & 1280 IF OPT% = 0% THEN OPT% = 4% : GOTO 1350 & 1300 IF OPT% > 0% AND OPT% < 5% THEN GOTO 1350 & 1320 PRINT BELL$ \ & PRINT "OPTIONS ARE (1 thru 4)" \ & SLEEP 3 \ & GOTO 1000 & 1350 ON OPT% GOSUB 2000, 3000, 4000, 5000 & 1360 IF GETOUT% & THEN & GOSUB 5000 & 1380 GOTO 1000 & 2000 !************************************************************** & ! & ! This takes care of the SET-TIME option. & ! & 2020 NAME1$ = FNNAME$ & ! Input the name through a function. & 2040 ALARMTIM1$ = FNTIME$ & ! Input the time through a function. & 2050 IF DEFAULT$ = "YES" & THEN & ALARMTIM1$ = FNDEFAULT$(ALARMTIM1$) & ! If the DEFAULT flag is set then the default & ! extension for the time is given. & 2060 REASON1$ = FNREASON$ & ! Input the reason through a function. & 2080 IF PRIV$ <> "YES" GOTO 2150 & ! This PRIV$ refers to the priviledge to & ! specify which keyboard is to be alarmed. & 2100 KBNUM1% = FNKB% & ! This function inputs the key board number from the user. & 2150 ANSWER$ = FNCONFIRM$ & ! This function returns a "Y" if the user says the & ! information which the user has given is all correct. & 2170 IF ANSWER$ = "Y" & THEN & Z% = FNLOAD%(FNFIND%) & ELSE & PRINT CLEAR$ \ & PRINT FOR CLR% = 1% TO 6% \ & PRINT BELL$ \ & PRINT TAB(22);"Try entering the information again." \ & SLEEP 3% \ & GOTO 2000 & ! If ANSWER$ is "Y" then the information is loaded & ! into the file using FNLOAD%. & ! If ANSWER$ is not "Y" then the user is asked & ! to enter the information again. & 2200 RETURN & ! Go back and give the options again. & 3000 !************************************************************** & ! & ! Modify time setting & ! & 3020 Z$ = FNKEY$ & ! This FUNCTION checks if the user should be allowed & ! MODIFY or CANCEL an alarm setting & 3040 ! & ! This is where you go if the NAME and the KEY match. & ! & 3060 OPEN "[1,2] ALARM.VIR" AS FILE #1% & 3080 OLD.TIME$ = ALARMTIM2$(KEYNUM1%) & 3100 OLD.REASON$ = REASON2$(KEYNUM1%) & 3120 OLD.KBNUM% = KBNUM2%(KEYNUM1%) & 3140 CLOSE #1% & ! Close the file after the values have been given to & ! OLD.TIME$, OLD.REASON$, and OLD.KBNUM%. & 3160 PRINT CLEAR$ & 3180 PRINT FOR CLR% = 1% TO 5% & 3200 PRINT "Do you still want to be alarmed at ";OLD.TIME$; \ & Z$ = SYS(CHR$(11%)) \ & INPUT " ";CNFRM.TIME$ & 3220 CNFRM.TIME$ = CVT$$(CNFRM.TIME$,32%) \ & CNFRM.TIME$ = LEFT(CNFRM.TIME$,1%) & 3240 IF CNFRM.TIME$ = "Y" & THEN & ALARMTIM1$ = OLD.TIME$ \ & GOTO 3280 & ! Keep the old value for ALARMTIM1$. & 3245 ! If CNFRM.TIME$ = "Y" keep the old value of for time & ! ELSE input the time as ALARMTIM1$. & 3250 ALARMTIM1$ = FNTIME$ & ! Input the time through a function. & 3260 IF DEFAULT$ = "YES" & THEN & ALARMTIM1$ = FNDEFAULT$(ALARMTIM1$) & ! If the DEFAULT flag is set then the default & ! extension for the time is given. & 3280 ! & ! This is where you go when the TIME is input correctly. & ! & 3285 Z$ = FNCVT$(OLD.REASON$) & ! Make three parts out of the reason. & ! The parts are PART1$, PART2$ and PART3$. & 3290 PRINT CLEAR$ \ & PRINT FOR CLR% = 1% TO 5% & 3295 PRINT "Reason: ";PART1$ \ & IF PART2$ = "" THEN GOTO 3305 ELSE & PRINT " ";PART2$ & ! Print PART2$ only if it has a piece of the reason. & 3300 IF PART3$ = "" THEN GOTO 3305 ELSE & PRINT " ";PART3$ & ! Print PART3$ only if it has a piece of the reason. & 3305 PRINT FOR CLR% = 1% TO 2% & 3310 Z$ = SYS(CHR$(11%)) \ & INPUT "Is this reason still correct ";CNFRM.REASON$ & 3320 CNFRM.REASON$ = CVT$$(CNFRM.REASON$,32%) \ & CNFRM.REASON$ = LEFT(CNFRM.REASON$,1%) & 3340 IF CNFRM.REASON$ = "N" GOTO 3360 & 3350 REASON1$ = OLD.REASON$ \ & GOTO 3370 & ! Keep the old value for REASON1$. & 3360 REASON1$ = FNREASON$ & ! Input the reason as REASON1$ using a function. & 3370 IF PRIV$ <> "YES" GOTO 3500 & ! This PRIV$ refers to the priviledge to & ! specify which keyboard is to be alarmed. & 3375 PRINT CLEAR$ \ & PRINT FOR CLR% = 1% TO 5% & 3380 PRINT "Do you still want the alarm to sound at KB"; \ & PRINT OLD.KBNUM%;""; \ & Z$ = SYS(CHR$(11%)) \ & INPUT CNFRM.KB$ & 3390 CNFRM.KB$ = CVT$$(CNFRM.KB$,32%) \ & CNFRM.KB$ = LEFT(CNFRM.KB$,1%) & 3400 IF CNFRM.KB$ = "N" GOTO 3440 & 3420 KBNUM1% = OLD.KBNUM% \ & GOTO 3500 & ! Keep the old value for KBNUM1%. & 3440 KBNUM1% = FNKB% & ! This function inputs the key board number from the user. & 3500 ANSWER$ = FNCONFIRM$ & ! This function returns a "Y" if the user says the & ! information which the user has given is all correct. & 3520 IF ANSWER$ = "Y" & THEN & Z% = FNLOAD%(KEYNUM1%) & ELSE & PRINT CLEAR$ \ & PRINT FOR CLR% = 1% TO 6% \ & PRINT BELL$ \ & PRINT TAB(22);"Try entering the information again." \ & SLEEP 3% \ & GOTO 3040 & ! If ANSWER$ is "Y" then the information is loaded & ! into the file using FNLOAD%. & ! If ANSWER$ is not "Y" then the user is asked & ! to enter the information again. & 3900 RETURN & ! Go back and give the options again. & 4000 !************************************************************** & ! & ! This is the CANCEL alarm setting SUB-ROUTINE & ! & 4100 Z$ = FNKEY$ & ! This FUNCTION checks if the user should be allowed & ! MODIFY or CANCEL an alarm setting & 4200 ! & ! This is where you go if the NAME and the KEY match. & ! & 4250 OPEN "[1,2] ALARM.VIR" AS FILE #1% & ! OPEN to get the information. & 4270 Z$ = FNCVT$(REASON2$(KEYNUM1%)) & ! Make three parts out of the reason. & ! The parts are PART1$, PART2$ and PART3$. & 4300 PRINT CLEAR$ & 4320 PRINT FOR CLR% = 1% TO 5% & 4340 PRINT " Name .......";NAME2$(KEYNUM1%) \ & PRINT \ & PRINT " Time .......";ALARMTIM2$(KEYNUM1%) \ & PRINT & 4345 PRINT " Reason .....";PART1$ \ & IF PART2$ = "" THEN GOTO 4355 ELSE & PRINT " ";PART2$ & 4350 IF PART3$ = "" THEN GOTO 4355 ELSE & PRINT " ";PART3$ & 4355 PRINT \ & PRINT " Key Board ..";KBNUM2%(KEYNUM1%) \ & PRINT FOR CLR% = 1% TO 3% \ & PRINT TAB(14);"This ALARM setting will be aborted in five seconds" \ & PRINT & 4357 CLOSE #1% & ! CLOSE after getting the information. & 4360 SLEEP 1% \ PRINT TAB(28);"5....."; & 4365 SLEEP 1% \ PRINT "4...." ; & 4370 SLEEP 1% \ PRINT "3..." ; & 4375 SLEEP 1% \ PRINT "2.." ; & 4380 SLEEP 1% \ PRINT "1." & 4390 OPEN "[1,2] ALARM.VIR" AS FILE #1% & ! OPEN to kill the information. & 4400 NAME2$(KEYNUM1%) = "" & 4440 ALARMTIM2$(KEYNUM1%) = "" & 4460 KBNUM2%(KEYNUM1%) = 0% & 4480 REASON2$(KEYNUM1%) = "" & 4490 CLOSE #1% & ! CLOSE after killing the information. & 4500 PRINT CLEAR$ & ! Clear the screen to tell them the & ! information has been killed. & 4520 PRINT FOR CLR% = 1% TO 8% & 4530 PRINT BELL$ & 4540 PRINT TAB(23);"THE ALARM SETTING HAS BEEN ABORTED" & 4550 PRINT FOR CLR% = 1% TO 10% & 4570 SLEEP 5% & 4600 RETURN & ! Go back and give the options again. & 5000 !************************************************************** & ! & ! This is the way out of this program. & ! & 5010 PRINT CLEAR$ & 5020 PRINT FOR CLR% = 1% TO 3% & 5030 PRINT "Finished ";TIME$(0%) \ & PRINT & 5040 Z$ = SYS(CHR$(9%)) & ! Exit and clear the program. & 5060 GOTO 32767 & 5080 RETURN & 6000 !************************************************************* & ! & ! This asks a privileged user what option they want to take. & ! & 6030 CLOSE #1% & ! Close it just to be safe. & 6100 PRINT CLEAR$ & 6120 PRINT FOR CLR% = 1% TO 5% & 6140 PRINT ,"Your options are:" \ & PRINT & 6160 PRINT ,,"(1) SET THE ALARM" & 6180 PRINT ,,"(2) MODIFY YOUR TIME SETTING" & 6200 PRINT ,,"(3) ABORT YOUR ALARM SETTING" & 6220 PRINT ,,"(4) EXIT THIS PROGRAM" & 6230 PRINT ,,"(5) LOOK AT THE EXISTING ALARM SETTINGS" & 6235 PRINT ,,"(6) CLEAR ALL THE ALARM SETTINGS" & 6240 PRINT FOR CLR% = 1% TO 3% & 6260 Z$ = SYS(CHR$(11%)) \ & INPUT "What option do you want to take <4>";OPT% & 6280 IF OPT% = 0% THEN OPT% = 4% : GOTO 6350 & 6300 IF OPT% > 0% AND OPT% < 7% THEN GOTO 6350 & 6320 PRINT BELL$ \ & PRINT "OPTIONS ARE (1 thru 6)" \ & SLEEP 3 \ & GOTO 6000 & 6350 ON OPT% GOSUB 2000, 3000, 4000, 5000, 7000, 8000 & 6380 GOTO 6000 & 7000 !************************************************************** & ! & ! This takes care of the LOOK AT ALARM SETTINGS option. & ! & 7020 PRINT CLEAR$ \ & PRINT FOR CLR% = 1% TO 5% & 7040 OPEN "[1,2] ALARM.VIR" AS FILE #1% & 7060 FOUND% = 0% & ! Set the FOUND% flag to 0%. & 7080 FOR PRNT% = 1% TO NUM.OF.PLACES% & 7090 IF NAME2$(PRNT%) = "" THEN GOTO 7160 & 7100 Z$ = FNCVT$(REASON2$(PRNT%)) & ! Make three parts out of the reason. & ! The parts are PART1$, PART2$ and PART3$. & 7120 PRINT " Key number....";PRNT% \ & PRINT " Name...............";NAME2$(PRNT%) \ & PRINT " Alarm time.........";ALARMTIM2$(PRNT%) \ & PRINT " Keyboard number....";KBNUM2%(PRNT%) \ & PRINT " Reason.............";PART1$ \ & IF PART2$ = "" THEN GOTO 7135 ELSE & PRINT " ";PART2$ & 7130 IF PART3$ = "" THEN GOTO 7135 ELSE & PRINT " ";PART3$ & 7135 PRINT FOR CLR% = 1% TO 2% & 7140 FOUND% = 1% & ! If something is found then FOUND% flag is set to 1%. & 7160 NEXT PRNT% & 7170 CLOSE #1% & 7180 IF FOUND% = 0% & THEN & PRINT CLEAR$ \ & PRINT FOR CLR% = 1% TO 8% \ & PRINT BELL$ \ & PRINT TAB(28);"The alarm file is empty." \ & SLEEP 5% \ & GOTO 7220 & ! If the FOUND% flag is still 0% then the file is empty. & 7200 PRINT FOR CLR% = 1% TO 3% \ & Z$ = SYS(CHR$(11%)) \ & INPUT "Hit to continue ";RTN$ & 7220 RETURN & ! Go back and give the options again. & 8000 !************************************************************** & ! & ! This takes care of the CLEAR ALL SETTINGS option. & ! & 8050 PRINT CLEAR$ & 8075 PRINT FOR CLR% = 1% TO 7% & 8100 PRINT BELL$ \ & PRINT "Are you sure you want to "; \ & Z$ = SYS(CHR$(11%)) \ & INPUT "clear all the alarm settings ";ANS$ & 8120 ANS$ = LEFT(ANS$,1%) & 8140 ANS$ = CVT$$(ANS$,32%) & 8160 IF ANS$ <> "Y" & THEN & PRINT CLEAR$ \ & PRINT FOR CLR% = 1% TO 7% \ & PRINT ," I'll do it anyway. " \ & SLEEP 3% \ & PRINT \ & PRINT \ & PRINT ," Na... I'll let you keep it." \ & PRINT BELL$ \ & SLEEP 3% \ & GOTO 8500 & ! Give them a little scare !!! & 8170 ! Tell them you're doing it....... \ & PRINT CLEAR$ \ & PRINT FOR CLR% = 1% TO 7% \ & PRINT TAB(22);"THE ALARM SETTINGS ARE BEING CLEARED." \ & PRINT BELL$ & 8190 ! Do it................. & 8220 OPEN "[1,2] ALARM.VIR" AS FILE #1% & 8240 FOR CLR% = 0% TO NUM.OF.PLACES% & 8260 NAME2$(CLR%) = "" \ & ALARMTIM2$(CLR%) = "" \ & KBNUM2%(CLR%) = 0% \ & REASON2$(CLR%) = "" & 8280 NEXT CLR% & 8300 CLOSE #1% & 8320 PRINT CLEAR$ \ & PRINT FOR CLR% = 1% TO 7% \ & PRINT TAB(20);"ALL THE ALARM SETTING HAVE BEEN CLEARED." \ & PRINT BELL$ \ & SLEEP 5% & 8500 RETURN & ! Go back and give the options again. & 12000 DEF FNNAME$ & 12010 PRINT CLEAR$ \ & PRINT FOR CLR% = 1% TO 5% & 12020 Z$ = SYS(CHR$(11%)) \ & INPUT "What is your NAME ";NAME1$ & 12030 NAME1$ = CVT$$(NAME1$,8%+16%+32%+128%) & 12040 IF NAME1$ <> "" THEN GOTO 12110 & ! If they don't give a name tell them you need to know it. & 12050 PRINT FOR CLR% = 1% TO 2% & 12055 PRINT BELL$ & 12060 PRINT ,"Your NAME is needed to recall your information, for" & 12070 PRINT ,"CANCELLATION or MODIFICATION of your alarm setting." & 12080 PRINT FOR CLR% = 1% TO 3% & 12090 SLEEP 7% & 12100 GOTO 12010 & 12110 FNNAME$ = NAME1$ & 12120 FNEND & 12500 ! & ! This function inputs the reason for the alarm setting & ! & 12520 DEF FNREASON$ & 12530 PRINT CLEAR$ \ & PRINT FOR CLR% = 1% TO 6% & 12540 PRINT ,"When the alarm sounds a message you give will be" \ & PRINT ," printed on your keyboard. This message will" \ & PRINT ," remind you of the reason the alarm was set." \ & PRINT \ & PRINT ," (Maximum length is 127 characters)" \ & PRINT FOR CLR% = 1% TO 3% & 12550 Z$ = SYS(CHR$(11%)) \ & PRINT "What is the message"; \ & INPUT LINE REASON1$ & ! This inputs the reason. & 12580 REASON1$ = CVT$$(REASON1$,128+32+16+8+4) & 12600 IF REASON1$ <> "" THEN GOTO 12700 & ! If they don't give a message give the default message. & 12620 REASON1$ = "TIME TO DO GOD KNOWS WHAT?" & 12700 REASON1$ = LEFT(REASON1$,128%) & ! Take only the first 128 charcters of REASON1$. & 12710 FNREASON$ = REASON1$ & 12750 FNEND & 12800 ! & ! This function converts the reason into three parts. & ! & 12810 DEF FNCVT$(REASON$) & 12815 REASON$ = REASON$ + " " & ! This put a space at the end to define the end of the string. & 12820 LONG% = LEN(REASON$) & ! Find the length. The length determines how many & ! whole parts can be made out of the reason. & 12830 IF LONG% <= 43% GOTO 12870 & 12840 IF LONG% <= 85% GOTO 12860 & 12850 POSIT1% = INSTR(43%,REASON$," ") \ & POSIT2% = INSTR(85%,REASON$," ") \ & PART1$ = LEFT(REASON$,POSIT1%) \ & PART2$ = MID(REASON$,POSIT1% + 1%,POSIT2% - POSIT1%) \ & PART3$ = RIGHT(REASON$,POSIT2% + 1%) \ & GOTO 12880 & ! This gives three parts. & 12860 POSIT1% = INSTR(43%,REASON$," ") \ & PART1$ = LEFT(REASON$,POSIT1%) \ & PART2$ = RIGHT(REASON$,POSIT1% + 1%) \ & PART3$ = "" \ & GOTO 12880 & ! This gives two parts. & 12870 PART1$ = REASON$ \ & PART2$ = "" \ & PART3$ = "" & ! This gives one part. & 12880 FNCVT$ = REASON$ & 12890 FNEND & 13000 ! & ! This FUNCTION controls the format of the time input & ! by the user. It sets the default for AM and PM to & ! the next occurance of the time input by the user. & ! & 13020 DEF FNTIME$ & 13050 PRINT CLEAR$ & 13060 DEFAULT$ = "" & 13070 AM.PM$ = "" & 13120 PRINT FOR CLR% = 1% TO 5% & 13140 PRINT "The present time is ";TIME$(0%) \ & PRINT \ & Z$ = SYS(CHR$(11%)) \ & INPUT " What time do you want the alarm to sound ";ALARMTIM1$ \ & ALARMTIM1$ = CVT$$(ALARMTIM1$, 2% + 32%) & 13160 IF INSTR(1%,ALARMTIM1$,"NOON") > 0% & THEN & FNTIME$ = "12:00 NOON" \ & GOTO 13500 & ! If the user entered "NOON" then the correct value is & ! given to FNTIME$ and then the function is terminated. & 13180 IF INSTR(1%,ALARMTIM1$,"MIDNIGHT") > 0% & THEN & FNTIME$ = "12:00 MIDNIGHT" \ & GOTO 13500 & ! If the user entered "MIDNIGHT" then the correct value is & ! given to FNTIME$ and then the function is terminated. & 13200 COLON% = INSTR(1%,ALARMTIM1$,":") & ! Find the colon in the time string. & 13220 IF COLON% = 0% & THEN & PRINT BELL$ \ & PRINT TAB(16); \ & PRINT "Use a colon (:) between the hour and the minutes." \ & SLEEP 3% \ & PRINT CLEAR$ \ & GOTO 13050 & ! If a colon is not found then the user is told to use one. & 13240 AM% = INSTR(1%,ALARMTIM1$,"AM") & 13260 PM% = INSTR(1%,ALARMTIM1$,"PM") & 13280 IF AM% > 0% THEN AM.PM$ = " AM" \ AM.PM% = AM% & 13300 IF PM% > 0% THEN AM.PM$ = " PM" \ AM.PM% = PM% & 13320 HOUR$ = LEFT(ALARMTIM1$,COLON% - 1%) & ! Put the value of the hour in a string. & 13340 IF AM.PM$ = "" & THEN & MINUTES$ = RIGHT(ALARMTIM1$,COLON% + 1%) & ELSE & MINUTES$ = RIGHT(LEFT(ALARMTIM1$,(AM.PM%-1%)), & (INSTR(1%,ALARMTIM1$,":")+1%)) & ! Put the value of the minutes in a string. & 13360 MINUTES% = VAL(MINUTES$) \ & HOUR% = VAL(HOUR$) \ & MINUTES$ = NUM1$(MINUTES%) \ & HOUR$ = NUM1$(HOUR%) & ! This gets integer values of the strings which have the & ! hour and the minutes. The integer is then turned back & ! into a string so that if the string value was "" , the & ! string values will have at least a "0". & 13380 IF HOUR% > 12% AND HOUR% < 25% & THEN & PRINT BELL$ \ & PRINT TAB(20);" Military time is not allowed." \ & PRINT TAB(20);"Input an hour between 1 and 12, not";HOUR%"." \ & SLEEP 3% \ & PRINT CLEAR$ \ & GOTO 13050 & ! Check the size of HOUR% (must be between 1 and 12) & 13400 IF HOUR% > 12% OR HOUR% < 1% & THEN & PRINT BELL$ \ & PRINT TAB(18);"Input an hour between 1 and 12, not";HOUR%"." \ & SLEEP 3% \ & PRINT CLEAR$ \ & GOTO 13050 & ! Check the size of HOUR% (must be between 1 and 12) & 13420 IF MINUTES% > 59% OR MINUTES% < 0% & THEN & PRINT BELL$ \ & PRINT TAB(17); \ & PRINT "The minutes must be between 0 and 59, not";MINUTES%"." \ & SLEEP 3% \ & PRINT CLEAR$ \ & GOTO 13050 & ! Check the size of MINUTES% (must be between 0 and 59) & 13440 IF HOUR% < 10% THEN HOUR$ = "0" + HOUR$ & ! If HOUR% is one digit add a "0" to the front of HOUR$. & 13460 IF MINUTES% < 10% THEN MINUTES$ = "0" + MINUTES$ & ! If MINUTES% is one digit add a "0" to the front of MINUTES$. & 13480 IF AM.PM$ = "" THEN DEFAULT$ = "YES" & 13490 IF HOUR$ + ":" + MINUTES$ <> "12:00" GOTO 13499 & ! If the time given is not 12:00 then do not & ! give the 12:00 extensions. & 13493 IF AM.PM$ = " AM" & THEN & AM.PM$ = " MIDNIGHT" & ! Give NOON or MIDNIGHT extension based on the value of AM.PM$. & 13495 IF AM.PM$ = " PM" & THEN & AM.PM$ = " NOON" & ! Give NOON or MIDNIGHT extension based on the value of AM.PM$. & 13499 FNTIME$ = HOUR$ + ":" + MINUTES$ + AM.PM$ & ! Put the final string together. & 13500 FNEND & 13501 ! & ! If the default is needed you set up the values used & ! in order to get the correct AM or PM default. & ! & 13520 DEF FNDEFAULT$(TTIME$) & 13530 AM.PM$ = "" & ! Clear out anything that may be in AM.PM$. & 13540 COMP.TIME$ = TIME$(0%) & ! Instead of using TIME$(0%) where it is needed I use & ! COMP.TIME$. This way I can change the value of COMP.TIME$ & ! to test the function with different values given to the & ! time of day. & 13560 NOW.HOUR$ = LEFT(COMP.TIME$,2%) \ & NOW.HOUR$ = "0" IF NOW.HOUR$ = "12" \ & NOW.MIN$ = MID(COMP.TIME$,4%,2%) \ & NOW.HOUR% = VAL(NOW.HOUR$) \ & NOW.MIN% = VAL(NOW.MIN$) & ! Get the values for the hours and minutes right now. & 13570 G.HOUR$ = LEFT(TTIME$,2%) \ & G.HOUR$ = "0" IF G.HOUR$ = "12" \ & G.MIN$ = MID(TTIME$,4%,2%) \ & G.HOUR% = VAL(G.HOUR$) \ & G.MIN% = VAL(G.MIN$) & ! Get the values for the hours and minutes given. & 13580 TOTAL.NOW% = (60 * NOW.HOUR%) + NOW.MIN% & ! Total minutes now. & 13590 TOTAL.GIVE% = (60 * G.HOUR%) + G.MIN% & ! Total minutes given. & 13600 AM% = INSTR(1%,COMP.TIME$,"AM") \ & PM% = INSTR(1%,COMP.TIME$,"PM") \ & M% = INSTR(1%,COMP.TIME$,"M") & ! Find the "AM", "PM" or "M" in the present time. & 13610 IF AM% > 0% THEN NOW.XM$ = " AM" \ OTHER$ = " PM" & ! If it is AM now then NOW.XM$ is " AM" and OTHER$ is " PM". & 13620 IF PM% > 0% THEN NOW.XM$ = " PM" \ OTHER$ = " AM" & ! If it is PM now then NOW.XM$ is " PM" and OTHER$ is " AM". & 13630 IF M% = 7% THEN NOW.XM$ = " PM" \ OTHER$ = " AM" & ! If it is M now then NOW.XM$ is " AM" and OTHER$ is " PM". & ! "M" will only appear at exactly noon "12:00 M". & 13640 IF COMP.TIME$ = "12:00 PM" & THEN & NOW.XM$ = " AM" \ OTHER$ = " PM" & ! This reverses the extensions when the present & ! time is 12:00 MIDNIGHT. & 13700 IF TOTAL.GIVE% >= TOTAL.NOW% & THEN & AM.PM$ = NOW.XM$ & ELSE & AM.PM$ = OTHER$ & ! In this sequence the extension of the present time is & ! given if the time given is GREATER THAN the present time. & 13740 ! & ! If the time given is 12:00 then an extension & ! of either NOON or MIDNIGHT are given. & ! & 13750 IF TTIME$ <> "12:00" GOTO 13900 & ! If the time given is not 12:00 then do not & ! give the 12:00 defaults. & 13770 IF AM.PM$ = " AM" & THEN & AM.PM$ = " MIDNIGHT" & ELSE & AM.PM$ = " NOON" & ! Give NOON or MIDNIGHT extension based on the value of AM.PM$. & 13900 FNDEFAULT$ = TTIME$ + AM.PM$ & ! Put the final string together. & 13950 FNEND & 14000 ! & ! This loads the information into the VIRTUAL ARRAY. & ! & 14010 DEF FNLOAD%(POINT%) & 14040 KEYNUM1% = POINT% & ! Give the value to KEYNUM1% because it is used & ! to tell the user what his/her keynumber is. & 14060 OPEN "[1,2] ALARM.VIR" AS FILE #1% & ! OPEN the file in order to load some information. & 14080 NAME2$(POINT%) = NAME1$ & 14100 ALARMTIM2$(POINT%) = ALARMTIM1$ & 14120 KBNUM2%(POINT%) = KBNUM1% & 14140 REASON2$(POINT%) = REASON1$ & 14160 CLOSE #1% & ! CLOSE the file after loading the information. & 14200 ! & ! Tell the User his/her KEY NUMBER (KEYNUM1%) & ! & 14220 PRINT CLEAR$ & 14240 PRINT FOR CLR% = 1% TO 5% & 14260 PRINT ," If you want to cancel or modify your alarm" \ & PRINT \ & PRINT ,"setting you will be asked for a number this" \ & PRINT \ & PRINT ,"number is your KEY." \ & PRINT FOR CLR% = 1% TO 4% \ & PRINT ,,"Your KEY NUMBER is ";KEYNUM1% \ & PRINT FOR CLR% = 1% TO 4% & 14280 Z$ = SYS(CHR$(11%)) \ & INPUT "Hit to exit this program";RTN$ \ & GETOUT% = -1% & ! GETOUT$ tells the subroutine option to exit the program. & 14300 FNEND & 14500 ! & ! This function find the next available & ! space in the virtual array & ! & 14520 DEF FNFIND% & 14540 FNFIND% = -1 & ! If the value returned by the function is -1 then & ! you know there is a problem in this function & 14560 PLACE% = 1% & ! Set the place counter. This keeps track of the & ! positions which already contain information. & 14570 OPEN "[1,2] ALARM.VIR" AS FILE #1% & 14580 UNTIL KBNUM2%(PLACE%) = 0% & ! This will keep looping until an available space is & ! found in the virtual array file. & 14600 PLACE% = PLACE% + 1 & ! Increment the place counter. & 14620 IF PLACE% - 1% = NUM.OF.PLACES% THEN DUMMY% = FNEXIT% & ! If the Virtual Array ever gets filled the program & ! will execute an EMERGENCY EXIT function. & 14640 NEXT & ! Go back to the UNTIL statement. & 14650 CLOSE #1% & 14660 FNFIND% = PLACE% & ! PLACE% is the place that has space. & 14680 FNEND & 15000 ! & ! This function returns a "Y" if the user says & ! the information is correct. & ! & 15010 DEF FNCONFIRM$ & 15020 PRINT CLEAR$ \ & PRINT FOR CLR% = 1% TO 6% & 15030 IF KBNUM1% = KBNUMSAVE% & THEN & KEYBOARDINFO$ = "on this keyboard." & ELSE & KEYBOARDINFO$ = "on keyboard number"+NUM$(KBNUM1%)+"." & 15050 PRINT " ";NAME1$;" will be alarmed ";KEYBOARDINFO$ & 15060 PRINT FOR CLR% = 1% TO 2% & 15070 PRINT " You will be alarmed at ";ALARMTIM1$ & 15080 PRINT FOR CLR% = 1% TO 2% & 15090 Z$ = FNCVT$(REASON1$) & ! Make three parts out of the reason. & ! The parts are PART1$, PART2$ and PART3$. & 15100 PRINT " Reason: ";PART1$ \ & IF PART2$ = "" THEN GOTO 15120 ELSE & PRINT " ";PART2$ & ! Print PART2$ only if it has a piece of the reason. & 15110 IF PART3$ = "" THEN GOTO 15120 ELSE & PRINT " ";PART3$ & ! Print PART3$ only if it has a piece of the reason. & 15120 PRINT FOR CLR% = 1% TO 3% & 15140 INPUT "Is this the correct information ";CONFIRM$ & ! Ask if the info is correct. & 15160 CONFIRM$ = CVT$$(CONFIRM$,32%) \ & CONFIRM$ = LEFT(CONFIRM$,1%) & 15170 IF CONFIRM$ <> "N" & THEN & CONFIRM$ = "Y" & ELSE & CONFIRM$ = "N" & 15180 FNCONFIRM$ = CONFIRM$ & 15200 FNEND & 15500 ! & ! This FUNCTION decides if the user may be allowed & ! to MODIFY or CANCEL an alarm se tting. & ! & ! If the user enters the wrong information the user & ! get kicked out the program. & ! & 15520 DEF FNKEY$ & 15540 NAME1$ = FNNAME$ & ! Input the name with the name input function. & 15550 ! Input the key number from the user. & 15560 PRINT CLEAR$ & 15580 PRINT FOR CLR% = 1% TO 5% & 15600 Z$ = SYS(CHR$(11%)) \ & INPUT "What was your KEY number ";KEYNUM1% & 15620 IF KEYNUM1% < 1% OR KEYNUM1% > 50% GOTO 15800 & ! If the keynumber is an impossible keynumber & ! then the user get kicked out of the program. & 15680 ! & ! Do the real checking of the name and key match. & ! & 15700 OPEN "[1,2] ALARM.VIR" AS FILE #1% & 15720 INFO.CHECK$ = NAME2$(KEYNUM1%) & ! Find the name that coresponds to the key number. & 15740 CLOSE #1% & 15760 IF NAME1$ = INFO.CHECK$ THEN GOTO 15900 & ! If the name and key do match then put the user & ! back into the normal flow of the program. & ! & ! Line 15900 is the FNEND (function end). & 15800 ! This is where you go if the name and key don't match. & 15810 PRINT CLEAR$ & 15820 PRINT CHR$(7%) FOR CLR% = 1% TO 5% & 15830 PRINT TAB(20);" You either entered the wrong KEY" \ & PRINT TAB(20);" number or the wrong NAME." \ & PRINT \ & PRINT TAB(20);"Without the correct KEY and NAME you may" \ & PRINT TAB(20);" not MODIFY or ABORT the alarm setting." \ & PRINT FOR CLR% = 1% TO 5% & 15840 Z$ = SYS(CHR$(9%)) & ! Exit and clear the program. & 15850 GOTO 32767 & ! Exit the program. & 15900 FNEND & 16000 !************************************************************** & ! & ! This inputs the key board number from the user. & ! & 16020 DEF FNKB% & 16040 DIM TRANS1%(127) & ! Dimension the translation array. & 16060 MAT TRANS1% = ZER & ! ZERO the traslation array. & 16080 FOR I% = 48% TO 57% & 16100 TRANS1%(I%) = I% & ! Give the array the correct ASCII numbers only in the & ! places where the numeric characters are. & 16120 NEXT I% & 16140 TRANS1%(0)=127% & 16160 CHANGE TRANS1% TO TRANS1$ & ! Create the translation string. From the numeric & ! array containing the ASCII values for the numeric & ! characters only. & 16180 TRANS1$ = CHR$(0)+TRANS1$ & 16200 PRINT CLEAR$ & 16220 PRINT FOR CLR% = 1% TO 5% & 16240 PRINT TAB(4);"What key board do you want the alarm to " + & "sound at "; & 16260 Z$ = SYS(CHR$(11%)) \ & INPUT NEWKB$ & 16280 NEWKB$ = XLATE(NEWKB$,TRANS1$) & ! Get only the numeric characters from NEWKB$ using & ! the XLATE function. & 16300 NEWKB% = VAL(NEWKB$) & ! Make NEWKB% from NEWKB$. & 16320 IF NEWKB% <> 0% & THEN & FNKB% = NEWKB% & ELSE & FNKB% = KBNUM1% & ! If the value of NEWKB% is zero then give the keyboard & ! number which was found in the keyboard look-up line. & 16330 IF NEWKB% <= MAXKB% GOTO 16500 & ! If the keyboard number given is higher than the highest & ! keyboard number on the system then the user is told to & ! input a lower keyboard number. & 16350 PRINT BELL$ \ & PRINT TAB(15);"That keyboard does not exist, input"; \ & PRINT MAXKB%;"or lower." \ & PRINT \ & SLEEP 5% \ & GOTO 16200 & 16500 FNEND & 16600 ! & ! This function creates the ALARM.VIR file if it is & ! not found when it is open for input at the beginning & ! of this program. & ! & 16620 DEF FNCREATE% & 16640 OPEN "[1,2] ALARM.VIR" AS FILE #1% & 16660 FOR CLR% = 0% TO NUM.OF.PLACES% & 16680 NAME2$(CLR%) = "" \ & ALARMTIM2$(CLR%) = "" \ & KBNUM2%(CLR%) = 0% \ & REASON2$(CLR%) = "" & 16700 NEXT CLR% & 16720 CLOSE #1% & 16740 FNEND & 19000 !************************************************************** & ! & ! ERROR ROUTINE & ! & 19010 ! * * * * * * * & ! Expected Errors WITHOUT error line numbers & ! * * * * * * * & 19015 ! ^C error \ & IF ERR = 28 & THEN & Z$ = SYS(CHR$(6%)+CHR$(-7%)) \ & CLOSE #1% \ & RESUME 500 & 19020 ! ^Z error \ & IF ERR = 11 & THEN & CLOSE #1% \ & RESUME 500 & 19030 ! ?Line too long \ & IF ERR = 47 & THEN & PRINT FOR CLR% = 1% TO 3% \ & PRINT BELL$ \ & PRINT BELL$;"?Line too long" \ & SLEEP 3% \ & PRINT CLEAR$ \ & PRINT FOR CLR% = 1% TO 5% \ & RESUME & 19040 IF ERR = 10 AND PRO.COUNT% < 100% & THEN & PRO.COUNT% = PRO.COUNT% + 1% \ & SLEEP 1% \ & RESUME & ! Stall the program for a second when a protection violation & ! error is generated. A protection violation error will be & ! generated when two jobs try to access the same block in & ! the ALARM.VIR file. To avoid an infinite loop this error & ! trap allows only 100 of these errors. & 19100 ! * * * * * * * & ! Expected Errors WITH error line numbers & ! * * * * * * * & 19110 ! %Data format error \ & IF ERR = 50 AND ERL = 1260 & THEN & PRINT \ & PRINT BELL$;"OPTIONS ARE (1 TO 4)" \ & SLEEP 3% \ & RESUME 1100 & 19120 ! %Data format error \ & IF ERR = 50 AND ERL = 6260 & THEN & PRINT \ & PRINT BELL$;"OPTIONS ARE (1 TO 6)" \ & SLEEP 3% \ & RESUME 6100 & 19130 ! %Data format error \ & IF ERR = 50 AND ERL = 15600 & THEN & RESUME 15800 & 19140 ! %Integer error \ & IF ERR = 51 AND ERL = 16300 & THEN & RESUME 16350 & 19150 ! ?Illegal number \ & IF ERR = 52 AND ERL = 15600 & THEN & RESUME 15800 & 19160 ! ?Illegal number \ & IF ERR = 52 AND ERL = 1260 & THEN & PRINT \ & PRINT BELL$;"OPTIONS ARE (1 TO 4)" \ & SLEEP 3% \ & RESUME 1100 & 19170 ! ?Illegal number \ & IF ERR = 52 AND ERL = 6260 & THEN & PRINT \ & PRINT BELL$;"OPTIONS ARE (1 TO 6)" \ & SLEEP 3% \ & RESUME 6100 & 19180 ! ?Can't find file or account \ & IF ERR = 5 AND ERL = 600 & THEN & NOT.FOUND% = -1% \ & RESUME 610 & ! Can't find the ALARM.VIR file when opened for input. & 19300 ! * * * * * * * & ! Unexpected errors WITH error line numbers & ! * * * * * * * & 19310 IF ERL = 13360 & THEN & PRINT \ & PRINT BELL$;"?Illegal time" \ & SLEEP 3% \ & RESUME 13050 & 19980 ! * * * * * * * & ! Unexpected errors & ! * * * * * * * & 19985 Z$ = SYS(CHR$(6%)+CHR$(9%)+CHR$(ERR)) & 19990 ERROR$ = RIGHT(Z$,3%) & 19995 PRINT BELL$ \ & PRINT " Oh no !! Not another "; ERROR$ \ & PRINT " at line";ERL;"in program ALARM !!" & 19999 GOTO 32767 & 31000 !************************************************************** & ! & ! (((( EMERGENCY EXIT )))) & ! & 31010 DEF FNEXIT% & 31020 ESCAPE% = 0% & 31030 PRINT CLEAR$ & 31035 ON ERROR GO TO 31250 & 31040 OPEN "KB:" AS FILE #1%, MODE 16% & ! Mode 16 to disable ^C. & 31050 Z$ = SYS(CHR$(3%) + CHR$(1%)) \ & Z$ = SYS(CHR$(11%) + CHR$(1%)) & ! Cancel the echo and type ahead. & 31120 PRINT #1% FOR CLR% = 1% TO 3% & 31130 PRINT #1% BELL$ & 31140 PRINT #1% TAB(6);"(((( Sorry there is no room left "; \ & PRINT #1% "for you in the Alarm file ))))" & 31145 S$ = TAB(10) & ! S$ was set in order to save space on the screen. & 31150 PRINT #1% & \ PRINT #1% & \ PRINT #1% S$;"Hello, I am David (Erasmo David Rosales). I am the author" & \ PRINT #1% & \ PRINT #1% S$;" of this program. When I wrote this program, I didn't" & \ PRINT #1% & \ PRINT #1% S$;" expect this program to have such a great demand." & \ PRINT #1% & \ PRINT #1% S$;" So, I only allocated space for fifty people," & \ PRINT #1% & \ PRINT #1% S$;" who can't keep track of time." & \ PRINT #1% & \ PRINT #1% S$;"Please inform the computer center manager of this problem." & \ PRINT #1% FOR CLR% = 1% TO 2% & 31200 INPUT #1%, FREEZE$ & 31210 ESCAPE% = ESCAPE% + 1% & 31220 IF ESCAPE% >= 30% & THEN & Z$ = SYS(CHR$(2%) + CHR$(1%)) \ & CLOSE #1% \ & GOTO 32767 & ! Return the echo and then exit the program. & 31230 IF CVT$$(FREEZE$,32%) = "ERASMO DAVID ROSALES" & THEN & Z$ = SYS(CHR$(2%) + CHR$(1%)) \ & CLOSE #1% \ & GOTO 32767 & ! Return the echo and then exit the program. & 31240 GOTO 31030 & 31250 ! Error routine for FNEXIT% & 31260 IF ERR > 0% THEN RESUME 31030 & ! On any error go to the begining of this function. & 31300 FNEND & 32767 END !r 2? 2 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & ! This software is furnished under no license and may be used & ! and copied in accordance with the nonexistent terms of such & ! license and with or without the inclusion of the above & ! copyright notice. This software or any other copies thereof & ! may be provided or otherwise made available to any other & ! person. & ! & ! The information in this software is subject to change without & ! notice and should not be construed as a commitment by & ! Whittier College or the author. This software is & ! unconditionally guaranteed to perform without error the & ! purpose for which it is intended. Said purpose is to remain & ! the secret of the author and is subject to change without & ! notice and at the whim of the author. & ! & ! Whittier College assumes no responsibility for the use or & ! reliability of its software on equipment that is not supplied & ! by Whittier College. Whittier College supplies no equipment. & ! & ! This program was written for internal use and has not been & ! been significantly modified for export. You may need to make & ! changes to fit your system or needs. If you have any problems & ! please contact: & ! & ! David Rosales & ! Whittier College, Computer Center & ! Whittier CA 90601 & ! (213) 693-0771 ext 287 & ! & 10 EXTEND & 30 ! & ! ALARM0 & ! & ! The Whittier College Alarm Manager. & ! & ! & 35 ! & ! EDIT DATE CHANGES MADE & ! & ! AUG/1/1983 Finished writing this program. & ! Changed by: Erasmo David Rosales. & ! & ! & ! ???/?/19?? ????? ????? ????? ????? ????? ????? ????? & ! Changed by: ?????? ????? ???????. & ! & 50 ! & ! ALARM0 & ! & ! This program reads the file generated by the ALARM & ! program. This progam finds the specified time in & ! the file, when it is time to send an alarm message & ! this program reads the rest of the information and & ! sends the message to the correct keyboard. & ! & ! & ! The format of the message is: & ! & ! "***************************************************" & ! ((Beep)) & ! "***************************************************" & ! ((Beep)) & ! "***************************************************" & ! ((Beep)) & ! & ! "Name of user," + It is TIME$(0%) & ! "Reason for alarm." & ! & ! ((Beep)) & ! "***************************************************" & ! ((Beep)) & ! "***************************************************" & ! ((Beep)) & ! "***************************************************" & ! & ! & 75 ! Detach the job......... \ & PRINT FOR CLR% = 1% TO 5% \ & PRINT "Detached." \ & Z$ = SYS(CHR$(6%) + CHR$(7%)) & 100 !************************************************************* & ! & ! Initialize ERROR routine and CONSTANTS. & ! & 150 DIM #1%, NAME2$(50%) = 32% , & ALARMTIM2$(50%) = 16% , & KBNUM2%(50%) , & REASON2$(50%) = 128% \ & NUM.OF.PLACES% = 50% & ! If the data file containing the user's information & ! keeps getting filled up and you want to expand the & ! size of the array you must set NUM.OF.PLACES% to & ! the size of the dimension. & 340 BELL$ = STRING$(4%,7%) & 500 ON ERROR GOTO 19000 & 1000 !************************************************************** & ! & ! Search through all the places in the array. & ! & 1010 SLEEP.TIME% = 600% & ! Set the initial value of SLEEP.TIME% to 600. & ! 600 seconds is ten minutes. & ! Later in the program this value will change if the & ! next alarm time will occur in less than 600 seconds. & 1020 OPEN "ALARM.VIR [1,2]" FOR INPUT AS FILE #1% \ & CLOSE #1% & ! Open the file for input to see if it exists. & 1030 IF NOT.FOUND% & THEN & GOTO 1300 & ! Sleep 10 minutes if the file can not be found. & ! When someone needs the alarm they will run & ! ALARM and the file will then be created. & 1040 FOR POINTER% = 1% TO NUM.OF.PLACES% & 1050 OPEN "[1,2] ALARM.VIR" AS FILE #1% \ & G.TIME$ = ALARMTIM2$(POINTER%) \ & CLOSE #1% & ! Get the given time from the array file. & 1070 IF G.TIME$ = "" & THEN & GOTO 1250 & ! If G.TIME$ is blank then look at the next given time. & 1080 G.TIME% = FNCVT%(G.TIME$) & ! Convert the given time into minutes since midnight. & 1100 COMP.TIME% = TIME(0%) / 60% & ! Convert the computer time into minutes since midnight. & 1120 IF COMP.TIME% >= G.TIME% AND COMP.TIME%-10% <= G.TIME% & THEN & Z% = FNALARM%(POINTER%) \ GOTO 1250 & ! If it is time to alarm it extecutes the ALARM FUNCTION. & ! After executing the alarm look at the next given time. & 1140 GOSUB 3000 & ! This subroutine looks ten minutes into the future, & ! checking to see if this setting should be executed & ! within the next ten minutes. & 1200 IF TEMP.SLEEP.TIME% > 0% & AND & TEMP.SLEEP.TIME% < SLEEP.TIME% & THEN & SLEEP.TIME% = TEMP.SLEEP.TIME% & 1250 NEXT POINTER% & 1270 IF SLEEP.TIME% = 0% & THEN & SLEEP.TIME% = 600% & ! If there is nothing to wake up for within the next ten & ! minutes then the program will sleep ten minutes. & 1300 SLEEP SLEEP.TIME% & ! Sleep for some time before searching the array again. & 1400 GOTO 1000 & ! Search the array again. & 3000 !************************************************************** & ! & ! This SUBROUTINE looks ahead ten minutes for & ! an alarm setting that may be set for a time & ! within the next ten minutes. & ! & 3080 FOR COMPARE% = 1% TO 10% & ! Set up a loop to make 10 comparisons of the given & ! and computer time. These comparisons are to see if & ! this alarm time will take place within ten minutes. & 3100 ADD.TIME% = COMP.TIME% + COMPARE% & ! This gives ADD.TIME% the value of the COMP.TIME% & ! plus COMPARE%. & 3110 IF G.TIME% = ADD.TIME% & THEN & TEMP.SLEEP.TIME% = COMPARE% * 45% & ELSE & TEMP.SLEEP.TIME% = 0% & ! If the alarm time will take place within & ! (COMPARE%) minutes then TEMP.SLEEP.TIME% & ! is given the value of seconds less than that & ! of (COMPARE%) minutes. & 3130 IF TEMP.SLEEP.TIME% > 0% & THEN & GOTO 3200 & ! If the time until the next alarm time is found then & ! exit this loop. (why keep looking if you found it.) & 3150 NEXT COMPARE% & 3200 RETURN & 10000 ! & ! This function coverts the time into the number of & ! minutes since midnight. The value is returned in & ! integer form. & ! & 10020 DEF FNCVT%(ARG$) & 10040 HOUR$ = LEFT(ARG$,2%) \ & HOUR% = VAL(HOUR$) \ & MIN$ = MID(ARG$,4%,2%) \ & MIN% = VAL(MIN$) & ! Get the values for the given hours and minutes & ! in string and numeric form. & 10050 MIDNIGHT% = INSTR(1%,ARG$,"MIDNIGHT") & ! Find the word MIDNIGHT in the given time. & 10060 PM% = INSTR(1%,TIME$(0%),"PM") & ! Find "PM" in the given time. & 10080 IF MIDNIGHT% > 0% & THEN & HOUR% = 0% & ! If it is MIDNIGHT then the value for the time is 0%. & 10100 IF PM% > 0% AND HOUR% <> 12% & THEN & HOUR% = HOUR% + 12% & ! If it is 1:00 PM or later then add 12 to the hour to & ! convert to the number of hours since midnight. & 10130 TOTAL% = (60 * HOUR%) + MIN% & ! Total minutes since midnight. & 10150 FNCVT% = TOTAL% & ! Return the total minutes since midnight in the function. & 10500 FNEND & 11000 ! & ! This function does the work of getting the attention & ! of the user and sending the message and then beeping & ! a few more times after the message is sent. & ! & 11020 DEF FNALARM%(POINT%) & 11040 OPEN "[1,2] ALARM.VIR" AS FILE #1% & 11050 NAME1$ = NAME2$(POINT%) \ & KB% = KBNUM2%(POINT%) \ & REASON1$ = REASON2$(POINT%) & ! Get the values of the information used. & 11060 CLOSE #1% & 11070 MESSAGE1$ = NAME1$ + " , " + " IT IS " + TIME$(0%) + "." & 11200 Z$ = FNCVT.MESSAGE$(REASON1$) & ! Make three parts out of the reason. So the message & ! may be printed as PART1$, PART2$ and PART3$. & 11220 Z% = FNNOISE%(KB%) & ! Send many beeps and rows of asteriks to the keyboard. & 11240 Z% = FNSEND%(MESSAGE1$,KB%) \ & Z% = FNSEND%(PART1$,KB%) & ! Send (name it is whatever O'clock.) & ! Send (Part one of the user's message.) & 11245 IF PART2$ <> "" & THEN & Z% = FNSEND%(PART2$,KB%) & ! Send PART2$ to the keyboard if it exists. & 11250 IF PART3$ <> "" & THEN & Z% = FNSEND%(PART3$,KB%) & ! Send PART3$ to the keyboard if it exists. & 11260 Z% = FNNOISE%(KB%) & ! Send many beeps and rows of asteriks to the keyboard. & 11280 PRO.VIO.COUNT% = 0% & ! Reset the counter that counts the number of protection & ! violations generated by the writing to the alarm file. & 11300 OPEN "[1,2] ALARM.VIR" AS FILE #1% & 11320 NAME2$(POINT%) = "" \ & ALARMTIM2$(POINT%) = "" \ & KBNUM2%(POINT%) = 0% \ & REASON2$(POINT%) = "" & ! Erase the information after it has been used. & 11340 CLOSE #1% & 11400 FNEND & 11500 ! & ! This function sends given information to a given keyboard. & 11520 DEF FNSEND%(INFO$,KB%) & 11530 RETURN1$ = CHR$(13%) + CHR$(10%) & 11540 INFO$ = STRING$(15%,32%) + INFO$ + STRING$(80%,32%) \ & INFO$ = LEFT(INFO$,80%) + RETURN1$ & ! Make the information 80 characters long by filling & ! it with spaces and ending it with a . & 11550 Z$ = SYS(CHR$(6%) + CHR$(-5%) + CHR$(KB%) + INFO$ ) & ! Execute the send using the system function. & 11560 FNEND & 11600 ! & ! This function sends many beeps and rows of asteriks & ! to the keyboard being alarmed. & 11610 DEF FNNOISE%(KB%) & 11620 STAR$ = STRING$(5%,7%) + STRING$(75%,42%) + STRING$(5%,32%) & ! This is 5 beeps + 75 asteriks + 5 spaces. & 11630 STAR$ = STAR$ + CHR$(13%) + CHR$(10%) & ! Add a carriage return and a line feed to STAR$. & 11640 BLANK.LINE$ = STRING$(80%,32%) + (CHR$(13%) + CHR$(10%)) & ! This is a blank line with a carriage return and line feed. & 11650 FOR BEEP% = 1% TO 2% & 11660 Z$ = SYS(CHR$(6%) + CHR$(-5%) + CHR$(KB%) + BLANK.LINE$) & ! Send a blank line. & 11670 Z$ = SYS(CHR$(6%) + CHR$(-5%) + CHR$(KB%) + STAR$) & ! Send some beeps and a row of asteriks. & 11675 SLEEP 1% & 11680 NEXT BEEP% & 11690 Z$ = SYS(CHR$(6%) + CHR$(-5%) + CHR$(KB%) + BLANK.LINE$) & ! Send a blank line. & 11700 FNEND & 12800 ! & ! This function converts the message into three parts. & ! & 12810 DEF FNCVT.MESSAGE$(REASON$) & 12815 REASON$ = REASON$ + " " & ! This adds a space to the end to define the end of the string. & 12820 LONG% = LEN(REASON$) & ! Find the length. The length determines how many & ! whole parts can be made out of the reason. & 12830 IF LONG% <= 43% GOTO 12870 & 12840 IF LONG% <= 85% GOTO 12860 & 12850 POSIT1% = INSTR(43%,REASON$," ") \ & POSIT2% = INSTR(85%,REASON$," ") \ & PART1$ = LEFT(REASON$,POSIT1%) \ & PART2$ = MID(REASON$,POSIT1% + 1%,POSIT2% - POSIT1%) \ & PART3$ = RIGHT(REASON$,POSIT2% + 1%) \ & GOTO 12880 & ! This gives three parts. & 12860 POSIT1% = INSTR(43%,REASON$," ") \ & PART1$ = LEFT(REASON$,POSIT1%) \ & PART2$ = RIGHT(REASON$,POSIT1% + 1%) \ & PART3$ = "" \ & GOTO 12880 & ! This gives two parts. & 12870 PART1$ = REASON$ \ & PART2$ = "" \ & PART3$ = "" & ! This gives one part. & 12880 FNEND & 19000 !************************************************************** & ! & ! ERROR ROUTINE & ! & 19010 ! * * * * * * * & ! Expected Errors WITHOUT error line numbers & ! * * * * * * * & 19030 IF ERR = 10 AND PRO.VIO.COUNT% < 100% & THEN & PRO.VIO.COUNT% = PRO.VIO.COUNT% + 1% \ & SLEEP 1% \ & RESUME & ! Stall the program for a second when a protection violation & ! error is generated. A protection violation error will be & ! generated when two jobs try to access the same block in & ! the ALARM.VIR file. To avoid an infinite loop this error & ! trap only allows 100 of these errors. & 19050 IF ERR = 10 AND PRO.VIO.COUNT% >= 100% & THEN & OPEN "[1,2]ALARM.DIE" AS FILE 11%, MODE 2% \ & PRINT 11%, DATE$(0%);TIME$(0%) \ & CLOSE 11% \ & CHAIN "[1,2]ALARM0" LINE 100 & ! If a hundred or more protection violations are generated & ! then the program starts over (really starts over). & ! Keep track of the times this happens. & 19100 ! * * * * * * * & ! Expected Errors WITH error line numbers & ! * * * * * * * & 19120 ! ?Can't find file or account \ & IF ERR = 5 AND ERL = 1020 & THEN & NOT.FOUND% = -1% \ & RESUME 1030 & ! Can't find the ALARM.VIR file when it is opened for input. & 19980 ! * * * * * * * & ! Unexpected errors & ! * * * * * * * & 19985 Z$ = SYS(CHR$(6%)+CHR$(9%)+CHR$(ERR)) & 19990 ERROR$ = RIGHT(Z$,3%) & 19995 PRINT BELL$ \ & PRINT " Oh no !! Not another "; ERROR$ \ & PRINT " at line";ERL;"in program ALARM0 !!" & 19999 GOTO 32767 & 32767 END Od 2? 10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & !If you have any problems or questions please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 13 ! & !This software is unconditionally guaranteed to perform without & !error the purpose for which it is intended. Said purpose is & !to remain the secret of the author and is subject to change & !without notice and at the whim of the author. & ! 20 ! & ! WCWP & ! & !The Whittier College Word Processor. & ! 21 ! & ! & ! 22 ! EDIT DATE REASON & ! 07/22/83 Version number in previous line removed & ! 08/22/83 Spelling of "previous" in line above corrected & ! 80 !Z$ = SYS(CHR$(6%)+CHR$(-7%)) !^C trap 90 ON ERROR GOTO 9000 100 ! & !preliminaries and message & ! 110 GOSUB 1000 200 ! & !find out what to process & ! 210 PRINT \ & PRINT "What word do you want to process"; \ & INPUTLINE WORD$ \ & WORD$ = CVT$$(WORD$,4%+8%+128%) & !trash leading, trailing spaces and junk 220 IF WORD$ = "" & THEN WORD$ = "Default" \ & PRINT \ & PRINT "Your word is: Default" \ & PRINT 230 IF FNCHECK%(WORD$) & THEN PRINT \ & GOTO 300 240 PRINT BELL$; "That is not a word." 250 GOTO 210 300 ! & !list and get options & ! 310 GOSUB 2000 400 ! & !do the option & ! 410 IF OPTION% = 10% & THEN GOTO 900 & !EXIT option 420 ON OPTION% GOSUB & 11000, 12000, 13000, 14000, 15000, 16000, 17000, 18000, 19000 & !ALPHA, COMPR, REVER, UPPER, LOWER, JUSTI, CENTE, SPELL, SAVE 430 PRINT "Your word is now:" \ & PRINT WORD$ \ & PRINT 500 ! & !repeat & ! 510 GOTO 300 900 ! & !exit option & ! 910 PRINT 990 GOTO 32767 1000 ! & ! & ! SUBROUTINE: Preliminaries & ! & ! 1100 ! & !some constants & ! 1110 BELL$ = CHR$(7%) 1120 TRUE% = -1% \ & FALSE% = 0% 1130 OPTLIST$ = "ALP*COM*REV*UPP*LOW*JUS*CEN*SPE*SAV*EXI*" 1140 ALPHABET$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZ'-" 1900 ! & !who is this & ! 1910 PRINT \ & PRINT "WCWP Whittier College Word Processor"; 1920 RANDOMIZE 1930 T% = INT ( ( 24*60*60 - TIME(0%) ) / 60% - 1% ) \ & PRINT TAB(64%);TIME$(T%+1%+INT(RND*5%)) 1990 RETURN 2000 ! & ! & ! SUBROUTINE: Get option & ! & ! 2100 ! & !list them & ! 2110 PRINT \ & PRINT "The options are:" \ & PRINT \ & PRINT "ALPHA to arrange the letters in alpabetical order" \ & PRINT "COMPRESS to delete duplicate letters" \ & PRINT "REVERSE to reverse the order of the letters" \ & PRINT "UPPER to capitalize all letters" \ & PRINT "LOWER to change to lower case" \ & PRINT "JUSTIFY to justify" \ & PRINT "CENTER to center" \ & PRINT "SPELLING to determine if the spelling is correct" \ & PRINT "SAVE to save the word to a file" \ & PRINT "EXIT to leave the program" \ & PRINT 2200 ! & !get the option & ! 2210 INPUT "Your option"; OPTION$ 2220 IF OPTION$ = "" THEN OPTION$ = "EXIT" 2230 OPTION$ = CVT$$(OPTION$,2%+4%+32%) & !get rid of spaces and junk; capitalize 2240 OPTION$ = LEFT(OPTION$,3%) + "*" 2300 ! & !see if the option is valid & ! 2310 LOC% = INSTR(1%,OPTLIST$,OPTION$) 2320 IF LOC% = 0% & THEN PRINT BELL$;"The option you specified is not one of those listed." \ & GOTO 2100 2400 ! & !if valid, convert to number & ! 2410 OPTION% = 1% + ( LOC% - 1% ) / 4% 2990 RETURN 8000 ! & ! & ! FUNCTIONS & ! & ! 8100 ! & !capitalize. (works for a single letter or a word) & ! 8110 DEF FNUPPER$(A$) = CVT$$(A$,32%) 8200 ! & !convert to lower case. Designed for one letter only. & ! 8210 DEF FNLOWER$(A$) 8220 FNLOWER$ = A$ 8230 IF A$ = "'" THEN GOTO 8290 8240 IF A$ = FNUPPER$(A$) & THEN FNLOWER$ = CHR$(ASCII(A$)+32%) 8290 FNEND 8300 ! & !Check to see if argument is a real word & ! 8310 DEF FNCHECK%(WORD$) 8320 FNCHECK% = TRUE% 8330 WORD$ = CVT$$(WORD$,32%) !convert lower case to upper case 8340 FOR CH% = 1% TO LEN(WORD$) 8350 IF INSTR(1%,ALPHABET$,MID(WORD$,CH%,1%)) & THEN GOTO 8360 8360 NEXT CH% 8390 FNEND 8400 ! & !check for proper order & ! 8410 DEF FNBEFORE%(A$,B$) 8420 FNBEFORE% = TRUE% 8430 IF FNUPPER$(A$) < FNUPPER$(B$) & THEN GOTO 8490 & !different letters in correct order: done 8440 IF FNUPPER$(A$) > FNUPPER$(B$) & THEN FNBEFORE% = FALSE% \ & GOTO 8490 & !different letters in wrong order: return false 8450 IF A$ > B$ & THEN FNBEFORE% = FALSE% & !same letter but first is lower case, second upper. & !program considers them in wrong order. 8490 FNEND 9000 ! & ! & ! Error Routine & ! & ! 9100 ! & !^C and ^Z errors & ! 9110 !IF ERR = 28 & !OR ERR = 11 & !THEN Z$ = SYS(CHR$(6%)+CHR$(-7%)) \ & ! RESUME 9200 ! & !Expected errors (by line number) & ! 9210 IF ERL = 19130 THEN RESUME 19200 & !SAVE file wasn't there 9600 ! & !Expected errors (with no specific line number) & ! 9900 ! & !Unexpected errors & ! 9910 Z$ = SYS(CHR$(6%)+CHR$(9%)+CHR$(ERR)) 9920 ERROR$ = RIGHT(Z$,3%) 9930 PRINT " ***** O No! *****" \ & PRINT " "; ERROR$; " at line";ERL \ & PRINT " Please do not consult author." 9990 GOTO 32767 11000 ! & ! SUBROUTINE: ALPHA Option & ! 11010 FOR RPT% = 1% TO LEN(WORD$) - 1% 11020 FOR C% = 1% TO LEN(WORD$) - RPT% 11130 IF FNBEFORE%(MID(WORD$,C%,1%),MID(WORD$,C%+1%,1%)) & THEN GOTO 11150 11140 WORD$ = LEFT(WORD$,C%-1%) + MID(WORD$,C%+1%,1%) & + MID(WORD$,C%,1%) + RIGHT(WORD$,C%+2%) 11150 NEXT C% 11160 NEXT RPT% 11990 RETURN 12000 ! & ! SUBROUTINE: COMPRESS Option & ! 12010 FOR C% = 1% TO LEN(WORD$) 12020 C$ = MID(WORD$,C%,1%) 12030 IF C$ = "" THEN 12060 12040 J% = INSTR(C%+1%,WORD$,FNUPPER$(C$)) \ & IF J% <> 0% & THEN WORD$ = LEFT(WORD$,J%-1%) + "" + RIGHT(WORD$,J%+1%) \ & GOTO 12030 12050 J% = INSTR(C%+1%,WORD$,FNLOWER$(C$)) \ & IF J% <> 0% & THEN WORD$ = LEFT(WORD$,J%-1%) + "" + RIGHT(WORD$,J%+1%) \ & GOTO 12030 12060 NEXT C% 12070 WORD$ = CVT$$(WORD$,4%) 12990 RETURN 13000 ! & ! SUBROUTINE: REVERSE Option & ! 13010 T$ = WORD$ \ & WORD$ = "" 13020 FOR C% = 1% TO LEN(T$) 13030 WORD$ = LEFT(T$,1%) + WORD$ 13040 T$ = RIGHT(T$,2%) 13050 NEXT C% 13990 RETURN 14000 ! & ! SUBROUTINE: UPPER Option & ! 14010 WORD$ = CVT$$(WORD$,32%) 14990 RETURN 15000 ! & ! SUBROUTINE: LOWER Option & ! 15010 T$ = WORD$ \ & WORD$ = "" 15020 FOR C% = 1% TO LEN(T$) 15030 WORD$ = WORD$ + FNLOWER$(MID(T$,C%,1%)) 15040 NEXT C% 15990 RETURN 16000 ! & ! SUBROUTINE: JUSTIFY Option & ! 16010 PRINT "Justification for this program is available from the author on request." \ & PRINT 16990 RETURN 17000 ! & ! SUBROUTINE: CENTER Option & ! 17010 LENG% = LEN(WORD$) 17020 IF LENG% / 2% * 2% = LENG% & THEN PRINT BELL$;"The word has no center." \ & RETURN 17030 INPUT "Letter to put at the center"; A$ 17040 IF A$ = "" THEN RETURN 17050 IF LEN(A$) > 1% & THEN PRINT BELL$;"One letter only." \ & GOTO 17030 17060 LETTER% = INSTR(1%,WORD$,A$) 17070 IF LETTER% = 0% & THEN PRINT "That letter doesn't appear in the word." \ & RETURN 17080 CENTER% = LENG% / 2% + 1% 17090 IF LETTER% <= CENTER% & THEN WORD$ = RIGHT(WORD$,LENG%-CENTER%+LETTER%+1%) & + LEFT(WORD$,LENG%-CENTER%+LETTER%) & ELSE WORD$ = RIGHT(WORD$,LETTER%-CENTER%+1%) & + LEFT(WORD$,LETTER%-CENTER%) 17990 RETURN 18000 ! & ! SUBROUTINE: SPELLING Option & ! 18100 ! & !get the right spelling & ! 18110 PRINT \ & PRINT "What is the correct spelling of your word"; \ & INPUTLINE CORRECT$ \ & CORRECT$ = CVT$$(CORRECT$,4%+8%+128%) & !trash leading, trailing spaces and junk 18200 ! & !convert to upper case for comparison & ! 18210 TWORD$ = CVT$$(WORD$,32%) 18220 CORRECT$ = CVT$$(CORRECT$,32%) 18300 ! & !do the comparison & ! 18310 IF TWORD$ = "RELIEF" AND CORRECT$ = "ROLAIDS" & OR TWORD$ = "ROLAIDS" AND CORRECT$ = "RELIEF" & THEN GOTO 18500 18320 IF TWORD$ = CORRECT$ & THEN GOTO 18500 18400 ! & !not correct & ! 18410 PRINT "Your word is not spelled correctly." 18420 RETURN 18500 ! & !correct & ! 18510 PRINT "Your word is spelled correctly." 18990 RETURN 19000 ! & ! SUBROUTINE: SAVE Option & ! 19100 ! & !find out the name of the file and try to open it & ! 19110 PRINT "Name of file in which to save the word"; 19120 INPUTLINE FILE$ \ & FILE$ = CVT$$(FILE$,-1%) & !do all the conversions 19130 OPEN FILE$ FOR INPUT AS FILE #1% & !if there was an error above, program will go to 19200 19140 GOTO 19300 19200 ! & !file wasn't there & ! 19210 PRINT BELL$; 19220 PRINT "File doesn't exist." 19230 RETURN 19300 ! & !file was there & ! 19310 PRINT BELL$; 19320 INPUT "File already exists. Is it okay to replace it"; ANSWER$ 19330 ANSWER$ = CVT$$(LEFT(ANSWER$,1%),-1%) 19340 IF ANSWER$ = "Y" & THEN GOTO 19400 & ELSE RETURN 19400 ! & !are you sure & ! 19410 FOR REALLY% = 0% TO 5% 19420 PRINT "Are you"; \ & PRINT " really"; IF REALLY% > 0% \ & PRINT ", really"; FOR R% = 1% TO REALLY% - 1% \ & PRINT " sure you want to delete it"; 19430 INPUT ANSWER$ \ & ANSWER$ = CVT$$(LEFT(ANSWER$,1%),-1%) 19440 IF ANSWER$ <> "Y" THEN RETURN 19450 NEXT REALLY% 19500 ! & !they are sure & ! 19510 KILL FILE$ 19520 PRINT "The file has been deleted." 19990 RETURN 32767 PRINT "Ready" \ & PRINT \ & Z$ = SYS(CHR$(5%)) \ & END d^W 2?10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 13 ! & ! Files with names like ??????.??? or .......... are hard & !to work with. So are files whose names begin with blanks. & !You can even give two files the same name. Make this program & !available at your own risk. & ! 20 ! & ! ODDNAM & ! & !A program to change the name of a file. & !Unlike PIP and other programs, this program directly accesses & !the UFD. It can therefore give a file a name which contains & !characters such as . or ? (or any other radix50 characters). & ! & !See UFD.BAS or UFD.DOC for details on how the program works & ! 100 ! & !Get the account number & ! 110 PRINT "Account number"; \ & INPUTLINE PPN$ \ & PPN$ = CVT$$(PPN$,-1%) 120 IF PPN$ = "" THEN GOTO 900 130 BRACKET% = INSTR(1%,PPN$,"[") \ & IF BRACKET% = 0% & THEN PPN$ = "[" + PPN$ + "]" 200 ! & !starting disk & ! 210 DISK$ = "DR0:" 300 ! & !get name of file & ! 310 INPUT "File name"; FILE$ 320 IF FILE$ = "" THEN GOTO 100 330 FILE$ = CVT$$(FILE$,32%) 400 ! & !open up and dimension the UFD; get cluster size & ! 410 OPEN DISK$ + PPN$ FOR INPUT AS FILE #1%, MODE 16384% 420 DIM #1%, U%(3583%,7%) & !up to 3584 blockettes of 8 words each 430 CLU% = U%(31%,0%) 500 ! & !look through name blockettes for it and process & ! 510 PTR% = FNLINK%(U%(0%,0%)) & !first word of first blockette is a link to first NB 520 IF PTR% = 0% THEN GOTO 600 !a zero pointer is end of NB's 530 TFILE$ = RAD$(U%(PTR%,1%)) + RAD$(U%(PTR%,2%)) + "." & + RAD$(U%(PTR%,3%)) 540 TFILE$ = CVT$$(TFILE$,2%) 550 IF TFILE$ = FILE$ & THEN GOSUB 2000 \ & GOTO 200 560 PTR% = FNLINK%(U%(PTR%,0%)) !get link to next NB 570 GOTO 520 600 ! & !couldn't find the file on DR0: & ! 610 IF DISK$ = "DR0:" & THEN DISK$ = "DR6:" \ & GOTO 400 900 ! & !done & ! 910 CLOSE #1% 920 GOTO 32767 2000 ! & ! & ! SUBROUTINE: Print data for current file & ! & ! 2200 ! & !ask new file name & ! 2210 PRINT "New name"; \ & INPUTLINE NEWNAME$ \ & NEWNAME$ = CVT$$(NEWNAME$,4%+32%) 2220 NEWNAME$ = LEFT(NEWNAME$ + " ",6%) 2230 PRINT "New extension"; \ & INPUTLINE NEWEXT$ \ & NEWEXT$ = CVT$$(NEWEXT$,4%+32%) 2240 NEWEXT$ = LEFT(NEWEXT$ + " ",3%) 2300 ! & !change it & ! 2310 U%(PTR%,1%) = FNRAD50%(LEFT(NEWNAME$,3%)) 2320 U%(PTR%,2%) = FNRAD50%(RIGHT(NEWNAME$,4%)) 2330 U%(PTR%,3%) = FNRAD50%(NEWEXT$) 2900 RETURN 8000 ! & ! & ! FUNCTIONS & ! & ! 8010 ! & !convert link word to Blockette number & ! & !bits 9 to 11 are the cluster number. The first line gets & ! these bits and multiplies by cluster size & !bits 12 to 15 are block number. The next line gets these and & ! multiplies by 32 (number of blockettes per block) & !bits 4 to 8 are the blockette number. The last line adds & ! this. & !the other bits of the link are not relevant here & ! 8020 DEF FNLINK%(L%) = & ((( L% AND 3584%) / 512% ) * CLU% & + ( SWAP%( L% AND -4096% ) / 16% )) * 32% & + (( L% AND 496%) / 16%) 8100 ! & !convert three character string to RAD50 & !illegal characters are changed to blanks and a flag is set & ! 8110 DEF FNRAD50%(S$) 8115 T% = 0% 8120 FOR I% = 1% TO 3% 8125 S% = ASCII(LEFT(S$,1%)) \ & S$ = RIGHT(S$,2%) 8130 IF 65% <= S% AND S% <= 90% & THEN S% = S% - 64% \ & GOTO 8175 8135 IF 48% <= S% AND S% <= 57% & THEN S% = S% - 18% \ & GOTO 8175 8140 IF S% = 32% & THEN S% = 0% \ & GOTO 8175 8145 IF S% = 36% & THEN S% = 27% \ & GOTO 8175 8150 IF S% = 46% & THEN S% = 28% \ & GOTO 8175 8155 IF S% = 63% & THEN S% = 29% \ & GOTO 8175 8170 ILLEGALCHARACTER% = -1% \ & FNRAD50% = 0% \ & GOTO 8190 8175 T% = T% * 40% + S% 8180 NEXT I% 8185 FNRAD50% = T% 8190 FNEND 32767 END <@ 2?10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 13 !***************************************************************& !***************************************************************& ! & ! W A R N I N G & ! & ! This is a dangerous program. If someone should manage to & !modify a privileged program, one of the ways to detect the & !change is by creation date. This program makes it easier to & !cover up one's tracks. & ! & !***************************************************************& !***************************************************************& 20 ! & ! DATE & ! & !A program to set the access date and date and time of creation & !for files. & ! & !This program is similar to the one called UFD. Look to that & !program for a description of the UFD. & ! 100 ! & !some data for conversions & ! 110 DIM MON%(12%) 120 DATA 0,31,59,90,120,151,181,212,243,273,304,334 130 MAT READ MON% 140 DIM MON$(12%) 150 DATA JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC 160 MAT READ MON$ 200 ! & !Get the account number & ! 210 PRINT "Account number"; \ & INPUTLINE PPN$ \ & PPN$ = CVT$$(PPN$,-1%) 220 IF PPN$ = "" THEN GOTO 900 230 DEVICE$ = "" 240 COLON% = INSTR(1%,PPN$,":") \ & IF COLON% <> 0% & THEN DEVICE$ = LEFT(PPN$,COLON%) \ & PPN$ = RIGHT(PPN$,COLON%+1%) 250 BRACKET% = INSTR(1%,PPN$,"(") \ & IF BRACKET% = 0% & THEN PPN$ = "(" + PPN$ + ")" 300 ! & !open up and dimension the UFD; get cluster size & ! 310 OPEN DEVICE$ + PPN$ FOR INPUT AS FILE #1%, MODE 16384% 320 DIM #1%, U%(3583%,7%) & !up to 3584 blockettes of 8 words each 330 CLU% = U%(31%,0%) 400 ! & !get name of file & ! 410 INPUT "File name"; FILE$ \ & FILE$ = CVT$$(FILE$,-1%) 420 IF FILE$ = "" THEN GOTO 200 500 ! & !look through name blockettes for it and process & ! 510 PTR% = FNLINK%(U%(0%,0%)) & !first word of first blockette is a link to first NB 520 IF PTR% = 0% THEN GOTO 600 !a zero pointer is end of NB's 530 TFILE$ = RAD$(U%(PTR%,1%)) + RAD$(U%(PTR%,2%)) + "." & + RAD$(U%(PTR%,3%)) 540 TFILE$ = CVT$$(TFILE$,2%) 550 IF TFILE$ = FILE$ & THEN GOSUB 2000 \ & GOTO 400 560 PTR% = FNLINK%(U%(PTR%,0%)) !get link to next NB 570 GOTO 520 600 ! & !couldn't find the file & ! 610 PRINT "Can't find a file by that name." 620 GOTO 400 900 ! & !done & ! 910 CLOSE #1% 920 GOTO 32767 2000 ! & ! & ! SUBROUTINE: Do a single file & ! & ! 2100 ! & !Get data & ! 2110 AB% = FNLINK%(U%(PTR%,6%)) & !get location of Accounting Blockette 2120 PRINT ' '; DATE$(U%(AB%,1%)); !date of last access 2130 PRINT ' '; DATE$(U%(AB%,3%)); !date of creation 2140 PRINT ' '; TIME$(U%(AB%,4%)); !time of creation 2200 ! & !do they want to change it & ! 2210 INPUT " Any changes"; ANSWER$ \ & ANSWER$ = CVT$$(ANSWER$,-1%) \ & ANSWER$ = LEFT(ANSWER$,1%) 2220 IF ANSWER$ <> "Y" THEN RETURN 2300 ! & !make the changes & ! 2310 INPUT "Date of last access"; D$ 2320 U%(AB%,1%) = FNINVDATE%(D$) 2330 INPUT "Date of creation"; D$ 2340 U%(AB%,3%) = FNINVDATE%(D$) 2350 INPUT "Time of creation"; T$ 2360 U%(AB%,4%) = FNINVTIME%(T$) 2990 RETURN 8000 ! & ! & ! FUNCTIONS & ! & ! 8100 ! & !convert link word to Blockette number & ! & !bits 9 to 11 are the cluster number. The first line gets & ! these bits and multiplies by cluster size & !bits 12 to 15 are block number. The next line gets these and & ! multiplies by 32 (number of blockettes per block) & !bits 4 to 8 are the blockette number. The last line adds & ! this. & !the other bits of the link are not relevant here & ! 8110 DEF FNLINK%(L%) = & ((( L% AND 3584%) / 512% ) * CLU% & + ( SWAP%( L% AND -4096% ) / 16% )) * 32% & + (( L% AND 496%) / 16%) 8200 ! & !convert date to number & ! 8210 DEF FNINVDATE%(D$) 8220 D$ = CVT$$(D$,-1%) \ & DAY% = VAL(LEFT(D$,2%)) \ & MON$ = MID(D$,4%,3%) \ & YEAR% = VAL(RIGHT(D$,8%)) 8230 FOR M% = 1% TO 12% 8240 IF MON$(M%) = MON$ & THEN MON% = MON%(M%) \ & M1% = M% 8250 NEXT M% 8260 IF YEAR%/4%*4% = YEAR% & AND M1% > 2% & THEN MON% = MON% + 1% 8270 FNINVDATE% = ( YEAR% - 70 ) * 1000 + MON% + DAY% 8290 FNEND 8300 ! & !convert time to number & ! 8310 DEF FNINVTIME%(T$) 8320 T$ = CVT$$(T$,-1%) \ & T$ = "0" + T$ IF LEN(T$) = 6% \ & HOUR = VAL(LEFT(T$,2%)) \ & MIN = VAL(MID(T$,4%,2%)) \ & AP$ = MID(T$,6%,1%) 8330 T = HOUR * 60 + MIN \ & IF AP$ = "P" THEN T = T + 12 * 60 8380 FNINVTIME% = 24 * 60 - T 8390 FNEND 32767 END Yy 2?10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! SPY & ! & !This program allows a privileged user to determine the contents& !of another user's input and output buffers. & !This program may not work properly at ordinary priorities & !because the buffers involved are being changed as rapidly or & !more rapidly than this program can access them. Try +120 if & !you want. & ! 80 Z$ = SYS(CHR$(6%)+CHR$(-7%)) !^C trap 90 ON ERROR GOTO 9000 100 ! & !Preliminaries & ! 110 GOSUB 1000 120 INPUT "Job number to spy on"; JOB% 140 JOB% = JOB% * 2% 200 ! & !Go through jobs one at a time. (Since offsets are always in & !terms of job times two, JOB% is actually twice the job number. & ! 240 GOSUB 2000 900 ! & !done & ! 990 GOTO 32767 1000 ! & ! & ! SUBROUTINE: Preliminaries & ! & ! 1100 ! & !data from monitor tables, part one & ! 1110 DIM MT%(30%) \ & CHANGE SYS( CHR$(6%) + CHR$(-3%) ) TO MT% 1120 JOBTBL% = MT%(11%) + SWAP%( MT%(12%) ) 1130 JBSTAT% = MT%(13%) + SWAP%( MT%(14%) ) 1140 JBWAIT% = MT%(15%) + SWAP%( MT%(16%) ) 1200 ! & !data from moniter tables, part two & ! 1210 DIM MT2%(30%) \ & CHANGE SYS( CHR$(6%) + CHR$(-12%) ) TO MT2% 1220 FCBLST% = MT2%(29%) + SWAP%( MT2%(30%) ) 1230 LOGNAM% = MT2%(21%) + SWAP%( MT2%(22%) ) 1240 DEVNAM% = MT2%( 5%) + SWAP%( MT2%( 6%) ) 1250 DEVOKB% = MT2%( 9%) + SWAP%( MT2%(10%) ) 1990 RETURN 2000 ! & ! & ! SUBROUTINE: Handle one job number & ! & ! 2100 ! & !get some addresses & ! 2110 JDB% = PEEK( JOBTBL% + JOB% ) 2120 IF (JDB% = -1%) & OR (JDB% = 0%) & THEN RETURN & ELSE PRINT \ & PRINT "Job number"; JOB% / 2% & !-1% is end of job list, 0% means that job not active 2130 JDFLAG% = PEEK( JDB% + 2% ) 2140 JDB2% = PEEK( JDB% + 8% ) 2150 IOB% = PEEK(JDB%) \ & KB.DDB% = PEEK(IOB%) !kb is channel zero 2160 TTINTF% = PEEK( KB.DDB% + 30% ) \ & INTFAC% = TTINTF% AND 255% & !interface flag and interface code 2170 JDPPN% = PEEK( JDB2% + 24% ) \ & PROJ% = SWAP%(JDPPN%) AND 255% \ & PROG% = JDPPN% AND 255% 2180 PRINT "Account: "; \ & PRINT "["; NUM1$(PROJ%);",";NUM1$(PROG%);"]" 2200 ! & !is it detached?, logged in? What about privileges? & !is it a pseudo keyboard? & ! 2210 IF (PEEK( KB.DDB% + 2% ) AND 255% ) = JOB% & AND (PEEK( KB.DDB% + 6% ) AND 8192%) <> 0% & THEN UNIT% = SWAP%( PEEK( KB.DDB% + 2%) ) AND 255% & ELSE UNIT% = -1% & !check to see if KB's job number is this job's & !If not detached, then UNIT% is its device unit number & !otherwise set UNIT% to -1 to indicate it is detached 2215 IF UNIT% = -1% THEN RETURN & ELSE PRINT "Keyboard number"; UNIT% 2300 ! & !print the jobname & ! 2310 PRINT "Program running is: "; \ & PRINT RAD$(PEEK(JDB2%+12%)) + RAD$(PEEK(JDB2%+14%)) 2400 ! & !try to look in the buffers & ! 2410 GOSUB 3000 2420 GOTO 2410 2990 RETURN 3000 ! & ! & ! SUBROUTINE: Looking at small buffer control areas & ! & ! 3100 ! & !for output & ! 3110 EP% = PEEK( KB.DDB% + 10% ) \ & FP% = PEEK( KB.DDB% + 12% ) 3120 PRINT "OUTPUT: "; 3130 GOSUB 4000 3200 ! & !for input & ! 3210 EP% = PEEK( KB.DDB% + 18% ) \ & FP% = PEEK( KB.DDB% + 20% ) 3220 PRINT "INPUT: "; 3230 GOSUB 4000 3990 RETURN 4000 ! & ! & ! SUBROUTINE: Print out contents of buffers & ! & ! 4010 W$ = "" 4100 ! & !set an odd address flag and adjust if necessary & ! 4110 EFL% = ( ( EP% AND 1%) <> 0% ) 4120 IF EFL% THEN EP% = EP% - 1% 4200 ! & !go through the buffers & ! 4210 WHILE ( EP% <> FP% ) AND ( (EP% - 1%) <> FP% ) 4220 IF ( EP% AND 31% ) <> 0% & THEN W$ = W$ + CVT%$(SWAP%(PEEK(EP%))) \ & EP% = EP% + 2% \ & GOTO 4250 4230 IF EP% = 0% & THEN GOTO 4300 4240 EP% = PEEK(EP%-32%) 4250 NEXT 4300 ! & !adjust or odd addresses & ! 4310 W$ = RIGHT(W$,2%) IF EFL% 4320 W$ = LEFT(W$,LEN(W$)-1%) IF EP% > FP% & !the way the condition on the WHILE loop is set, the only way & !that EP% can fail to be equal to FP% at the end of the loop & !is if FP% is odd. In this case, the last character is not wanted 4400 ! & !print it & ! 4410 PRINT W$ 4990 RETURN 9000 ! & ! & ! Error Routine & ! & ! 9100 ! & !^C error & ! 9200 ! & !Expected errors (by line number) & ! 9600 ! & !Expected errors (with no specific line number) & ! 9900 ! & !Unexpected errors & ! 9910 Z$ = SYS(CHR$(6%)+CHR$(9%)+CHR$(ERR)) 9920 ERROR$ = RIGHT(Z$,3%) 9930 PRINT " ***** I can't handle this one *****" \ & PRINT " "; ERROR$; " at line";ERL 32767 END Ad 2? 10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! JUMP & ! & !A program to duplicate and extend the POISE supplied JUMP & !program. It has two basic purposes. One is for privileged & !users and the other is for people who need convenient access & !to accounts in one project. & ! 21 !privileged use: & ! & !like the DEC program, JUMP allows you to jump from a privileged& !account to another account. It has the following extensions. & ! (1) user may specify account with or without brackets & ! (2) account logicals are interpreted (see below) & ! (3) user may continue to jump to other accounts (even if the & ! current account is not privileged) as long as the first & ! jump was from a privileged account. This option is & ! explained below. & ! 22 ! & !Account logicals. & ! & !The file $LOGIN.DAT contains a list of account logicals. JUMP & !can use these logicals. & ! 23 ! & !continued JUMPing & ! & ! When a user first JUMPs from a privileged account, this & !program creates a file [1,3]JUMPnn.TMP (where nn is the job & !number) which contains the account number from which the user & !ran the program. As long as this file exists, the user with & !the job number specified in the files name will be able to use & !this program to JUMP to any account, even if he is not & !currently in a privileged account. 24 ! & !the BACK option & ! & ! Once a privileged user has used JUMP to jump from a & !privileged account, he may use JUMP BACK to return to that & !same priviledged account, no matter how many other accounts he & !has JUMPed to in between. & ! 25 ! & !the END option & ! & ! Although the original use of JUMP END was with the non- & !privileged option, it may also be used with the privileged & !version. JUMP END will delete the "permission" file in [1,3] & !so that the user will no longer be able to use JUMP. It is & !useful if you want to let someone else use the terminal but & !don't want them to have JUMP privileges. Since this option & !would usually be used in conjunction with a JUMP to the new & !users's account, it may be combined with an account number. & !For example, JUMP 10,1 END will sign the user into account & !1,10 and eliminate the ability to JUMP further. & ! 26 ! & !the project option & ! & ! To use this option: & !(1) A privileged user adds an entry in [1,3]JUMP.DAT in the & ! following format: proj,prog:proj2:pass & ! where proj,prog is the account from which the process & ! must be inititated (called the master account), & ! proj2 is the project within which the user can JUMP & ! freely (called the permission project) ,and & ! pass is the password needed by the user. & !(2) The user signs in to the master account & !(3) To jump to an account in the permission project, the user & ! need only specify the programmer number. & !(4) The first use of the program requires the password. & ! Thereafter, the user may continue to JUMP within the & ! permission account as long as he has the same job number. & ! & ! This option works by creating a file [1,3]J2MPnn.TMP & !(where nn is the job number). The file contains the permission& !project. It is created on the first use of the option (after & !the correct password is given). LOGIN should be modified to & !delete this file, as with the privileged option. & ! & ! Note that the master account need not be in the permission & !project. Note also that the password need not be the password & !to the master account. & ! 27 ! & !***************************************************************& !***************************************************************& ! & ! W A R N I N G & ! & ! This program operates by creating files in [1,3] with & !names of the form JUMPnn.TMP or J2MPnn.TMP, where nn is the & !job number of the user. It is the existence of these files & !which allows the JUMPing to work. If the files are not & !deleted, the next user who gets that job number will have the & !privilege of JUMPing. The JUMP END option will delete these & !files, but I recommend modifying LOGIN to delete them before & !signing the user into an account. (It is easier to modify & !LOGOUT but people can be signed out by too many other means & !(like UT KILL) to trust it. To the best of my knowledge, a & !modification to LOGIN is sufficient security, but I don't & !guarantee anything. & ! & !***************************************************************& !***************************************************************& ! 28 ! & !some "global" variables: & ! & ! JUMP$ the priveleged case permission file & ! J2MP$ the single project permission file & ! ARG$ although it starts out as the argument given by & ! the user, for most of the program it is that & ! argument converted to upper case with spaces & ! removed (and the other conversions). In the & ! case of double arguments (like in JUMP 8,1 END) & ! ARG$ will start as the whole argument but will & ! later have the second argument chopped off & ! ARG1$ the first character of ARG$ & ! 80 Z$ = SYS(CHR$(6%)+CHR$(-7%)) !^C trap 90 ON ERROR GOTO 9000 100 ! & !Preliminaries & ! 110 GOSUB 1000 200 ! & !get argument from core common (if there) & ! 210 Z$ = SYS(CHR$(7%)) \ & Z$ = CVT$$(Z$,-1%) 220 ARG$ = RIGHT(Z$,5%) \ & ARG1$ = LEFT(ARG$,1%) 300 ! & !get some background data & ! 310 JDB% = PEEK(520%) \ & PPN% = PEEK( PEEK( JDB% + 8% ) + 24% ) \ & PROJ% = SWAP%(PPN%) AND 255% \ & PROG% = PPN% AND 255% & !see description of monitor tables, for example [1,21]MONITO.DOC 320 JOB% = (PEEK(518%) AND 255%) / 2% & !ditto 330 JOB$ = NUM1$(JOB%) \ & IF LEN(JOB$) = 1% THEN JOB$ = "0" + JOB$ 340 JUMP$ = "[1,3]JUMP" + JOB$ + ".TMP" \ & J2MP$ = "[1,3]J2MP" + JOB$ + ".TMP" & !These files are used a lot. They are the permission files for & !the privileged and single project cases (respectively) 400 ! & !get the argument. (failure to specify argument is only & !allowed for the original use) & ! 410 IF PROJ% = 1% & AND ARG$ = "" & THEN PRINT "Account to jump to"; \ & INPUTLINE ARG$ \ & ARG$ = CVT$$(ARG$,-1%) \ & ARG1$ = LEFT(ARG$,1%) 420 IF ARG$ = "" & THEN GOTO 32700 & !If argument is not specified by now, usage is illegal 500 ! & !Parse and execute argument & ! 510 GOSUB 2000 900 ! & !done & ! 990 GOTO 32700 1000 ! & ! & ! SUBROUTINE: Initialize & ! & ! 1100 ! & !some constants & ! 1110 BELL$ = CHR$(7%) 1120 TRUE% = -1% \ & FALSE% = 0% 1990 RETURN 2000 ! & ! & ! SUBROUTINE: parse argument & ! & ! 2100 ! & !remove ( and ) if there (note that [ or ] was converted & !earlier. Assume at most one of each. (We are going to add & !them back later, but it is convenient to have them removed at & !this stage anyway.) & !If the account was not fully specified (for example, a logical & !was given or a single number in the general project use), the & !flag PRINTFLAG% is set. When (if) the login is done, the & !program will print the account PPN. & ! 2110 J% = INSTR(1%,ARG$,"(" ) 2120 IF J% <> 0% & THEN ARG$ = LEFT(ARG$,J%-1%) + RIGHT(ARG$,J%+1%) \ & ARG1$ = LEFT(ARG$,1%) 2130 J% = INSTR(1%,ARG$,")" ) 2140 IF J% <> 0% & THEN ARG$ = LEFT(ARG$,J%-1%) + RIGHT(ARG$,J%+1%) \ & ARG1$ = LEFT(ARG$,1%) 2200 ! & !first look for END & ! 2201 !PRINT "Looking for END" 2210 J% = FNFINDEND%(ARG$) !finds END or equivalent 2220 IF J% = 0% THEN GOTO 2300 2230 ARG$ = LEFT(ARG$,J%-1%) \ & ARG1$ = LEFT(ARG$,1%) 2231 !PRINT "END deleted, argument is now "; ARG$ 2240 IF ARG$ = "" & THEN GOSUB 5000 \ & RETURN & !if no other argument, go to END routine only 2250 ENDFLAG% = TRUE% \ & GOTO 2100 & !otherwise, set a flag and go back to parse the rest of the & !argument. (We can't do the file deletion here, because the & !files must be there when we check for permission later & ! 2300 ! & !look for NEXT (and its equivalents), PREV (and its & !equivalents). In each case, the same subroutine will be used. & !Its more convenient to set the value of TOPROJ% and TOPROG% & !here, even though their use is in the subroutine. & ! 2301 !PRINT "looking for NEXT" 2310 IF FNNEXT%(ARG$) & OR ARG$ = "+" & THEN TOPROJ% = PROJ% \ & TOPROG% = PROG% + 1% \ & PRINTFLAG% = TRUE% \ & GOSUB 4000 \ & RETURN 2319 !PRINT "Looking for PREV" 2320 IF FNPREV%(ARG$) & OR ARG$ = "-" & THEN TOPROJ% = PROJ% \ & TOPROG% = PROG% - 1% \ & PRINTFLAG% = TRUE% \ & GOSUB 4000 \ & RETURN 2400 ! & !look for BACK & ! 2401 !PRINT "Looking for BACK" 2410 IF ARG$ = "BACK" & THEN PRINTFLAG% = TRUE% \ & GOSUB 6000 \ & RETURN 2500 ! & !check for general project use (single number) & ! 2501 !PRINT "Looking for single number" 2510 TOPROJ% = PROJ% \ & TOPROG% = VAL(ARG$) & !if this generates an error the error routine will branch & !to next part. TOPROJ% is set in case there is no error. 2520 GOSUB 4000 \ & PRINTFLAG% = TRUE% \ & RETURN & !since the argument was a number, it must be the project use 2600 ! & !check for general privileged use (number,number) & ! 2601 !PRINT "Looking for two numbers" 2610 J% = INSTR(1%,ARG$,",") 2620 IF J% = 0% THEN GOTO 2700 2630 TOPROJ% = VAL( LEFT(ARG$,J%-1%)) \ & TOPROG% = VAL(RIGHT(ARG$,J%+1%)) & !if either generates an error, program will resume at next part 2640 IF TOPROJ% = 0% & THEN PRINT "Invalid use." \ & GOTO 32700 2650 GOSUB 3000 \ & RETURN & !both sides of comma were valid numbers so it must be & !privileged use. It is convenient to set TOPROJ% and TOPROG% & !here, even though their use is in the subroutine. 2700 ! & !only other possibility is a logical. It may be a system & !logical. We wil use file name string scan to check this. If & !this doesn't work, we will assume it is a LOGIN logical & ! 2701 !PRINT "Looking for system logical" 2710 DIM Z%(30%) 2720 CHANGE SYS( CHR$(6%) + CHR$(-10%) + ARG$ ) TO Z% & !see RSTS programming manual & !any error will cause a resume at 2800 2730 S0% = Z%(27%) + SWAP%(Z%(28%)) 2740 IF (S0% AND 1024%) = 0% & THEN GOTO 2800 & ELSE TOPROJ% = Z%(6%) \ & TOPROG% = Z%(5%) \ & PRINTFLAG% = TRUE% \ & GOSUB 3000 2800 ! & !must be a LOGIN logical (or garbage) & ! 2801 !PRINT "Looking for LOGIN logical" 2810 GOSUB 12000 2820 IF ARG$ = "?" & THEN PRINT BELL$;"Illegal argument." \ & GOTO 32700 & !if there is no such logical, then argument must be in & !error. 2830 PRINTFLAG% = TRUE% 2840 GOSUB 3000 2990 RETURN 3000 ! & ! & ! SUBROUTINE: General privileged use & ! & ! 3010 ! & !By the time this subroutine is reached, TOPROJ% and TOPROG% & !will have already been set. BACK is handled elsewhere. If & !argument was a logical, it has been translated to an account & !number. This option has END built in (so that the possibility & !of creating and deleting the same file is avoided.) & ! 3100 ! & !if this account is privileged then skip the part where we & !look for the permission file. & ! 3110 IF PROJ% = 1% THEN 3300 3200 ! & !look for the permission file. If not there, die. If there & !skip by the creation of permission file. & ! 3210 OPEN JUMP$ FOR INPUT AS FILE #1% & !if not there error routine resumes at 3700 3220 GOTO 3500 3300 ! & !create the permission file (this is bypassed if not in a & !privileged account. If there was an END in the argument, we & !don't create it. 3310 IF ENDFLAG% = TRUE% THEN GOTO 3500 3320 OPEN JUMP$ FOR OUTPUT AS FILE #1% 3330 PRINT #1%, PROJ%;",";PROG% 3340 CLOSE #1% 3350 GOTO 3500 !don't kill the file just created 3400 ! & !if there was an END in the argument, delete the permission & !file. & ! 3410 KILL JUMP$ & !if not there, resume at 3500 3500 ! & !delete any ????nn.TMP files & ! 3510 GOSUB 11000 3600 ! & !do the login & ! 3610 GOSUB 10000 3620 GOTO 32700 3700 ! & !invalid use & ! 3710 PRINT BELL$;"Invalid use." 3720 GOTO 32700 3990 RETURN 4000 ! & ! & ! SUBROUTINE: General project use & ! & ! 4010 ! & !If there was an END, the appropriate subroutine call is & !included here. & ! 4100 ! & !look for permission file & ! 4110 OPEN J2MP$ FOR INPUT AS FILE #1% & !If not there, error routine resumes at 4200 4120 INPUT #1%, PERMISSION% 4130 IF PERMISSION% <> TOPROJ% & THEN PRINT BELL$;"Wrong project." \ & GOTO 32700 & !file is there, but wrong project. 4140 GOTO 4400 !since file is there and has right project 4200 ! & !permission file not there. Look in !JUMP.DAT to see if they & !are allowed to use this. If so, ask for password and create & !the file. If not, die. & ! 4210 GOSUB 13000 & !if they are allowed to use this option, the subroutine will & !set TOPROJ% (which could be different from current project) & !If use is not legal, program will terminate. 4400 ! & !permission file was there (or just created) & !if END was there, get rid of files & ! 4410 IF ENDFLAG% = TRUE% THEN GOSUB 5000 4500 ! & !delete the ????nn.TMP files & ! 4510 GOSUB 11000 4600 ! & !do the login and logout & ! 4610 PRINTFLAG% = TRUE% 4620 GOSUB 10000 4990 RETURN 5000 ! & ! & ! SUBROUTINE: END command & ! & ! 5010 ! & !This option may be used by itself or with another argument. & !If another argument was given, it will have already been & !processed by now. This single argument is designed for ending & !both types of operation: privileged and single project. & ! 5100 ! & !Kill the privileged jump file if there & ! 5110 KILL JUMP$ & !If not there error routine resumes at 5200 5200 ! & !Kill the single project jump file if there & ! 5210 KILL J2MP$ & !If not there error routine resumes at 5300 5300 ! & !print reassuring message & ! 5310 PRINT "JUMPing privileges have been terminated." 5990 RETURN 6000 ! & ! & ! SUBROUTINE: BACK commmand & ! & ! 6010 ! & !This option could be done by looking up the project number in & !the file and then using the general privileged use subroutine & !with a new argument. But this involves duplication of effort. & !(For example, the check for the permission file will be & !redundant.) Instead, I have put the complete code here. It & !involves duplication in writen code but not in executed code. & ! 6100 ! & !find out where to return to (or die if file not there) & ! 6110 OPEN JUMP$ FOR INPUT AS FILE #1% & !if not there, error routine resumes at 6400 6120 INPUT #1%, TOPROJ%, TOPROG% 6130 CLOSE #1% 6200 ! & !delete the ????nn.TMP files & ! 6210 GOSUB 11000 6300 ! & !log in & ! 6310 GOSUB 10000 6320 GOTO 32700 6400 ! & !file wasn't there & ! 6410 PRINT BELL$;"Can't jump back." \ & GOTO 32700 6990 RETURN 8000 ! & ! & ! FUNCTIONS & ! & ! 8100 ! & !A function to find END, /END, & !This function returns zero if none of the above appear. & !Otherwise, it returns the index of the first one. The three & !last options are included only for compatability with earlier & !versions of this program. With only the option END, this & !function becomes exactly INSTR(1%,ARG$,"END"). & !This function assumes that no more than one of these four will & !appear 8110 DEF FNFINDEND%(ARG$) 8120 J% = INSTR(1%,ARG$,"/END") \ & IF J% <> 0% & THEN FNFINDEND% = J% \ & GOTO 8190 8130 J% = INSTR(1%,ARG$,"END") \ & IF J% <> 0% & THEN FNFINDEND% = J% \ & GOTO 8190 8180 FNFINDEND% = 0% 8190 FNEND 8200 ! & !find NEXT & ! 8210 DEF FNNEXT%(A$) 8220 FNNEXT% = FALSE% 8230 IF LEN(A$) > 4% & THEN GOTO 8290 8240 IF A$ = LEFT("NEXT",LEN(A$)) & THEN FNNEXT% = TRUE% 8290 FNEND 8300 ! & !find PREV & ! 8310 DEF FNPREV%(A$) 8320 FNPREV% = FALSE% 8330 IF LEN(A$) > 8% & THEN GOTO 8390 8340 IF A$ = LEFT("PREVIOUS",LEN(A$)) & THEN FNPREV% = TRUE% 8390 FNEND 8990 RETURN 9000 ! & ! & ! Error Routine & ! & ! 9100 ! & !^C trap & ! 9110 IF ERR = 28 THEN RESUME 32700 9200 ! & !Expected errors (by line number) & ! 9210 IF ERL = 2510 THEN RESUME 2600 & !argument is not a valid number (single number case) 9220 IF ERL = 2630 THEN RESUME 2700 & !argument is not a valid number (number,number case) 9230 IF ERL = 12210 THEN RESUME 12300 & !end of file for logicals 9240 IF ERL = 3210 THEN RESUME 3700 & !permission file not there 9250 IF ERL = 3410 THEN RESUME 3500 & !tried to kill permission file when not there 9260 IF ERL = 4110 THEN RESUME 4200 & !permission file (project case) not there 9270 IF ERL = 5110 THEN RESUME 5200 & !JUMP file to kill wasn't there 9280 IF ERL = 5210 THEN RESUME 5300 & !J2MP file to kill wasn't there 9290 IF ERL = 6110 THEN RESUME 6400 & !tried JUMP BACK with no permission file 9300 ! & !more expected errors by line number & ! 9310 IF ERL = 11410 THEN RESUME 11990 & !no more temp files to kill 9320 IF ERL = 10120 THEN RESUME 10200 & !no such account 9330 IF ERL = 11110 THEN RESUME 11990 & !couln't find TEMPnn.TMP (for account [1,3] only) 9340 IF ERL = 13120 THEN RESUME 13200 & !end of file in JUMP.DAT 9350 IF ERL = 2720 THEN RESUME 2800 & !illegal file name (looking for logical) 9360 IF ERL = 10520 THEN RESUME 10530 & !account doesn't exist (actually password doesn't exist) 9370 IF ERL = 11430 THEN RESUME 11440 & !couldn't kill *.TMP file (probably because of protect bit) 9380 IF ERL = 10010 THEN RESUME 10100 & ! EMTLOG isn't running 9390 IF ERL = 12630 THEN RESUME 12640 & !entry in $LOGIN.DAT is not a valid number 9600 ! & !Expected errors (with no specific line number) & ! 9610 IF ERR = 11 THEN RESUME 32700 & !^Z 9900 ! & !Unexpected errors & ! 9910 Z$ = SYS(CHR$(6%)+CHR$(9%)+CHR$(ERR)) 9920 ERROR$ = RIGHT(Z$,4%) 9930 PRINT " I can't cope with a "; \ & PRINT ERROR$; " at line";ERL 9990 GOTO 32700 10000 ! & ! & ! SUBROUTINE: logout and login & ! & ! 10010 SENDER.PPN% = PEEK(PEEK(PEEK(520%) + 8%) + 24%) & \ SENDER.Z$ = SYS(CHR$(6%)! SYS call to FIP & + CHR$(22%) & + CHR$(-1%) & + CHR$(0%) & + 'EMTLOG' & + STRING$(10%,0%) & + CHR$(21%) & + CHR$(20%) & + CHR$(SWAP%(SENDER.PPN%) AND 255%) & + CHR$(SENDER.PPN% AND 255%) & + CHR$(213%) & + CHR$(65%) & + CHR$(0%) & + CHR$(100%) & + CHR$(TOPROJ%) & + CHR$(TOPROG%)) & 10020 SLEEP 2% & 10100 ! & !look up the password (see RSTS programming manual for an & !explanation). & ! 10110 Z$ = CHR$(6%) + CHR$(14%) + STRING$(4%,0%) + CHR$(TOPROG%) & + CHR$(TOPROJ%) 10120 CHANGE SYS(Z$) TO Z% \ & PASS$ = RAD$( Z%( 9%) + SWAP%( Z%(10%) ) ) & + RAD$( Z%(11%) + SWAP%( Z%(12%) ) ) 10130 IF INSTR(1%,PASS$,"?") & THEN PRINT "You can't JUMP to an account with no password." \ & GOTO 32767 10140 GOTO 10300 !skip error handling 10200 ! & !No such account & ! 10210 PRINT BELL$;"No such account." 10220 GOTO 32700 10300 ! & !using results of SYS call above, set up for login call (see & !RSTS programming manual again.) & ! 10310 Z%(7%+I%) = Z%(9%+I%) FOR I% = 0% TO 3% 10320 Z%(5%) = TOPROG% \ & Z%(6%) = TOPROJ% 10325 T$ = CVT%$(SWAP%(0%+2%)) \ & T1% = ASCII(LEFT(T$,1%)) \ & T2% = ASCII(RIGHT(T$,2%)) 10330 Z%(1%) = 6% \ & Z%(2%) = 4% \ & Z%(3%) = 0% \ & Z%(4%) = 0% 10340 Z%(I%) = 0% FOR I% = 11% TO 30% 10400 ! & !Logout & ! 10410 Z$ = SYS( CHR$(6%) + CHR$(5%) ) & !try logging out with a quota check first 10420 LOGOUT.STATUS% = SWAP%( ASCII(MID(Z$,3%,1%)) ) + ASCII(MID(Z$,4%,1%)) 10430 IF LOGOUT.STATUS% = 0% THEN GOTO 10500 & !if successful, skip the rest 10440 IF LOGOUT.STATUS% = -1% & AND ASCII(MID(Z$,13%,1%)) = 1% & THEN PRINT BELL$;"You are unable to JUMP because your detached job quota is exceeded." \ & PRINT "Program terminated." \ & GOTO 32767 10450 IF LOGOUT.STATUS% = -1% & AND ASCII(MID(Z$,13%,1%)) = 0% & THEN PRINT BELL$;"Your quota is exceeded. You have been signed out anyway." 10460 Z$ = SYS( CHR$(6%) + CHR$(5%) + CVT%$(SWAP%(0%+2%))) & !do it without without quota checks 10500 ! & !Login & ! 10510 CHANGE Z% TO Z$ 10520 Z$ = SYS(Z$) \ & GOTO 10600 !if error, resume at 10530 10530 PRINT "You can't jump to an account which has no password." 10540 GOTO 32767 10600 ! & !print message if desired & ! 10610 IF PRINTFLAG% = TRUE% & THEN PRINT "Jumping to account ["; \ & PRINT NUM1$(TOPROJ%); \ & PRINT ","; \ & PRINT NUM1$(TOPROG%); \ & PRINT "]." 10990 RETURN 11000 ! & ! & ! SUBROUTINE: delete temporary files & ! & ! 11100 ! & !If account is [1,3] we can't kill all temporary files or we & !will kill the permission file. In this case we will just & !delete TEMPnn.TMP & ! 11110 IF PROJ% = 1% & AND PROG% = 3% & THEN KILLFILE$ = "TEMP" + JOB$ + ".TMP" \ & KILL KILLFILE$ \ & RETURN & !if file not there, error routine will resume at the & !return statement anyway 11200 ! & !Use File Name String Scan to convert name to form needed later & !(See RSTS Programming Manual). This only needs to be done & !once, even if several files get deleted. & ! 11210 KILLFILE$ = "????" + JOB$ + ".TMP" 11220 CHANGE SYS( CHR$(6%) + CHR$(-10%) + KILLFILE$ ) TO Z% 11300 ! & !Set up for directory sys call (See RSTS Programming Manual & !again) & ! 11310 Z%(1%) = 6% \ & Z%(2%) = 17% \ & Z%(3%) = 0% \ & Z%(4%) = 0% 11320 CHANGE Z% TO Z$ 11400 ! & !This loop keeps killing files till it runs out & ! 11410 CHANGE SYS(Z$) TO Z% & !if no more files, error routine resumes at 11990 11420 FILE$ = RAD$( Z%( 7%) + SWAP%( Z%( 8%) ) ) & + RAD$( Z%( 9%) + SWAP%( Z%(10%) ) ) + "." & + RAD$( Z%(11%) + SWAP%( Z%(12%) ) ) 11430 KILL FILE$ 11440 GOTO 11300 11990 RETURN 12000 ! & ! & ! SUBROUTINE: look up account logicals & ! & ! 12100 ! & !open the file & ! 12110 OPEN "$LOGIN.DAT" AS FILE #1% 12200 ! & !look for logical equal to argument & ! 12210 INPUTLINE #1%, IN$ \ & IN$ = CVT$$(IN$,-1%) & !end of file will cause resume to 12300 12220 EQUAL% = INSTR(1%,IN$,"=") 12230 LOGICAL$ = LEFT(IN$,EQUAL%-1%) 12240 IF CVT$$(LOGICAL$,-1%) = CVT$$(ARG$,-1%) THEN GOTO 12400 12250 GOTO 12210 12300 ! & !didn't find it (end of file error resumes here) & ! 12310 ARG$ = "?" 12320 RETURN 12400 ! & !found it. Part to right of = is PPN (and maybe some junk) & ! 12401 !PRINT "Found logical: " ARG$ 12410 ARG$ = RIGHT(IN$,EQUAL% + 1%) 12500 ! & !look for ;. If there get rid of it and all following & ! 12510 J% = INSTR(1%,ARG$,";") 12520 IF J% <> 0% & THEN ARG$ = LEFT(ARG$,J%-1%) 12521 !PRINT "after ; argument is ";ARG$ 12600 ! & !may have / or ,. Either way we want TOPROJ% to be the left & !part and TOPROG% to be the right part. We will assume that & !the data in the file is correct (so that TOPROJ% and TOPROG% & !must be legal numbers) & ! 12610 J% = INSTR(1%,ARG$,",") 12620 IF J% = 0% & THEN J% = INSTR(1%,ARG$,"/") & !we assume that one of them is there 12621 !PRINT "Position of , or / is"; J% \ & !PRINT "Argument is now "; ARG$ 12630 TOPROJ% = VAL( LEFT(ARG$,J%-1%) ) \ & TOPROG% = VAL( RIGHT(ARG$,J%+1%) ) \ & GOTO 12990 12640 PRINT "Can't interpret entry in $LOGIN.DAT" \ & PRINT "Program terminated." \ & GOTO 32767 12990 RETURN 13000 ! & ! & ! SUBROUTINE: First time project use & ! & ! 13100 ! & !Look in !JUMP.DAT for their account & !(We assume that the data file is in the correct form) & ! 13101 !PRINT "first fime project use" 13110 OPEN "[1,3]JUMP.DAT" AS FILE #1% 13120 INPUTLINE #1%, IN$ \ & IN$ = CVT$$(IN$,-1%) & !if end-of-file then error routine resumes at 13200 13130 J% = INSTR(1%,IN$,",") \ & MASTERPROJ% = VAL(LEFT(IN$,J%-1%)) \ & IN$ = RIGHT(IN$,J%+1%) 13140 J% = INSTR(1%,IN$,":") \ & MASTERPROG% = VAL(LEFT(IN$,J%-1%)) \ & IN$ = RIGHT(IN$,J%+1%) 13141 !PRINT MASTERPROJ%,MASTERPROG% 13150 IF MASTERPROJ% <> PROJ% & OR MASTERPROG% <> PROG% & THEN GOTO 13120 & !keep looking for this account 13160 CLOSE #1% 13170 GOTO 13300 13200 ! & !wasn't found & ! 13210 PRINT BELL$; "You are not in the correct account." \ & GOTO 32700 13300 ! & !was found: find permision project and password & ! 13310 J% = INSTR(1%,IN$,":") \ & TOPROJ% = VAL( LEFT(IN$,J%-1%) ) \ & PASSWORD$ = CVT$$( RIGHT(IN$,J%+1%),32% ) 13400 ! & !Check the password & ! 13410 Z$ = SYS(CHR$(3%)) !cancel echo, of course 13420 INPUT "Password";USERPASS$ \ & USERPASS$ = CVT$$(USERPASS$,-1%) \ & PRINT 13430 Z$ = SYS(CHR$(2%)) !reinstate echo 13440 IF USERPASS$ = PASSWORD$ THEN 13600 13500 ! & !password was wrong & ! 13510 PRINT BELL$; "Incorrect password." 13520 GOTO 32700 13600 ! & !password was right, set up file & ! 13610 OPEN J2MP$ FOR OUTPUT AS FILE #1% 13620 PRINT #1%, TOPROJ% 13630 CLOSE #1% 13990 RETURN 32700 ! & !end of program & ! 32710 Z$ = SYS(CHR$(9%)) !Exit and clear program 32767 END f 2?10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! PRIV & ! & !A program to make a list of all privileged files on the & !system. Since the only access to protection codes are in the & !UFD, this program works through the UFD. Most of the explan- & !ation of the UFD is left out. See [1,3] UFD.BAS for that & !description. & ! 80 Z$ = SYS(CHR$(6%)+CHR$(-7%)) !^C trap 90 ON ERROR GOTO 9000 100 ! & !Initialize & ! 110 GOSUB 1000 200 ! & !Explain program & ! 210 GOSUB 2000 300 ! & !output file & ! 310 INPUT "Output file "; OUTFILE$ \ & OUTFILE$ = "PRIV.LST" IF OUTFILE$ = "" \ & OUTFILE$ = CVT$$(OUTFILE$,4%) 320 IF INSTR(1%,OUTFILE$,".") = 0% & THEN OUTFILE$ = OUTFILE$ + ".LST" 330 OPEN OUTFILE$ FOR OUTPUT AS FILE #2% 340 PRINT #2% \ & PRINT #2% \ & PRINT #2%, " Privileged accounts as of "; DATE$(0%) 400 ! & !disk & ! 410 INPUT "Disk number"; DISK$ \ & DISK$ = CVT$$(DISK$,-1%) 420 IF DISK$ = "" THEN GOTO 900 430 IF LEFT(DISK$,2%) = "DR" & THEN DISK% = VAL(MID(DISK$,3%,1%)) & ELSE DISK% = VAL(DISK$) 440 DEVICE$ = "DR" + NUM1$(DISK%) + ":" 450 PRINT #2% \ & PRINT #2%, " for ";DEVICE$ \ & PRINT #2 500 ! & !Go through accounts & ! 510 INDEX% = 0% 520 Z$ = SYS( CHR$(6%) + CHR$(25%) + & CHR$(INDEX%) + CHR$(SWAP%(INDEX%)) + & CHR$(255%) + CHR$(255%) + & STRING$(16%,0%) + & "DR" + CHR$(DISK%) + CHR$(255%) ) 530 PROJ% = ASCII(MID(Z$,6%,1%)) \ & PROG% = ASCII(MID(Z$,5%,1%)) 535 PRINT " Working on "; "["; \ & PRINT USING "###", PROJ%; \ & PRINT ","; \ & PRINT USING "###", PROG%; \ & PRINT "]" 540 IF PROJ% = 1% AND PROG% = 1% THEN GOTO 560 & !Skip [1,1] because it has the MFD 550 GOSUB 3000 !Go through UFD for this account 560 INDEX% = INDEX% + 1% 570 GOTO 520 600 ! & !another disk & ! 610 GOTO 400 900 ! & !done & ! 910 CLOSE #2% 990 GOTO 32767 1000 ! & ! & ! SUBROUTINE: Initialize & ! & ! 1100 ! & !constants & ! 1110 BELL$ = CHR$(26%) 1120 TRUE% = -1% \ & FALSE% = 0% 1990 RETURN 2000 ! & ! & ! SUBROUTINE: Description & ! & ! 2010 PRINT \ & PRINT "This program will provide a list of all files with privileged protection codes." \ & PRINT 2990 RETURN 3000 ! & ! & ! SUBROUTINE: Go thorugh UFD for one account & ! & ! 3100 ! & !open the UFD, dimension it and get cluster size & ! 3110 OPEN DEVICE$ + "[" + NUM1$(PROJ%) + "," + NUM1$(PROG%) + "]" AS FILE #1% 3120 DIM #1%, U%(3538%,7%) 3130 CLU% = U%(31%,0%) 3200 ! & !loop through name blockettes & ! 3210 PTR% = FNLINK%(U%(0%,0%)) 3220 IF PTR% = 0% THEN RETURN 3230 GOSUB 4000 !Do this file 3240 PTR% = FNLINK%( U%(PTR%,0%) ) 3250 GOTO 3220 3990 RETURN 4000 ! & ! & ! SUBROUTINE: Do one file & ! & ! 4100 ! & !quit if "wrong" protection code & ! 4110 PROT% = SWAP%( U%(PTR%,4%) ) AND 255% 4120 IF PROT% < 128% THEN RETURN 4200 ! & !print data & ! 4210 PRINT #2%, "["; \ & PRINT #2%, USING "###", PROJ%; \ & PRINT #2%, ","; \ & PRINT #2%, USING "###", PROG%; \ & PRINT #2%, "] "; 4220 PRINT #2%, RAD$( U%(PTR%,1%) ); & RAD$( U%(PTR%,2%) ); "."; & RAD$( U%(PTR%,3%) ); & !name of file 4230 PRINT #2%, USING " ###", PROT%; & !Protection 4240 AB% = FNLINK%(U%(PTR%,6%)) \ & PRINT #2%, " ";DATE$(U%(AB%,3%)) & !date of creation 4990 RETURN 8000 ! & ! & ! FUNCTIONS & ! & ! 8100 ! & !Convert a link word to a blockette number & ! 8110 DEF FNLINK%(L%) = ((( L% AND 3584%) / 512% ) * CLU% & + ( SWAP%( L% AND -4096% ) / 16% )) * 32% & + (( L% AND 496%) / 16%) 9000 ! & ! & ! Error Routine & ! & ! 9100 ! & !^C error: not caught seperately & ! 9200 ! & !Expected errors (by line number) & ! 9210 IF ERL = 520 THEN RESUME 400 & !assume an error means no more files on this disk 9600 ! & !Expected errors (with no specific line number) & ! 9900 ! & !Unexpected errors & ! 9910 Z$ = SYS(CHR$(6%)+CHR$(9%)+CHR$(ERR)) 9920 ERROR$ = RIGHT(Z$,3%) 9930 CLOSE 1% 9940 PRINT #2% \ & PRINT #2% \ & PRINT #2%, "Program ended with an error before all files were processed." \ & PRINT #2%, " "; ERROR$; " at line";ERL 9950 CLOSE #2% 32767 END ;K} 2? 10 EXTEND 20 ! & ! LAST & ! & ! A program to access the "last signed in" data in the GFD and & !print that data for specified cases. The user will specify which & !account(s), which keyboard(s) and which date(s). The program will & !print out the information for those specified combinations. & ! For account(s), user may specify a list in the form & ![proj1,prog1],[proj2,prog2],... where either proj or prog could be & !*. Limit is 50 specifications. The default is [*,*]. & ! For keyboards, the user may specify a list whose entries are in & !the form n or n-m. For example, "1,4,7-9" will include keyboards 1, & !4,7,8, and 9. User may also specify "DETACHED". Limit is 50 & !keyboards. The default is all keyboards and detached. & ! For the date, the user may specify a specific date, a range of & !dates, or all dates before (and including) a given date. The formats& !are: "##-XXX-##", "##-XXX-## TO ##-XXX-##", and "BEFORE "##-XXX-##" & !respectively. Only one can be specified. The default is all & !dates. & ! The program does not have an error trap, so it will not survive & !even the most trivial error. The program is disigned for people who & !know what they are doing and is almost devoid of error checking. & ! 100 ! & !dimension statement for storage of DCN's for GFD's & ! 110 DIM DCN.GFD%(255%) 200 ! & !some constants & ! 210 TRUE% = -1% \ & FALSE% = 0% 220 DISK$ = "DR0:" 300 ! & !dimension statements for specifications & ! 310 DIM PROJ%(50%), PROG%(50%), KB%(50%), KBS$(50%) 400 ! & !data for the function at 18400 & ! 410 DIM MON%(12%) 420 DATA 0,31,59,90,120,151,181,212,243,273,304,334 430 MAT READ MON% 440 DIM MON$(12%) 450 DATA JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC 460 MAT READ MON$ 1000 ! & ! & ! MAIN PROGRAM & ! & ! & !get the specifications & ! 1010 GOSUB 11000 2000 ! & !open disk non-file structured with buffer size large enough & !to get the second block of the MFD. & !get the pack label block & !get the version number and quit if not 1.1 & ! 2010 OPEN DISK$ AS FILE #1%, RECORDSIZE 1024% 2020 FIELD #1%, 1024% AS BUFF$ 2030 GET #1%, BLOCK 1% 2040 VERSION% = FNBYTE%(7%) \ & LEVEL% = FNBYTE%(6%) \ & IF VERSION% <> 1% & OR LEVEL% <> 1% & THEN PRINT "This program only works for 1.1 disks." \ & GOTO 32767 2050 DCN.MFD% = FNWORD%(2%) 3000 ! & !get the DCN of the MFD & ! 3010 GET #1%, BLOCK DCN.MFD% 4000 ! & !save DCN's for GFD's & !go through a second time to use them. & !Two loops are needed because there are GET's inside the loop which & !change the buffer. & ! 4010 FOR PROJ% = 1% TO 255% 4020 DCN.GFD%(PROJ%) = FNWORD%(256% + PROJ%) 4030 NEXT PROJ% 4040 FOR PROJ% = 1% TO 255% 4050 IF DCN.GFD%(PROJ%) = 0% & THEN GOTO 7010 5000 ! & !open up the GFD with correct cluster size & !get the link for this account & ! 5010 CLOSE #1% 5020 OPEN DISK$ AS FILE #1%, RECORDSIZE 16% * 512% 5030 FIELD #1%, 16% * 512% AS BUFF$ 5040 GET #1%, BLOCK DCN.GFD%(PROJ%) \ & CURRENT.CLUSTER% = 0% 6000 ! & !go through this GFD & ! 6010 FOR PROG% = 0% TO 255% 6020 LINK.NB% = FNWORD%(512% + PROG%) 6030 IF LINK.NB% <> 0% & THEN GOSUB 10000 6040 NEXT PROG% 7000 ! & !end of PROJ% loop & ! 7010 NEXT PROJ% 9000 ! & !normal exit & ! 9010 CLOSE #1% 9990 GOTO 32767 10000 ! & ! & ! SUBROUTINE: check account & ! & ! & ! & !save the cluster map & ! 10010 FOR I% = 0% TO 7% 10020 CLUSTER.MAP%(I%) = FNWORD%(249%+I%) & !these are the last eight words of the block 10030 NEXT I% 10100 ! & !get correct cluster, block and offset for this link & ! 10110 OFFSET% = FNLINK%(LINK.NB%) \ & !the function GETs the right cluster and finds the offset \ & BYTE.OFFSET% = OFFSET% \ & WORD.OFFSET% = OFFSET%/2% 10200 ! & !save the values of the other links (in case we leave this cluster & ! 10210 LINK.DTB% = FNWORD%(WORD.OFFSET% + 0%) 10500 ! & !data from date/time blockette & !(including link to password blockette) & ! 10510 OFFSET% = FNLINK%(LINK.DTB%) \ & !the function GETs the correct cluster and finds the offset \ & BYTE.OFFSET% = OFFSET% \ & WORD.OFFSET% = OFFSET%/2% 10520 KB.LAST% = FNBYTE%(BYTE.OFFSET% + 3%) 10530 DATE.LAST% = FNWORD%(WORD.OFFSET% + 2%) \ & TIME.LAST% = FNWORD%(WORD.OFFSET% + 3%) 10535 IF DATE.LAST% = 0% THEN DATE.LAST% = FNDATE.TO.NUMBER%(DATE$(0%)) 10540 IF FNCHECK% & THEN PRINT "["; \ & PRINT USING "###", PROJ%; \ & PRINT ","; \ & PRINT USING "###", PROG%; \ & PRINT "]"; \ & PRINT " Last signed in "; \ & PRINT "detached"; IF KB.LAST% = 255% \ & PRINT "at KB"; NUM1$(KB.LAST%);":"; IF KB.LAST% <> 255% \ & PRINT TAB(34);"on ";DATE$(DATE.LAST%); \ & PRINT " at ";TIME$(TIME.LAST%) 10900 ! & !done & ! 10990 RETURN 11000 ! & ! & ! SUBROUTINE: get specifications & ! & ! & ! 11100 ! & !accounts & !ask, do default, initialize counter & ! 11110 PRINT "Which accounts"; \ & INPUTLINE ACCTS$ \ & ACCTS$ = CVT$$(ACCTS$,2%+4%+32%) & !get it, remove spaces and delimiters, change to capitals, 11120 IF ACCTS$ = "" & THEN SKIP.ACCT.CHECK% = TRUE% \ & GOTO 11300 11130 I% = 0% 11200 ! & !pull them off one at a time & !not many error checks here & ! 11210 BRACKET% = INSTR(1%,ACCTS$,"]") 11220 IF BRACKET% <> 0% & THEN I% = I% + 1% & ELSE NUM.ACCTS% = I% \ & GOTO 11300 & !if there is another account, count it and continue 11230 ACCT$ = LEFT(ACCTS$,BRACKET%-1%) \ & ACCTS$ = RIGHT(ACCTS$,BRACKET%+2%) & !assume character after the bracket is a comma. Drop it and the & !bracket at the end 11240 ACCT$ = RIGHT(ACCT$,2%) & !assume first character is [ and drop it 11250 COMMA% = INSTR(1%,ACCT$,",") \ & PROJ$ = LEFT(ACCT$,COMMA%-1%) \ & PROG$ = RIGHT(ACCT$,COMMA%+1%) & !assume there is a comma 11260 IF PROJ$ = "*" & THEN PROJ%(I%) = 255% & ELSE PROJ%(I%) = VAL(PROJ$) & !assume no illegal numbers 11270 IF PROG$ = "*" & THEN PROG%(I%) = 255% & ELSE PROG%(I%) = VAL(PROG$) & !assume no illegal numbers 11280 GOTO 11210 & !try again 11300 ! & !keyboards & !ask, do default, initialize counter & ! 11310 PRINT "Which keyboards"; \ & MAT INPUT KBS$ 11320 IF KBS$(1%) = "" & THEN SKIP.KB.CHECK% = TRUE% \ & GOTO 11500 11330 I% = 0% 11400 ! & !interpret them one at a time & !note that J% counts enties and I% counts keyboards. They may not & !be the same. & ! 11410 FOR J% = 1% TO NUM 11420 IF LEFT(KBS$(J%),3%) = "DET" & THEN I% = I% + 1% \ & KB%(I%) = 255% \ & GOTO 11470 & !for detached keyboards 11430 HYPHEN% = INSTR(1%,KBS$(J%),"-") 11440 IF HYPHEN% = 0% & THEN I% = I% + 1% \ & KB%(I%) = VAL(KBS$(J%)) \ & GOTO 11470 & !single keyboard on list 11450 FIRST% = VAL( LEFT(KBS$(J%),HYPHEN%-1%)) \ & LAST% = VAL(RIGHT(KBS$(J%),HYPHEN%+1%)) & !begin case where there is a range by finding first and last KB 11460 FOR K% = 0% TO LAST% - FIRST% \ & I% = I% + 1% \ & KB%(I%) = FIRST% + K% \ & NEXT K% \ & !put in the whole range 11470 NEXT J% 11480 NUM.KBS% = I% 11500 ! & !dates & !ask, do default & ! 11510 PRINT "Which dates"; \ & INPUTLINE DATES$ \ & DATES$ = CVT$$(DATES$,-1%) 11520 IF DATES$ = "" & THEN SKIP.DATE.CHECK% = TRUE% \ & GOTO 11900 11600 ! & !look for BEFORE & ! 11610 IF LEFT(DATES$,3%) <> "BEF" THEN GOTO 11700 11620 DATES$ = RIGHT(DATES$,FNFIND.DIGIT%(DATES$)) 11630 FIRST.DATE% = 0% \ & LAST.DATE% = FNDATE.TO.NUMBER%(DATES$) 11640 GOTO 11900 11700 ! & !look for TO & ! 11710 T% = INSTR(1%,DATES$,"TO") 11720 IF T% = 0% THEN GOTO 11800 11730 FIRST.DATE% = FNDATE.TO.NUMBER%( LEFT(DATES$,T%-1%)) \ & LAST.DATE% = FNDATE.TO.NUMBER%(RIGHT(DATES$,T%+2%)) 11740 GOTO 11900 11800 ! & !only one date specified & ! 11810 FIRST.DATE% = FNDATE.TO.NUMBER%(DATES$) \ & LAST.DATE% = FIRST.DATE% 11900 ! & !done & ! 11990 RETURN 12000 ! & ! & ! FUNCTION: check specifications & ! & ! & ! 12010 DEF* FNCHECK% 12020 FNCHECK% = TRUE% & !default in case all checks are skipped 12100 ! & !check accounts & ! 12110 IF SKIP.ACCT.CHECK% THEN GOTO 12200 12120 FOR I% = 1% TO NUM.ACCTS% 12130 IF (PROJ% = PROJ%(I%) OR PROJ%(I%) = 255%) & AND (PROG% = PROG%(I%) OR PROG%(I%) = 255%) & THEN GOTO 12200 12140 NEXT I% 12150 FNCHECK% = FALSE% \ & GOTO 12900 & !didn't make it past this check 12200 ! & !check keyboards & ! 12210 IF SKIP.KB.CHECK% THEN GOTO 12300 12220 FOR I% = 1% TO NUM.KBS% 12230 IF KB.LAST% = KB%(I%) & THEN GOTO 12300 12240 NEXT I% 12250 FNCHECK% = FALSE% \ & GOTO 12900 & !didn't make it past this check 12300 ! & !check dates & ! 12310 IF SKIP.DATE.CHECK% THEN GOTO 12900 12320 IF FIRST.DATE% <= DATE.LAST% & AND DATE.LAST% <= LAST.DATE% & THEN FNCHECK% = TRUE% & ELSE FNCHECK% = FALSE% 12900 ! & !end & ! 12990 FNEND 18000 ! & ! & ! FUNCTIONS & ! & ! 18100 ! & !pull a word from the buffer & !for convenience, the words are numbered as words even though the & !buffer is character (and hence byte) oriented. Words are normally & !numbered starting at zero, but the characters in the buffer must be & !numbered starting at one, so another adjustment is needed. & ! 18110 DEF* FNWORD%(W%) 18120 FIRSTBYTE% = W% * 2% + 1% 18180 FNWORD% = ASCII( MID(BUFF$,FIRSTBYTE% ,1%) ) & + SWAP%( ASCII( MID(BUFF$,FIRSTBYTE%+1%,1%) ) ) 18190 FNEND 18200 ! & !pull a byte from the buffer & !Since the bytes are generally numbered starting at zero but the & !characters are numbered begining at one, an adjustment is needed. & ! 18210 DEF* FNBYTE%(B%) 18280 FNBYTE% = ASCII(MID(BUFF$,B%+1%,1%)) 18290 FNEND 18300 ! & !convert a link & !If the link indicates another cluster, the correct cluster is GETted & !by the function. & ! & !In a link word the bits have the following meaning: & ! & ! 0 - 8 byte within the block & ! 9 - 11 cluster (16 blocks) number & ! 12 - 15 block within the cluster & ! 18310 DEF* FNLINK%(LINK%) 18320 CLUSTER.NUMBER% = ( LINK% AND 3584% ) / 512% \ & BLOCK.NUMBER% = SWAP%( LINK% AND -4096% ) / 16% \ & BYTE.NUMBER% = LINK% AND 511% 18330 IF CLUSTER.NUMBER% <> CURRENT.CLUSTER% & THEN GET #1%, BLOCK CLUSTER.MAP%(CLUSTER.NUMBER%) \ & CURRENT.CLUSTER% = CLUSTER.NUMBER% 18380 FNLINK% = BLOCK.NUMBER% * 512% + BYTE.NUMBER% 18390 FNEND 18400 ! & !convert date to number & ! 18410 DEF FNDATE.TO.NUMBER%(D$) 18420 D$ = CVT$$(D$,-1%) \ & D$ = "0" + D$ IF LEN(D$) = 8% \ & DAY% = VAL(LEFT(D$,2%)) \ & MON$ = MID(D$,4%,3%) \ & YEAR% = VAL(RIGHT(D$,8%)) 18430 FOR M% = 1% TO 12% 18440 IF MON$(M%) = MON$ & THEN MON% = MON%(M%) \ & M1% = M% 18450 NEXT M% 18460 IF YEAR%/4%*4% = YEAR% & AND M1% > 2% & THEN MON% = MON% + 1% 18470 FNDATE.TO.NUMBER% = ( YEAR% - 70 ) * 1000 + MON% + DAY% 18490 FNEND 18500 ! & !find the first digit in a string & ! 18510 DEF* FNFIND.DIGIT%(STR$) 18520 FOR I.FIND.DIGIT% = 1% TO LEN(STR$) 18530 C% = ASCII(MID(STR$,I.FIND.DIGIT%,1%)) 18540 IF 48% <= C% AND C% <= 57% & THEN FNFIND.DIGIT% = I.FIND.DIGIT% \ & GOTO 18590 18550 NEXT I.FIND.DIGIT% 18560 FNFIND.DIGIT% = 0% 18590 FNEND 32767 END f} 2? 1 EXTEND 2 !Extended BASIC+2 & & ! P R O T E C T & & ! Program : PROTEC.BAS & ! Author : Troy Greenup & ! Version : 2 & ! Edit : 1 & ! Edit Date: 10-Nov-83 & & & ! Refer all Inquiries to: & & ! The Computer Center & ! Whittier College & ! Whittier, California & ! (213) 693-0771 x238 & & & 9 ! & & ! C O P Y R I G H T N O T I C E & & ! No Copyright (NC) & ! WHITTIER COLLEGE COMPUTER CENTER, WHITTIER, CA 90608 & ! & ! & ! This software has been furnished without a license for use & ! on any computer system that can handle it and may be copied & ! without the inclusion of this copyright notice. This & ! software, and any other copies thereof, may be provided or & ! otherwise made available to any person for whatever reason & ! or excuse for use on their system who will also agree to & ! ignore these pseudo-license terms. Title to, credit for, & ! and ownership of this software shall be given to whomever & ! will take the blame for it as well. & ! & !**************************************************************** & 20 ON ERROR GOTO 9000 & \ DIM Z%(30) & \ Z% = FNKB% & \ CLEAR$ = CHR$(26%) IF LSI% & \ CLEAR$ = CHR$(140%) IF GIGI% & \ CLEAR$= CHR$(155%) + '[2J' + CHR$(155%) + '[;H' IF VT100% OR VT125% & ! Z%() is for a FIP call. See what kind of tube we're & ! on and define CLEAR$ & 30 PPN% = PEEK(PEEK(PEEK(520%) + 8%) + 24%) & \ PROJ% = SWAP%(PPN%) AND 255% & \ PROG% = PPN% AND 255% & \ USER$ = '[' + NUM1$(PROJ%) + ',' + NUM1$(PROG%) & \ Z$ = SYS(CHR$(6%) + CHR$(9%) + CHR$(0%)) & \ USER$ = USER$ + '] Job ' & + RIGHT(NUM1$(ASCII(LEFT(Z$,1%))/2% + 100%), 2%) & ! Lookup the account number (the direct way to avoid & ! disturbing future EMT logging) and an interesting & ! (though sloppy) way of getting and converting the & ! job number into 2 digits. & 100 OPEN 'KB:' AS FILE #1%, MODE 24% & \ PRINT #1%, RECORD 256%, CHR$(128% + 79%) + CHR$(32%); & \ PRINT #1%, 'Password: '; & \ GET #1% & \ FIELD #1%, RECOUNT AS PASS$ & \ PASS$ = CVT$$(PASS$, 140%) & \ IF PASS$ = '' & THEN Z$ = SYS(CHR$(6) + CHR$(14%) + CHR$(0%) + CHR$(SWAP%(0%)) & + CHR$(0%) + CHR$(0%) + CHR$(PROG%) + CHR$(PROJ%)) & \ CHANGE Z$ TO Z% & \ PASS$ = CVT$$(RAD$(Z%(9%) + SWAP%(Z%(10%))) & + RAD$(Z%(11%) + SWAP%(Z%(12%))), 255%) & ! Mode 8 for delimiterless (fielded) input and & ! Mode 16 to stop ^Cs & ! Get the password to release the keyboard. The default is & ! the password to their account. & 110 PRINT #1%, CLEAR$ & \ PRINT #1%, FNMOVE$(3%, 17%); & '+--v---v---v---v---v---v---v---v---v---v---+' & \ FOR X% = 4% TO 10% STEP 3% & \ PRINT #1%, FNMOVE$(X%, 17%); & '| |' & \ PRINT #1%, FNMOVE$(X% + 1%, 17%); & '> <' & \ PRINT #1%, FNMOVE$(X% + 2%, 17%); & '| |' & \ NEXT X% & \ PRINT #1%, FNMOVE$(13%, 17%); & '| |' & \ PRINT #1%, FNMOVE$(14%, 17%); & '+--^---^---^---^---^---^---^---^---^---^---+' & ! Print the border & 120 PRINT #1%, FNMOVE$(5%, 33%); 'Protected by' & \ PRINT #1%, FNMOVE$(6%, 35%); 'FROBOZZ' & \ PRINT #1%, FNMOVE$(7%, 30%); 'Magic Alarm Company' & \ PRINT #1%, FNMOVE$(9%, 38%); 'for' & \ PRINT #1%, FNMOVE$(11%, 30%); 'User: ';USER$ & \ PRINT #1%, FNMOVE$(12%, 36%); TIME$(0%) & \ PRINT #1%, FNMOVE$(17%, 1%) & ! Print the inside stuff and close the KB: & 140 TOOLONG = TIME(0%)/60% + 10% & ! Protection ends in 10 minutes & 150 Z$ = SYS(CHR$(3%) + CHR$(1%)) & \ Z$ = SYS(CHR$(11%) + CHR$(1%)) & ! Cancel the echo and type ahead 160 PRINT #1%, RECORD 256%, CHR$(128% + 79%) + CHR$(32%); & \ GOSUB 3000 & \ WAIT 20% & \ GET #1% & \ FIELD #1%, RECOUNT AS GUESS$ & \ GOTO 1000 IF CVT$$(GUESS$, 4%) = PASS$ & \ GOTO 140 IF CVT$$(GUESS$, -1%) = 'EXTEND' & \ GOTO 2000 IF TIME(0%) / 60% >= TOOLONG & \ PRINT #1%, CHR$(7%); & \ GOTO 160 & ! The main loop. Check to see what's happening every & ! 20 seconds to see if time's up, updating the time left. & ! If someone typed 'EXTEND' they start a new 10 minutes. & ! Beep if a miscue. & 170 IF TOOLONG <= TIME(0%) / 60% & THEN GOTO 2000 & ELSE GOSUB 3000 & \ GOTO 160 & ! Wait error in the previous line. Update the time left. & ! If over 10 minutes, log the turkey out. & 1000 CLOSE #1% & \ Z$ = SYS(CHR$(2%)) & \ Z$ = SYS(CHR$(9%)) & !Close the KB:, resume echo, and end clearing this program & 2000 PRINT #1%, FNMOVE$(18%, 17%); ' Protection time expired ...'; & \ PRINT #1%, SPACE$(79% - POS(0%)) & ! Tell them protection ends & 2010 Z$ = SYS(CHR$(2%) + CHR$(1%)) & \ Z$ = SYS(CHR$(6%) + CHR$(5%) + CVT%$(SWAP%(2%))) & \ GOTO 32767 & ! Log them out, ignoring quota & 3000 ! U P D A T E T I M E L E F T & 3010 TIM = TOOLONG - TIME(0%) / 60% & \ MINUTES.REMAINING% = TIM & \ SECONDS.REMAINING% = (TIM - MINUTES.REMAINING%) * 60% & \ PRINT #1%, FNMOVE$(18%, 17%); 'Protection will expire in'; & \ GOTO 3020 UNLESS MINUTES.REMAINING% & \ PRINT #1%, MINUTES.REMAINING%;'minute'; & \ PRINT #1%, 's'; UNLESS MINUTES.REMAINING% < 2% & ! Calculate minutes, seconds left and print minutes & ! if necessary & 3020 GOTO 3030 UNLESS SECONDS.REMAINING% & \ PRINT #1%, SECONDS.REMAINING%;'second'; & \ PRINT #1%, 's '; UNLESS SECONDS.REMAINING% < 2% & ! Print seconds, if necessary & 3030 PRINT #1%, SPACE$(79% - POS(0%)) & \ RETURN & ! Clear to end of line and return & 9000 ! E R R O R H A N D L I N G R O U T I N E & 9010 IF ERR = 15 AND ERL = 160 & THEN GUESS$ = '' & \ RESUME 170 & ! KB Wait expired. Don't do anything but return to check & ! for time & 9020 IF ERR = 15 AND ERL = 20050 & THEN LSI% = -1% & \ FNKB% = -1% & \ RESUME 20090 & ! No response from keyboard in FNKB%, must be an LSI & ! or decwriter & 9030 IF ERL <= 110 & THEN RESUME 1000 & ELSE RESUME 160 & ! The only expected errors should occur in the main loop & ! (such things as ^Zs and such, so return them to the loop & ! unless they ^Z before they type in a password, in which & ! we release them & 20000 DEF* FNKB% & ! This function is a modified version of the standard Whittier & ! College FNKB%. Instead of returning values 0% thru 5% and & ! remembering what each stands for, all terminals in VT52 mode & ! are changed to ANSII mode, thus all we need to is what type & ! of terminal it is. The variables meant to be local to this & ! function have the prefix FUNC.KB. . The variables meant to & ! be global (the actual values to be returned) are boolean and & ! are as follows: & ! & ! LSI% if keyboard is an LSI or Decwriter & ! GIGI% if keyboard is a GIGI & ! VT100% if keyboard is a VT100 or Visual 100 & ! VT125% if keyboard is a VT125 & ! & ! FNKB% is true if one of the above was determined, else FNKB% & ! is false. The keyboard is opened on channel 12, so either it & ! it should be left available for this function or change the & ! channel of this function. & 20010 LSI% = 0% & \ GIGI% = 0% & \ VT100% = 0% & \ VT125% = 0% & \ FNKB% = 0% & ! Initialize everything to false & 20030 FUNC.KB.Z$ = SYS(CHR$(11%)) + SYS(CHR$(3%)) & \ WAIT 4% & \ OPEN 'KB:' AS FILE #12%, MODE 8% & \ PRINT #12%, CHR$(155%);'<' & ! Cancel the type ahead and echo on this keyboard. Wait & ! a few seconds then open them up in ANSII. & 20040 PRINT #12%, CHR$(155%);'Z'; & \ PRINT #12%, RECORD 256%, CHR$(128% + 3%); & ! Send out the interrogation code. & 20050 UNTIL INSTR(1%, FUNC.KB.REST.OF.RESP$, 'c') & \ PRINT #12%, RECORD 256%, CHR$(128% + 1%); & \ GET #12% & \ FIELD #12%, 1% AS FUNC.KB.1ST.RESP.CHAR$ & \ FUNC.KB.REST.OF.RESP$ = FUNC.KB.REST.OF.RESP$ + FUNC.KB.1ST.RESP.CHAR$ & \ NEXT & ! Keep looking in the buffer until we get a response. & 20060 IF INSTR(1%, FUNC.KB.REST.OF.RESP$, '?5') <> 0% & THEN FNKB% = -1% & \ GIGI% = -1% & \ GOTO 20090 & ! Keyboard is a GIGI & 20070 IF INSTR(1%, FUNC.KB.REST.OF.RESP$, '?12') <> 0% & THEN FNKB% = -1% & \ VT125% = -1% & \ GOTO 20090 & ! Keyboard is a VT125 & 20080 IF INSTR(1%, FUNC.KB.REST.OF.RESP$, '?1') <> 0% & THEN FNKB% = -1% & \ VT100% = -1% & \ GOTO 20090 & ! Keyboard is a VT100 & 20090 WAIT 0% & \ FUNC.KB.Z$ = SYS(CHR$(11%)+CHR$(12%)) & \ CLOSE #12% & \ FUNC.KB.Z$ = SYS(CHR$(2%)) & ! Kill the wait, reenable type ahead, close the channel, & ! and reset to echo . & 20100 FNEND & ! End of FNKB% & 21000 DEF* FNMOVE$(ROW%, COLUMN%) & ! The cursor control function. It is assumed that the & ! keyboard type is known and is designated as LSI%, GIGI%, & ! VT100%, or VT125% and is in ANSII mode & 21010 IF LSI% & THEN FNMOVE$ = CHR$(155%) + '=' + CHR$(ROW% + 31%) & + CHR$(COLUMN% + 31%) & ELSE FNMOVE$ = CHR$(155%) + '[' + NUM1$(ROW%) + ';' & + NUM1$(COLUMN%) + 'H' & 21020 FNEND & ! End of FNMOVE$ & 32767 END & 4R 2?10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! MFDBIT & ! & !A program to set the "marked for deletion" bit on files. When & !this bit is set, the file does not show up in a directory & !listing. CLEANing will destroy the file, but until then it is & !on the system and can be recovered by changing the bit again & ! & !This program is similar to the one called UFD. Look to that & !program for a description of the UFD. & ! 100 ! & !Get the account number & ! 110 PRINT "Account number"; \ & INPUTLINE PPN$ \ & PPN$ = CVT$$(PPN$,-1%) 120 IF PPN$ = "" THEN GOTO 900 130 BRACKET% = INSTR(1%,PPN$,"(") \ & IF BRACKET% = 0% & THEN PPN$ = "[" + PPN$ + "]" 200 ! & !get name of file & ! 210 INPUT "File name"; FILE$ 220 IF FILE$ = "" THEN GOTO 100 300 ! & !starting disk & ! 310 DISK$ = "DR0:" 400 ! & !open up and dimension the UFD; get cluster size & ! 410 OPEN DISK$ + PPN$ FOR INPUT AS FILE #1%, MODE 16384% 420 DIM #1%, U%(3583%,7%) & !up to 3584 blockettes of 8 words each 430 CLU% = U%(31%,0%) 500 ! & !look through name blockettes for it and process & ! 510 PTR% = FNLINK%(U%(0%,0%)) & !first word of first blockette is a link to first NB 520 IF PTR% = 0% THEN GOTO 600 !a zero pointer is end of NB's 530 TFILE$ = RAD$(U%(PTR%,1%)) + RAD$(U%(PTR%,2%)) + "." & + RAD$(U%(PTR%,3%)) 540 TFILE$ = CVT$$(TFILE$,2%) 550 IF TFILE$ = FILE$ & THEN GOSUB 2000 \ & GOTO 200 560 PTR% = FNLINK%(U%(PTR%,0%)) !get link to next NB 570 GOTO 520 600 ! & !couldn't find the file on DR0: & ! 610 IF DISK$ = "DR0:" & THEN DISK$ = "DR6:" \ & GOTO 400 900 ! & !done & ! 910 CLOSE #1% 920 GOTO 32767 2000 ! & ! & ! SUBROUTINE: Do a single file & ! & ! 2100 ! & !find the status byte and MFD bit & ! 2110 FSTATUS% = U%(PTR%,4%) AND 255% 2120 MFDBIT% = (FSTATUS% AND 128%) / 128% 2200 ! & !say what is now true & ! 2210 IF MFDBIT% = 0% & THEN PRINT "MFD bit is off." & ELSE PRINT "MFD bit is on." 2300 ! & !ask about new status & ! 2310 INPUT "New status of MFD bit (ON, OFF)"; BIT$ \ & BIT$ = CVT$$(BIT$,-1%) 2320 IF BIT$ = "" THEN RETURN 2330 IF BIT$ <> "ON" AND BIT$ <> "OFF" & THEN PRINT "Please specify." \ & GOTO 2310 2400 ! & !do it & ! 2410 IF BIT$ = "ON" AND MFDBIT% = 0% & THEN U%(PTR%,4%) = U%(PTR%,4%) OR 128% 2420 IF BIT$ = "OFF" AND MFDBIT% = 1% & THEN U%(PTR%,4%) = U%(PTR%,4%) AND (NOT 128%) 2990 RETURN 8000 ! & ! & ! FUNCTIONS & ! & ! 8010 ! & !convert link word to Blockette number & ! & !bits 9 to 11 are the cluster number. The first line gets & ! these bits and multiplies by cluster size & !bits 12 to 15 are block number. The next line gets these and & ! multiplies by 32 (number of blockettes per block) & !bits 4 to 8 are the blockette number. The last line adds & ! this. & !the other bits of the link are not relevant here & ! 8020 DEF FNLINK%(L%) = & ((( L% AND 3584%) / 512% ) * CLU% & + ( SWAP%( L% AND -4096% ) / 16% )) * 32% & + (( L% AND 496%) / 16%) 32767 END & 2?10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! FIND & ! & !A program to make a list of all "hidden" files on the system, & !i.e. files which have the "marked for deletion" bit set but & !are not open. This program is similar to UFD.BAS, which you & !should see for an explanation of the UFD. & ! 80 Z$ = SYS(CHR$(6%)+CHR$(-7%)) !^C trap 90 ON ERROR GOTO 9000 100 ! & !Initialize & ! 110 GOSUB 1000 200 ! & !Explain program and get disk number & ! 210 GOSUB 2000 220 INPUT "Disk number"; DISK$ 230 IF LEFT(DISK$,2%) = "DR" & THEN DISK% = VAL(MID(DISK$,3%,1%)) & ELSE DISK% = VAL(DISK$) 240 DISK$ = "DR" + NUM1$(DISK%) + ":" 300 ! & !output file & ! 310 INPUT "Output file "; OUTFILE$ \ & OUTFILE$ = "HIDDEN.LST" IF OUTFILE$ = "" \ & OUTFILE$ = CVT$$(OUTFILE$,4%) 320 IF INSTR(1%,OUTFILE$,".") = 0% & THEN OUTFILE$ = OUTFILE$ + ".LST" 330 OPEN OUTFILE$ FOR OUTPUT AS FILE #2% 400 ! & !Go through accounts & ! 410 INDEX% = 0% 420 Z$ = SYS( CHR$(6%) + CHR$(25%) + & CHR$(INDEX%) + CHR$(SWAP%(INDEX%)) + & CHR$(255%) + CHR$(255%) + & STRING$(16%,0%) + "DR" + & CHR$(DISK%) + CHR$(255%) ) & ! 430 PROJ% = ASCII(MID(Z$,6%,1%)) \ & PROG% = ASCII(MID(Z$,5%,1%)) 435 IF INSTR(1%,OUTFILE$,"KB:") = 0% & THEN PRINT "Working on "; "["; \ & PRINT USING "###", PROJ%; \ & PRINT ","; \ & PRINT USING "###", PROG%; \ & PRINT "]" 440 IF PROJ% = 1% AND PROG% = 1% THEN GOTO 460 & !Skip [1,1] because it has the MFD 450 GOSUB 3000 !Go through UFD for this account 460 INDEX% = INDEX% + 1% 470 GOTO 420 900 ! & !done & ! 990 GOTO 32767 1000 ! & ! & ! SUBROUTINE: Initialize & ! & ! 1100 ! & !constants & ! 1110 BELL$ = CHR$(26%) 1120 TRUE% = -1% \ & FALSE% = 0% 1990 RETURN 2000 ! & ! & ! SUBROUTINE: Description & ! & ! 2010 PRINT \ & PRINT "This program will print a list of all files with the 'marked for deletion' bit" \ & PRINT "set. Files which have this bet set but are not opened exist on the disk but" \ & PRINT "are not listed by DI, CAT, or PIP and are therefore effectively hidden." \ & PRINT 2990 RETURN 3000 ! & ! & ! SUBROUTINE: Go thorugh UFD for one account & ! & ! 3100 ! & !open the UFD, dimension it and get cluster size & ! 3110 OPEN DISK$ + "[" + NUM1$(PROJ%) + "," + NUM1$(PROG%) + "]" AS FILE #1% 3120 DIM #1%, U%(3538%,7%) 3130 CLU% = U%(31%,0%) 3200 ! & !loop through name blockettes & ! 3210 PTR% = FNLINK%(U%(0%,0%)) 3220 IF PTR% = 0% THEN RETURN 3230 GOSUB 4000 !Do this file 3240 PTR% = FNLINK%( U%(PTR%,0%) ) 3250 GOTO 3220 3990 RETURN 4000 ! & ! & ! SUBROUTINE: Do one file & ! & ! 4100 ! & !quit if bit not set & ! 4110 STATUSBYTE% = U%(PTR%,4%) AND 255% 4120 IF (STATUSBYTE% AND 128%) <> 128% THEN RETURN 4200 ! & !print data & ! 4210 PRINT #2%, "["; \ & PRINT #2%, USING "###", PROJ%; \ & PRINT #2%, ","; \ & PRINT #2%, USING "###", PROG%; \ & PRINT #2%, "] "; 4220 PRINT #2%, RAD$( U%(PTR%,1%) ); & RAD$( U%(PTR%,2%) ); "."; & RAD$( U%(PTR%,3%) ); & !name of file 4230 PRINT #2%, USING " ###", PROT%; & !Protection 4240 AB% = FNLINK%(U%(PTR%,6%)) \ & PRINT #2%, " ";DATE$(U%(AB%,3%)) & !date of creation 4990 RETURN 8000 ! & ! & ! FUNCTIONS & ! & ! 8100 ! & !Convert a link word to a blockette number & ! 8110 DEF FNLINK%(L%) = ((( L% AND 3584%) / 512% ) * CLU% & + ( SWAP%( L% AND -4096% ) / 16% )) * 32% & + (( L% AND 496%) / 16%) 9000 ! & ! & ! Error Routine & ! & ! 9100 ! & !^C error: not caught seperately & ! 9200 ! & !Expected errors (by line number) & ! 9210 IF ERL = 420 THEN GOTO 900 & !assume an error means no more files 9600 ! & !Expected errors (with no specific line number) & ! 9900 ! & !Unexpected errors & ! 9910 Z$ = SYS(CHR$(6%)+CHR$(9%)+CHR$(ERR)) 9920 ERROR$ = RIGHT(Z$,3%) 9930 CLOSE 1% 9940 PRINT #2% \ & PRINT #2% \ & PRINT #2%, "Program ended with an error before all files were processed." \ & PRINT #2%, " "; ERROR$; " at line";ERL 9950 CLOSE #2% 32767 END , 2? 10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! GFD & ! & !A program to access the data in the GFD. It only prints part & !of the data, but this program should be sufficent to show how & !any of the data may be printed. See GFD.DOC for a description & !of the GFD and DISK.DOC for a description of DCN 1 of the & !disk. & ! 1000 ! & ! & ! MAIN PROGRAM & ! & ! & !get the disk number & ! 1010 INPUT "Disk"; DISK$ 1020 IF DISK$ = "" THEN GOTO 9000 & !quit if no disk specified 1030 IF LEFT(DISK$,2%) <> "DR" & THEN DISK$ = "DR" + DISK$ 1040 IF RIGHT(DISK$,LEN(DISK$)) <> ":" & THEN DISK$ = DISK$ + ":" 1050 PRINT \ PRINT 2000 ! & !open disk non-file structured with buffer size large enough & !to get the second block of the MFD. & !get the pack label block & !get the version number and quit if not 1.1 & !get the DCN of the MFD & ! 2010 OPEN DISK$ AS FILE #1%, RECORDSIZE 1024% 2020 FIELD #1%, 1024% AS BUFF$ 2030 GET #1%, BLOCK 1% 2040 VERSION% = FNBYTE%(7%) \ & LEVEL% = FNBYTE%(6%) \ & IF VERSION% <> 1% & OR LEVEL% <> 1% & THEN PRINT "This program only works for 1.1 disks." \ & GOTO 32767 2050 DCN.MFD% = FNWORD%(2%) 3000 ! & !get the account number & ! 3010 PRINT "Account number"; \ & INPUTLINE PPN$ \ & PPN$ = CVT$$(PPN$,-1%) 3020 IF PPN$ = "" THEN GOTO 8000 & !if no account, ask for another disk 3030 IF LEFT(PPN$,1%) = "(" & THEN PPN$ = RIGHT(PPN$,2%) \ & PPN$ = LEFT(PPN$,LEN(PPN$)-1%) & !if [ was given, assume ] also and get rid of both & !remember that the convert will change [ to ( 3040 COMMA% = INSTR(1%,PPN$,",") \ & PROJ% = VAL( LEFT(PPN$,COMMA%-1%) ) \ & PROG% = VAL( RIGHT(PPN$,COMMA%+1%) ) 4000 ! & !get the DCN of the GFD & !if no such project, say so & ! 4010 GET #1%, BLOCK DCN.MFD% 4020 DCN.GFD% = FNWORD%(256% + PROJ%) 4030 IF DCN.GFD% = 0% & THEN PRINT "There is no such project." \ & GOTO 3000 5000 ! & !open up the GFD with correct cluster size & !get the link for this account & ! 5010 CLOSE #1% 5020 OPEN DISK$ AS FILE #1%, RECORDSIZE 16% * 512% 5030 FIELD #1%, 16% * 512% AS BUFF$ 5040 GET #1%, BLOCK DCN.GFD% \ & CURRENT.CLUSTER% = 0% 5050 LINK.NB% = FNWORD%(512% + PROG%) 5060 IF LINK.NB% = 0% & THEN PRINT "There is no such account." \ & GOTO 3000 6000 ! & !get the data for this account & ! 6010 GOSUB 10000 7000 ! & !another account & ! 7010 GOTO 3000 8000 ! & !another disk & ! 8010 GOTO 1000 9000 ! & !normal exit & ! 9010 CLOSE #1% 9990 GOTO 32767 10000 ! & ! & ! SUBROUTINE: Data from GFD & ! & ! & !save the cluster map & ! 10010 FOR I% = 0% TO 7% 10020 CLUSTER.MAP%(I%) = FNWORD%(249%+I%) & !these are the last eight words of the block 10030 NEXT I% 10100 ! & !get correct cluster, block and offset for this link & ! 10110 OFFSET% = FNLINK%(LINK.NB%) \ & !the function GETs the right cluster and finds the offset \ & BYTE.OFFSET% = OFFSET% \ & WORD.OFFSET% = OFFSET%/2% 10200 ! & !save the values of the other links (in case we leave this & !cluster) & ! 10210 LINK.DTB% = FNWORD%(WORD.OFFSET% + 0%) 10220 LINK.AB% = FNWORD%(WORD.OFFSET% + 6%) 10300 ! & !data from the name blockette & ! 10310 PROJ% = FNBYTE%(BYTE.OFFSET% + 3%) \ & PROG% = FNBYTE%(BYTE.OFFSET% + 2%) \ & PRINT "Account [";PROJ%;",";PROG%;"]" 10320 PROT% = FNBYTE%(BYTE.OFFSET% + 9%) \ & PRINT "Protection:";PROT% 10330 STAT% = FNBYTE%(BYTE.OFFSET% + 8%) \ & PRINT "Status";STAT% 10340 LOGINS% = FNBYTE%(BYTE.OFFSET% + 11%) \ & PRINT "Logins:";LOGINS% 10350 OPENS% = FNBYTE%(BYTE.OFFSET% + 10%) \ & PRINT "Opens:";OPENS% 10360 DCN.UFD% = FNWORD%(WORD.OFFSET% + 7%) \ & PRINT "DCN of UFD is"; DCN.UFD% 10400 ! & !data from accounting blockette & !(only some of the data is being printed) & ! 10410 OFFSET% = FNLINK%(LINK.AB%) \ & !the function GETs the right cluster and finds the offset \ & WORD.OFFSET% = OFFSET%/2% 10420 CONNECT% = FNWORD%(WORD.OFFSET% + 2%) \ & PRINT \ & PRINT "Connect time is "; FNTIME$(CONNECT%) 10430 QUOTA% = FNWORD%(WORD.OFFSET% + 6%) \ & PRINT "Quota:";QUOTA% 10500 ! & !data from date/time blockette & !(including link to password blockette) & ! 10510 OFFSET% = FNLINK%(LINK.DTB%) \ & !the function GETs the correct cluster and finds the offset \ & BYTE.OFFSET% = OFFSET% \ & WORD.OFFSET% = OFFSET%/2% 10520 KB.LAST% = FNBYTE%(BYTE.OFFSET% + 3%) 10530 IF KB.LAST% <> 0% & THEN PRINT "Last signed in at KB"; NUM1$(KB.LAST%);":"; \ & PRINT " on ";DATE$(FNWORD%(WORD.OFFSET% + 2%)); \ & PRINT " at ";TIME$(FNWORD%(WORD.OFFSET% + 3%)) 10540 LINK.PB% = FNWORD%(WORD.OFFSET% + 0%) 10600 ! & !data from password blockette & ! 10610 OFFSET% = FNLINK%(LINK.PB%) \ & !the function GETs the correct cluster and finds the offset \ & BYTE.OFFSET% = OFFSET% 10620 PASS$ = CHR$( FNBYTE%(BYTE.OFFSET% + 3%) ) 10630 FOR I% = 4% TO 15% 10640 PASS$ = PASS$ + CHR$( FNBYTE%(BYTE.OFFSET% + I%) ) 10650 NEXT I% 10660 !PRINT \ & !PRINT "Password: "; PASS$ 10700 ! & !print a couple of blank lines & ! 10710 PRINT \ PRINT 10900 ! & !return & ! 10990 RETURN 18000 ! & ! & ! FUNCTIONS & ! & ! 18100 ! & !pull a word from the buffer & !for convenience, the words are numbered as words even though & !the buffer is character (and hence byte) oriented. Words are & !normally numbered starting at zero, but the characters in the & !buffer must be numbered starting at one, so another adjustment & !is needed. & ! 18110 DEF* FNWORD%(W%) 18120 FIRSTBYTE% = W% * 2% + 1% 18180 FNWORD% = ASCII( MID(BUFF$,FIRSTBYTE% ,1%) ) & + SWAP%( ASCII( MID(BUFF$,FIRSTBYTE%+1%,1%) ) ) 18190 FNEND 18200 ! & !pull a byte from the buffer & !Since the bytes are generally numbered starting at zero but & !the characters are numbered begining at one, an adjustment is & !needed. & ! 18210 DEF* FNBYTE%(B%) 18280 FNBYTE% = ASCII(MID(BUFF$,B%+1%,1%)) 18290 FNEND 18300 ! & !convert a link & !If the link indicates another cluster, the correct cluster is & !GETed by the function. & ! & !In a link word the bits have the following meaning: & ! & ! 0 - 8 byte within the block & ! 9 - 11 cluster (16 blocks) number & ! 12 - 15 block within the cluster & ! 18310 DEF* FNLINK%(LINK%) 18320 CLUSTER.NUMBER% = ( LINK% AND 3584% ) / 512% \ & BLOCK.NUMBER% = SWAP%( LINK% AND -4096% ) / 16% \ & BYTE.NUMBER% = LINK% AND 511% 18330 IF CLUSTER.NUMBER% <> CURRENT.CLUSTER% & THEN GET #1%, BLOCK CLUSTER.MAP%(CLUSTER.NUMBER%) \ & CURRENT.CLUSTER% = CLUSTER.NUMBER% 18380 FNLINK% = BLOCK.NUMBER% * 512% + BYTE.NUMBER% 18390 FNEND 18400 ! & !convert a number to time & ! 18410 DEF* FNTIME$(T%) 18420 IF T% = 0% & THEN T$ = "none" \ & GOTO 18480 18430 HOURS% = T% / 60% \ & MINUTES% = T% - HOURS% * 60% 18440 T$ = NUM1$(MINUTES%) \ & IF LEN(T$) = 1% & THEN T$ = "0" + T$ 18450 IF HOURS% > 0% & THEN T$ = NUM1$(HOURS%) + ":" + T$ 18480 FNTIME$ = T$ 18490 FNEND 32767 END 4 2?10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! UFD & ! & !A program to look at the UFD (User File Directory) & ! & !Each block of the UFD is divided into 8 "blockettes". The & !dimension statement does that division (remember that all & !arrays have zero elements). 3584 is the larges number of & !blockettes possible ( 7 clusters of 16 blocks of 32 & !blockettes each). The function FNLINK% is used to convert & !a pointer into a blockette number. & ! 21 ! & !There are several kinds of blockettes. & ! & !The very first blockette is a Label Blockette (LB). Its & !layout is: & ! Word 0: Link to first NB (see below) & ! Word 1: -1 (helps to identify it as an LB & ! Words 2 through 5 are zero & ! Word 6: PPN (project and programmer number) & ! Word 7: -31692 (rad50 for 'UFD') & !Name Blockettes (NB) are described in subroutine 2000 & !Accounting Blockettes (AB) are described in subroutine 2000 & !Retrieval Blockettes (RB) have lists of DCN's and pointers & ! to more RB's & !Attribute Blockettes (ATB) are used by RSX and RMS. They are & !not discussed here. & ! 100 ! & !open up and dimension the UFD; get cluster size & ! 110 PRINT "Account"; \ & INPUTLINE PPN$ \ & PPN$ = CVT$$(PPN$,-1%) 120 OPEN PPN$ FOR INPUT AS FILE #1% & !This is how to open up the UFD 130 DIM #1%, U%(3583%,7%) & !up to 3584 blockettes of 8 words each 140 CLU% = U%(31%,0%) & ! & !Every block in the UFD has a copy of the FDCM (file Directory & !cluster map). Its first (0th) word has the cluster size. The & !other words are device cluster numbers, the physical locations & !of parts of the file. & ! 200 ! & !look through this UFD & ! 210 PTR% = FNLINK%(U%(0%,0%)) & !first word of first blockette is a link to first NB 220 IF PTR% = 0% THEN GOTO 900 !a zero pointer is end of NB's 230 GOSUB 2000 !process this file 240 PTR% = FNLINK%(U%(PTR%,0%)) !get link to next NB 250 GOTO 220 900 ! & !done & ! 910 GOTO 32767 2000 ! & ! & ! SUBROUTINE: Print data for current file & ! & ! 2100 ! & !Data from Name Blockette & ! 2110 PRINT RAD$(U%(PTR%,1%)); & RAD$(U%(PTR%,2%)); "."; & RAD$(U%(PTR%,3%)); & !file name and extension 2120 PRINT USING "<###>", SWAP%(U%(PTR%,4%)) AND 255% & !protection code 2130 ST% = U%(PTR%,4%) AND 255% 2135 PRINT "Status Byte: "; 2140 FOR I% = 7% TO 0% STEP -1% 2150 PRINT USING "#", ( (2% ^ I%) AND ST% ) / 2% ^ I%; 2160 NEXT I% 2170 PRINT 2180 PRINT "Open regardless and open count: ", & ( SWAP%(U%(PTR%,5%)) AND 255% ), ( U%(PTR%,5%) AND 255% ) 2200 ! & !data from Accounting Blockette & ! & ! word 0: link to Attribute Blockette & ! word 1: date of last access & ! word 2: file size in blocks & ! word 3: date of creation & ! word 4: time of creation & ! word 5: run-time system name & ! word 6: " & ! word 7: file clustersize & ! & !for large data files, which have no run-time system, word & !five is set to zero (which is not valid for a RTS) and word & !six is used for the most significant part of the file size. & ! 2210 AB% = FNLINK%(U%(PTR%,6%)) & !get location of Accounting Blockette 2220 PRINT 'access: '; DATE$(U%(AB%,1%)); !date of last access 2230 PRINT ' creation: '; DATE$(U%(AB%,3%)); !date of creation 2240 PRINT ' '; TIME$(U%(AB%,4%)) !time of creation 2250 SIZE = U%(AB%,2%) \ & SIZE = SIZE + 65536. IF SIZE < 0 & !get size and adjust for "negatives" 2260 SIZE = SIZE + 65536. * U%(AB%,6%) UNLESS U%(AB%,5%) & !if a large file, add high order part. 2270 PRINT USING "SIZE: ######", SIZE 2280 PRINT "Run time system: ";RAD$(U%(AB%,5%)) + RAD$(U%(AB%,6%)) 2290 PRINT "Clustersize: ";U%(AB%,7%) 2300 ! & !some space before next file & ! 2310 PRINT \ PRINT 2990 RETURN 8000 ! & ! & ! FUNCTIONS & ! & ! 8010 ! & !convert link word to Blockette number & ! & !bits 9 to 11 are the cluster number. The first line gets & ! these bits and multiplies by cluster size & !bits 12 to 15 are block number. The next line gets these and & ! multiplies by 32 (number of blockettes per block) & !bits 4 to 8 are the blockette number. The last line adds & ! this. & !the other bits of the link are not relevant here & ! 8020 DEF FNLINK%(L%) = & ((( L% AND 3584%) / 512% ) * CLU% & + ( SWAP%( L% AND -4096% ) / 16% )) * 32% & + (( L% AND 496%) / 16%) 32767 END  2? 2 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & ! This software is furnished under no license and may be used & ! and copied in accordance with the nonexistent terms of such & ! license and with or without the inclusion of the above & ! copyright notice. This software or any other copies thereof & ! may be provided or otherwise made available to any other & ! person. & ! & ! The information in this software is subject to change without & ! notice and should not be construed as a commitment by & ! Whittier College or the author. This software is & ! unconditionally guaranteed to perform without error the & ! purpose for which it is intended. Said purpose is to remain & ! the secret of the author and is subject to change without & ! notice and at the whim of the author. & ! & ! Whittier College assumes no responsibility for the use or & ! reliability of its software on equipment that is not supplied & ! by Whittier College. Whittier College supplies no equipment. & ! & ! This program was written for internal use and has not been & ! been significantly modified for export. You may need to make & ! changes to fit your system or needs. If you have any problems & ! please contact: & ! & ! David Rosales & ! Whittier College, Computer Center & ! Whittier CA 90601 & ! (213) 693-0771 ext 287 & ! & 10 EXTEND 15 ! & ! This program allows you to find the DCNs (Disk & ! Cluster Numbers) of a file and also demonstrates & ! a method for GETing the data from the DCNs of the & ! disk. & ! & ! See UFD.DOC and UFD.BAS to understand & ! how the UFD is accessed. & ! & 100 ! & ! Initialize ^C TRAP, ERROR routine and CONSTANTS. & ! & 120 ON ERROR GOTO 19000 & 140 Z$ = SYS(CHR$(6%)+CHR$(-7%)) & ! ^C Error trap & 500 GOSUB 18000 & ! Constant variables. & 1000 INPUT "Disk ";DISK$ \ & DISK$ = "DR0:" IF CVT$$(DISK$,2%) = "" \ & INPUT "Disk cluster size <4>";D.CLU% \ & D.CLU% = 4% IF D.CLU% = 0% & ! Input the disk name. & ! Input the cluster size of the disk. & 1005 PRINT "Account"; \ & INPUTLINE UFD$ \ & GOTO 1005 IF CVT$$(UFD$,2%+4%) = "" & ! Input the account number. & 1010 INPUT "File name";FILE.NAME$ \ & GOTO 1010 IF CVT$$(FILE.NAME$,2%) = "" & ! Input the file name. & 1020 PRINT.IT% = 0% \ & INPUT "Print the contents of the file ";PRINT.IT$ \ & PRINT.IT% = YES% IF LEFT(CVT$$(PRINT.IT$,32%),1%) = "Y" & ! Ask if they want to see the file. & 1040 REC.SIZE% = D.CLU% * 512% & ! Recordsize is the clustersize times the size of a block. & 1060 OPEN DISK$+UFD$ AS FILE #9% \ & DIM #9%, U%(3583%,7%) \ & OPEN DISK$ AS FILE #3% RECORDSIZE REC.SIZE% \ & FIELD #3%, REC.SIZE% AS DISK.CLUSTER$ & ! Open up the UFD. & ! Dimension the UFD. & ! Open the disk (non-file structured). & ! Field a disk cluster. & 1080 NB% = FNNB%(FILE.NAME$) \ & RB% = FNLINK%(U%(NB%,7%)) & ! Find the name blockette of the given file. & ! Find the retrieval blockette in the name blockette. & 1100 FOR WORD% = 0% TO 7% & ! Loop for all the words in each retrieval blockette. & 1120 DCN% = U%(RB%,WORD%) \ & IF WORD% = 0% & THEN & PRINT \ & PRINT "Pointer to the next retrieval "; \ & PRINT "blockette on the disk is DCN";DCN% \ & PRINT "Pointer to the next retrieval "; \ & PRINT "blockette in the array is";FNLINK%(DCN%) \ & PRINT & ! & ! Find the DCN in the WORD%'th position in the & ! retrieval blockette. & ! Word zero is the pointer to the next retrieval & ! blockette. When I get to word zero I print out & ! the different forms in which the pointer to the & ! next retrieval blockette can be interpretted. & ! & ! The DCN would be used in the case of accessing & ! the UFD non-file structured. & ! The FNLINK% version is used to access the UFD in & ! form of an array (as I have done in this program). & 1130 IF WORD% <> 0% & THEN & PRINT \ & PRINT "Word";WORD%;"points to DCN";DCN% \ & PRINT & ! If the word is not the zero word of the retrieval & ! blockette then it is reffering to a DCN on the disk. & ! Print where the DCN is pointing to. & 1140 IF DCN% <> 0% AND WORD% <> 0% AND PRINT.IT% = YES% & THEN & GET #3%, BLOCK DCN% \ & PRINT DISK.CLUSTER$ & ! If the DCN% is not pointing to DCN zero and DCN% & ! is not the pointer to the next retrieval blockette & ! and I have been asked to print out the file, then & ! I do a GET on chanel #3% and print out the cluster. & 1160 NEXT WORD% & ! Do it again. & 1180 RB% = FNLINK%(U%(RB%,0%)) \ & IF RB% = 0% & THEN & GOTO 1200 & ELSE & GOTO 1100 & 1200 CLOSE #9% \ & CLOSE #3% & ! Close the UFD. & ! Close the disk. & 17999 GOTO 32767 & 18000 ! & ! This SUBROUTINE sets up the values to some & ! constant variabales. & ! & 18010 BELL$ = CHR$(7%) + CHR$(7%) + CHR$(7%) & 18020 YES% = -1% \ & TRUE% = -1% \ & NO% = 0% \ & FALSE% = 0% & 18200 RETURN & ! Return from the MAIN SUBROUTINE. & 19000 ! & ! ERROR ROUTINE & ! & 19010 ! * * * * * * * & ! Expected Errors WITHOUT error line numbers & ! * * * * * * * & 19020 ! ^C error \ & IF ERR = 28 & THEN & Z$ = SYS(CHR$(6%)+CHR$(-7%)) \ & CLOSE #9% \ & CLOSE #3% \ & RESUME 100 & 19030 ! ^Z error \ & IF ERR = 11 & THEN & CLOSE #9% \ & CLOSE #3% \ & RESUME 32767% & 19980 ! * * * * * * * & ! Unexpected errors & ! * * * * * * * & 19985 Z$ = SYS(CHR$(6%)+CHR$(9%)+CHR$(ERR)) & 19990 ERROR$ = RIGHT(Z$,3%) & 19995 PRINT BELL$ \ & PRINT " Oh no !! Not another "; ERROR$ \ & PRINT " at line";ERL;"in program DCN !!" & 19999 GOTO 32767 & 22000 ! & ! This function finds the NB of files. & ! & 22010 DEF* FNNB%(FILE.FN$) & 22030 FILE.FN$ = CVT$$(FILE.FN$,2%+32%) \ & FILE.UFD$ = "" \ & FOUND.FILE% = 0% & ! Convert the user input to upper case with no spaces. & ! Initialize the UFD file name string. & ! Initialize the file found flag. & 22050 CLU% = U%(31%,0%) \ & NB% = FNLINK%( U%(0%,0%) ) & ! Find the clustersize of the UFD. & ! Find the pointer to the first name blockette. & 22070 UNTIL FOUND.FILE% = TRUE% \ & IF NB% = 0% & THEN & PRINT "?Can't find file ";FILE.FN$ \ & GOTO 32767 & ! Loop until we find the file in the UFD. & ! If we reach the end of the UFD & ! then & ! we could not find the file. & 22090 FILE.UFD$ = RAD$(U%(NB%,1%)) + RAD$(U%(NB%,2%)) + & "." + RAD$(U%(NB%,3%)) \ & FILE.UFD$ = CVT$$(FILE.UFD$,2%) \ & IF FILE.UFD$ = FILE.FN$ & THEN & FOUND.FILE% = TRUE% & ELSE & NB% = FNLINK%( U%(NB%,0%) ) \ & NEXT & ! Build the file name string. & ! Get rid of all the spaces in the file name string. & ! If the file names match & ! then & ! Set the file found flag. & ! else & ! Find the next name blockette. & ! Look at next name blockette. & 22100 FNNB% = NB% \ & FNEND & 22250 DEF* FNLINK%(L%) = ((( L% AND 3584%) / 512% ) * CLU% & + ( SWAP%( L% AND -4096% ) / 16% )) * 32% & + (( L% AND 496%) / 16%) & 32767 END & \qq 2?10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! RETRIE & ! & !A program to look at Retrieval Blockettes & ! & !See UFD.BAS or UFD.DOC for details on how the program works & ! 100 ! & !Get the account number & ! 110 PRINT "Account number"; \ & INPUTLINE PPN$ \ & PPN$ = CVT$$(PPN$,-1%) 120 IF PPN$ = "" THEN GOTO 900 130 BRACKET% = INSTR(1%,PPN$,"(") \ & IF BRACKET% = 0% & THEN PPN$ = "[" + PPN$ + "]" 200 ! & !open up and dimension the UFD; get cluster size & ! 210 OPEN PPN$ FOR INPUT AS FILE #1% 220 DIM #1%, U%(3583%,7%) & !up to 3584 blockettes of 8 words each 230 CLU% = U%(31%,0%) 300 ! & !get name of file & ! 310 INPUT "File name"; FILE$ 320 IF FILE$ = "" THEN GOTO 100 330 FILE$ = CVT$$(FILE$,32%) 400 ! & !look through name blockettes for it and process & ! 410 PTR% = FNLINK%(U%(0%,0%)) & !first word of first blockette is a link to first NB 420 IF PTR% = 0% THEN GOTO 500 !a zero pointer is end of NB's 430 TFILE$ = RAD$(U%(PTR%,1%)) + RAD$(U%(PTR%,2%)) + "." & + RAD$(U%(PTR%,3%)) 440 TFILE$ = CVT$$(TFILE$,2%) 450 IF TFILE$ = FILE$ & THEN GOSUB 2000 \ & GOTO 300 460 PTR% = FNLINK%(U%(PTR%,0%)) !get link to next NB 470 GOTO 420 500 ! & !couldn't find the file & ! 510 PRINT "Can't find a file by that name." 520 GOTO 300 900 ! & !done & ! 910 CLOSE #1% 920 GOTO 32767 2000 ! & ! & ! SUBROUTINE: Print data for current file & ! & ! 2200 ! & !find Retrieval Blockette & ! 2210 RB% = FNLINK%(U%(PTR%,7%)) 2300 ! & !print the data & ! 2310 FOR I% = 1% TO 7% 2320 DCN% = U%(RB%,I%) 2330 IF DCN% <> 0% THEN PRINT DCN% 2340 NEXT I% 2350 IF U%(RB%,0%) <> 0% & THEN RB% = FNLINK%(U%(RB%,0%)) \ & GOTO 2300 2400 ! & !to print the contents of the file: & !(1) open the disk non file structured with a record size equal & ! to the cluster size. (See DISK.DOC or SYS.DOC for how to & ! find the cluster size.) & !(2) field the buffer at the same size & !(3) for each value of DCN%, use GET #?, BLOCK DCN% to get the & ! appropriate cluster and then print it & ! 2900 RETURN 8000 ! & ! & ! FUNCTIONS & ! & ! 8010 ! & !convert link word to Blockette number & ! & !bits 9 to 11 are the cluster number. The first line gets & ! these bits and multiplies by cluster size & !bits 12 to 15 are block number. The next line gets these and & ! multiplies by 32 (number of blockettes per block) & !bits 4 to 8 are the blockette number. The last line adds & ! this. & !the other bits of the link are not relevant here & ! 8020 DEF FNLINK%(L%) = & ((( L% AND 3584%) / 512% ) * CLU% & + ( SWAP%( L% AND -4096% ) / 16% )) * 32% & + (( L% AND 496%) / 16%) 32767 END <i" 2?10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! DATETI & ! & !A program to find data in the Date/Time blockete of the GFD: & !last keyboard number, date and time of last login, date and & !time of last pasword change, and date and time of account & !creation. It can be accesses by FIP -25. At the time of & !writing, this form of FIP -25 is not documented in the RSTS & !Programmers Manual, but I think this program prints all the & !information from this SYS call that isn't either in the data & !passed or easily available from other SYS functions. & ! 90 ON ERROR GOTO 9000 100 ! & !preliminaries & ! 110 GOSUB 1000 120 PRINT \ & PRINT " This program prints the information available in the Date/Time blockette" \ & PRINT "of the GFD." \ & PRINT 200 ! & !get the account number & ! 210 PRINT "Account number"; \ & INPUTLINE PPN$ \ & PPN$ = CVT$$(PPN$,-1%) 220 IF PPN$ = "" THEN GOTO 900 230 IF LEFT(PPN$,1%) = "(" & THEN PPN$ = RIGHT(PPN$,2%) \ & PPN$ = LEFT(PPN$,LEN(PPN$)-1%) 240 COMMA% = INSTR(1%,PPN$,",") 250 PROJ% = VAL( LEFT(PPN$,COMMA%-1%) ) \ & PROG% = VAL( RIGHT(PPN$,COMMA%+1%) ) 300 ! & !get and print the data from the SYS call & ! 310 GOSUB 2000 400 ! & !again & ! 410 GOTO 200 900 ! & !done & ! 990 GOTO 32767 1000 ! & ! & ! SUBROUTINE: preliminaries & ! & ! 1100 ! & !some constants & ! 1110 TRUE% = -1% \ & FALSE% = 0% 1120 BELL$ = CHR$(7%) 1900 ! & !return & ! 1990 RETURN 2000 ! & ! & ! SUBROUTINE: data from SYS call & ! & ! 2100 ! & !dimension the array to store return from SYS call & ! 2110 DIM S%(30%) 2200 ! & !do the SYS call and CHANGE & ! 2210 Z$ = SYS( CHR$(6%) + CHR$(-25%) + CHR$(-1%) + CHR$(4%) & + CHR$(PROG%) + CHR$(PROJ%) ) 2220 CHANGE Z$ TO S% 2300 ! & !select the data & ! 2301 !Data in the relevant blockette is: & ! & ! bytes description & ! 0 - 1 link to next block & ! 2 last keyboard number & ! 3 4 & ! 4 - 5 Date of last login & ! 6 - 7 Time of last login & ! 8 - 9 Date of password change & ! 10 - 11 Time of password change & ! 12 - 13 Date account created & ! 14 - 15 Time account created & ! 2302 ! & !As best as I can tell, the data returned from the SYS call is & ! & ! bytes description & ! 1 Job number (times 2) & ! 2 so far this has always been 2 & ! 3 so far this has always been 255 & ! 4 so far this has always been 4 & ! 5 - 6 PPN in usual format & ! 7 so far this has always been 4 & ! 8 keyboard number last logged in to & ! 9 - 10 date of last login & ! 11 - 12 time of last login & ! 13 - 14 date of last password change & ! 15 - 16 time of last password change & ! 17 - 18 date account created & ! 19 - 20 time account created & ! 21 - 29 so far these have always been zero & ! 30 so far this has always been 50 & ! 2310 PRINT 2320 INDATE$ = DATE$( S%( 9%) + SWAP%(S%(10%)) ) \ & INTIME$ = TIME$( S%(11%) + SWAP%(S%(12%)) ) 2330 KB% = S%(8%) 2340 PRINT "Last login was at KB"; NUM1$(KB%); ":"; \ & PRINT " on ";INDATE$;" at ";INTIME$;"." 2350 CHANGEDATE$ = DATE$( S%(13%) + SWAP%(S%(14%)) ) \ & CHANGETIME$ = TIME$( S%(15%) + SWAP%(S%(16%)) ) 2360 PRINT "Password last changed on "; CHANGEDATE$; \ & PRINT " at ";CHANGETIME$;"." 2370 CREATEDATE$ = DATE$( S%(17%) + SWAP%(S%(18%)) ) \ & CREATETIME$ = TIME$( S%(19%) + SWAP%(S%(20%)) ) 2380 PRINT "Account created on "; CREATEDATE$; \ & PRINT " at ";CREATETIME$;"." 2390 PRINT \ PRINT 2900 ! & !return & ! 2990 RETURN 9000 ! & ! & ! ERROR ROUTINE & ! & ! 9100 IF ERL = 250 & THEN PRINT "Invalid account number." \ & RESUME 200 9110 IF ERL = 2210 & AND ERR = 5 & THEN PRINT "Account doesn't exist." \ & RESUME 200 9120 IF ERL = 2210 & THEN PRINT "Invalid account number." \ & RESUME 200 9120 ON ERROR GOTO 0 32767 END  & 2? 10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! BIGFIL & ! & !A program to print a list of "big" files. It prints the names & !of any files whose size is larger than the size given. User & !delete files if desired. & ! & !See UFD.BAS or UFD.DOC for a full explanation of the workings & !of this program. & ! 70 GOSUB 1000 !for initialization 80 Z$ = SYS(CHR$(6%)+CHR$(-7%)) !^C trap 90 ON ERROR GOTO 9000 100 ! & !get disk and file size to look for & ! 110 PRINT "This program will list all files larger than or equal to the given size." 120 INPUT "Disk"; DISK$ \ & DISK$ = CVT$$(DISK$,-1%) 130 IF LEFT(DISK$,2%) = "DR" & THEN DISK% = VAL(MID(DISK$,3%,1%)) & ELSE DISK% = VAL(DISK$) 140 INPUT "Minimum size"; MINSIZE 200 ! & !get the delete option & ! 210 PRINT "You have three options concerning the deletion of the large files." \ & PRINT "ALL to delete all such files" \ & PRINT "SELECT if you wish to be asked about each file" \ & PRINT "NONE to keep all files." \ & PRINT 220 INPUT "Your option (A, S or N)"; OPTION$ \ & OPT$ = CVT$$(LEFT(OPTION$,1%),-1%) 230 IF OPT$ = "A" & THEN DEL% = ALL% \ & GOTO 400 240 IF OPT$ = "S" & THEN DEL% = ASK% \ & GOTO 400 250 IF OPT$ = "N" & THEN DEL% = NONE% \ & GOTO 400 260 PRINT BELL$;'Please answer "A", "S" or "N".' \ & GOTO 200 400 ! & !preset index & ! 410 N% = -1% 500 ! & !get the next file & ! 510 N% = N% + 1% 520 Z$ = SYS( CHR$(6%) + CHR$(25%) + CHR$(N%) + CHR$(SWAP%(N%)) & + CHR$(255%) + CHR$(255%) + STRING$(16%,0%) + "DR" & + CHR$(DISK%) + CHR$(255%) ) 530 PROJ% = ASCII(MID(Z$,6%,1%)) \ & PROG% = ASCII(MID(Z$,5%,1%)) 540 PPN$ = "[" + NUM1$(PROJ%) + "," + NUM1$(PROG%) + "]" 550 PRINT " (Now working on ";PPN$;")" 600 ! & !open up and dimension the UFD; get cluster size & ! 610 IF PROJ% = 0% & THEN GOTO 510 620 IF PROJ% = 1% & AND PROG% = 1% & THEN GOTO 510 630 OPEN "DR" + NUM1$(DISK%) + ":" + PPN$ FOR INPUT AS FILE #1% 640 DIM #1%, U%(3583%,7%) 650 CLU% = U%(31%,0%) 700 ! & !go through this UFD & ! 710 PTR% = FNLINK%(U%(0%,0%)) & !first word of first blockette is a link to first NB 720 IF PTR% = 0% THEN GOTO 800 !a zero pointer is end of NB's 730 GOSUB 2000 !process this file 740 PTR% = FNLINK%(U%(PTR%,0%)) !get link to next NB 750 GOTO 720 800 ! & !go back for next account & ! 810 CLOSE #1% 820 GOTO 500 900 ! & !done & ! 910 GOTO 32767 1000 ! & ! & ! SUBROUTINE: preliminaries & ! & ! 1100 ! & !some constants & ! 1110 TRUE% = -1% \ & FALSE% = 0% 1120 BELL$ = CHR$(7%) 1200 ! & !values for DEL% option & !(the specific values are meaningless. They only need to be & !different) & ! 1210 ALL% = 1% 1220 NONE% = 0% 1230 ASK% = 2% 1990 RETURN 2000 ! & ! & ! SUBROUTINE: Find size of file and maybe print & ! & ! 2100 ! & !Data from Name Blockette & ! 2110 N$ = RAD$(U%(PTR%,1%)) + RAD$(U%(PTR%,2%)) + "." & + RAD$(U%(PTR%,3%)) & !file name and extension 2200 ! & !find the size & ! 2210 AB% = FNLINK%(U%(PTR%,6%)) & !get location of Accounting Blockette 2220 SIZE = U%(AB%,2%) \ & SIZE = SIZE + 65536. IF SIZE < 0 & !get size and adjust for "negatives" 2230 SIZE = SIZE + 65536. * U%(AB%,6%) UNLESS U%(AB%,5%) & !if a large file, add high order part. 2300 ! & !print it out if big enough & ! 2310 IF SIZE < MINSIZE THEN RETURN 2320 PRINT USING "[ ###", PROJ%; \ & PRINT ","; \ & PRINT USING "### ] ", PROG%; 2330 PRINT N$; TAB(22%); 2340 PRINT USING "######", SIZE; 2350 IF DEL% = ASK% & THEN PRINT " ";DATE$(U%(AB%,3%)); " "; TIME$(U%(AB%,4%)); 2400 ! & !go to deletion routine if desired & ! 2410 IF DEL% = ALL% & THEN GOSUB 5000 \ & PRINT " deleted." \ & RETURN 2420 IF DEL% = ASK% & THEN GOSUB 4000 \ & RETURN 2430 PRINT !to cancel last semicolon in case no deletion was requested 2990 RETURN 4000 ! & ! & ! SUBROUTINE: delete on request & ! & ! 4100 ! & !print the question and get answer & ! 4110 INPUT " Delete (Y/N)";ANSWER$ \ & ANSWER$ = CVT$$(LEFT(ANSWER$,1%),-1%) 4200 ! & !if answer is NO then return & ! 4210 IF ANSWER$ = "N" THEN RETURN 4300 ! & !if answer isn't yes, ask again & ! 4310 IF ANSWER$ = "Y" THEN GOTO 4400 4320 PRINT 'Please answer "Y" to delete or "N" to save.' 4330 GOTO 4110 4400 ! & !delete it & ! 4410 GOSUB 5000 4420 PRINT "File ";FILE$;" deleted." \ & PRINT 4990 RETURN 5000 ! & ! & ! SUBROUTINE: delete current file & ! ( [PROJ%,PROG%]N$ ) & ! & ! 5010 FILE$ = "[" + NUM1$(PROJ%) + "," + NUM1$(PROG%) + "]" + N$ 5020 KILL FILE$ 5990 RETURN 8000 ! & ! & ! FUNCTIONS & ! & ! 8010 ! & !convert link word to Blockette number & ! & !bits 9 to 11 are the cluster number. The first line gets & ! these bits and multiplies by cluster size & !bits 12 to 15 are block number. The next line gets these and & ! multiplies by 32 (number of blockettes per block) & !bits 4 to 8 are the blockette number. The last line adds & ! this. & !the other bits of the link are not relevant here & ! 8020 DEF FNLINK%(L%) = & ((( L% AND 3584%) / 512% ) * CLU% & + ( SWAP%( L% AND -4096% ) / 16% )) * 32% & + (( L% AND 496%) / 16%) 9000 ! & ! & ! Error Routine & ! & ! 9100 ! & !^C error & ! 9110 IF ERR = 28 & THEN PRINT "Aborted by ^C." \ & GOTO 32767 9200 ! & !Expected errors (by line number) & ! 9210 IF ERL = 520 THEN RESUME 900 & !account wasn't there 9220 IF ERL = 5020 THEN RESUME 5990 & !file couldn't be killed 9600 ! & !Expected errors (by type) & ! 9900 ! & !Unexpected errors & ! 9910 Z$ = SYS(CHR$(6%)+CHR$(9%)+CHR$(ERR)) 9920 ERROR$ = RIGHT(Z$,3%) 9930 PRINT " ***** Whoops! *****" \ & PRINT " "; ERROR$; " at line";ERL 9990 GOTO 32767 32767 END f 2?10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! PROBIT & ! & !A program to set the protect bit on files. When this bit is & !set the file can be neither deleted not renamed. & ! & !This program is similar to the one called UFD. Look to that & !program for a description of the UFD. & ! 100 ! & !Get the account number & ! 110 PRINT "Account number"; \ & INPUTLINE PPN$ \ & PPN$ = CVT$$(PPN$,-1%) 120 IF PPN$ = "" THEN GOTO 900 130 BRACKET% = INSTR(1%,PPN$,"(") \ & IF BRACKET% = 0% & THEN PPN$ = "[" + PPN$ + "]" 200 ! & !get name of file & ! 210 INPUT "File name"; FILE$ 220 IF FILE$ = "" THEN GOTO 100 300 ! & !starting disk & ! 310 DISK$ = "DR0:" 400 ! & !open up and dimension the UFD; get cluster size & ! 410 OPEN DISK$ + PPN$ FOR INPUT AS FILE #1%, MODE 16384% 420 DIM #1%, U%(3583%,7%) & !up to 3584 blockettes of 8 words each 430 CLU% = U%(31%,0%) 500 ! & !look through name blockettes for it and process & ! 510 PTR% = FNLINK%(U%(0%,0%)) & !first word of first blockette is a link to first NB 520 IF PTR% = 0% THEN GOTO 600 !a zero pointer is end of NB's 530 TFILE$ = RAD$(U%(PTR%,1%)) + RAD$(U%(PTR%,2%)) + "." & + RAD$(U%(PTR%,3%)) 540 TFILE$ = CVT$$(TFILE$,2%) 550 IF TFILE$ = FILE$ & THEN GOSUB 2000 \ & GOTO 200 560 PTR% = FNLINK%(U%(PTR%,0%)) !get link to next NB 570 GOTO 520 600 ! & !couldn't find the file on DR0: & ! 610 IF DISK$ = "DR0:" & THEN DISK$ = "DR6:" \ & GOTO 400 900 ! & !done & ! 910 CLOSE #1% 920 GOTO 32767 2000 ! & ! & ! SUBROUTINE: Do a single file & ! & ! 2100 ! & !find the status byte and protect bit & ! 2110 FSTATUS% = U%(PTR%,4%) AND 255% 2120 PROBIT% = (FSTATUS% AND 32%) / 32% 2200 ! & !say what is now true & ! 2210 IF PROBIT% = 0% & THEN PRINT "Protect bit is off." & ELSE PRINT "Protect bit is on." 2300 ! & !ask about new status & ! 2310 INPUT "New status of protect bit (ON, OFF)"; BIT$ \ & BIT$ = CVT$$(BIT$,-1%) 2320 IF BIT$ = "" THEN RETURN 2330 IF BIT$ <> "ON" AND BIT$ <> "OFF" & THEN PRINT "Please specify." \ & GOTO 2310 2400 ! & !do it & ! 2410 IF BIT$ = "ON" AND PROBIT% = 0% & THEN U%(PTR%,4%) = U%(PTR%,4%) OR 32% 2420 IF BIT$ = "OFF" AND PROBIT% = 1% & THEN U%(PTR%,4%) = U%(PTR%,4%) AND (NOT 32%) 2990 RETURN 8000 ! & ! & ! FUNCTIONS & ! & ! 8010 ! & !convert link word to Blockette number & ! & !bits 9 to 11 are the cluster number. The first line gets & ! these bits and multiplies by cluster size & !bits 12 to 15 are block number. The next line gets these and & ! multiplies by 32 (number of blockettes per block) & !bits 4 to 8 are the blockette number. The last line adds & ! this. & !the other bits of the link are not relevant here & ! 8020 DEF FNLINK%(L%) = & ((( L% AND 3584%) / 512% ) * CLU% & + ( SWAP%( L% AND -4096% ) / 16% )) * 32% & + (( L% AND 496%) / 16%) 32767 END  N 2?10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! ACCLST & ! & !A program to use the MFD and GFD to make a list of the accounts on & !a disk. & !See DISK.DOC, GFD.DOC, and GFD.BAS for an explanation of the MFD and & !GFD. & ! 100 ! & !dimension statement for storage of DCN's for GFD's & ! 110 DIM DCN.GFD%(255%) 1000 ! & ! & ! MAIN PROGRAM & ! & ! & !get the disk number and output file & ! 1010 INPUT "Disk"; DISK$ 1020 IF DISK$ = "" THEN GOTO 9000 & !quit if no disk specified 1030 IF LEFT(DISK$,2%) <> "DR" & THEN DISK$ = "DR" + DISK$ 1040 IF RIGHT(DISK$,LEN(DISK$)) <> ":" & THEN DISK$ = DISK$ + ":" 1050 PRINT \ PRINT 1060 PRINT "Output file"; \ & INPUTLINE OUTFILE$ \ & OUTFILE$ = CVT$$(OUTFILE$,-1%) 1070 OPEN OUTFILE$ FOR OUTPUT AS FILE #2% 1080 PRINT #2%, FOR L% = 1% TO 4% \ & PRINT #2%, "Listing of accounts on "; DISK$; " as of "; DATE$(0%) \ & PRINT #2% 1090 LINES% = 6% 2000 ! & !open disk non-file structured with buffer size large enough & !to get the second block of the MFD. & !get the pack label block & !get the version number and quit if not 1.1 & ! 2010 OPEN DISK$ AS FILE #1%, RECORDSIZE 1024% 2020 FIELD #1%, 1024% AS BUFF$ 2030 GET #1%, BLOCK 1% 2040 VERSION% = FNBYTE%(7%) \ & LEVEL% = FNBYTE%(6%) \ & IF VERSION% <> 1% & OR LEVEL% <> 1% & THEN PRINT "This program only works for 1.1 disks." \ & GOTO 32767 2050 DCN.MFD% = FNWORD%(2%) 3000 ! & !get the DCN of the MFD & ! 3010 GET #1%, BLOCK DCN.MFD% 4000 ! & !save DCN's for GFD's & !go through a second time to use them. & !Two loops are needed because there are GET's inside the loop which & !change the buffer. & ! 4010 FOR PROJ% = 1% TO 255% 4020 DCN.GFD%(PROJ%) = FNWORD%(256% + PROJ%) 4030 NEXT PROJ% 4040 FOR PROJ% = 1% TO 255% 4050 IF DCN.GFD%(PROJ%) = 0% & THEN GOTO 7010 5000 ! & !open up the GFD with correct cluster size & !get the link for this account & ! 5010 CLOSE #1% 5020 OPEN DISK$ AS FILE #1%, RECORDSIZE 16% * 512% 5030 FIELD #1%, 16% * 512% AS BUFF$ 5040 GET #1%, BLOCK DCN.GFD%(PROJ%) \ & CURRENT.CLUSTER% = 0% 6000 ! & !go through this GFD & ! 6010 FOR PROG% = 0% TO 255% 6020 LINK.NB% = FNWORD%(512% + PROG%) 6030 IF LINK.NB% <> 0% & THEN GOSUB 10000 6040 NEXT PROG% 7000 ! & !end of PROJ% loop & ! 7010 NEXT PROJ% 9000 ! & !normal exit & ! 9010 CLOSE #1% 9990 GOTO 32767 10000 ! & ! & ! SUBROUTINE: print accounts & ! & ! & ! & !check for adjacency & ! 10010 IF PROJ% = 1% & AND PROG% = 0% & THEN WORKING.PROJ% = 0% \ & FIRST.PROG% = 1% \ & LAST.PROG% = 1% 10020 IF PROJ% = WORKING.PROJ% & AND PROG% = LAST.PROG% + 1% & THEN LAST.PROG% = PROG% \ & RETURN & !if it fits in the current range, don't print it yet 10100 ! & !this account is not in current range & !if there was only one or two, print it/them & ! 10110 IF (LAST.PROG% = FIRST.PROG%) & THEN PRINT #2%, USING "[###", WORKING.PROJ%; \ & PRINT #2%, ","; \ & PRINT #2%, USING "###]", FIRST.PROG% \ & LINES% = LINES% + 1% \ & GOTO 10300 10120 IF (LAST.PROG% - FIRST.PROG%) = 1% & THEN PRINT #2%, USING "[###", WORKING.PROJ%; \ & PRINT #2%, ","; \ & PRINT #2%, USING "###]", FIRST.PROG% \ & PRINT #2%, USING "[###", WORKING.PROJ%; \ & PRINT #2%, ","; \ & PRINT #2%, USING "###]", LAST.PROG% \ & LINES% = LINES% + 2% \ & GOTO 10300 10200 ! & !if several, print them on one line & ! 10210 PRINT #2%, USING "[###", WORKING.PROJ%; \ & PRINT #2%, ","; \ & PRINT #2%, USING "###]", FIRST.PROG%; \ & PRINT #2%, " - "; \ & PRINT #2%, USING "[###", WORKING.PROJ%; \ & PRINT #2%, ","; \ & PRINT #2%, USING "###]", LAST.PROG% \ & LINES% = LINES% + 1% 10300 ! & !count lines & ! 10310 IF LINES% >= 55% & THEN PRINT #2%, CHR$(12%) \ & PRINT #2%, FOR L% = 1% TO 4% \ & LINES% = 4% 10400 ! & !begin again & ! 10410 WORKING.PROJ% = PROJ% 10420 FIRST.PROG% = PROG% \ & LAST.PROG% = PROG% 10900 ! & !done & ! 10990 RETURN 18000 ! & ! & ! FUNCTIONS & ! & ! 18100 ! & !pull a word from the buffer & !for convenience, the words are numbered as words even though & !the buffer is character (and hence byte) oriented. Words are & !normally numbered starting at zero, but the characters in the & !buffer must be numbered starting at one, so another adjustment & !is needed. & ! 18110 DEF* FNWORD%(W%) 18120 FIRSTBYTE% = W% * 2% + 1% 18180 FNWORD% = ASCII( MID(BUFF$,FIRSTBYTE% ,1%) ) & + SWAP%( ASCII( MID(BUFF$,FIRSTBYTE%+1%,1%) ) ) 18190 FNEND 18200 ! & !pull a byte from the buffer & !Since the bytes are generally numbered starting at zero but & !the characters are numbered begining at one, an adjustment is & !needed. & ! 18210 DEF* FNBYTE%(B%) 18280 FNBYTE% = ASCII(MID(BUFF$,B%+1%,1%)) 18290 FNEND 32767 END y 2? 10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You will need to make & !changes to fit your courses. If you have any problems please & !contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! CLASS & ! & !A program to create, delete and tape blocks of accounts. Its & !main purpose is for class accounts. It therefore has a data & !file which has the project numbers usually given to the & !presently known classes. If these same numbers are used each & !time, then we can have one backup tape for each class which & !is zeroed and reused each offering. In the case of Math 238 & !we may want to keep more than one offering on tape. Therefore & !the program has the option to use a different project number & !on the tape. (Several different offerings can be put on one & !tape this way). & ! 21 ! & !The data file is a virtual array with room for 20 entries & !(i.e. 20 classes). Each entry consists of: & ! class number & ! name of class (up to 16 characters) & ! usual project number & ! actual project number & ! last programmer number assigned (they are assigned in order) & ! 22 ! & !The program has these options: & ! create a project & ! tape a project & ! delete a project & ! 23 ! & !Since the [?,0] account is usually assigned to the professor & !the user is asked about it (quota, password, etc.) seperately & ! 80 Z$ = SYS(CHR$(6)+CHR$(-7%)) !^C trap 90 ON ERROR GOTO 9000 100 !Preliminaries 110 GOSUB 1000 200 !Get number of class and find in list 210 GOSUB 2000 300 !Get the option 310 GOSUB 3000 400 !Do the option 410 ON OPTION% GOSUB 11000, 12000, 13000, 14000, 900 900 !Quit 910 CLOSE #1%, #2% 990 GOTO 32767 1000 !Subroutine: preliminaries 1100 !Constants 1110 CLEAR$ = CHR$(26%) 1120 BELL$ = CHR$(7%) 1200 !Dimension 1210 DIM CLASSNO%(20%), CLASSNAME$(20%), PROJECT%(20%) 1220 DIM #2%, LAST%(20%) 1300 !Open files 1310 OPEN "[1,3]CLASS.DAT" FOR INPUT AS FILE #1% \ & OPEN "[1,3]CLASS.DA2" FOR INPUT AS FILE #2% & !Error routine branches to 1350 if not there. 1320 GOTO 1400 1350 !If data file isn't there. 1360 PRINT BELL$;"Can't find data file. Check with math department." \ & GOTO 32767 1400 !Read the file 1410 I% = I% + 1% 1420 INPUT #1%, CLASSNO%(I%), CLASSNAME$(I%),PROJECT%(I%) & !End of file will cause branch to 1450 1440 GOTO 1410 1450 !Branch to here at end of file or if it finds a comment line 1460 NOENTRIES% = I% - 1% 1990 RETURN 2000 !Subroutine: number of class 2100 !Get number of class 2110 INPUT "Number of class"; CLASSNO% 2200 !Look for it 2210 FOR I% = 1% TO NOENTRIES% 2220 IF CLASSNO%(I%) = CLASSNO% THEN 2300 2230 NEXT I% 2250 !Class not found 2260 PRINT BELL$; "Can't find this class." \ & GOTO 2110 2300 !Class found 2310 INDEX% = I% 2320 CLASSNAME$ = CLASSNAME$(INDEX%) \ & PROJECT% = PROJECT%(INDEX%) \ & LAST% = LAST%(INDEX%) 2330 ZERO$ = "[" + NUM1$(PROJECT%) + ",0]" 2400 !Print data for user 2410 PRINT \ & PRINT "Class: "; CLASSNAME$ \ & PRINT "Project number: "; PROJECT% 2420 IF PROJECT% = 141% & THEN PRINT "Sorry, project 241 is used for FORTRAN." 2430 PRINT \ & INPUT "Continue "; ANSWER$ \ & ANS$ = CVT$$(LEFT(ANSWER$,1%),32%) \ & IF ANS$ = "" THEN ANS$ = "Y" 2440 IF ANS$ <> "Y" THEN 900 2500 ! 2990 RETURN 3000 !Subroutine: Get the option 3100 !Print the list 3110 PRINT CLEAR$; 3120 PRINT "Options available are:" \ & PRINT \ & PRINT "CREATE to create accounts" \ & PRINT "TAPE to PIP accounts to tape" \ & PRINT "DELETE to delete accounts" \ & PRINT "MOVE to PIP accounts to new project" \ & PRINT "EXIT to quit the program" \ & PRINT 3200 !Get the option 3210 INPUT "Option"; OPTION$ \ & O$ = CVT$$(LEFT(OPTION$,1%),32%) 3220 IF O$ = "" THEN O$ = "E" 3300 !Which one is it 3310 OPTION% = INSTR(1%,"CTDME",O$) 3320 IF OPTION% = 0% & THEN PRINT BELL$;"That option not available." \ & GOTO 3210 3990 RETURN 9000 !Error routine 9100 !Expected errors 9110 IF ERR = 28 & THEN CLOSE #1%, #2% \ & GOTO 32767 & !^C error 9120 IF ERR = 11 THEN RESUME 300 9130 IF ERL = 1420 THEN RESUME 1450 9140 IF ERL = 11150 AND ERR = 16% THEN RESUME 11160 & !Account already exists (for zero account) 9150 IF ERL = 11440 AND ERR = 16% THEN RESUME 11460 & !Account already exists (for general case) 9160 IF ERL = 13140 AND ERR = 5 THEN RESUME 13160 & !If file to delete isn't there, just go on (zero case) 9170 IF (ERL = 13230 OR ERL = 13220) THEN RESUME 13270 & !If file to delete isn't there, just go on (general case) 9180 IF ERL = 14340 AND ERR = 16 THEN RESUME 14400 & !MOVE tried to create a file that was already there 9200 !^Z 9210 IF ERR = 11 THEN RESUME 200 9900 !Unexpected errors 9910 Z$ = SYS(CHR$(6%)+CHR$(9%)+CHR$(ERR)) 9920 ERROR$ = RIGHT(Z$,3%) 9930 PRINT " ***** I can't handle this one *****" \ & PRINT " "; ERROR$; " at line";ERL 9940 GOTO 32767 11000 !Subroutine: CREATE option & !See the RSTS/E programming manual for a description of the use & !of the SYS function used here. 11100 !Do the zero account 11120 PRINT "This program treats account ";ZERO$;" seperately." \ & PRINT "Don't worry. If the account already exists, it will not be deleted." 11130 PRINT "Password for "; ZERO$; \ & INPUT PASS$ 11140 PASS$ = FNR50$(PASS$) !Convert to Radix-50 11150 Z$ = SYS(CHR$(6%)+CHR$(0%)+STRING$(5%,0%)+CHR$(PROJECT%)+PASS$) \ & PRINT "Account "; ZERO$; ",0] created." \ & GOTO 11200 & !If account already exist, error routine will branch to 11160 11160 PRINT BELL$;"Account ";ZERO$;" already exists." \ & GOTO 11200 11200 !Ask about the other accounts 11210 PRINT \ & INPUT "How many accounts to be created"; LAST% 11230 INPUT "Password"; PASS$ \ & PASS$ = FNR50$(PASS$) & !Convert to Radix-50 11300 !set up the permanent part of the string 11310 DIM A%(30%) 11320 A%( 0%) = 30% \ & A%( 1%) = 6% \ & A%( 2%) = 0% \ & A%( 8%) = PROJECT% \ & A%(14%) = 0% \ & A%(13%) = 100% 11330 A%(8%+I%) = ASCII(MID(PASS$,I%,1)) FOR I% = 1% TO 4% 11400 !Create the accounts 11410 FOR PG% = 1% TO LAST% 11420 A%(7%) = PG% 11430 CHANGE A% TO A$ 11440 Z$ = SYS(A$) & !If account aleady exists, error routine branches to 11470 11445 PRINT "Account ["; NUM1$(PROJECT%); ","; NUM1$(PG%); & "] created." 11450 GOTO 11470 11460 PRINT BELL$; "Account ["; NUM1$(PROJECT%); ","; NUM1$(PG%); & "] already exists." 11470 NEXT PG% 11500 !Put number of accounts in the data file 11510 LAST%(INDEX%) = LAST% 11600 !Print message 11610 PRINT \ & PRINT LAST%;"accounts were created." 11700 !Password disabling? 11710 INPUT "Do you want to allow disabling of passwords"; ANSWER$ \ & ANS$ = CVT$$(LEFT(ANSWER$,1%),32%) 11720 IF ANS$ <> "Y" THEN 11800 11730 PRINT "Account from which disabling will occur"; \ & INPUTLINE ACCT$ \ & ACCT$ = CVT$$(ACCT$,-1%) 11740 INPUT "Password for disabling"; PASSWORD$ 11750 ARG$ = ACCT$ + ":" + NUM1$(PROJECT%) + ":" + PASSWORD$ 11760 Z$ = SYS(CHR$(8%)+ARG$) !put argument in core common 11770 CHAIN "[1,3]DISDAT" 10000 !DISDAT does the work 11800 ! 11990 RETURN 12000 !Subroutine: TAPE option 12010 PRINT "This part of the program will create a command file and "; \ & PRINT "chain to AT." 12100 !May want a different account number 12110 PRINT "Project number for tape <"; NUM1$(PROJECT%); ">"; \ & INPUT TAPEPROJ% 12120 IF TAPEPROJ% = 0% THEN TAPEPROJ% = PROJECT% 12130 INPUT "Zero the tape first"; ANSWER$ \ & ANS$ = CVT$$(LEFT(ANSWER$,1%),32%) 12140 IF ANS$ = "Y" & THEN ZEROTAPE% = 1% \ & GOTO 12200 12150 IF ANS$ <> "N" & THEN PRINT 'Please answer "YES" or "NO".' \ & GOTO 12130 12200 !Build the command file 12210 OPEN "CLASS.CMD" FOR OUTPUT AS FILE #3% 12220 PRINT #3%, "RUN $PIP" 12225 IF ZEROTAPE% = 1% & THEN PRINT #3%, "MT:/ZE" \ & PRINT #3%, "YES" 12230 INPUT "Tape the zero account"; ANSWER$ \ & ANS$ = CVT$$(LEFT(ANSWER$,1%),32%) \ & IF ANS$ = "Y" & THEN PRINT #3%, "MT0:[";NUM1$(TAPEPROJ%);",0] = ["; \ & PRINT #3%, NUM1$(PROJECT%);",0]/W" 12235 FOR PG% = 1% TO LAST% 12240 PRINT #3%, "MT0:[";NUM1$(TAPEPROJ%);",";NUM1$(PG%);"] = "; \ & PRINT #3%, "[";NUM1$(PROJECT%);",";NUM1$(PG%);"]/W" 12250 NEXT PG% 12260 PRINT #3%, "^Z" 12270 CLOSE #3% 12300 !Chain to AT via the CCL 12310 Z$ = SYS(CHR$(14%)+"AT CLASS") 12990 RETURN 13000 !Subroutine: DELETE option 13100 !May not want to delete the zero account 13110 PRINT "Do you want to delete "; ZERO$; \ & INPUT ANSWER$ \ & ANS$ = CVT$$(LEFT(ANSWER$,1),32%) 13120 IF ANS$ <> "Y" THEN 13200 13130 Z$ = SYS(CHR$(6%)+CHR$(13%)+STRING$(3%,0%)+CHR$(PROJECT%)) & !Zero the account 13140 Z$ = SYS(CHR$(6%)+CHR$(1%)+STRING$(5%,0%)+CHR$(PROJECT%)) \ & PRINT "Account "; ZERO$; " deleted." & !Delete the account 13150 GOTO 13200 13160 PRINT "Account "; ZERO$; " already deleted." 13200 !Do the other accounts 13210 FOR PG% = 1% TO LAST% 13220 Z$ = SYS(CHR$(6%)+CHR$(13%)+CHR$(255%)+CHR$(0%) & +CHR$(PG%)+CHR$(PROJECT%)) & !Zero the account 13230 Z$ = SYS(CHR$(6%)+CHR$(1%)+STRING$(4%,0%)+CHR$(PG%)+CHR$(PROJECT%)) & !Delete the account 13240 PRINT "Account ["; NUM1$(PROJECT%); ","; NUM1$(PG%); "] deleted." 13250 NEXT PG% 13260 GOTO 13300 13270 PRINT "Account ["; NUM1$(PROJECT%); ","; NUM1$(PG%); \ & PRINT "] can't be deleted." \ & GOTO 13250 13280 LAST%(INDEX%) = 0% 13300 ! 13990 RETURN 14000 !Subroutine: MOVE option 14010 PRINT "This part of the program will create a command file and "; \ & PRINT "chain to AT." 14100 !New account number 14110 INPUT "New account number"; NEWPROJ% 14120 IF NEWPROJ% = 0% THEN NEWPROJ% = PROJECT% 14200 !Fixed part of SYS arguments 14210 DIM CREATE%(14%) 14220 CREATE%( 0%) = 14% \ & CREATE%( 1%) = 6% \ & CREATE%( 2%) = 0% \ & CREATE%( 8%) = NEWPROJ% \ & CREATE%(14%) = 0% & !for creating the account 14230 DIM LOOK%(8%) 14240 LOOK%( 0%) = 8% \ & LOOK%( 1%) = 6% \ & LOOK%( 2%) = 14% \ & LOOK%( 8%) = PROJECT% & !for looking up password 14300 !Create the accounts 14310 FOR PG% = 0% TO LAST% 14320 LOOK%(7%) = PG% \ & CHANGE LOOK% TO Z$ \ & Z$ = SYS(Z$) \ & PASS$ = MID(Z$,9%,4%) & !look up the password. See RSTS/E programming manual 14330 IF PG% = 0% THEN CREATE%(13%) = 0% ELSE CREATE%(13%) = 100% 14340 CREATE%(7%) = PG% \ & CHANGE CREATE% TO Z$ \ & Z$ = LEFT(Z$,8%) + PASS$ + RIGHT(Z$,13%) \ & Z$ = SYS(Z$) & !create the new account. See RSTS/E programming manual 14350 NEXT PG% 14360 GOTO 14500 14400 !Tried to create an existing file 14410 PRINT BELL$; \ & PRINT "["; NUM1$(NEWPROJ%); ","; NUM1$(PG%); "] already exists." \ & PRINT "MOVE aborted." \ & RETURN 14500 ! 14800 !Build the command file 14810 OPEN "CLASS.CMD" FOR OUTPUT AS FILE #3% 14820 PRINT #3%, "RUN $PIP" 14830 FOR PG% = 0% TO LAST% 14840 PRINT #3%, "[";NEWPROJ%;",";PG%;"] = [";PROJECT%;",";PG%;"]" 14850 NEXT PG% 14860 PRINT #3%, "^Z" 14870 CLOSE #3% 14900 !Chain to AT via the CCL 14910 Z$ = SYS(CHR$(14%)+"AT CLASS") 14990 RETURN 20000 !Functions 21000 !Password to radix-50 (as four characters) & !See the RSTS/E programming manual for an explanation 21010 DEF FNR50$(P$) = MID( SYS(CHR$(6%)+CHR$(-10%)+P$), 7%,4%) 32767 END +d,F 2?10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! PACKID & ! & !A program to look up and change a disk Pack ID. & !See DISK.DOC & ! 300 ! & !constants & ! 310 TRUE% = -1% \ & FALSE% = 0% 320 BELL$ = CHR$(7%) 1000 ! & ! & ! MAIN PROGRAM & ! & ! & !get the disk number & ! 1010 PRINT "This program will find the Pack ID of a disk." \ & PRINT 1020 INPUT "Disk number"; DISK$ \ & DISK$ = CVT$$(DISK$,-1%) 1030 IF LEFT(DISK$,2%) = "DR" & THEN DISK% = VAL(MID(DISK$,3%,1%)) & ELSE DISK% = VAL(DISK$) 1040 DISK$ = "DR" + NUM1$(DISK%) + ":" 2000 ! & !open the disk non-file structured and field it & ! 2010 OPEN DISK$ AS FILE #1% 2020 FIELD #1%, 512% AS BUFF$ 3000 ! & !print current value & ! 3010 GET #1%, BLOCK 1% 3020 CHANGE MID(BUFF$,13%,4%) TO ID% 3030 ID$ = RAD$( ID%(1%) + SWAP%(ID%(2%)) ) + & RAD$( ID%(3%) + SWAP%(ID%(4%)) ) 3040 PRINT "Current Pack ID:"; ID$ 3050 PRINT 4000 ! & !ask about a change & ! 4010 INPUT "Change pack ID "; ANS$ \ & ANS$ = CVT$$(LEFT(ANS$,1%),-1%) 4020 IF ANS$ <> "Y" THEN GOTO 9000 4030 PRINT "The disk must be dismounted." \ & INPUT "Is the disk dismounted "; ANS$ \ & ANS$ = CVT$$(LEFT(ANS$,1%),-1%) 4040 IF ANS$ <> "Y" THEN GOTO 9000 5000 ! & !They wanted to make a change & ! 5010 INPUT "New pack ID"; ID$ \ & ID$ = CVT$$(ID$,-1%) 5020 Z$ = SYS( CHR$(6%) + CHR$(-10%) + ID$ ) \ & ID$ = MID(Z$,7%,4%) & !use File Name String Scan to convert to RAD50 5030 LSET BUFF$ = LEFT(BUFF$,12%) + ID$ + RIGHT(BUFF$,17%) 5040 PUT #1%, BLOCK 1% 9000 ! & !normal exit & ! 9010 CLOSE #1% 9990 GOTO 32767 32767 END 4[2? STRUCTURE OF THE UFD The UFD consists of 8-word units called "blockettes". A simple way to effect the division of a block into blockettes is by a virtual array. For example the two BASIC lines below set up the UFD for account [1,3]: OPEN "[1,3]" FOR INPUT AS FILE #1% DIM #1%, U%(3583%,7%) The largest number of blockettes possible is 3584 (7 clusters of 16 blocks of 32 blockettes.). The function FNLINK% is used to convert a pointer into a blockette number: DEF FNLINK%(L%) = ((( L% AND 3584%) / 512% ) * CLU% & + ( SWAP%( L% AND -4096% ) / 16% )) * 32% & + (( L% AND 496%) / 16%) Bits 9 to 11 are the cluster number. The first line gets these bits and multiplies by cluster size. Bits 12 to 15 are block number. The next line gets these and multiplies by 32 (number of blockettes per block). Bits 4 to 8 are the blockette number. The last line adds this. The other bits of the link refer to the byte within the blockette. They are not needed here. Every block in the UFD has a copy of the FDCM (file Directory cluster map). Its first (0th) word has the cluster size. The other words are device cluster numbers, the physical locations of parts of the file. There are several kinds of blockettes. Label Blockettes, Name Blockettes, Accounting Blockettes, Retrieval Blockettes and Attribute Blockettes. LABEL BLOCKETTES Word 0: Link to first NB (see below) Word 1: -1 (helps to identify it as an LB Words 2 through 5 are zero Word 6: PPN (project and programmer number) Word 7: -31692 (RAD50 for 'UFD') (The very first blockette is a Label Blockette. There are no others.) NAME BLOCKETTES Word 0: Link to next name blockette Words 1-2: File name in RAD50. Word 3: Extension in RAD50. Word 4: Protection Code and Status (see below) Word 5: R/O regardless open count and Open file count Word 6: Link to Accounting Blockette Word 7: Link to first Retrieval Blockette STATUS BYTE OF NAME BLOCKETTE Bit 0: 'out of SAT' (for historical purposes) Bit 1: file is placed Bit 2: write access given out Bit 3: file open in update mode Bit 4: no file extending allowed (set for contiguous files) Bit 5: No delete or rename allowed Bit 6: entry is MFD entry Bit 7: file marked for deletion ACCOUNTING BLOCKETTES Word 0: Link to Attribute Blockette Word 1: Date of Last Access Word 2: File Size in Blocks Word 3: Date of Creation Word 4: Time of Creation Words 5-6 Run-Time System Name Word 7: File Clustersize (For large non-executable files, word 5 must be zero. The hight byte of word 6 is also zero. The low byte of word six is used to store the most significant part of the file size.) RETRIEVAL BLOCKETTES Retrieval Blockettes have lists of DCN's and pointers to more RB's. ATTRIBUTE BLOCKETTES These are used by RSX and RMS. They are not discussed here. 4FO 2? 2 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & ! This software is furnished under no license and may be used & ! and copied in accordance with the nonexistent terms of such & ! license and with or without the inclusion of the above & ! copyright notice. This software or any other copies thereof & ! may be provided or otherwise made available to any other & ! person. & ! & ! The information in this software is subject to change without & ! notice and should not be construed as a commitment by & ! Whittier College or the author. This software is & ! unconditionally guaranteed to perform without error the & ! purpose for which it is intended. Said purpose is to remain & ! the secret of the author and is subject to change without & ! notice and at the whim of the author. & ! & ! Whittier College assumes no responsibility for the use or & ! reliability of its software on equipment that is not supplied & ! by Whittier College. Whittier College supplies no equipment. & ! & ! This program was written for internal use and has not been & ! been significantly modified for export. You may need to make & ! changes to fit your system or needs. If you have any problems & ! please contact: & ! & ! David Rosales & ! Whittier College, Computer Center & ! Whittier CA 90601 & ! (213) 693-0771 ext 287 & ! & 10 EXTEND & 30 ! & ! KILL0 & ! & ! The Whittier College Zero Size File Killer. & ! & ! & ! This program kills file that have a size of zero blocks. & ! If the file has a protection code of <63> then save it. & ! If the file is open the file will not be killed. & ! & 35 ! & ! EDIT DATE CHANGES MADE & ! & ! Sep/30/1983 Finished writing this program. & ! Changed by: Erasmo David Rosales. & ! & ! Dec/17/1983 Altered ^C trap to give the tally up to & ! the time when the run was aborted, then & ! close the file. & ! Changed by: Erasmo David Rosales. & ! & 100 !************************************************************* & ! & ! Initialize ^C TRAP, ERROR routine and CONSTANTS. & ! & 110 CLEAR$ = CHR$(155%) + '[2J' + CHR$(155%) + '[;H' & + CHR$(140%) + CHR$(26%) + CHR$(8%) + " " & 120 BELL$ = CHR$(7%) + CHR$(7%) & 130 YES% = -1% \ & NO% = 0% \ & TOTAL = 0% \ & SAVED = 0% \ & CANT = 0% & 200 ON ERROR GOTO 19000 & 220 Z$ = SYS(CHR$(6%)+CHR$(-7%)) & ! ^C Error trap & 1000 ! This is the intro to the program. & 1020 PRINT CLEAR$ \ & PRINT FOR CLR% = 1% TO 8% \ & PRINT " This program kills files that have a size of zero blocks." \ & PRINT " If the file has a protection code of <63> or if the" \ & PRINT " file is open the file will not be killed." \ & PRINT & 1030 Z$ = SYS(CHR$(11%)) \ & INPUT "Which disk do you want to clean up ";DISK$ \ & DISK$ = CVT$$(DISK$,32%+2%) \ & FOR D% = 0% TO 7% \ & DEV% = D% IF INSTR(1%,DISK$,NUM1$(D%)) \ & NEXT D% & ! This finds the DISK number. (DR?:) & 1040 DISK$ = "DR"+NUM1$(DEV%)+":" & ! This makes the device string based on the DEV%. & 2000 ! & ! & ! Start the actual program flow.... & ! & ! & 2020 OPEN "DEAD.DOC" AS FILE #9%, MODE 2% & ! This is the file that keeps track of the & ! files that get killed by this program. & 2040 PRINT #9% , FOR CLR% = 1% TO 5% \ & PRINT #9% , STRING$(79%,42%) \ & PRINT #9% , TAB(20%); \ & PRINT #9% , DATE$(0%);" ";TIME$(0%);" ON DISK ";DISK$ \ & PRINT #9% , STRING$(79%,42%) \ & PRINT #9% , FOR CLR% = 1% TO 3% & ! Print the Header at the Top of the page. & 2080 N% = -1% & ! Initialize the account counter. & 2100 ! & ! Get the next account. & ! & 2110 N% = N% + 1% & ! N% is the counter that increments the accounts. & ! The PPN wildcard takes the accounts in order. & 2120 Z$ = SYS( CHR$(6%) + CHR$(25%) + CHR$(N%) + CHR$(SWAP%(N%)) & + CHR$(255%) + CHR$(255%) + STRING$(16%,0%) & + "DR" + CHR$(DEV%) ) & ! This is the PPN wildcard lookup sys function. & 2130 PROJ% = ASCII(MID(Z$,6%,1%)) \ & PROG% = ASCII(MID(Z$,5%,1%)) & 2140 IF PROJ% = 0% AND PROG% = 1% & THEN & GOTO 2100 & ! This will skip over [0,1]. & 2150 IF PROJ% = 1% AND PROG% = 1% & THEN & GOTO 2100 & ! This will skip over [1,1]. & 2160 PPN$ = DISK$+" "+"["+NUM1$(PROJ%)+","+NUM1$(PROG%)+"]" & ! Put together the PPN$ & 2400 ! & ! Open up and dimension the UFD and get the cluster size. & ! & 2410 OPEN PPN$ FOR INPUT AS FILE #1% & 2420 PRINT TAB(20%);"(Now cleaning out ";PPN$;")" & 2430 DIM #1%, U%(3583%,7%) & 2440 CLU% = U%(31%,0%) & 2500 ! & ! Go through this UFD & ! & 2510 POINTER% = FNLINK%(U%(0%,0%)) & ! First word of first blockette is a link to first NB & 2520 IF POINTER% = 0% & THEN & GOTO 2600 & ! A zero pointer is end of NB's & 2530 POINT% = POINTER% & ! Set POINT% = POINTER% so that after we GOSUB 3000 & ! we will still have the correct & ! values for the pointer. & 2540 POINTER% = FNLINK%(U%(POINTER%,0%)) & ! Get link to next NB before this file possibly gets killed. & 2550 GOSUB 3000 & ! Process this file. & 2560 GOTO 2520 & 2600 ! & ! Go back for next account. & ! \ & CLOSE #1% \ & GOTO 2100 & 3000 ! & ! SUBROUTINE: Find size of file and maybe kill. & ! & 3100 ! Data from Name Blockette & 3110 N$ = RAD$(U%(POINT%,1%)) + RAD$(U%(POINT%,2%)) + "." & + RAD$(U%(POINT%,3%)) \ & N$ = PPN$ + N$ & ! [P,PN] File name and extension. & 3200 ! & ! Find the size. & ! & 3210 AB% = FNLINK%(U%(POINT%,6%)) & ! Get location of Accounting Blockette. & 3220 SIZE = U%(AB%,2%) & ! Get the size. & 3300 ! & ! Kill if size is zero. & ! & 3310 IF SIZE <> 0% & THEN & RETURN & 3320 OP% = FNOPEN%(N$) & ! Find out if the file is open. & 3330 IF OP% = YES% & THEN & GOTO 4000 & ! If the file is open then save. & 3340 PRO.CODE% = SWAP%(U%(POINT%,4%)) AND 255% \ & IF (PRO.CODE% AND 2%) = 2% & THEN & GOTO 4000 & ! If the file is write protected against owner then save it. & 3350 KILL N$ \ & TOTAL = TOTAL + 1% & ! Keep a tally of how many files get killed. & 3360 PRINT TAB(20%); \ & PRINT N$; \ & PRINT " size <";NUM1$(SIZE);"> has been killed." & ! Tell the user the file has been killed. & 3370 PRINT #9% , TAB(20%); \ & PRINT #9% , N$; \ & PRINT #9% , " size <";NUM1$(SIZE);"> has been killed." & ! Tell the user the file has been killed. & 3990 RETURN & 4000 SAVED = SAVED + 1% & ! Keep a tally of how many files get saved. & 4020 PRINT TAB(20%); \ & PRINT N$; \ & PRINT " size <";NUM1$(SIZE);"> has been saved.";BELL$ & ! Tell the user the file has been saved. & 4040 PRINT #9% , TAB(20%); \ & PRINT #9% , N$; \ & PRINT #9% , " size <";NUM1$(SIZE);"> has been saved." & ! Tell the user the file has been saved. & 4080 RETURN & 5000 ! & ! Done. & ! & 5020 TOTAL$ = NUM1$(TOTAL) \ & SAVED$ = NUM1$(SAVED) \ & CANT$ = NUM1$(CANT) \ & S1$ = "s have" \ & S2$ = "s have" \ & S3$ = "s" & ! Set the constants needed for the final output. & 5040 IF TOTAL = 1 & THEN & S1$ = " has" & ! A "1" is not plural, so don't say it plural. & 5050 IF SAVED = 1 & THEN & S2$ = " has" & ! A "1" is not plural, so don't say it plural. & 5060 IF CANT = 1 & THEN & S3$ = "" & ! A "1" is not plural, so don't say it plural. & 5070 IF TOTAL = 0 & THEN & TOTAL$ = "No" & ! I want it read "No files ..." not, " 0 files ...". & 5080 IF SAVED = 0 & THEN & SAVED$ = "No" & ! I want it read "No files ..." not, " 0 files ...". & 5090 IF CANT = 0 & THEN & CANT$ = "No" & ! I want it read "No files ..." not, " 0 files ...". & 5100 PRINT FOR CLR% = 1% TO 5% \ & PRINT TOTAL$;" zero size file";S1$;" been deleted." \ & PRINT FOR CLR% = 1% TO 2% \ & PRINT SAVED$;" zero size file";S2$;" been saved." \ & PRINT FOR CLR% = 1% TO 2% \ & PRINT CANT$;" zero size file";S3$;" could not be killed." & 5120 PRINT #9% FOR CLR% = 1% TO 5% \ & PRINT #9% TOTAL$;" zero size file";S1$;" been deleted." \ & PRINT #9% FOR CLR% = 1% TO 2% \ & PRINT #9% SAVED$;" zero size file";S2$;" been saved." \ & PRINT #9% FOR CLR% = 1% TO 2% \ & PRINT #9% CANT$;" zero size file";S3$;" could not be killed." & 5190 CLOSE #9% & ! Close "DEAD.DOC". & 5200 GOTO 32767 & 19000 !************************************************************** & ! & ! Error Routine & ! & !************************************************************** & 19100 ! ^C error \ & IF ERR = 28 AND LINE = 1030 & THEN & PRINT BELL$;"Aborted by ^C" \ & GOTO 32767 & ! Before the program flow die on the ^C error. & 19150 IF ERR = 28 AND LINE <> 1030 & THEN & CLOSE #1%, #3% \ & RESUME 5000 & ! Give the results of the run up to the ^C error. & 19175 IF ERR = 11 & THEN & PRINT BELL$;"Aborted by ^Z" \ & GOTO 32767 & ! This is the end of file error response. & 19200 ! & !Expected errors (by line number) & ! & 19210 IF ERL = 2120 & THEN & RESUME 5000 & ! Account wasn't there & 19230 IF ERL = 3350 & THEN & PRINT TAB(20%); \ & PRINT N$;BELL$; \ & PRINT " size <";NUM1$(SIZE);"> unable to kill." \ & PRINT #9% , TAB(20%); \ & PRINT #9% , N$; \ & PRINT #9% , " size <";NUM1$(SIZE);"> unable to kill." \ & CANT = CANT + 1% \ & RESUME 3990 & ! If the KILL fails for any reason. & ! (most likely the file will not exist) & ! Tell the user the file is already dead, and keep & ! a tally of how many files were dead already. & ! & ! Line 3990 is the Return for the subroutine. & 19900 ! & !Unexpected errors & ! & 19910 Z$ = SYS(CHR$(6%)+CHR$(9%)+CHR$(ERR)) \ & ERROR$ = RIGHT(Z$,3%) \ & PRINT BELL$;"You fool !!! You Caused a "; \ & PRINT ERROR$; " at line";ERL & 19990 GOTO 32767 & 20000 DEF FNOPEN%(FILE.N$) & 20030 ! & ! FUNCTION: TO FIND OUT IF A FILE IS OPEN. & ! & ! This function uses FIP -8% to tell if a file is open. & ! & 20050 ON ERROR GOTO 20400 & 20100 ! & ! Set some constants. & ! & 20110 YES% = -1% \ & NO% = 0% & 20140 DIM Z%(30%) & ! Dimension statement. & 20150 OPEN FILE.N$ FOR INPUT AS FILE #3% & ! Open the file on channel three. & 20180 ! & ! Use the FIP -8% & ! \ & Z$ = SYS(CHR$(6%)+CHR$(-8%)+CHR$(3%)+CHR$(1%)) & 20210 CHANGE Z$ TO Z% & 20230 ! & ! Select the correct data needed to see if the file is open. & ! & ! Get the number which tells how many jobs have this & ! file open, if the file is open by more than one job & ! then someone else also has the file open. & ! & 20240 OTHER% = Z%(3%) \ & REGARDLESS% = Z%(4%) \ & OPENCOUNT% = OTHER% + REGARDLESS% & 20260 CLOSE #3% & ! Finally close the file. & 20280 IF OPENCOUNT% > 1% & THEN & FNOPEN% = YES% & ELSE & FNOPEN% = NO% & 20300 ON ERROR GOTO 19000 \ & FNEND & 20400 IF ERL = 20150 & THEN & OPENCOUNT% = 0% \ & RESUME 20280 & ! This is in the case of the file not existing, & ! or any other error that may occur. & 20500 ! * * * * * * * & ! Unexpected errors & ! * * * * * * * & 20520 GOTO 19000 & ! If there is an unexpected error goto the main error routine. & 21000 ! & ! FUNCTION TO : Convert link word to Blockette number. & ! & ! Bits 9 to 11 are the cluster number. The first line gets & ! these bits and multiplies by cluster size & ! Bits 12 to 15 are block number. The next line gets these & ! and multiplies by 32 (number of blockettes per block) & ! Bits 4 to 8 are the blockette number. The last line adds & ! this. & ! The other bits of the link are not relevant here & ! & 21020 DEF FNLINK%(L%) = & ((( L% AND 3584%) / 512% ) * CLU% & + ( SWAP%( L% AND -4096% ) / 16% )) * 32% & + (( L% AND 496%) / 16%) & 21050 GOTO 32767 & 32767 END t 2?10 EXTEND 11 ! & ! & ! & ! C O P Y R I G H T N O T I C E & ! & ! & ! No Copyright (C) 1981, 1982, 1983, 1984 by & ! Whittier College, Whittier Ca. & ! & ! & !This software is furnished under no license and may be used & !and copied in accordance with the nonexistent terms of such & !license and with or without the inclusion of the above & !copyright notice. This software or any other copies thereof & !may be provided or otherwise made available to any other & !person. No title to and ownership of the software is hereby & !transferred. & ! & !The information in this software is subject to change without & !notice and should not be construed as a commitment by Whittier & !College or the author. & ! & !Whittier College assumes no responsibility for the use or & !reliability of its software on equipment that is not supplied & !by Whittier College. Whittier College supplies no equipment. & ! & !***************************************************************& ! 12 ! & ! This program was written for internal use and has not & !been significantly modified for export. You may need to make & !changes to fit your system or needs. If you have any problems & !please contact: & ! & ! David Garland & ! Whittier College & ! Whittier CA 90601 & ! (213) 693-0771 ext 289 & ! 20 ! & ! BFD & ! & !A program to access the data in the BFD. & ! 1000 ! & ! & ! MAIN PROGRAM & ! & ! & !get the disk number & ! 1010 INPUT "Disk"; DISK$ 1020 IF DISK$ = "" THEN GOTO 9000 & !quit if no disk specified 1030 IF LEFT(DISK$,2%) <> "DR" & THEN DISK$ = "DR" + DISK$ 1040 IF RIGHT(DISK$,LEN(DISK$)) <> ":" & THEN DISK$ = DISK$ + ":" 1050 PRINT \ PRINT 2000 ! & !open disk non-file structured & !get the pack label block & !get the version number and quit if not 1.1 & !get the DCN of the MFD & ! 2010 OPEN DISK$ AS FILE #1%, RECORDSIZE 1024% 2020 FIELD #1%, 1024% AS BUFF$ 2030 GET #1%, BLOCK 1% 2040 VERSION% = FNBYTE%(7%) \ & LEVEL% = FNBYTE%(6%) \ & IF VERSION% <> 1% & OR LEVEL% <> 1% & THEN PRINT "This program only works for 1.1 disks." \ & GOTO 32767 2050 DCN.MFD% = FNWORD%(2%) 4000 ! & !get the DCN of the BFD & ! 4010 GET #1%, BLOCK DCN.MFD% 4020 DCN.BFD% = FNWORD%(7%) 4030 IF DCN.BFD% = 0% & THEN PRINT BELL$; "This disk has no BFD." \ & PRINT "Please correct immediately." \ & GOTO 32767 5000 ! & !open up the BFD with correct cluster size & ! 5010 CLOSE #1% 5020 OPEN DISK$ AS FILE #1%, RECORDSIZE 16% * 512% 5030 FIELD #1%, 16% * 512% AS BUFF$ 5040 GET #1%, BLOCK DCN.BFD% \ & CURRENT.CLUSTER% = 0% 6000 ! & !get the data for this account & ! 6010 GOSUB 10000 7000 ! & !another account & ! 7010 GOTO 3000 8000 ! & !another disk & ! 8010 GOTO 1000 9000 ! & !normal exit & ! 9010 CLOSE #1% 9990 GOTO 32767 10000 ! & ! & ! SUBROUTINE: Data from BFD & ! & ! & !get the links to the job blockette and cluster blockette & ! 10010 LINK.JB% = FNWORD%(0%) 10020 LINK.CB% = FNWORD%(1%) 10100 ! & !get correct cluster, block and offset for job link & ! 10110 OFFSET% = FNLINK%(LINK.JB%) \ & !the function GETs the right cluster and finds the offset \ & BYTE.OFFSET% = OFFSET% \ & WORD.OFFSET% = OFFSET%/2% 10200 ! & !data from job blockette & ! 10210 FOR I% = 1% TO 7% \ & JB%(I%) = FNWORD%(WORD.OFFSET% + I%) \ & IF JB%(I%) <> 0% & THEN PRINT "Job number for job"; I%; "is"; JB%(I%) 10220 NEXT I% 10230 NEXT.LINK% = FNWORD%(WORD.OFFSET%) 10240 IF NEXT.LINK% = 0% THEN GOTO 10400 10250 OFFSET% = FNLINK%(NEXT.LINK%) 10260 GOTO 10100 10300 ! & !get correct cluster, block and offset for job link & ! 10310 OFFSET% = FNLINK%(LINK.JB%) \ & !the function GETs the right cluster and finds the offset \ & BYTE.OFFSET% = OFFSET% \ & WORD.OFFSET% = OFFSET%/2% 10400 ! & !data from cluster blockette & ! & !word meaning & ! & ! 0 reserved & ! 1 -1 & ! 2 number of blocks in a cluster & ! 3 number of blockettes in a block & ! 4 number of words in a blockette & ! 5 number of bytes in a word & ! 6 number of bits in a byte & ! 7 RAD50 for "BFD" & ! 10410 IF FNWORD%(7%) <> 3444% & THEN PRINT BELL$; "?Corrupt BFD." \ & GOTO 32767 10420 PRINT "Number of blocks in a cluster:"; FNWORD%(2%) 10430 PRINT "Number of blockettes in a block:"; FNWORD%(3%) 10440 PRINT "Number of words in a blockette:"; FNWORD%(4%) 10450 PRINT "Number of bytes in a word:"; FNWORD%(5%) 10450 PRINT "Number of bits in a byte:"; FNWORD%(6%) 10700 ! & !print a couple of blank lines & ! 10710 PRINT \ PRINT 10900 ! & !return & ! 10990 RETURN 18000 ! & ! & ! FUNCTIONS & ! & ! 18100 ! & !pull a word from the buffer & !for convenience, the words are numbered as words even though & !the buffer is character (and hence byte) oriented. Words are & !normally numbered starting at zero, but the characters in the & !buffer must be numbered starting at one, so another adjustment & !is needed. & ! 18110 DEF* FNWORD%(W%) 18120 FIRSTBYTE% = W% * 2% + 1% 18180 FNWORD% = ASCII( MID(BUFF$,FIRSTBYTE% ,1%) ) & + SWAP%( ASCII( MID(BUFF$,FIRSTBYTE%+1%,1%) ) ) 18190 FNEND 18200 ! & !pull a byte from the buffer & !Since the bytes are generally numbered starting at zero but & !the characters are numbered begining at one, an adjustment is & !needed. & ! 18210 DEF* FNBYTE%(B%) 18280 FNBYTE% = ASCII(MID(BUFF$,B%+1%,1%)) 18290 FNEND 18300 ! & !convert a link & !If the link indicates another cluster, the correct cluster is & !GETed by the function. & ! & !In a link word the bits have the following meaning: & ! & ! 0 - 8 byte within the block & ! 9 - 11 cluster (16 blocks) number & ! 12 - 15 block within the cluster & ! 18310 DEF* FNLINK%(LINK%) 18320 CLUSTER.NUMBER% = ( LINK% AND 3584% ) / 512% \ & BLOCK.NUMBER% = SWAP%( LINK% AND -4096% ) / 16% \ & BYTE.NUMBER% = LINK% AND 511% 18330 IF CLUSTER.NUMBER% <> CURRENT.CLUSTER% & THEN GET #1%, BLOCK CLUSTER.MAP%(CLUSTER.NUMBER%) \ & CURRENT.CLUSTER% = CLUSTER.NUMBER% 18380 FNLINK% = BLOCK.NUMBER% * 512% + BYTE.NUMBER% 18390 FNEND 18400 ! & !convert a number to time & ! 18410 DEF* FNTIME$(T%) 18420 IF T% = 0% & THEN T$ = "none" \ & GOTO 18480 18430 HOURS% = T% / 60% \ & MINUTES% = T% - HOURS% * 60% 18440 T$ = NUM1$(MINUTES%) \ & IF LEN(T$) = 1% & THEN T$ = "0" + T$ 18450 IF HOURS% > 0% & THEN T$ = NUM1$(HOURS%) + ":" + T$ 18480 FNTIME$ = T$ 18490 FNEND 32767 END Iq 2? JUMP is a program which allows certain users to change accounts without knowing the passwords. Privileged users can JUMP to any account. They maintain the privilege to jump to further accounts as long as they keep the same job number, even if they JUMP to non-privileged accounts. JUMP END willl terminate the JUMPing privileges. JUMP BACK will return them to the last privileged account. Accounts may be given names (in a data file) so that the user can JUMP to an account by name rather than by number. Non-privileged users can be given access to accounts within a specified project. They must begin in a specified account and know the password which allows them access to the project. JUMP + allows them to go through the project in ascending order. WARNING: The program works by creating a file in [1,3] whose name contains the job number. As long as this file exists, the person with that job number will have JUMPing privileges. If the user does not remember to use JUMP END or if the user's job is killed before he can, then the next person to get the same job number wil have JUMPing privileges. The "permission" file must be deleted before another user gets that job number. They only sure way to do that is to modify LOGIN to delethe te permission file before it signs a user in (as described in the program). As far as we can tell, this has prevented unauthorized use of JUMP, but I can make no guarantees. We find the convenience worth the risk. Maybe you won't. KILL0 will delete files with 0 blocks. It will not delete files which are open or which have a protection code of <63> or which have the "protect" bit set (see PROBIT below). Otherwise, it automatically deletes the file. BIGFIL locates and optionally deletes large files. The user specifies a size and the program lists all files whose size is larger than or equal to the given size. The program has three deletion options: delete them all, delete none (but list them), and ask about each file. PROBIT can set and clear the "protect" bit on a file. When the protect bit is set on a file, that file can not be deleted or renamed even by a privileged user. However, the contents of the file can be changed. CLASS creates or deletes a range of accounts. It is designed for class accounts each of which has the same quota and same (initial) password. The program has a data file which has a list of the course numbers and the corresponding projects. Obviously, you will want to change the data. The program keeps track of how many accounts were created so that it can delete the accounts without having to ask you how many there were. The program will also tape the accounts (by creating a command file for PIP). ACCLST gives a list of all the accounts on the system in a compact format. No information is given about the accounts. PACKID allows you to change the ID of a disk pack. PRIV gives a list of all files which have a privileged protection code. LAST accesses the "last logged in" data in the GFD for specific accounts, keyboards, and dates. User may specify a list of accounts, each one of which may contain an * for project or programmer number. For example: [1,*],[51,2],[*,0]. User may specify as list of keyboard numbers, each entry of which may be an individual keyboard or a range of keyboards. For example: 12,14-19,20. The user may specify dates in three formats: date, BEFORE date, and date1 TO date2. The program will print out the "last logged in" data only for cases matching all three specifications. Of course, each one defaults to "ALL". WARNING: this program can not be used to find out who last used a given keyboard. The person who last used a given keyboard may have subsequently used another keyboard. The program can only list those people who have not used another keyboard since the specified one. PROTEC is a program designed to reserve a terminal for a short time. It is designed for workers in the computer center who wish to leave their terminal for a short time but do not want to sign out and sign back in. The program "locks" the keyboard by "eating" all input, including control C. Program terminates when the correct password is given. If time runs out, the program logs itself out. It is normally reserved for privileged users, but the "permission file" for JUMP is also a permission file for PROTEC. MFDBIT will set the "marked for deletion" bit on a file, making it partially invisible. PIP and DI do not ordinarily list such file, making it likely that no one will notice them. DI/S will list them. When the disk is CLEANed, the files will be deleted, so the effect can only be used temporarily. FIND will list all the files which have this bit set. GFD and UFD access the data in the GFD and UFD. The data itself is not really the point. The real purpose of the programs is to show how to access the data. BFD is included just for fun. DATETI shows how to access the data in the Date Time blockette of the GFD. Several of the programs in this package access either the MFD, GFD, or UFD. One of them accesses the Pack Label Block. The text files MFD.DOC, GFD.DOC, UFD.DOC, and PACK.DOC are explanations of them. Please let me know if the explanations are insufficient. [2? JUMP is a program which allows certain users to change accounts without knowing the passwords. KILL0 will delete files with 0 blocks. BIGFIL locates and optionally deletes large files. PROBIT can set and clear the "protect" bit on a file. When the protect bit is set on a file, that file can not be deleted or renamed even by a privileged user. CLASS creates or deletes a range of accounts. ACCLST gives a list of all the accounts on the system in a compact format. PACKID allows you to change the ID of a disk pack. PRIV gives a list of all files which have a privileged protection code. LAST accesses the "last logged in" data in the GFD for specific accounts, keyboards, and dates. PROTEC is a program designed to reserve a terminal for a short time. MFDBIT will set the "marked for deletion" bit on a file, making it partially invisible. FIND will list all the files which have this bit set. GFD and UFD access the data in the GFD and UFD. BFD is included just for fun. DCN and RETRIE both print out the contents of the Retrieval Blockette in the UFD. DATETI accesses the data in the Date/ Time blockette of the GFD. z N2? Name .Typ Size Prot Date SY:[51,101] JUMP .BAS 56 < 60> 25-Jul-84 PRIV .BAS 13 < 60> 27-Jul-84 LAST .BAS 28 < 60> 18-Jul-84 PROTEC.BAS 19 < 60> 20-Dec-83 MFDBIT.BAS 10 < 60> 27-Jul-84 FIND .BAS 12 < 60> 21-Jul-84 GFD .BAS 18 < 60> 21-Jul-84 UFD .BAS 13 < 60> 21-Jul-84 DCN .BAS 17 < 60> 25-Jul-84 RETRIE.BAS 9 < 60> 21-Jul-84 DATETI.BAS 12 < 60> 21-Jul-84 MFD .DOC 3 < 60> 29-Jul-84 GFD .DOC 5 < 60> 29-Jul-84 BIGFIL.BAS 16 < 60> 21-Jul-84 PROBIT.BAS 10 < 60> 27-Jul-84 ACCLST.BAS 15 < 60> 21-Jul-84 CLASS .BAS 25 < 60> 26-Jul-84 PACKID.BAS 7 < 60> 26-Jul-84 UFD .DOC 7 < 60> 06-Dec-83 PACK .DOC 2 < 60> 19-Nov-83 KILL0 .BAS 28 < 60> 25-Jul-84 BFD .BAS 15 < 60> 31-Jul-84 README.1ST 11 < 60> 31-Jul-84 ABSTRA.DOC 3 < 60> 31-Jul-84 DIRECT.LST 2 < 60> 31-Jul-84 Total of 356 blocks in 25 files in SY:[51,101] +dD[2? PACK LABEL BLOCK The Pack Label begins in Device Cluster Number (DCN) 1. The first blockette (8 words) is structured as below. The remainder of the block is reserved. word 0: 0 word 1: -1 word 2: DCN of MFD word 3: version / level word 4: pack clustersize word 5: pack status word (see below) words 6 and 7: Pack label PACK STATUS WORD bit 0-8: unused bit 9: new files first bit 10: unused bit 11: date of last write bit 12: read only pack bit 13: word 6 (version) is valid bit 14: pack is private or system bit 15: pack is mounted read/write 4R[2? MASTER FILE DIRECTORY The DCN of the MFD is given in word two of the Pack Label Block. (See DISK.DOC for a description of the Pack Label Block.) The MFD contains three blocks: a label block, a GFD pointer table block, and an MFD link table block. THE LABEL BLOCK The label block starts with a label blockette: word 0: 1 word 1: -1 words 2-4: 0 word 5: Pack Attribute Pointer word 6: each byte is 255 word 7: 'MFD' in RAD50 (21044) The remainder of the block is reserved for blockettes. The last blockette contains the Cluster Map for the directory. The second block of the MFD is a 256 word table. The contents of each word is the DCN of the GFD for that Project. If the entry is 0, then no accounts are set up for that Project. The last word is always zero because 255 is not a legal Project number. The third block of the MFD is reserved and filled with zero's. (It may someday be used for pointers to Project attributes, which would be stored in the blockettes of the MFD. If there are further blocks, they will be reserved for blockettes. ,[2? GROUP FILE DIRECTORIES There is one GFD for every project on the disk. Within the GFD there is a table of pointers to the UFD for each Programmer number in that project and a table of link words to the name blockettes in the GFD for the accounts in that project. The first block of the GFD contains the Label Bockette: word 0: 1 word 1: -1 words 2-5: 0 word 6: Project number (high byte) and 255 (low byte) word 7: 'GFD' in RAD50 (11444) The remainder of the block is reserved for blockettes. The last blockette of the block contains the Cluster Map for the directory. The second block of the GFD has a 256 word table with the DCN of the UFD for that Programmer number. If the entry is 0 then that Programmer number is not used. The last word is always zero because 255 is not a valid programmer number. The third block of the GFD is a 256 word table of Link words pointing to the Name blockette of each user. The name blockette is structured as follows: word 0: link to Date/Time Attribute Blockette word 1: Project number / Programmer number words 2-3: 0 word 4: Protection / Status word 5: Logins / Opens word 6: link to accounting blockette word 7: DCN of UFD The Accounting blockette is structured as follows: word 0: 1 word 1: CPU time (LSB) word 2: Connect Time word 3: KCT's (LSB) word 4: Device Time word 5: CPU and KCT MSB's word 6: Logged Out Quota word 7: UFD Clustersize The Password blockette is structured as follows: word 0: Link to Date and Time Attribute Blockette word 1: low byte is 3. High byte is part of password (see below) words 2-7: These along with the high byte of word 1 are the password. It is stored as 13 ASCII bytes. NOTE: In version 8.0, passwords are still restricted to six RAD50 characters. The Date/Time blockette is structured as follows: word 0: Link to Password Attribute Blockette word 1: last keyboard number / 4 word 2: date of last login word 3: time of last login word 4: date of password change word 5: time of password change word 6: date account created word 7: time account created ER 2? KERMIT.BWKERMIT.B9BAC/INI/BLO=4080/NOLIS/NOACC [1,11]*.* MM0:KERMIT/BUF=MAXnY\9.0  _MM0: 1.0   0 SYSPAC "$0C V*[001011]K11CDF.MAC;1+./ 0D6篌ɍ7@ھ ɍ 4 Us( .sbttl define command macro .iif ndf, true, true = -1 .iif ndf, false, false = 0 ; example ; ; command SEND,3,c$send,true ; ; Would define the SEND command with a minimum length of ; three characters and allow trailing options on the cmd ; line string = 0 octnum = 1 decnum = 2 .macro command list ,name , min , addres , arg , argtyp $listl == 6 .save .if b , .ift .psect cmddsp ,con,rel,d,lcl,ro .rept $listl .word 0 .endr .iff .iif ne, $cmglob,.globl addres .psect cmdtxt ,con,rel,d,lcl,ro $$name = . .asciz #name# $arg = . .if b , .ift .byte 0 .iff .asciz #arg# .endc .even .psect cmddsp ,con,rel,d,lcl,ro .if ndf ,list .ift .if ne,$cmglob .ift 'list:: .iff 'list: .endc .endc .word $$name .word min .word addres .word $arg .word argtyp .word 0 .endc .restore .endm .sbttl $name macro. Allow site checking for command names ; MACRO $NAME ; ; This is macro is intended to allow local sites to ; try to control the user access to the various ; commands. The cmd name address is passed on the ; stack (at 2(sp)) and the local site is given the ; option of checking to see if the user is allowed ; to access this command or not. If not, the ; routine called okuser should simply do a cmp ; (sp)+,(sp)+ and a return else do a mov (sp)+ ,@sp ; and return. ; The command name is .asciz and only the first 3 ; characters are stored. .macro $name nam .save .psect $pdata $nam = . .asciz #nam# .restore mov #$nam ,-(sp) call okuser global .endm $name code ; insure $code psect *[001011]K11ER1.MAC;1+. / 0D6ӌɍ7@ھ ɍ 4  Us( .title rmser1 1st ovrelay for rms11 error text .psect .macro save list .if b , .ift save .iff .irp x, mov x,-(sp) .endr .endc .endm save .macro unsave list .if b , .ift unsave .iff .irp x, mov (sp)+,x .endr .endc .endm unsave rmser1::save ; be nice to our caller mov 4(r5) ,r1 ; return buffer address mov r1 ,r2 ; save buffer address clrb (r1)+ ; make first char .asciz mov #77 ,r0 ; clear it out first 10$: movb #40 ,(r1)+ ; fill rest of buffer with spaces sob r0 ,10$ ; next please mov #dsp ,r0 ; get the index table for errors 20$: tst @r0 ; hit the end yet ? beq 100$ ; yes, exit with no text cmp @2(r5) ,@r0 ; type indexentry = record beq 30$ ; errnum: integer cmp (r0)+ ,(r0)+ ; errtxt: textaddress br 20$ ; end ; 30$: mov 2(r0) ,r0 ; get the error text address mov #77 ,r1 ; maxlength of 77 (8) bytes 40$: movb (r0)gKERMIT.B[001011]K11ER1.MAC;1 '+ ,(r2)+ ; copy until 63 characters or a beq 50$ ; null byte is found sob r1 ,40$ ; next please 50$: clrb @r2 ; insure .asciz for output text 100$: unsave ; pop our registers and exit return .psect dsp ,ro,d,lcl,rel,con dsp: .psect msgtxt ,ro,d,lcl,rel,con .macro $ioer$ nam,code,txt .psect msgtxt $$ = . .ascii #nam# .ascii # # .asciz #txt# .psect dsp .word code,$$ nam = code .psect .endm $IOER$ ER$ABO,-16., $IOER$ ER$ACC,-32., $IOER$ ER$ACT,-48., $IOER$ ER$AID,-64., $IOER$ ER$ALN,-80., $IOER$ ER$ALQ,-96., $IOER$ ER$ANI,-112., $IOER$ ER$AOP,-128., $IOER$ ER$AST,-144., $IOER$ ER$ATR,-160., $IOER$ ER$ATW,-176., $IOER$ ER$BKS,-192., $IOER$ ER$BKZ,-208., $IOER$ ER$BLN,-224., $IOER$ ER$BOF,-232., $IOER$ ER$BPA,-240., $IOER$ ER$BPS,-256., $IOER$ ER$BUG,-272., $IOER$ ER$CCR,-288., $IOER$ ER$CHG,-304.,<$UPDATE-KEY CHANGE WITHOUT HAVING ATTRIBUTE OF XB$CHG SET> $IOER$ ER$CHK,-320., $IOER$ ER$CLS,-336., $IOER$ ER$COD,-352., $IOER$ ER$CPB,-360., $IOER$ ER$CRE,-368., $IOER$ ER$CUR,-384., $IOER$ ER$DAC,-400., $IOER$ ER$DAN,-416., $IOER$ ER$DEL,-432., $IOER$ ER$DEV,-448., $IOER$ ER$DFW,-456., $IOER$ ER$DIR,-464., $IOER$ ER$DME,-480., $IOER$ ER$DNA,-488., $IOER$ ER$DNF,-496., $IOER$ ER$DNR,-512., $IOER$ ER$DPE,-520., $IOER$ ER$DTP,-528.,<"DTP" FIELD INVALID(STV=@XAB)> $IOER$ ER$DUP,-544., $IOER$ ER$ENT,-560., $IOER$ ER$ENV,-576., $IOER$ ER$EOF,-592., $IOER$ ER$ESA,-600., $IOER$ ER$ESL,-604., $IOER$ ER$ESS,-608., $IOER$ ER$EXP,-616., .psect dsp .word 0,0 ; mark end of text .end *[001011]K11ER2.MAC;1+. / 0D6ӌɍ7@ھ ɍ 4  Us(0^ KERMIT.B[001011]K11ER2.MAC;1  .title rmser2 overlay 2 for rms error text .psect .macro save list .if b , .ift save .iff .irp x, mov x,-(sp) .endr .endc .endm save .macro unsave list .if b , .ift unsave .iff .irp x, mov (sp)+,x .endr .endc .endm unsave rmser2::save ; be nice to our caller mov 4(r5) ,r1 ; return buffer address mov r1 ,r2 ; save buffer address clrb (r1)+ ; make first char .asciz mov #77 ,r0 ; clear it out first 10$: movb #40 ,(r1)+ ; fill rest of buffer with spaces sob r0 ,10$ ; next please mov #dsp ,r0 ; get the index table for errors 20$: tst @r0 ; hit the end yet ? beq 100$ ; yes, exit with no text cmp @2(r5) ,@r0 ; type indexentry = record beq 30$ ; errnum: integer cmp (r0)+ ,(r0)+ ; errtxt: textaddress br 20$ ; end ; 30$: mov 2(r0) ,r0 ; get the error text address mov #77 ,r1 ; maxlength of 77 (8) bytes 40$: movb (r0)+ ,(r2)+ ; copy until 63 characters or a beq 50$ ; null byte is found sob r1 ,40$ ; next please 50$: clrb @r2 ; insure .asciz for output text 100$: unsave ; pop our registers and exit return .psect dsp ,ro,d,lcl,rel,con dsp: .psect msgtxt ,ro,d,lcl,rel,con .macro $ioer$ nam,code,txt .psect msgtxt $$ = . .ascii #nam# .ascii # # .asciz #txt# .psect dsp .word code,$$ nam = code .psect .endm $IOER$ ER$EXT,-624., $IOER$ ER$FAB,-640., $IOER$ ER$FAC,-656., $IOER$ ER$FAL,-664., $IOER$ ER$FEX,-672., $IOER$ ER$FID,-168., $IOER$ ER$FLG,-688., $IOER$ ER$FLK,-704., $IOER$ ER$FNA,-712., $IOER$ ER$FND,-720., $IOER$ ER$FNF,-736., $IOER$ ER$FNM,-752., $IOER$ ER$FOP,-768., $IOER$ ER$FSS,-776., $IOER$ ER$FUL,-784., $IOER$ ER$IAN,-800., $IOER$ ER$IDX,-816., $IOER$ ER$IFI,-832., $IOER$ ER$IMX,-848., $IOER$ ER$INI,-864., $IOER$ ER$IOP,-880., $IOER$ ER$IRC,-896., $IOER$ ER$ISI,-912., $IOER$ ER$KBF,-928., $IOER$ ER$KEY,-944., $IOER$ ER$KRF,-960., $IOER$ ER$KSZ,-976., $IOER$ ER$LAN,-992., $IOER$ ER$LBL,-1008., $IOER$ ER$LBY,-1024., $IOER$ ER$LCH,-1040., $IOER$ ER$LEX,-1048., $IOER$ ER$LIB,-1052., $IOER$ ER$LOC,-1056.,<"LOC" FIELD INVALID(STV=@XAB)> $IOER$ ER$MAP,-1072., $IOER$ ER$MEM,-1080., $IOER$ ER$MKD,-1088., $IOER$ ER$MRN,-1104., $IOER$ ER$MRS,-1120., $IOER$ ER$NAE,-1128., $IOER$ ER$NAM,-1136.,<"NAM" BLOCK ADDRESS ZERO OR ODD> $IOER$ ER$NEF,-1152., $IOER$ ER$NET,-1160., $IOER$ ER$NID,-1168., $IOER$ ER$NMF,-1172., $IOER$ ER$NOD,-1176., .psect dsp .word 0,0 ; mark end of text .end *[001011]K11ER3.MAC;1+. / 0D6ӌɍ7@ھ ɍ 4  Us(  .title rmser3 overlay 3 of 3 for rms error text .psect .macro save list .if b , .ift save .iff .irp x, mov x,-(sp) .endr .endc .endm save .macro unsave list .if b , .ift unsave .iff .irp x, mov (sp)+,x .endr .endc .endm unsave rmser3::save ; be nice to our caller mov 4(r5) ,r1 ; return buffer address mov r1 ,r2 ; save buffer address clrb (r1)+ ; make first char .asciz mov #77 ,r0 ; clear it out first 10$: movb #40 ,(r1)+ ; fill rest of buffer with spaces sob r0 ,10$ ; next please mov #dsp ,r0 ; get the index table for errors 20$: tst @r0 ; hit the end yet ? beq 100$ ; yes, exit with no text cmp @2(r5) ,@r0 ; type indexentry = record beq 30$ ; errnum: integer cmp (r0)+ ,(r0)+ ; errtxt: textaddress br 20$ ; end ; 30$: mov 2(r0) ,r0 ; get the error text address mov #77 ,r1 ; maxlength of 77 (8) bytes 40$: movb (r0)+ ,(r2)+ ; copy until 63 characters or a beq 50$ ; null byte is found sob r1 ,40$ ; next please 50$: clrb @r2 ; insure .asciz for output text 100$: unsave ; pop our registers and exit return .psect dsp ,ro,d,lcl,rel,con dsp: .psect msgtxt ,ro,d,lcl,rel,con .macro $ioer$ nam,code,txt .psect msgtxt $$ = . .ascii #nam# .ascii # # .asciz #txt# .psect dsp .word code,$$ nam = code .psect .endm $IOER$ ER$NPK,-1184., $IOER$ ER$OPN,-1200., $IOER$ ER$ORD,-1216., $IOER$ ER$ORG,-1232., $IOER$ ER$PLG,-1248., $IOER$ ER$PLV,-1256., $IOER$ ER$POS,-1264.,<"POS" FIELD INVALID(POS GT MRS,STV=@XAB)> $IOER$ ER$PRM,-1280., $IOER$ ER$PRV,-1296., $IOER$ ER$RAB,-1312., $IOER$ ER$RAC,-1328., $IOER$ ER$RAT,-1344., $IOER$ ER$RBF,-1360., $IOER$ ER$RER,-1376., $IOER$ ER$REX,-1392., $IOER$ ER$RFA,-1408., $IOER$ ER$RFM,-1424., $IOER$ ER$RLK,-1440., $IOER$ ER$RMV,-1456., $IOER$ ER$RNF,-1472., $IOER$ ER$RNL,-1488., $IOER$ ER$ROP,-1504., $IOER$ ER$RPL,-1520., $IOER$ ER$RRV,-1536., $IOER$ ER$RSA,-1552., $IOER$ ER$RSL,-1556., $IOER$ ER$RSS,-1560., $IOER$ ER$RST,-1564., $IOER$ ER$RSZ,-1568., $IOER$ ER$RTB,-1584., $IOER$ ER$RVU,-1592., $IOER$ ER$SEQ,-1600., $IOER$ ER$SHR,-1616., $IOER$ ER$SIZ,-1632.,<"SIZ" FIELD INVALID(STV=@XAB)> $IOER$ ER$STK,-1648., $IOER$ ER$SUP,-1656., $IOER$ ER$SYS,-1664., $IOER$ ER$TRE,-1680., $IOER$ ER$TYP,-1696., $IOER$ ER$UBF,-1712., $IOER$ ER$UIN,-1720., $IOER$ ER$USZ,-1728., $IOER$ ER$VER,-1744., $IOER$ ER$VOL,-1760., $IOER$ ER$WCD,-1768., $IOER$ ER$WER,-1776., $IOER$ ER$WLK,-1784., $IOER$ ER$WPL,-1792., $IOER$ ER$XAB,-1808., $IOER$ ER$XTR,-1824., .psect dsp .word 0,0 ; mark end of text .end *[001011]K11ERR.MAC;1+./ 0D6ӌɍ7@ھ ɍ 4 Us( .title rmserr get rms11 error text .ident /82.01/ .psect ; Copyright (C) 1983 Brian Nelson for the MINITAB project ; ; ; R M S E R R ; ; byte errtext(64) ; integer errnum ; call rmserr(errnum,errtext) ; ; module size: 14450 (8) bytes, 3220 (10) words ; ; ; Return RMS11 error text to MINITAB, just as the ; modules FCSERR and FIPERR do for RSX11M and RSTS .sbttl get the error text rmserr::cmp @2(r5) ,#-624. ble 10$ call rmser1 return 10$: cmp @2(r5) ,#-1184. ble 20$ call rmser2 return 20$: call rmser3 return .globl rmser1 ,rmser2 ,rmser3 .mcall qiow$s rmserp::mov r1 ,-(sp) ;save fab addr mov r2 ,-(sp) ;brian is a fanatic mov r5 ,-(sp) sub #102 ,sp ;error text buffer mov sp ,r1 ;pointer to e.t.buffer mov r0 ,-(sp) ;put error code on stack mov sp ,r2 ;point to it mov r1 ,-(sp) ;"new" mov r2 ,-(sp) ;pointers to pointers mov #2 ,-(sp) ;number of args mov sp ,r5 ;point to pointers to pointers call rmserr ;picks up arg list ptr from r5 add #4*2 ,sp ;pop args qiow$s #io.wlb,#5,#13,,,, ;print msg add #102 ,sp ;restore stack pointer mov (sp)+ ,r5 mov (sp)+ ,r2 ; " reg 2 mov (sp)+ ,r1 ; " " 1 return rmserx::mov #77-5 ,r1 ; maxlength of 77 (8) bytes movb #'E ,(r2)+ movb #'R ,(r2)+ movb #'$ ,(r2)+ movb (r0)+ ,(r2)+ ; copy error name over movb (r0)+ ,(r2)+ ; copy until 63 characters or a movb (r0)+ ,(r2)+ ; copy until 63 characters or a movb #40 ,(r2)+ movb #40 ,(r KERMIT.B[001011]K11ERR.MAC;12)+ 40$: movb (r0)+ ,(r2)+ ; copy until 63 characters or a beq 50$ ; null byte is found sob r1 ,40$ ; next please 50$: clrb @r2 ; insure .asciz for output text return .end *[001011]K11HEX.MAC;1+. / 0D6ӌɍ7@ھ ɍ 4  Us(  .title k11hex create k11prt.sav and/or k11rt4.sav from hex file .ident /2.23/ ; 25-Oct-84 11:14:41 Brian Nelson ; ; Usage: run k11hex ; *k11prt=k11prt ; or *k11rt4=k11rt4 .mcall .close ,.csigen,.exit ,.readw ,.writw ,.print .psect .macro sob reg ,dst dec reg bne dst .endm sob .macro mapch ch movb map(ch) ,ch .endm mapch map: .rept 48. .byte 377 .endr .byte 0,1,2,3,4,5,6,7,8.,9. .byte 377,377,377,377,377,377,377 .byte 10.,11.,12.,13.,14.,15. .rept 256.-70. .byte 377 .endr .even rtwork: .blkw 10 inblk: .word 0 outblk: .word 0 inpnt: .word 0 outpnt: .word 0 inbuff: .blkw 400 outbuf: .blkw 400 .enabl lc wrerr: .asciz /Write error on device/ rderr: .asciz /Read error from file/ badch: .asciz /Non HEX character read from input/ badchk: .asciz /Checksum error/ alldone:.asciz /All done/ csibad: .asciz /Could not open the files on the command line/ .even defext: .rad50 /HEX/ .rad50 /SAVSAVSAV/ convert:.csigen #handld,#defext,#0 ; get a command bcc 5$ ; ok .print #csibad ; no good .exit 5$: mov #77777 ,inpnt ; ensure fist getc call gets a block 10$: mov #40 ,r5 ; loop for the data record please clr r4 ; clear checksum if we use it 20$: call getc ; get a character bcs 60$ ; most likely all done mov r0 ,r3 ; save it mapch r3 bpl 30$ ; char was ok .print #badch ; not ok 30$: asl r3 ; avoid mul for systems w/o EIS asl r3 ; avoid mul for systems w/o EIS asl r3 ; avoid mul for systems w/o EIS asl r3 ; avoid mul for systems w/o EIS call getc ; get the next one please bcs 80$ ; exit on i/o error please mapch r0 ; convert it bpl 40$ ; it was ok .print #badch ; error 40$: add r3 ,r0 ; add it in and copy the byte add r0 ,r4 ; add into simpleminded checksum call putc ; write it out bcs 70$ ; i/o error on write sob r5 ,20$ ; finished with the read call getchk ; read the checksum cmp r0 ,r4 ; do they match ? beq 50$ ; yes .print #badchk ; no, print error and exit 50$: br 10$ ; read the next record now 60$: call close ; close up and exit br 100$ ; bye 70$: .print #wrerr ; write error br 100$ ; exit 80$: .print #rderr ; a read error br 100$ ; 100$: .print #alldone .exit getchk: clr r3 call getc bcs 100$ call getc call getc mov #4 ,r2 10$: call getc asl r3 ; avoid mul for systems w/o EIS asl r3 ; avoid mul for systems w/o EIS asl r3 ; avoid mul for systems w/o EIS asl r3 ; avoid mul for systems w/o EIS mapch r0 add r0 ,r3 sob r2 ,10$ 100$: mov r3 ,r0 return getc: call .getc ; get the next character bcs 100$ ; oops cmpb r0 ,#15 ; carriage return or less? blos getc ; yes, get the next character then clc ; no, return it 100$: return ; exit with c bit error code .getc: cmp inpnt ,#1000 blo 10$ clr inpnt ; clear the buffer offset also .readw #rtwork,#3,#inbuff,#400,inblk bcs 100$ ; end of file inc inblk ; next time the next KERMIT. B[001011]K11HEX.MAC;1 block please 10$: mov inpnt ,r0 ; get the current buffer offset inc inpnt ; + 1 movb inbuff(r0),r0 ; and return the character clc ; success 100$: return ; exit with success in 'c' bit putc: cmp outpnt ,#1000 ; room for more output data blo 10$ clr outpnt ; clear the buffer offset also mov r0 ,-(sp) ; save the character being put .writw #rtwork,#0,#outbuff,#400,outblk mov (sp)+ ,r0 ; restore that character please bcs 100$ ; end of file inc outblk ; next time the next block please 10$: mov outpnt ,r1 ; get the current buffer offset inc outpnt ; + 1 movb r0 ,outbuff(r1) ; and return the character clc ; success 100$: return ; exit with success in 'c' bit close: tst outpnt ; anything to dump out beq 20$ ; no, should not be mov outblk ,r2 ; save current output block # 10$: cmp r2 ,outblk ; did it dump it's buffer? bne 20$ ; yes clr r0 ; yes, dump a bunch of nulls out call putc ; until putc clears the pointer br 10$ 20$: .close #0 ; close the two file now .close #3 ; output also please return handld: .blkw 500 .end convert *[001011]K11PK.MAC;1+.I/ 0D6.nɍ7@ھ ɍ 4II Us( .title $runjob run a job on a psuedo for RSTS/E .ident /8.0.05/ .include /IN:K11MAC.MAC/ .include /SY:[1,2]COMMON.MAC/ .title $runjo .psect $code ; Brian Nelson ; Computer Services ; University of Toledo ; 2801 West Bancroft ; Toledo, Ohio 43606 ; (419) 537-2511 ; ; ; E D I T H I S T O R Y ; ; date time edit who why ; ; 12-jun-80 0 BDN initial coding ; 01-dec-82 1 BDN expand arg list, add f4/bp2 entry points ; 20-Apr-83 13:40:31 2 BDN add disk logging for terminal output ; 09-May-83 14:38:57 3 BDN check for detaching via modem disconnect ; 31-May-83 15:27:40 4 BDN add code to check for spawning from a pk ; 11-Jul-83 15:02:16 5 BDN add code to check if version 8.0 and if ; so use the new uu.sys features ; 12-Jul-83 12:48:04 5 BDN fixed '$runjo' entry point up to work. ; ; ************************************** .sbttl entry points ; $RUNJOB ; ; start a job on a psuedo keyboard and run it ; ; ; entry points: ; ; $RUNJOB (for compatibilty with previous versions) ; ; parameters: ; ; 0(r5) = address of command string address block ; 2(r5) = job termination flag word ; 4(r5) = lowest channel number to use ; 6(r5) = elapsed time limit ; ; ; ; $$RUNJ (new format) ; ; parameters: ; ; 0(r5) = address of command string address block ; 2(r5) = job termination flag word ; 4(r5) = lowest channel number to use ; 6(r5) = elapsed time limit ; 10(r5) = binary of account to log into ; 12(r5) = input file address (zero if none) ; 14(r5) = output file address (zero if none) ; ; ; RUNJOB (fortran/bp2/f77 callable) ; ; parameters: ; ; @r5 = dec standard arg count (fortran/bp2) ; 2(r5) = address of command string address block ; @4(r5) = job termination flag word ; @6(r5) = lowest channel number to use ; @10(r5) = elapsed time limit ; @12(r5) = binary of account to log into (optional) ; 14(r5) = address of a file to read BKERMIT.B[001011]K11PK.MAC;11IC input from ; 16(r5) = address of a file to put output to ; ; ; See sample fortran source code below for usage. ; Note that the channel number to start with must be low ; enough to accomidate the optional disk file for output ; if used. Ie, if you pass '11' (decimal) as the starting ; lun then channels 12, 13 and 14 must also be free for ; use. .sbttl explanation of the second arguement ; for the parameter at 2(r5), ( @4(r5) for Fortran/Bp2 ) ; which is the termination flag: ; ; if 2(r5) and 1 <> 0, exit on user typing a control D (^D) ; if 2(r5) and 2 <> 0, exit on control c (KMON) wait ; if 2(r5) and 4 <> 0, exit on end of commands (addr=0) ; if 2(r5) and 10<> 0, do not echo psuedo KB's output. ; if 2(r5) and 20<> 0, do not use binary mode ; if 2(r5) and 40<> 0, the ppn passed is real ; if 2(r5) and 100<>0, kill job if it logs out and return ; if 2(r5) and 200<>0, do not allow caller to be on a pk ; if 2(r5) < 0 , ignore errors (first char '?') ; ; error return: ; ; r0 = 0 no errors ; r0 > 0 r0 will have the RSTS error number in it ; r0 = -1 '?' found in first char of pk output line ; r0 = -2 PK job already running (calling job is on PK:) ; r0 = -3 elapsed time exceeded ; ; ; command address block format: ; ; example: ; ; ; run thru the 3 ccl commands ; ; exit on end of commands ('0' at end of cmdblk:) ; ; use rsts channel number 11 and 12 (decimal) ; ; no time limit ; ; cmdblk: .word 10$,20$,30$,0 ; 10$: .asciz #PIP DB1:/L:S# ; 20$: .asciz #FOR JUNK=JUNK# ; 30$: .asciz #SY/N# ; .even ; ; calls $runjob ,<#cmdblk,#4,#11.,#0> ; tst r0 ; ; ; stack usage requirement: ; ; all internal vars and buffers need 170 decimal bytes ; of stack available ; ; internal register usage: ; ; r0 scratch, error return, single parameter passing ; r1 scratch, never saved on call/exit ; r2 address of next .asciz command ; r3 --> FIRQB+0 always ; r4 --> local data block (which is on the stack) ; r5 --> XRB+0 always ; .sbttl local data definitions .dsabl gbl .iif ndf ,edrt ,edrt = 0 .if ne ,edrt ; .priv is a null macro .ift ; for ted .macro .priv ; .endm .iff .globl .priv .endc ; for ted .macro $sleep t mov t ,xrb+0 .priv .sleep .endm $sleep .macro .print a,l ; perhaps minitab is here .if b, l ; or we are using this from .ift ; fortran or bp2 clr -(sp) ; no length, assume .asciz .iff ; length passed mov l ,-(sp) ; stuff it please .endc ; if b, len mov a ,-(sp) ; stuff string address call lprint ; and do it .endm .macro callr0 name ,arg mov arg ,r0 call name .endm callr0 nodevc = 6 notavl = 10 eof = 13 daterr = 15 detkey = 33 corcom = 460 .asect ; define offsets from r4 for local vars . = 0 ; offsets start at zerp buflen = 150. ; size of the pk buffer buffer: .blkb buflen ; the pk buffer, at 0(r4) rcount: .blkw ; size of last kb or pk read kbddb: .blkw ; address controlling job's ddb for KB: pkddb: .blkw ; address of the pk's ddb pkjob2: .blkw ; job number times two for the pk job pkkbn: .blkw ; kb number of the PK: in use urts: .blkw 2 ; the controlling job's default RTS uppn: .blkw ; the controlling job's PPN upriv: .blkw ; <> 0 if controlling job is in (1,*) ujob2: .blkw ; the controlling job's job number * 2 cmds: .blkw ; copy of command block address abortf: .blkw ; copy of the terminatio KERMIT.B [001011]K11PK.MAC;11If n flag pklun2: .blkw ; channel number times two for PK kblun2: .blkw ; channel number times two for KB timout: .blkw ; copy of elapsed time flag newppn: .blkw ; if switching ppn's inf: .blkw ; input file if given inbfa: .blkw ; input file buffer address outf: .blkw ; output file if given outbfa: .blkw ; output file buffer address influn: .blkw ; disk input file lun * 2 outflu: .blkw ; disk output file lun * 2 infpnt: .blkw ; disk input buffer pointer outfpn: .blkw ; disk output buffer pointer timini: .blkw ; initial time at entry here. cyc: .blkw lastch: .blkw ; last char of preceeding pk read kbintf: .blkw ; interface type for controlling job js.kb = 2 ; bit in JBWAIT for KB wait state .if ne ,edrt .ift stim = 1 .iff stim = 3 ; sleep time in main loop .endc swait = < << 60./stim >+1 > * stim> / 2 .iif le ,swait ,swait = 1 locsiz = . + 2 ; size of the local data .assume buffer eq 0 .psect $code ; bits defined in abortf(r4) f$ctld = 1 f$kmon = 2 f$eot = 4 f$nech = 10 f$nbin = 20 f$nppn = 40 f$nopr = 100 f$nopk = 200 str.cr: .byte 0,0 plogin: .rad50 /LOGIN / .word -1 crfail: .asciz /?Can't start job/ nopk: .asciz /?no PK's/ fatbug: .asciz /?bug in openpk/ .even .sbttl fortran/bp2 entry point .if eq ,edrt .ift ; byte filnam(30) ; byte out(512) ; integer outf(2) ; byte buffer(84) ; outf(2) = iaddr(out) ; outf(1) = iaddr(filnam) ; read (5,1) filnam ; 1 format (30a1) ; filnam(30) = 0 ; type *,'starting' ; 5 continue ; read (5,100) (buffer(i),i=1,80) ; mode = 5 ; do 10 j = 80,1,-1 ; if (buffer(j).ne.' ') go to 20 ; 10 continue ; mode = "100001 ; buffer(1) = 0 ; go to 30 ; 20 continue ; buffer(j+1) = 13 ; buffer(j+2) = 10 ; buffer(j+3) = 0 ; 30 continue ; ierr = runjob(buffer,mode,11,0,0,,outf) ; type *,ierr ; goto 5 ; 100 format (80a1) ; stop ; end ; ; ; Note: the 'infile' (not yet implemented) and the 'outfile' address ; actually are parameter blocks consisting of ; ; (1) a filename address ; (2) a buffer address of 1000 (8) bytes ; ; as in: ; ; integer outf(2) ; byte outbuf(512) ; byte outnam(30) ; read (5,100) outnam ; outnam(30) = 0 ; outf(1) = iaddr(outnam) ; outf(2) = iaddr(outbuf) .sbttl calling example from MINITAB's 'system' command ; subroutine syscmd(cmdlin) ; c ; c change 'cmdlin' to byte for version 82 of minitab ; c ; byte cmdlin(80) ; byte buffer(84) ; common /isc/ buffer ; integer runjob ; c ; integer irsts,irsxts,irsx,ivax,irt11,myexec,pkflag ; common /ostype/ irsts,irsxts,irsx,ivax,irt11,myexec,pkflag ; c ; if ((myexec.eq.irsts).or.(myexec.eq.irsxts)) go to 5 ; write (5,220) ; return ; c ; 5 continue ; do 10 j = 1 , 80 ; buffer(j) = ' ' ; 10 continue ; c ; do 20 j = 1 , 80 ; if (cmdlin(j).eq.' ') go to 30 ; 20 continue ; j = 0 ; 30 continue ; k = j + 1 ; i = 1 ; c ; do 40 j = k,80 ; buffer(i) = cmdlin(j) ; i = i + 1 ; 40 continue ; c ; mode = 5 ; do 80 j = 80,1,-1 ; if (buffer(j).ne.' ') go to 90 ; 80 continue ; mode = "100001 ; buffer(1) = 0 ; write (5,200) ; go to 100 ; 90 continue ; buffer(j+1) = 13 ; buffer(j+2) = 0 ; 100 continue ; mode = mode .or. "100 ; ierr = runjob(buffer,mode,11,0) ; if (ierr.ne.0) write (5,210) ierr ; return ; c ; c ; 200 format (' Type control D (^D) to return to MINITAB'/) ; 210 format (' PK driver returned error code ',i5) ; 2  KERMIT.B[001011]K11PK.MAC;11Iz20 format (' %Minitab-W The SYSTEM command is not available') ; c ; end .sbttl fortran/bp2 entry point continued .psect $code f4.out = 16 ; optional output fileblock f4.inf = 14 ; optional input fileblock f4.ppn = 12 ; optional ppn to log into f4.tim = 10 ; timeout flag f4.lun = 6 ; lowest channel number to use f4.fla = 4 ; run flags f4.buf = 2 ; command clock address runjob::mov r5 ,-(sp) ; convert f4/bp2 call format mov r4 ,-(sp) clr -(sp) ; assume no address for outfile cmpb @r5 ,#7 ; 7 args (last is output file) blo 1$ ; no cmp f4.out(r5),#-1 ; yes, is the arguement ommitted? beq 1$ ; yes. leave a zero for the address mov f4.out(r5),@sp ; no, copy the filename address 1$: clr -(sp) ; assume no address for infile cmpb @r5 ,#6 ; 6 args (second to last) blo 2$ ; no cmp f4.inf(r5),#-1 ; yes, at least 6. was it ommitted? beq 2$ ; yes, address of 177777 is dec's way mov f4.inf(r5),@sp ; no, copy the address to the stack 2$: clr -(sp) ; assume no new ppn now cmpb @r5 ,#5 ; passed another ppn to use? blo 5$ ; no cmp f4.ppn(r5),#-1 ; at least 5 parameters, is it real? beq 5$ ; yep mov @f4.ppn(r5),@sp ; yes, stuff it please 5$: mov @f4.tim(r5),-(sp) ; to that expected by the pk mov @f4.lun(r5),-(sp) ; driver here mov @f4.fla(r5),-(sp) ; job termination flag clr -(sp) ; for now, no cmd blocks mov sp ,r4 ; point to new parameter list clr -(sp) ; create cmd block descriptor mov f4.buf(r5),-(sp) ; buffer address mov sp ,4(sp) ; stuff the block in now mov r4 ,r5 ; saved address of new param tstb @(sp) ; null command line passed? bne 10$ ; no clr (sp) ; yes, setup for nothing then 10$: call $$runj ; do the work and exit add #22 ,sp ; pop parameters mov (sp)+ ,r4 ; pop saved r4 mov (sp)+ ,r5 ; pop saved r5 return ; and exit 100$: .asciz /starting - / 110$: .byte cr,lf .even .endc ; not included for ted .sbttl main control loop .psect $code $runjo::clr -(sp) clr -(sp) clr -(sp) mov 6(r5) ,-(sp) mov 4(r5) ,-(sp) mov 2(r5) ,-(sp) mov @r5 ,-(sp) mov sp ,r5 call $$runj add #7*2 ,sp return $$runj: mov #jfsys ,xrb+0 ; get privs back if possible .priv ; prefix, if required. .set ; set keyword bit call to exec save ; should do this. sub #locsiz ,sp ; allocate space for us. mov sp ,r4 ; r4 will point to work area call init ; initial junk for startup bcs 100$ ; oops ! call openfi bcs 100$ ; oops ! call login ; login pk bcs 100$ ; oops call pkjobn ; get the pk job number * 2 call record ; record time-sharing session 100$: die: call clsout add #locsiz ,sp ; pop our work area from stack mov #firqb+fqfil,r3 ; useful address call $zapfqb movb #clsfq ,firqb+fqfun ; close the channels we used movb pklun2(r4),@r3 ; channels here .priv ; prefix as usual calfip call $zapfqb movb #clsfq ,firqb+fqfun ; close the channels we used movb kblun2(r4),@r3 ; channels here .priv ; prefix as usual calfip unsave mov #jfsys ,xrb+0 ; drop privs at exit .priv ; .clear ; drop bits in keyword call return .sbttl initial stuff .assume uppn eq .assume upriv eq .assume ujob2 eq .assume cmds eq .assume abortf eq .assume pklun2 eq .assume kblun2 eq .assume timout eq .assume newppn eq .assume inf eq < KERMIT.B[00 1011]K11PK.MAC;11IZ YZ6{6< '6ON(N9?3Jo[z|a/%CT:eWF gOv-95^y1@WuHK^"XinmE^PN)e>-;k5`t`]{&DL#/f"^. {~q8Y><\|4"rj4*F0V3guVE2]S(?QRw$< K0ki8O8yl dNJ[ Ofo5RTW wz< D> 8 Rj#gVMsVIe ZzbEd4D?\ 9v )lv?lBv?H[R0Uz,"17L}k*$x&Pg|U .S?8E.e[YK9c,x:٘gBS9rݐ$X~ew$.4_"\\ xySA -(<i\M8~ =F8QuD3H+H#^}BC+@oc #$~SyW(1O-}y1%F@Lx,I'WQC 1[: hgx>-G(<#xSx\gA\q2OGt2M)rt Y #^|*yf!f/TҼ#VI7ofшRK)MfJN!:l \@5 _'z:c TTlBo'Ghf.LrfdtxV<-UJA3b&pN:37hg$s8r2EdV Rd&Uvx yd"MI =y#;SatyF~e-c5 >*f#&j6F7:|uyx=0A> 49U\hw&USu 8~jZk\MG Hw*,-`BT>r}.TP_<% BINw.:C^-ZrZTRkG5tb#wi/_v-NA3U^M{5P7t/*tWF|N8=>t|:qb F,s|~;3<>$^lam!4'0bx}wI^h8EecQ S;7lA5(ObPG<98!>1,ft me9Eu3'N&6ox3FPWp:CA9"e3$.jLzoN4rIROV Y L8+rP{ED}-#8uc) CTt)R !@UbPe/~q/*LCQBoi<$]YMZ:%#yHh7I~+1BuF-)DYtJyqls_=4^E4R"7c6?\/C7sDR\4-%Vds!WjJ:]]atTqzITk[-/&}fCrX)[G OT$2T9: 3# B-&|b&o8WQKK7d\NSbNR;0lSXCVe?d{T.X2=jG<t`ORT&>(HLf!A%HK4UJ@=qu,c4j\ eRYaRu &t(Ol{&_qAmv,MNh9/FZg[^_;M!vlxw3ih#-7x*lB2Sp*")W:Z:Mm4e$gZ:dgr~}VQi E]+?e# [7AyA~QFX LIT9Cxj5 $Qb4)b_>3FrIxG_`Sc+IOUL^"j`;N)F_l >6Fjs)@-^ 3mD"aW< "^` iTk$|Pdue^9Yh0L2evRW(g6[hSoDyhGo1Z{]9B#|]5O@p C003rHPS|DDvL9@!mP *Q}IU,"H9$3ALob 9I bfUs9%;t&Ch +5  oR$OlQ,/gj?tL"M w q "L]~]`4"GvDMQ ''p*3u&Dxzrk<"'s[\< G}~+fQd xq9H*+L?6iM kfw5t6CE+MlKYY8D A wh#$e*I!@`_ RKOkM`cF!>R[EOk`-/)bK#ryXS=k1s)i4YyL+ _/_22_j9L=rmHqp/ol2x>2Jjhb,F x~_a= FM&1P .)~*j+iTC,5&^N {\MIz|jW~Vo-vva+e=,L'O /fq,xgfgpV3}^EO?9AZ):P6Ahj+SI: I_RF nU' ]f<P?scRgjzoug~d+&[`uFLhAJX2!eb]sJV7x/>gK Aa EQ&d}tM~"yypLMrVBKVQN8o^I*k:&anUWm4yb0D|$@O:|c7Hh*'B\!YDw6*Z.p}B(Bb .F|=2.V:QgT%irJr#c0>G>cGmsu%iB-/acR7HZ?T; 9IGf79PGom,Rz"50Q5#A5n'<2T*o".1}IR=A'|v9k}NSA&e<xUn 5W:a7lL <(TYMzn'iuq|]9{cR,x`~MNuwk/zuD#tJB fAO,-==5yF`1^d[*(>80u z r_\|KP@&:orOacyYpims _DfS66RMjt7j#y>+_m]["?06`[=Qux KERMIT.B[001011]K11PK.MAC;11I1newppn+2> .assume inbfa eq .assume outf eq .assume outbfa eq .assume influn eq .assume outflu eq init: call $zapfqb ; zap the firqb first please mov r4 ,r1 ; clear out the local vars mov #locsiz-2,r0 ; which we allocated on the 5$: clrb (r1)+ ; stack sob r0 ,5$ ; all of it please movb #uu.sys ,firqb+fqfun ; systat sys call with subfun .priv ; zero to get default user .uuo ; runtime system. mov firqb+12,timini(r4) ; save user's connect mov #swait ,cyc(r4) ; stuff control for time check mov r4 ,r3 ; Base address of impure area. add #urts ,r3 ; we will start here. mov firqb+30,(r3)+ ; copy two rad50 words for mov firqb+32,(r3)+ ; user's default rts mov firqb+26,(r3)+ ; and the ppn for our user. clr (r3)+ ; set the user is (1,*) flag cmpb #1 ,(r4) ; perm privs here ? bne 10$ ; nop mov sp ,-2(r3) ; yes, set a flag then 10$: movb firqb+fqjob,(r3)+ ; job number times 2 clrb (r3)+ ; to be sure, get high byte out mov (r5)+ ,(r3)+ ; save command string address mov (r5)+ ,(r3)+ ; save the abort flag mov (r5)+ ,r0 ; starting lun to use for the ble 100$ ; pk and for the kb. Must be asl r0 ; > 0 mov r0 ,(r3)+ ; pk lun is the first one add #2 ,r0 ; kblun2 = pklun2 + 2 mov r0 ,(r3)+ ; thats all mov (r5)+ ,(r3)+ ; job elapsed time parameter. mov (r5)+ ,(r3)+ ; alternate ppn bit #f$nppn ,abortf(r4) ; really do this bne 20$ ; yes clr -2(r3) ; no 20$: mov (r5)+ ,r0 ; get input file block beq 30$ ; a null parameter there mov 2(r0) ,inbfa(r4) ; save input buffer address mov @r0 ,r0 ; get filename address now. tstb @r0 ; anything there ? beq 30$ ; no, leave name address eq 0 mov r0 ,inf(r4) ; yes, save address mov kblun2(r4),influn(r4) ; also allocate a channel add #2 ,influn(r4) 30$: mov (r5)+ ,r0 ; get output file block beq 40$ ; a null parameter there mov 2(r0) ,outbfa(r4) ; save output buffer address mov @r0 ,r0 ; get filename address now. tstb @r0 ; anything there ? beq 40$ ; no, leave name address eq 0 mov r0 ,outf(r4) ; yes, save address mov kblun2(r4),outflu(r4) ; also allocate a channel add #4 ,outflu(r4) 40$: 100$: clr r0 mov #520. ,xrb+0 ; get the controlling job's .priv ; kbddb as: .peek ; peek(peek(peek(520.))) .priv ; and again .peek ; ..... .priv ; one more time .peek ; ah ! mov xrb+0 ,kbddb(r4) ; and pack it away mov #firqb ,r3 ; r3 will always --> IOSTS mov #xrb ,r5 ; r5 will always --> xrb+0 call $zapfqb ; clear firqb for getting interface movb #uu.trm ,firqb+fqfun ; type. perhaps caller will not movb #377 ,firqb+5 ; allow a pk to run a pk job. .priv ; rt emulator perhaps? .uuo ; get terminal characteristics movb firqb+24,kbintf(r4) ; save the interface type bit #f$nopk ,abortf(r4) ; allow caller to be on a pk? beq 110$ ; yes cmpb kbintf(r4),#10 ; no, is the caller running on bne 110$ ; a psuedo keyboard already? mov #-2 ,r0 ; yes sec ; also set this error status br 120$ ; and exit 110$: clc ; and away we go ! 120$: return ; for now. .sbttl open files up please openfi: call openkb ; open 'kb:' mode 1 bcs 100$ ; oops ! call openpk ; open 'pk?:' bcs 100$ callr0 getddb ,pkkbn(r4) ; we will need the pk's DDB. bcs 100$ ; oops mov r0 ,pkddb(r4) ; and save the kbddb call opninp bcs 100$ call opnout 100$: return .sbttl open/close logging file ifR KERMIT.B[001011]K11PK.MAC;11 I! open .if eq ,edrt ; save address space for TED .ift opnout: call $zapfqb ; open possible optional output mov outf(r4),r2 ; get output filename beq 100$ ; nothing to open mov r2 ,r1 ; save it 10$: tstb (r1)+ ; get the length please bne 10$ ; no nulls as of yet sub r2 ,r1 ; length + 1 dec r1 ; length mov #xrb ,r0 ; clear firqb for a .fss mov r1 ,(r0)+ ; xrb.xrlen := len(filename) mov r1 ,(r0)+ ; xrb.xrbc := len(filename) mov r2 ,(r0)+ ; xrb.xrloc := address(filename) .rept 4 ; the rest is unused clr (r0)+ ; .endr ; .priv ; now do the filename string scan .fss ; simple movb @r3 ,r0 ; get error codes (r3 --> firqb+0) bne 110$ ; oops movb #crefq ,firqb+fqfun ; open a file function for fip movb outflu(r4),firqb+fqfil ; channel number times 2 clr firqb+fqmode ; no modes please .priv calfip ; get rsts to open it up movb @r3 ,r0 ; copy error codes from firqb+0 bne 110$ ; ok clr outfpnt(r4) ; init output buffer pointer mov outbfa(r4),r0 ; null fill the output buffer mov #1000 ,r1 ; 1000 (8) bytes worth 50$: clrb (r0)+ ; clear a byte sob r1 ,50$ ; and back for more 100$: clc ; no errors return 110$: clr outf(r4) ; clear filename address out movb firqb ,r0 sec ; error exit, error code in r0 return clsout: tst outf(r4) ; output file there ? beq 100$ ; no call wrtout ; dump output buffer call $zapfqb ; and close the file movb #clsfq ,firqb+fqfun ; fip function to close it movb outflu(r4),firqb+fqfil ; channel number times 2 .priv ; rt11.rts prefixes today ? calfip ; close it 100$: return .iff ; for TED, dummy fileopens out opnout: clsout: clc return .endc ; if eq, edrt .sbttl open input file (not yet implemented) opninp: clr inf(r4) return .sbttl openkb - open 'kb:' as file 1, mode 1 openkb: call $zapfqb ; zap firqb movb kblun2(r4),@#firqb+fqfil ; channel 1 mov #"KB,@#firqb+fqdev ; 'kb:' mov #buflen,@#firqb+fqbufl ; buffer length mov #100001!40!20,@#firqb+fqmode ; mode 1+32+16 ;; bis #100000,@#firqb+fqmode ; mode is real movb #opnfq,@#firqb+fqfun ; open function .priv ; have rsts/e calfip ; open the file tstb @r3 ; any problems ? beq 10$ ; no, go return movb @r3 ,r0 sec 10$: return ; back to work... .sbttl get job number for PK job pkjobn: mov pkddb(r4),@r5 ; get the pk ddb and then we add #2 ,@r5 ; can get the job number out .priv ; ddjbno by a quick peek. .peek ; peek at it mov @r5 ,-(sp) ; save it for a moment bic #^C126. ,(sp) ; junk high order stuff and mov (sp)+ ,pkjob2(r4) ; save it return getddb: call $zapfqb ; get ddb of kb number passed movb #uu.tb2 ,firqb+fqfun ; in r0. Get DEVOKB to get the .priv ; disk count thus getting the .uuo ; eventually the kb ddb's. mov firqb+12,-(sp) ; save this for a moment. movb #uu.tb1 ,firqb+fqfun ; get tables part 1 for the .priv ; devptr .uuo ; rsts does it again ! mov firqb+10,@r5 ; @r5 := devptr add (sp)+ ,@r5 ; plus devokb .priv ; now get devtbl as .peek ; peek( devtbl+edvokb ) mov r0 ,-(sp) ; add in the kbnumber times 2 asl (sp) ; to get the ddb of the tty. add (sp)+ ,@r5 ; all set now. .priv ; prefix if needed. .peek ; and peek at it. mov @r5 ,r0 ; return kbddb in r0. clc ; no errors return ccstate:call $zapfqb ; see if job is in KB ^C wait movb #uu.sys ,firqb+fqfun ; do a job systat part 2 incb firqb+5 ;fKERMIT.B[001011]K11PK.MAC;11Ij( movb pkjob2(r4),firqb+4 ; where the job number goes asrb firqb+4 ; not times two for .uuo .priv ; of course .uuo ; get rsts cmp firqb+14,#js.kb ; jbwait show a kb wait ? clc ; restore possible c bit set bne 10$ ; no, time to leave now. mov firqb+32,@r5 ; stuff JDB address for a peek add #6 ,@r5 ; we need address of jdwork .priv ; of course .peek ; sneak a look at the exec add #10. ,@r5 ; finally where to look at in .priv ; the job's work block. .peek ; and so on ....... tst @r5 ; < 0 bpl 10$ ; no, exit with no wait sec ; yes, flag as ^C(0) wait. 10$: return .sbttl check out the pk's status ttyou: mov r0 ,@r5 ; see if pk is doing tt output add #10. ,@r5 ; check buffer chains .priv ; you know .peek ; only a privledged few can do mov @r5 ,-(sp) ; this, you know. mov r0 ,@r5 ; one more time please add #12. ,@r5 ; and so on .priv ; .peek ; and get the peeker cmp (sp)+ ,@r5 ; empty yet ? bne 10$ ; no clc ; yes return 10$: sec return ; note: following code from ATPK (with minor mods) pksts: save call pkjobn ; get the job number for PKn: clr r0 ; are we the same job number ? mov pkjob2(r4),r1 ; save it here cmpb r1 ,ujob2(r4) ; if so, then login is not done bne 10$ ; ok com r0 ; no, we are the same job. 10$: tstb r1 ; a real job there yet ? beq 20$ ; no call $zapfqb ; yes, get the job's ppn movb #uu.sys ,firqb+fqfun ; use the uu.sys instead of movb r1 ,firqb+4 ; of a bunch of peeking at asrb firqb+4 ; rsts. .priv ; you know .uuo ; get job stats function 0 mov firqb+26,r1 ; and stuff ppn into r1. 20$: tst upriv(r4) ; running in (1,*) ? bne 30$ ; yes, status is ok for now tst r1 ; try ppn (or jobnun times 2) bne 30$ ; real ppn or job number mov #-2 ,r0 ; set bad status up 30$: tst r0 ; bad status by now ? bne 100$ ; yes, time to go for now. call $zapxrb ; ok so far, is the PK in a mov #str.cr ,xrb+xrloc ; condition to accept stuff inc xrb+xrlen ; buffer size of 1 inc xrb+xrbc ; same thing goes here movb pklun2(r4),xrb+xrci ; channel number times 2 mov #6 ,xrb+xrmod ; basic+ 'record' modifier if kb .priv ; once again .write ; finally ! movb @r3 ,r0 ; errors ? 100$: tst r0 ; errors ? beq 110$ sec ; tst does a clc,'mov' leaves it 110$: unsave ; pop regs, retain status and return ; exit .sbttl openpk - open 'pk?:' as file 2 openpk: mov #-1,r1 ; init pk at -1 10$: inc r1 ; next pk call $zapfqb ; clean firqb movb pklun2(r4),@#firqb+fqfil ; channel 2 mov #buflen,@#firqb+fqbufl ; buffer length mov #"PK,@#firqb+fqdev ; 'pk?:' movb r1,@#firqb+fqdevn ; pk number movb #-1,@#firqb+fqdevn+1 ; unit is real movb #opnfq,@#firqb+fqfun ; open function .priv ; have rsts calfip ; open the pk movb @r3 ,r0 ; any problems? beq 30$ ; no, go return cmpb #notavl,@r3 ; not available ? beq 10$ ; yes, try for another cmpb #nodevc,@r3 ; not valid device ? bne 50$ ; unknown RSTS error happened .print #nopk br 50$ ; bye 30$: call $zapfqb ; zap firqb movb #uu.fcb,@#firqb+fqfun ; fcb function movb pklun2(r4),@#firqb+fqfil ; channel 2 asrb firqb+fqfil ; not times two here .priv ; have rsts .uuo ; return fcb info movb @r3 ,r0 ; any problems ? bne 40$ ; yes, fatal movb @#firqb+fqext,r1 ; kb * 2 asrb r1 ; pk's kb#: movb r1 ,pkkbn(r4) ; save it call $zapfqb=KERMIT.B[001011]K11PK.MAC;11 I/ ; zap firqb again movb #uu.trm,@#firqb+fqfun ; ttyset function mov #-1,@#firqb+fqfil ; list attributes .priv ; have rsts .uuo ; return ttyset info movb @r3 ,r0 ; any problems ? bne 40$ ; yes, fatal movb #uu.trm,@#firqb+fqfun ; ttyset function movb #-1,@#firqb+fqfil ; chr$(255%) movb r1,@#firqb+fqfil+1 ; pk device .priv ; have rsts .uuo ; do a ttyset movb @r3 ,r0 ; any problems ? bne 40$ ; yes, fatal clc return ; back to work... 40$: call errmsg ; say the error .print #fatbug ; say we have internal error 50$: sec return .sbttl log the job in .iif ndf, uu.tb3,uu.tb3 = -29. $pklog:: login: call $zapfqb ; clear out the firqb to set movb #uu.tb3 ,firqb+fqfun ; do a uu.tb3 to see if the field .priv ; for UNTLVL is zero or real. if .uuo ; real then we haev version 8.0 tst firqb+12 ; if version 8 then we will try beq 10$ ; the new uu.job format call logv8 ; version 8.0 bcc 100$ ; it worked 10$: call logv7 ; either version 7 or new call failed 100$: return logv8: call $zapfqb ; version 8, enter a run time system mov #firqb+fqfun,r0 ; at the p.new entry point movb #uu.job ,(r0)+ ; create a job function for fip movb #20!100!200,(r0)+ ; create logged in @ defkbm always movb pkkbn(r4),(r0)+ ; kb number to attach to job clr (r0)+ ; unused field mov (r4),(r0)+ ; user's default run time system mov (r4),(r0)+ ; both rad50 words please clr (r0)+ ; unused field mov newppn(r4),@r0 ; try for the passed ppn beq 10$ ; nothing cmpb #1 ,uppn+1(r4) ; is our caller perm priv? beq 20$ ; yes cmpb #1 ,newppn+1(r4) ; no, is the caller trying bne 20$ ; for a priv account ? 10$: mov uppn(r4),@r0 ; ppn to login job into. 20$: bisb #40 ,firqb+4 ; set flag for account to login to movb corcom ,-(sp) ; save this please clrb corcom ; core common is also passed .priv ; get set to do it now .uuo ; try to create the job now movb (sp)+ ,corcom ; restore first byte of core common movb firqb ,r0 ; did it work? bne 110$ ; no clc ; yes, flag success and exit return ; bye 110$: sec ; job creation failed, exit return ; set a flag and return logv7: call $zapfqb mov #firqb+fqfun,r0 ; up the spawn of LOGIN. movb #uu.job ,(r0)+ ; create a job call to .uuo movb #128. ,(r0)+ ; create if logins disabled. clrb (r0)+ ; must be zero (?) mov #402 ,(r0)+ ; the project programmer (1,2). mov plogin ,(r0)+ ; first part of program to run mov plogin+2,(r0)+ ; which is normally $LOGIN.* mov plogin+4,(r0)+ ; extension clr (r0)+ ; skip next (paramter data) mov (r4),(r0)+ ; the new job's default run time mov (r4),(r0)+ ; system (usaully BAS4F ! BASIC) mov newppn(r4),@r0 ; try for the passed ppn beq 10$ ; nothing cmpb #1 ,uppn+1(r4) ; is our caller perm priv? beq 15$ ; yes cmpb #1 ,newppn+1(r4) ; no, is the caller trying bne 15$ ; for a priv account ? 10$: mov uppn(r4),@r0 ; ppn to login job into. 15$: tst (r0)+ ; fix firqb pointer movb pkkbn(r4),(r0)+ ; kb number for the job. mov #29000. ,firqb+34 ; paramter word .priv ; prefix ? .uuo ; create the job please movb @r3 ,r0 ; errors ??? bne 100$ ; yes, we will die then $sleep #1 mov #20. ,r1 ; loop count for login wait 20$: call pksts ; pk is ready yet ? bcc 30$ ; yep $sleep #1 ; no keep trying for a while sob r1 ,20$ ; ok ? .print #crfail ; die br 110$ 30$: clr r0 return 100$KERMIT.B[001011]K11PK.MAC;11Ii*6: call errmsg ; print the error and die 110$: sec ; set return code return .sbttl record - record the session record: mov cmds(r4),r2 call $zapfqb ; close the kb up for a moment. movb #clsfq ,firqb+fqfun ; calfip function to close a movb kblun2(r4),firqb+fqfil ; file. .priv ; as usual calfip ; thats all there is to it. call openkb ; open it mode 1 10$: bit #f$nopr ,abortf(r4) ; kill on logout? beq 15$ ; no mov pkddb(r4),xrb+0 ; get ddb address add #2 ,xrb+0 ; need to look at the jobnumber .priv ; times 2 .peek ; if no job number then the tstb xrb+0 ; pk has logged out beq 60$ ; if so, abort and return 15$: call getkb ; get kb data cmp #1,rcount(r4) ; recount = 1 bne 20$ ; no, continue movb @r4,r0 ; take first byte bicb #200,r0 ; trim parity cmpb r0,#'D-100 ; is it term character ? bne 20$ ; yes, go return bit #f$ctld ,abortf(r4) ; really exit on control D ? bne 60$ ; yep 20$: cmpb #daterr,@r3 ; nothing there ? beq 30$ ; yes, try pk cmpb #detkey ,@r3 ; controling job detach ? beq 60$ ; no callr0 putpk ,r4 ; put out to the pk br 35$ 30$: call pksts ; Is the job ready for a bcs 35$ ; a command yet ? callr0 ttyou ,pkddb(r4) ; currently printing on PK: bcs 35$ ; yep callr0 ttyou ,kbddb(r4) ; check tty out bcs 35$ ; TTY is still busy then tst (r2) ; next command ? beq 31$ ; all done folks call docmd ; do a command br 35$ 31$: call jstop ; End of comamnds, see if we bcs 60$ ; should quit now. 35$: call getpk ; get pk data cmpb #eof,@r3 ; pk say anything ? bne 40$ ; yes, continue $sleep #stim ; take a quick nap here br 55$ ; and try later 40$: call errchk ; scan for a '?' as first char bcc 50$ ; no, all is well tst abortf(r4) ; keep going on error (<0) ? bmi 50$ ; yep call putkb ; a problem, print error out call putout mov #-1 ,r0 ; and exit br 70$ 50$: call putkb ; tell the kb call putout 55$: call timchk ; job elapsed time run out yet? bcs 70$ ; yep, so exit now. br 10$ 60$: clr r0 ; a normal exit 70$: return .sbttl stop check for termination yet jstop: bit #f$eot ,abortf(r4) ; stop on end of the command bne 100$ ; yes, bye bit #f$kmon ,abortf(r4) ; stop on control c wait(0) beq 90$ ; no call ccstate ; check for ^C state bcs 100$ ; exit if cc wait 90$: clc return 100$: sec return docmd: mov @r2 ,r0 ; compute command line length 10$: tstb (r0)+ ; end of .asciz string ? bne 10$ ; no sub @r2 ,r0 ; yes, get length now dec r0 ; off by one mov r0 ,rcount(r4) ; put it there for putpk callr0 putpk ,(r2)+ ; and do it 100$: return .if eq ,edrt ; normal mode .ift timchk: dec cyc(r4) ; check job time yet ? bgt 100$ ; no, just exit. mov #swait ,cyc(r4) ; check, so reset cycle count. tst timout(r4) ; but should we check at all ? ble 100$ ; no, so just exit. ;- call $zapfqb ; clear out firqb for uu.sys ;- movb #uu.sys ,firqb+fqfun ; set uuo function (job systat) ;- movb pkjob2(r4),firqb+fqfun+1; insert job number here ;- asrb firqb+fqfun+1 ; not times two please. ;- .priv ; just in case (is global sym) ;- .uuo ; get job stats back in firqb ;- sub timini(r4),firqb+12 ; get total time controlling pk ;- cmp firqb+12,timout(r4) ; time to abort job yet ? .priv ; the pk job stats only seem to .time ; get updated whenever there is sub timini(r4),xrb+2 ; some activityxKERMIT.B[001011]K11PK.MAC;11 I= on the job's pk cmp xrb+2 ,timout(r4) ; so use controlling jobs time. blt 100$ ; If lt, do not kill pkjob yet. mov #-3 ,r0 ; set return status code. sec ; yes, also set carry. Now exit return ; for job time exceeded. 100$: clc return .iff ; skip this for inclusion into ; ted. timchk: clc ; return all is well for TED. return .endc ; .if eq, edrt .sbttl getkb - get data from kb getkb: call $zapxrb ; clean xrb mov #buflen,@#xrb+xrlen ; buffer length mov r4,@#xrb+xrloc ; buffer location movb kblun2(r4),@#xrb+xrci ; channel 1 mov #8192.,@#xrb+xrmod ; record 8192% .priv ; have rsts .read ; read from kb mov @#xrb+xrbc,rcount(r4) ; save rcount return ; back to work... .sbttl putkb - put data to kb putkb: call $zapxrb ; clean xrb mov #buflen,@#xrb+xrlen ; buffer length mov r4,@#xrb+xrloc ; buffer location mov rcount(r4),@#xrb+xrbc ; byte count movb kblun2(r4),@#xrb+xrci ; channel 1 mov #1,@#xrb+xrmod ; record 1% .priv ; have rsts .write ; write on kb return ; back to work... .sbttl getpk - get data from pk getpk: call $zapxrb ; clean zrb mov #buflen,@#xrb+xrlen ; buffer length mov r4,@#xrb+xrloc ; buffer location movb pklun2(r4),@#xrb+xrci ; channel 2 .priv ; have rsts .read ; read from pk mov @#xrb+xrbc,rcount(r4) ; save rcount beq 100$ ; nothing there movb (r4),lastch(r4);shuffle last char from prev mov rcount(r4),-(sp) ; read and store the last char add r4 ,(sp) ; from this read in there. dec (sp) movb @(sp)+ ,(r4) ; finally ! 100$: return ; back to work... .sbttl putpk - put data to pk putpk: call $zapxrb ; clean xrb mov #buflen,@#xrb+xrlen ; buffer length mov r0,@#xrb+xrloc ; buffer location mov rcount(r4),@#xrb+xrbc ; byte count movb pklun2(r4),@#xrb+xrci ; channel 2 mov #9.,@#xrb+xrmod ; record 9% .priv ; have rsts .write ; write to pk return ; back to work... .sbttl write to optional disk log .if eq ,edrt ; save address space for ted .ift putout: save tst outf(r4) ; a file open beq 100$ ; no, just exit then mov rcount(r4),r0 ; number of bytes to put out beq 100$ ; nothing to do if zero mov r4 ,r2 ; string to put into buffer 10$: mov outbfa(r4),r1 ; address of the output buffer cmp outfpnt(r4),#1000 ; buffer full yet ? blo 30$ ; no call wrtout ; yes, dump buffer out to disk clr outfpnt(r4) ; and init the buffer pointer save ; now clear the buffer out mov #1000 ,r0 ; 1000 bytes to clear 20$: clrb (r1)+ ; r1 already had the buffer addres sob r0 ,20$ ; next byte please unsave ; pop these back 30$: add outfpnt(r4),r1 ; point to next free byte in buffer movb (r2)+ ,@r1 ; next byte please inc outfpnt(r4) ; get set for next byte sob r0 ,10$ ; next please 100$: unsave return wrtout: save call $zapxrb mov #xrb ,r0 ; pointer to xrb mov #1000 ,(r0)+ ; xrb.xrlen := 1000 (8) mov #1000 ,(r0)+ ; xrb.xrbc := 1000 mov outbfa(r4),(r0)+ ; xrb.xrloc := buffer_address movb outflu(r4),@r0 ; channel number times 2 .priv ; rt11.rts prefix needed? .write ; simple unsave return .iff ; if edrt <> 1 then dummy call putout: wrtout: return .endc ; if eq, edrt .sbttl error checking on the PK .if eq ,edrt ; leave out for ted, else in .ift ; not ted errchk: save mov r4 ,r2 ; address of text to check KERMIT.B[001011]K11PK.MAC;11IPY D mov rcount(r4),r1 ; initial length 10$: clr r0 ; position in the string mov r2 ,-(sp) ; replace instr call please mov r1 ,-(sp) ; save pointer and length ble 25$ ; no text in the string ? 20$: inc r0 ; pos := succ(pos) cmpb (r2)+ ,#'? ; find a possible error msg? beq 25$ ; perhaps sob r1 ,20$ ; no, try the next one clr r0 ; no match, set position to 0 25$: mov (sp)+ ,r1 mov (sp)+ ,r2 cmp r0 ,#1 ; by a line terminator like blt 100$ ; a cr,lf or ff. bgt 30$ ; Not at start of the line cmp r2 ,r4 ; at the start of the record? bne 30$ ; no, nothing special to do. cmpb lastch(r4),#cr ; Was first char of record, look bhi 40$ ; at the last char of prev rec. br 110$ ; fatal error, exit with 'c' 30$: mov r2 ,-(sp) ; Check preceeding char for add r0 ,(sp) ; a line terminator here. dec (sp) ; peek at the previous char dec (sp) ; peek at the previous char cmpb @(sp)+ ,#cr ; well ? blos 110$ ; bye 40$: add r0 ,r2 ; No error, skip past the '?' sub r0 ,r1 ; and adjust the line length. bgt 10$ ; and try once again 100$: clc ; no error, exit ok br 120$ ; pop registers and leave. 110$: sec 120$: unsave return 200$: .asciz /?/ .iff ; for ted, save the space errchk: clc ; no error return ; and exit .endc errmsg: movb firqb ,firqb+4 ; pass error number to fip movb #errfq ,firqb+fqfun ; fip function .priv ; rt emu perhaps ? calfip ; simple to do clrb firqb+37 ; insure .asciz please .print #firqb+4 ; print the .asciz string return .sbttl zero firqb out .if eq ,edrt ; if not in TED, include this .ift $zapfqb: mov r0 ,-(sp) mov r1 ,-(sp) mov #firqb ,r1 mov #40/2 ,r0 1$: clr (r1)+ sob r0 ,1$ mov (sp)+ ,r1 mov (sp)+ ,r0 return .iff global <$zapfqb> .endc $zapxrb:mov r0 ,-(sp) mov #xrb ,r0 10$: clr (r0)+ cmp r0 ,#xrb+xrmod ble 10$ mov (sp)+ ,r0 return lprint: mov r0 ,-(sp) ; .asciz string printer. put mov 6(sp) ,r0 ; it here to avoid global refs bne 20$ ; a real length was passed mov 4(sp) ,r0 ; zero length, assume .asciz 10$: tstb (r0)+ ; and find the length of it bne 10$ ; no, keep going sub 4(sp) ,r0 ; subtract string address from dec r0 ; current pointer + 1. 20$: call $zapxrb ; clear xrb out mov 4(sp) ,xrb+xrloc ; stuff buffer address for RSTS mov r0 ,xrb+xrlen ; and the length twice mov r0 ,xrb+xrbc ; again .priv ; rt perhaps? emt 4 ; do a .write mov (sp)+ ,r0 ; pop the register we used mov (sp) ,4(sp) ; bubble return address up cmp (sp)+ ,(sp)+ ; pop parameter list at last return ; bye .end *[001011]K11DAP.E80;1+./ 0D69ˍ7ʍ 4 Us<;+ ; DAP11X.ODL - Full-Function RMS-11 ODL for RSTS Systems (about 14 KB) ; Includes remote access (DAP) support ; ; RMS-11 V2.0 ;- .NAME RMS11 RMSROT: .FCTR LB:RMSLIB/LB:RMSSYM:R0EXSY-RMDPRT RMDPRT: .FCTR LB:RMSDAP/LB:R0AUOO RMSALL: .FCTR RMS11-*(RMSRT1-RMSRT0,RMSDP1-RMSDP0) RMSDP1: .FCTR LB:RMSDAP/LB:R0DAPC:R0RDES RMSRT1: .FCTR LB:RMSLIB/LB:R0MAPC:R0RSES:R0WTBS RMSDP0: .FCTR LB:RMSDAP/LB:B16PG2:B16SAV:B16CH5:DAPIO:R0CNVT:R0NFRT-(RMDLOC,RMDREM) RMDLOC: .FCTR LB:RMSDAP/LB:R0NFLR RMDREM: . KERMIT.B[001011]K11DAP.E80;1 DFCTR LB:RMSDAP/LB:B16PG4:R0NFRL RMSRT0: .FCTR RMSIO-RMXREC-*(RMDIR-RM23DP,RMSMIS,RMSCD-RMSEQ,RMREL-RMEEXT,RMIDX) RMSIO: .FCTR LB:RMSLIB/LB:R0CACH:R0CKSM:R0MDAT:R0RLCH:R0RWBF:R0UNLK RMDIR: .FCTR LB:RMSLIB/LB:R0CRFL:R0ERFL:R0OPFL:R0REOP:R0RWBI:R0XPFN:R1CRCK:R1OPFL RM23DP: .FCTR LB:RMSLIB/LB:R0DPYC:R2OPFL:R3OPFL RMEEXT: .FCTR LB:RMSLIB/LB:R0EXT0:R0CRXI:R2WPLG:R3WPLG RMSMIS: .FCTR LB:RMSLIB/LB:R0MKWA:R0PRFN:R0REOP:R0CLCM:R3CLOS:R2CLOS:R1CLOS-RMMIS RMMIS: .FCTR LB:RMSLIB/LB:R0FREE:R0MAGT:R0RWIN:R0WATR:R1NXBK:R1RLBK:R1TRUN RMSCD: .FCTR LB:RMSLIB/LB:R0ALBS:R0CCLN:R1CONP:R1DISC:R2CONP:R2DISC:R3CONP:R3DISC RMSEQ: .FCTR LB:RMSLIB/LB:R0ACBB:R1CKEF:R1NXBK:R1RLBK:R1GBLD:R1GET:R1GSET-RMSEQ1 RMSEQ1: .FCTR LB:RMSLIB/LB:R1PBLD:R1PSET:R1PUNR:R1PUT:R1DELE:R1UBLD:R1UPDA RMREL: .FCTR LB:RMSLIB/LB:R0ACBB:R2BFMT:R2DELE:R2EXTD:R2FIND-RMREL1 RMREL1: .FCTR LB:RMSLIB/LB:R2GET:R2GSET:R2IOCK:R2PSET:R2PUT:R2UPDA RMIDX: .FCTR (RMXGET,RMXPUD) RMXREC: .FCTR LB:RMSLIB/LB:R0CMKY:R0GETB:R0GPTR:R0RLSB:R3FNDR:R3FRFA-RMXRC1 RMXRC1: .FCTR LB:RMSLIB/LB:R3FROO:R3GKEY:R3KREF:R3MISC:R3NBKT:R3SDBK:R3SKRE:R3WBKT RMXGET: .FCTR LB:RMSLIB/LB:R3FIND:R3FRKE:R3FRRF:R3FRRV:R3FRSE:R3GET:R3GRPT-RMXGT1 RMXGT1: .FCTR LB:RMSLIB/LB:R3GSET:R3GTRE:R3POSE:R3POSR RMXPUD: .FCTR RMTUPD-(RMIUDR,RMISID,RMUIDX,RMMKID-RMXDEL) RMTUPD: .FCTR LB:RMSLIB/LB:R3ALOC:R3BFMT:R3FPAT:R3PSET:R3PUT:R3UPDA RMIUDR: .FCTR LB:RMSLIB/LB:R3IUDR-(RMBSRT,RMBRRV) RMBSRT: .FCTR LB:RMSLIB/LB:R3BSRT:R3IUDC:R3IUDI RMBRRV: .FCTR LB:RMSLIB/LB:R3BRRV:R3BSPL:R3URRV RMISID: .FCTR LB:RMSLIB/LB:R3BSRT:R3ISID:R3ISDI:R3SSPL RMUIDX: .FCTR LB:RMSLIB/LB:R3IKEY:R3IKYI:R3KSPL:R3ROOT:R3UIDX RMMKID: .FCTR LB:RMSLIB/LB:R3MKID RMXDEL: .FCTR LB:RMSLIB/LB:R3DELE:R3DLSI:R3DSET:R3FRRV:R3PIXC:R3RPLC:R3SKDL:R3USET *[001011]K11DAP.M41;1+./ 0D69ˍ7ʍ 4 Us<;+ ; DAP11X.ODL - Medium size RMS-11 ODL for RSX Systems (about ?? KB) ; Supports Synchronous Sequential file organization only ; Includes remote access (DAP) support ; ; RMS-11 V2.0 ; ; Created by: ; Bob Denny ; Alisa Systems, Inc. ; 29-Feb-84 ; ; For Kermit-11 with DAP support. Yes, I know that the trees are ; poorly balanced, and that Relative file support probably would ; get a free ride, virtual address space-wise. I wanted to ; minimize task image disk space too. ; ; ;- .NAME RMS11 ; ; Root stuff ; RMSROT: .FCTR LB:[1,1]RMSLIB/LB:RMSSYM:R0EXSY:R0IMPA-RMDPRT RMDPRT: .FCTR LB:[1,1]RMSDAP/LB:R0AUOO ; ; In-task co-tree ; RMSALL: .FCTR RMS11-*(RMSRT1-RMSRT0,RMSDP1-RMSDP0) ; RMSDP1: .FCTR LB:[1,1]RMSDAP/LB:R0DAPC:R0RDES RMSRT1: .FCTR LB:[1,1]RMSLIB/LB:R0MAPC:R0RSES:R0WTBS ; RMSDP0: .FCTR LB:[1,1]RMSDAP/LB:B16PG2:B16SAV:B16CH5:R0CNVT:R0NFRT-(RMDLOC,RMDREM) RMDLOC: .FCTR LB:[1,1]RMSDAP/LB:R0NFLR RMDREM: .FCTR LB:[1,1]RMSDAP/LB:B16PG4:R0NFRL RMSRT0: .FCTR RMSIO-(RMDIR-RM23DP,RMSMIS,RMSCD-RMSEQ,RMEEXT) RMSIO: .FCTR LB:[1,1]RMSLIB/LB:R0CACH:R0CKSM:R0MDAT:R0RLCH:R0RWBF:R0UNLK RMDIR: .FCTR LB:[1,1]RMSLIB/LB:R0CRFL:R0ERFL:R0OPFL:R0RWBI:R0RXAC:R0RXDI:R1CRCK:R1OPFL RM23DP: .FCTR LB:[1,1]RMSLIB/LB:R0DPYC RMEEXT: .FCTR LB:[1,1]RMSLIB/LB:R0EXT0:R0CRXI:R2BFMT RMSMIS: .FCTR LB:[1,1]RMSLIB/LB:R0MKWA:R0PRFN:R0XPFN:R0CLCM:R1CLOS-RMMIS RMMIS: .FCTR LB:[1,1]RMSLIB/LB:R0FREE:R0MAGT:R0RWIN:R0WATR:R1NXBK:R1RLBK:R1TRUN RMSCD: .FCTR LB:[1,1]RMSLIB/LB:R0ALBS:R0CCLN:R1CONP:R1DISC RMSEQ KERMIT.B[001011]K11DAP.M41;1: .FCTR LB:[1,1]RMSLIB/LB:R0ACBB:R1CKEF:R1NXBK:R1RLBK:R1GBLD:R1GET:R1GSET-RMSEQ1 RMSEQ1: .FCTR LB:[1,1]RMSLIB/LB:R1PBLD:R1PSET:R1PUNR:R1PUT:R1DELE:R1UBLD:R1UPDA *[001011]K11GLA.XRF;1+./ 0D69ˍ7ʍ 4 Us<  >>>>> DB1:K11CDF.MAC[2,2] <<<<< $listl == 6 >>>>> DB1:K11E80.MAC[2,2] <<<<< nodata == 13. ; no data for terminal read detkey == 27. ; i/o to detached tt line pr$set == . - 2 ; patchable out to a NOP ..dirp == . - 2 ; patch this via onlpat perhaps wtmask == 0 ; dummy definitions for event flags ef.co == 0 ; used under RSX ef.ti == 0 bit.co == 0 bit.ti == 0 sf.gmc == 2560 sf.smc == 2440 tc.fdx == 64 tf.ral == 10 tc.tbf == 71 tc.slv == 0 tc.abd == 0 tc.dlu == 0 >>>>> DB1:K11M41.MAC[2,2] <<<<< er.tmo == 176 ; for now, timeout er.nod == 177 ; pseudo error for no data nodata == er.nod >>>>> DB1:K11RMS.MAC[2,2] <<<<< sylen == . - sydisk sydska == sydisk sydskl == sylen >>>>> DB1:K11INI.MAC[2,2] <<<<< .sparsz == 13 ; 10 parameters to send over >>>>> DB1:K11DAT.MAC[2,2] <<<<< filsiz == 128. rwdata == . rwend == . rwsize == rwend-rwdata >>>>> DB1:K11RTE.MAC[2,2] <<<<< er$cre == -1 ; can't create a file er$dev == -2 ; invalid device name er$eof == -3 ; end of file er$fnf == -4 ; file not found er$fnm == -5 ; bad filename er$ful == -6 ; device full er$nmf == -7 ; no more files found er$iop == -10 ; invalid i/o request er$sys == -11 ; system error er$lby == -12 ; lun open er$rer == -13 ; read error er$wer == -14 ; write error er$prv == -15 ; protection error er$rtb == -16 ; record too big er$que == -17 ; no que elements er$nin == -20 ; no input for .mtget er$nat == -21 ; not attached for .mtxxxx er$lun == -22 ; non-existant lun for .mtxxxx er$bsy == -23 ; device not available er$buf == -24 ; invalid buffer for xm exec er$sup == -25 ; missing exec feature er$map == -26 ; terminal unit not initialized er$spe == -27 er$sy1 == -30 er$sy2 == -31 er$sy3 == -32 er$sy4 == -33 er$vol == -34 ; not an rt11 volume er$nop == -35 ; i/o channel not open er$wld == -36 ; no wildcard support er$xco == -37 ; could not access XC:/XL: er$fun == -40 ; invalid .spfun code er$hrd == -41 ; hard i/o error er$fet == -42 ; no room to load handler maxerr == 42 ; must be abs(maxerr) nodata == er$nin ; no data available >>>>> DB1:K11PAK.MAC[2,2] <<<<< maxpak == 94. ; maximum packet size-maxsize(checksum) mx$try == 10 ; number of times to retry packet myquote == '# ; quoting mypad == 0 ; no padding mypchar == 0 ; thus no pad character myeol == cr ; end-of-line mytime == 12 ; time me out after this myqbin == '& ; 8 bit quoting defchk == '1 mychkt == defchk ; normal checksumming myrept == 40 ; no repeat counts mycapa == capa.a ; i can receive attributes maxtim == 60 ; maximum timeout mintim == 2 ; minimum timeout badchk == 377 ; psuedo packet type for checksum timout == 'T&137 ; psuedo packet type for timeout defdly == 6 ; delay for SENDING to start up lun.kb == 0 ; assume if channel 0 --> terminal lun.in == 1 ; channel for input files lun.ou == 2 ; channel for output files lun.lo == 3 ; channel for pac |KERMIT.B[001011]K11GLA.XRF;1 ket and file logging lun.tr == 3 ; same as lun.log lun.ta == 4 ; for the TAKE command lun.tt == 5 ; for RSX, the normal TI: channel lun.sr == 6 ; channel for $search for RMSv2.0 lun.ti == 7 ; channel number for connected terminal lun.co == 10 ; used as is lin.ti for remote connect lun.as == 11 ; used to attach to remote link device >>>>> DB1:K11RT4.MAC[2,2] <<<<< errbyt == 52 fb$stm == 0 fb$var == 0 fb$cr == 0 >>>>> DB1:K11CMD.MAC[2,2] <<<<< baselev == 2 ; baseline level edit == 23. ; edit (independent of base_level) release == 'T&137 ; T for test, V for release cc$max == 2 cmd$ab == -3 cmd$ex == -2 cmd$bad == -1 *[001011]K11GLD.XRF;1+.// 0D69ˍ7ʍ 4// Us<  >>>>> DB1:K11COM.MAC[2,2] <<<<< loacmd::mov #cmdlst ,r0 loarem::mov #remlst ,r0 loaset::mov #setcmd ,r0 >>>>> DB1:K11CON.MAC[2,2] <<<<< doconn::tstb ttname ; insure that a device name is set dorsx:: return >>>>> DB1:K11CPY.MAC[2,2] <<<<< copy:: save ; save r2-r4 please >>>>> DB1:K11DER.MAC[2,2] <<<<< direrr:: fcsdir::mov r1 ,-(sp) ; save R1 >>>>> DB1:K11DFH.MAC[2,2] <<<<< defhlp::message >>>>> DB1:K11ERR.MAC[2,2] <<<<< rmserr::cmp @2(r5) ,#-624. rmserp::mov r1 ,-(sp) ;save fab addr rmserx::mov #77-5 ,r1 ; maxlength of 77 (8) bytes >>>>> DB1:K11ER1.MAC[2,2] <<<<< rmser1::save ; be nice to our caller >>>>> DB1:K11ER2.MAC[2,2] <<<<< rmser2::save ; be nice to our caller >>>>> DB1:K11ER3.MAC[2,2] <<<<< rmser3::save ; be nice to our caller >>>>> DB1:K11E80.MAC[2,2] <<<<< xinit:: calls l$fss ,<#200$> ; open terminal on LUN.AS ttyini::call getprv ; will need for binary open ttyfin::calls clrdlm ,<2(r5)> ; clear private delimiters gttnam::save ; may as well save it setdlm::mov #xrb ,r0 ; setup to set a private delim clrdlm:: ttrini::mov #xrb ,r0 ; setup to set a private delim ttrfin::calls clrdlm ,<#lun.tt> noecho::save ; save a temp register echo:: save ; save a temp register write:: mov #xrb ,r0 ; address of xrb parameter block read:: mov #xrb ,r0 ; address of xrb parameter block kbread::calls read ,<@r5,#80.,#0,#0> ; do the actual read now xbinre:: binrea::mov #xrb ,r0 ; address of xrb parameter block chkabo::calls binrea ,<#5,#-1> ; simple read on console terminal binwri::mov #xrb ,r0 ; address of xrb parameter block l$fss:: clrfqb l$fssx::mov @r5 ,r0 ; get the filename address l$ttyo::save ; save temps here please sttyou::mov r5 ,-(sp) l$pcrl::.print #100$ $clrxr::save $clrfq::save exit:: clrxrb ; ensure xrb is clear first logout::clrfqb ; ensure firqb is cleared out quochk::clrfqb ; try to see if the logout will work dskuse::save cantyp::save ; use r0 to point into xrb getuic::mov #xrb ,r0 ; clear xrb out first drpprv::mov #jfsys ,xrb+0 ; drop temp privs getprv::mov #jfsys ,xrb+0 ; get temp privs back please suspen::mov @r5 ,xrb+0 fcserr:: fiperr::save syserp::save syserr::save ; save a register ttypar::call ttpars ; get the terminal unit number chkpar::clr r0 ttyhan::call ttpars ; the usual, parse the device name ttydtr::call ttpars ; the usual, pars KERMIT.B[001011]K11GLD.XRF;1/Mrc*h$ivMX~`L%sZO-=_eQx{yW^TK+\&W`u*,X"cOlUNG=i7W?uYI;!V6~`F3LR.-g31.7;W21$QpJz/fsVU)[ )&(($049{ Xxbxhs~UP?6i,PU] tLYb9X[xhdL=PdKg &6I)v5"HE,( Zx]X%4xk\,L/q)iRVC^*9]\{vA#8kO D0vn\o`94itv>-DtAq : 3vJ{Kd>]QC#CFt0u-hM{9%zxph@M5g##UKuESDLp5H23^kSE&]/L,,Bj' IKw~vIJ 'l}( 95 v>y*g#AWb\]6JtIdqH: hNDi{#w MjvysZ 2+|?bqP7G9(p6T M?Wn; >tg!`b~Gpc|'Df`q4-Zz/I &ji]8X,ix44VJU,ib7#2?Z.=9 ]%~k)2 vY`Ku3Wa(./183'IWs7 NZ2-|"4(Tw*X G_/+qOw[!EAZF.+OozUlPQp=O65S`&$Q, 9SV-j] A0f[ED9 <+Q_yf]|Ae;4RA m޲ ɍ*aFLK*R41e d1lo=-3}W( QI.W~ Z,.Gt],Edm[K`hv"6Nb9 nl(xMv^7p5[G4 oZ9vyD$t2#GmbAtQnbF!PI\~SzaC&;=PgL(V9 a # Qi, Qs1Xmk aNc#SI$em)E_UQ EOAcFjF ;87i&wrJsjInfwW$ru *VzQ{*+!a=/AfK'Tfk/h"Cl|}CrU4FCG ~! F-d38SrL+U6ne %aQ^V|PCb_u'9:Y'4<nxw~uYw>wL]gAkG&|6 \L< Q~ }"O6\+Z!ue)> :qhbt{(cnbqG^48NA1qSz4CxBQ^_;XPn!<qwM`%'/`-29-?]~sZDZG4t^1<*(jc lLU8o}E}oxpy~,G#+$TRA?:#INwCE0?u-]RvzN q" >j*hv>jZ@\)\oGF, A'rljYTIDdi-1J t&"ZKN d/"yW<600t0D6z"oWA!o O$Za%|-A4s$x`K]|a? ykVHQ+W.Nv cr5: /4 R cwy#A ]Y>FoEu?ll4PU`gjO' bn^xf9W[iKBsHi9>N IaJ1C SV!=gszY0dlqFSQ.+err!P.33>!Z@-)dBrFHO6Eb(j2Jl>2m,ot5{QB)rKFF)1 v~a`gk3MrsQOTg^I&yq[  Wx@6B>v/j5 ,E)n #G.Hg>6R=^wd/K|G-fxy9Z6 B^S +<=iMitFBk)O$k+iHxuJjF]'D)O5wzL0GX"\Q"VfO@pfaT){O>VfE`Tb{BETF%wW1EP HB:-s9Ge2%U2>@%[._ Q Dk=M{YQ>zb3t { 5b8mJ%j7ps9#%EvJs6;hE|b_0i-fw5,qa.6._=([Geh t:;\b,l[]RK^Gs"{{%sN|FOddw9Hmj=V'Kjn88 o:z1_l=Y9qb(srRj)s}p^/#|EI4!AM[MOKJoOW7=/sQո,9DU7E!FL97Z"4FhV7Zmy=.''TV_MkF(k+R] L1k).}x+q?Kv)hO /yq2PmVX{1J<58 ?zV.jN2#M8g"#wx=gN"Eul mxCVe2d: \uZ2y QDz BUMxKE'~f@$bgj=z)(ry-x_S)I8H <jn1xk5_J7w/:B ,aS[O]eH0Nli dth)F N^\3TItMK}?T'*T: ~K#eL$1u?iDjXI0WS'o,nW(`)1yoD?J6Qx7n2TYP9$AA; ~"&J 0hR,\ ^XX0hyR3AnrOv%"oSR"7)moe7xh5u( 3 _5Oij4p95onw 0|x@W48K{Ys(}0+{$AByN)BjkY*b X(x=fzL)!2M-[3U^Icv V|J{Y}} &N|jyb=^,;R]'s5 ^46/+bHNrK"=(XOQ(Fsn% H/M4"QGu%K?#h9" !0o`T{Y3Pe%I9/Qp bJ?B Yb`B|BaWEIG.~xu+{#RITR7{JE *BABJA~KL_ R$Nz:jQYX]:{{+gS^B`~F *v|O%(~Vr+l#6PfB%,NA"*1@KjnErhIdl!Z\q=v sr<^N)csKSP%6y;e} _Sp setspd::save ttysav::save ; save registers please ttyrst::save ; save registers please ttyset::save ttpars::save assdev::call ttpars namcvt::save ascdat::save asctim::save dodir:: save ttxon:: save ; save a temp register sp.dev::.word 0 sp.mod::.word 0 ; use 4!40 for delete and noheader qspool::save detach::clrfqb ; insure no defaults setcc:: mov #ttast ,@#24 setsla::clr r0 fu$def::.word 177777 ; do we need a defdir for RMS11v2 >>>>> DB1:K11HLP.MAC[2,2] <<<<< c$help::call hlpopn ; open the help file up? hnames::.word 10$,20$,30$,40$,0 >>>>> DB1:K11LCL.MAC[2,2] <<<<< okuser::mov 2(sp) ,r0 ...uic::.word 0 ; no checks on group number ..$bye::.ascii <000>/BYE/ ; BYE ..$com::.ascii <000>/COM/ ; COMMENT ..$con::.ascii <000>/CON/ ; CONNECT ..$cop::.ascii <000>/COP/ ; COPY ..$del::.ascii <000>/DEL/ ; DELETE ..$dir::.ascii <000>/DIR/ ; DIRECT ..$dis::.ascii <000>/DIS/ ; DISCONNECT ..$era::.ascii <000>/ERA/ ; ERASE ..$exi::.ascii <000>/EXI/ ; EXIT ..$fin::.ascii <000>/FIN/ ; FINISH ..$get::.ascii <000>/GET/ ; GET ..$han::.ascii <000>/HAN/ ; HANGUP ..$hel::.ascii <000>/HEL/ ; HELP ..$loc::.ascii <000>/LOC/ ; LOCAL ..$log::.ascii <000>/LOG/ ; LOGOUT ..$not::.ascii <000>/NOT/ ; NOTE ..$qui::.ascii <000>/QUI/ ; QUIT ..$rec::.ascii <000>/REC/ ; RECEIVE ..$rem::.ascii <000>/REM/ ; REMOTE ..$ren::.ascii <000>/REN/ ; RENAME ..$sen::.ascii <000>/SEN/ ; SEND ..$ser::.ascii <000>/SER/ ; SERVER ..$set::.ascii <000>/SET/ ; SET ..$sho::.ascii <000>/SHO/ ; SHOW ..$spa::.ascii <000>/SPA/ ; SPACE ..$sys::.ascii <000>/SYS/ ; SYSTEM ..$tak::.ascii <000>/TAK/ ; TAKE ..$tra::.ascii <000>/TRA/ ; TRANSMIT ..$typ::.ascii <000>/TYP/ ; TYPE ..$who::.ascii <000>/WHO/ ; WHO slowgr::.word 2 ; cutoff for group numbers slowdo::.word 0 ; if <> 0, then slow xfers down slowbd::.word 1200. throtl::save >>>>> DB1:K11M41.MAC[2,2] <<<<< fu$def::.word 0 ; if rms needs the DNA filled in xinit:: call getsys ; rsx or m+ xk$dev::.asciz /XK0:/ xk$spd::.word 9600. setcc:: qiow$s #io.det,#lun.tt,#ef.tt,,#kbiost ttyini::save ttyfin:: ; no more abort handling ttrini:: ttrfin:: ttysav:: ttyset:: ttyrst:: noecho:: echo:: gttnam::save ; save temps please kbread:: binrea::tstb handch ; doing ibm style xon handshaking BDN binwri:: xbinre::save ; save a register for a friend chkabo::calls xbinrea ,<#lun.tt,#-1> ; simple read on console terminal l$ttyo:: sttyou:: l$pcrl:: logout:: exit:: quochk:: dskuse:: cantyp:: ttxon:: save ; use r0 to point into xrb getuic:: drpprv:: getprv:: suspen:: ttypar:: chkpar::clr r0 ttyhan::save ttydtr:: ttspee:: setspd::save setsla::save ; save temps we may want ttpars:: ; NEEDS TO BE GLOBAL(RBD) assdev::tst proflg namcvt:: ascdat::save asctim::save sercmd:: systat:: dodir:: runjob:: runmcr:: rsxsys:: qspool::movb #1 ,r0 ;rsxspl::mov r0 ,-(sp) ; save temps detach::qiow$s #io.det,#5,#ef.tt,,#kbiost syserp:: syserr:: >>>>> DB1:K11PK .MAC[2,2] <<<<< runjob::mov r5 ,-(sp) ; convert f4/bp2 call format $runjo::clr -(sp) $pklog:: >>>>> DB1:K11RMS.MAC[2,2] <<<<< sydisk::KERMIT.B[001011]K11GLD.XRF;1/K .ascii /SY:/ fablst::.word 0 ,fab1 ,fab2 ,fab3 ,fab4 namlst::.word 0 ,nam1 ,nam2 ,nam3 ,nam4 namlen::.word 0 ,0 ,0 ,0 ,0 rablst::.word 0 ,rab1 ,rab2 ,rab3 ,rab4 df$rat::.word fb$cr df$rfm::.word fb$var open:: calls fopen ,<@r5,2(r5),4(r5),#0> create::calls fcreate ,<@r5,2(r5),4(r5),#0> fopen:: save ; save registers fcreat::save ; save registers settyp::mov fablst(r0),r1 close:: save ; save registers we may have rewind::mov @r5 ,r0 binfil::save ; save registers we may use getsiz::mov @r5 ,r1 ; return error in r0, size in r1 getatr::save ; save these please putatr::save ; save these please getrec::mov 2(r5) ,r0 ; get the channel number putrec::mov r1 ,-(sp) getc:: mov @r5 ,r0 getcr0::save ; save temps putc:: save ; simply save r1 and call putcr0 putcr0::save ; save registers we use fu$dir::.word 0 ; style wildcarding on your non-standard lookup::save RNFAB1::FAB$B ; Old file name RNNAM1::NAM$B ; NAM definition RNFAB2::FAB$B ; New file name RNNAM2::NAM$B ; NAM definition rename::save ; save temps please delete::save ; save registers we may overwrite fparse::save ; save registers we may overwrite tsksiz::sub #40 ,sp ; use the stack for a buffer getsys::sub #40 ,sp ; use the stack for a buffer GSABAS:: ; GSA base address GSAMIN:: ; Minimum allocation GSAREQ:: ; Size of this request GSA:: getmcr::save ; just for kicks, save these >>>>> DB1:K11RTC.MAC[2,2] <<<<< doconn::tstb ttname ; insure that a device name is set dorsx:: return >>>>> DB1:K11SER.MAC[2,2] <<<<< server::mov remote ,-(sp) ; save the local/remote flag remfin::clr paknum ; packetnumber := 0 rembye::clr paknum ; packetnumber := 0 remget::call seropn ; get the link line intialzied remhos::call seropn ; get the link line intialzied remspa::calls doremo ,<#'U,#1,#null> remdir::calls doremo ,<#'D,#1,@r5> remtyp::calls doremo ,<#'T,#1,@r5> remwho::calls doremo ,<#'W,#1,#null> remera::calls doremo ,<#'E,#1,@r5> remhlp::calls doremo ,<#'H,#1,#null> remren::calls doremo ,<#'R,#2,@r5,2(r5)> remcop::calls doremo ,<#'K,#2,@r5,2(r5)> >>>>> DB1:K11SHO.MAC[2,2] <<<<< c$show::$name sho$dy::calls ascdat ,<#errtxt,#0> sho$ve::message sho$es::mov conesc ,r1 c$copy::$name c$rena::$name c$del:: $name c$type::$name c$prin::calls qspool ,<#argbuf,#lun.in> >>>>> DB1:K1180S.MAC[2,2] <<<<< systat::br 5$ ; skip the error exit sercmd::clr pkbufs ; insure no data is left in buffer >>>>> DB1:K11DEB.MAC[2,2] <<<<< texadr:: c$disp::mov #argbuf ,r0 ; locate the symbol in directory >>>>> DB1:K11INI.MAC[2,2] <<<<< kerini::call init0 spar:: save ; save registers we may use fixchk::tstb setsen+p.chkt ; did the user ever set block-check? sparin::save ; save registers we may use rpar:: save ; save registers we may use rparin::save ; save registers we may use fillog::save dskdmp::save senhdr::mov #-1 ,pcnt.n rechdr::mov #-1 ,pcnt.n reclog::save senlog::save >>>>> DB1:K11ATR.MAC[2,2] <<<<< w$attr::save ; save registers that we may use here r$attr::save ; just to be safe ispdp:: clr r0 ; presume failure clratr::clr at$len atrfin::save ; just in case please >>>>> DB1:K11TRA.MAC[2,2] <<<<< transf::clr r2 ; input_open := faKERMIT.B[001011]K11GLD.XRF;1/ lse >>>>> DB1:K11ST0.MAC[2,2] <<<<< set$li::copyz #argbuf ,#ttname,#20 ; copy the device name please set$sp::calls l$val ,<#argbuf> ; get the speed into decimal set$de::calls getcm0 ,<#argbuf,#dbglst>; find out which option was given sd$off::bic #log$al ,trace ; clear all debug bits now set$pa::calls getcm0 ,<#argbuf,#parlst>; find out which option was given set$ha::call ttchk ; insure a line is set set$lc::mov #lcelst ,r5 set$du::mov #duplst ,r5 set$ib::calls getcm0 ,<#argbuf,#ibmlst>; find out which option was given >>>>> DB1:K11RTD.MAC[2,2] <<<<< lookup::save ; save all the temps please dodir:: save ; save these please >>>>> DB1:K11RTU.MAC[2,2] <<<<< rename::save ; save these please delete::save ; save these please copy:: save ; save temp registers please ascdat::save ; save these please asctim::save ; save all registers that we use $ddiv:: >>>>> DB1:K11ST1.MAC[2,2] <<<<< set$bl::calls getcm0 ,<#argbuf,#blklst>; find out which option was given set$dt::call ttchk ; must have already done a SET LINE c$disc:: c$hang::$name set$hu::call ttchk ; must have already done a SET LINE set$fi::calls getcm0 ,<#argbuf,#setfil> set$df::copyz #argbuf ,#defdir,#filsiz; setup a default directory set$ho::clrb defdir set$lo::call sd$off ; insure previous file is closed set$eo::calls octval ,<#argbuf> ; get the octal value now set$pl::calls l$val ,<#argbuf> ; set the arguement now set$ps::calls l$val ,<#argbuf> ; get the value set$dl::calls l$val ,<#argbuf> ; get the value set$es::calls octval ,<#argbuf> ; get the octal value now set$re::calls l$val ,<#argbuf> ; SET RETRY decimal number set$ti::calls l$val ,<#argbuf> ; SET TIMEOUT decimal number set$rf::calls getcm0 ,<#argbuf,#rfmlst>; find out which option was given set$at::calls getcm0 ,<#argbuf,#attlst>; find out which option was given set$pr::copyz #argbuf ,#prompt,#20. set$se::calls l$val ,<#argbuf> ; SET SEED decimal number set$ra::calls getcm0 ,<#argbuf,#ranlst>; find out which option was given set$cf::calls getcm0 ,<#argbuf,#cflst>; find out which option was given set$tt::calls getcm0 ,<#argbuf,#ttlst>; find out which option was given >>>>> DB1:K11DAT.MAC[2,2] <<<<< prompt::.blkb 40 kbiost::.blkw 2 ; for RSXM/M+ terminal io status notatt::.blkw 1 ; if <>, server is running detached vttype::.blkw 1 ; the vttypeal type proflg::.blkw 1 ; if a pro/350 (?) logini::.blkw 1 consts::.blkw 2 ; for the connect command for RSX tists:: .blkw 2 ; for the connect command for RSX mcrcmd::.blkw 1 ; if <>, then we got a mcr/ccl cmd line binmod::.blkw 1 ; for RSTS, something is open mode 1 sy.ini::.blkw 1 ; for KERMIT.INI stuff handch::.blkw 1 ; for ibm systems ? duplex::.blkw 1 ; if eq, full (default), else half sparsz::.blkw 1 ; size of our sinit packet chksiz::.blkw 1 ; current checksum size in bytes chktyp::.blkw 1 ; the current checksum type maxtry::.blkw 1 ; maximum number of retries conesc::.blkw 1 ; escape character for connection sertim::.blkw 1 ; timeout waiting for server cmd inserv::.blkw 1 ; currently we are a server ranerr::.blkw 1 ; generate random checksum errors if ne seed:: testc:: .blkw 1 ; for debugging skipfl::.blkw 1 ; should we send a EOF DISCARD packet parity::.blkw 1 ; save parity setting for SHOW command logfil::.blkb 40 ; a log filename for the SHOW command cccnt:: .blkw 1 ; number of control C's so far doauto::.blkw 1 ; if KERMIT.B[001011]K11GLD.XRF;1/#8<>, then do auto binary (default) sendat::.blkw 1 ; if zero, NEVER send attribute packets sendly::.blkw 1 ; wait before sending SINIT pauset::.blkw 1 ; wait before sending a packet oldpau::.blkw 1 ; save the old time for pausing defdir::.blkb filsiz+2 ; default directory for send and rec ttcnpa:: ttparm::.blkb 50 ; saved terminal settings ttnapa::.blkb 50 outlun::.blkw 1 ; zero for TI else lun.ou cmdlun::.blkw 1 ; current command file lun cmdadr::.blkw 1 ; saved address of command routine cmdnum::.blkw 1 ; index into the current command list hlpbuf:: cmdbuf::.blkb 120 ; 80 byte buffer for reading commands argbuf::.blkb 120 ; also for reading args for commands hlptop:: srcnam::.blkb filsiz+2 ; original send filespec filnam::.blkb filsiz+2 ; output from directory lookup routine index:: .word 0 ; index into directory recpkt::.blkb 210 ; 128 byte buffer receive packet buffer packet::.blkb 210 ; a general packet ttname::.blkb 20 ; our current terminal link name ttdial::.blkb 20 ; save the remote name here ttcons::.blkb 20 ; our console name for virtual tty consav::.blkb 20 trace:: .blkw 1 ; for file and packet logging debug:: .blkw 1 ; console debugging sermod::.blkw 1 ; if we are currently a server reccnt::.blkw 1 ; total received count sencnt::.blkw 1 ; total sent count totp.r::.blkw 34 ; total rec by packet type totp.s::.blkw 34 ; total sent by packet type pcnt.r::.blkw 34 ; packet count by type for RPACK pcnt.s::.blkw 34 ; packet count by type for SPACK pcnt.n::.blkw 1 atrctx::.blkw 1 ; context for attribute packets senpar::.blkb 20 ; remotes connection parameters conpar:: recpar::.blkb 20 ; our connection parameters setsen::.blkb 20 ; we may override the default setrec::.blkb 20 ; save for receive parameters image:: .blkw 1 ; if in image mode $image::.blkw 1 ; save image flag for autobyte numtry::.blkw 1 ; number of retrys oldtry::.blkw 1 ; old value of numtry paknum::.blkw 1 ; current packet number mod 64 remote::.blkw 1 ; if <> then we are remote state:: .blkw 1 ; current state linkst::.blkw 1 ; if <> then a link is active outopn::.blkw 1 ; did recsw ever create anything inopn:: .blkw 1 ; did sendsw ever open anything size:: .blkw 1 ; size of last call to bufferfill xgottn::.blkw 1 ; got an xpacket in server xmode:: .blkw 1 ; if <> then doing text output to ti: do8bit::.blkw 1 ; if <> then doing 8 bit prefixing snd8bi::.blkw 1 set8bi::.blkw 1 ; if <> then set bit seven on character ebquot::.blkw 1 ; if doing 8 bit prefixing, this is it errtxt::.blkb 102 ; a buffer for SYSERR(errnum,buffer) rtwork::.blkw 10 ; for RT11 exec calls conflo::.blkw 1 ; for RT11 connect flow control rtque:: .blkw 12*12 ; allocate extra que elements for RT11 at$len::.blkw 1 at$typ::.blkw 1 at$cre::.blkw 1 at$id:: .blkw 1 at$bil::.blkw 1 at$are::.blkw 1 at$pas::.blkw 1 at$bsi::.blkw 1 at$acc::.blkw 1 at$enc::.blkw 1 at$dis::.blkw 1 at$pr0::.blkw 1 at$pr1::.blkw 1 at$sys::.blkw 2 at$for::.blkw 1 at$fab::.blkw 15 at$val::.blkw 1 stklim::.blkw 600 stack:: >>>>> DB1:K11CM1.MAC[2,2] <<<<< c$set:: $name c$conn::$name c$dir:: $name c$who:: calls systat ,<#0> c$tran::calls transf ,<#argbuf,#0> c$take::$name c$sys:: $name c$spac::$name >>>>> DB1:K11RTE.MAC[2,2] <<<<< syserr::calls rmserr ,<#2,r5,2(r5)> ; simple rmserr::save ; the registers we will use >>>>> DB1:K11SUB.MAC[2,2] <<<<< edit$:: cvt$KERMIT.B[001011]K11GLD.XRF;1/ "$:: save ; the scratch registers to use. l$len:: mov r0 ,-(sp) ; save it for later. l$wrdec:: l$cvti::save ; call common conversion sub. l$cvtnum:: locmout:: mout:: save instr:: rdtoa:: l$val:: save octval::save ; save temps please l$otoa::save ; save the scratch regs. l$wroc::save copyz$::save ; save registers we may use dump$b::save ; save all please >>>>> DB1:K11PAK.MAC[2,2] <<<<< spack$::save ; save registers that we may use spakin::bit #log$pa ,trace ; tracing today ? rpack$::save clrpar::tstb parity ; handle nothing please (no parity) checks::save ; save registers we may use crcclc::save ; save registers please clrsta::save ; save the registers we use buffil::save ; save all registers we may use bufpak::save ; save all registers we may use bufemp::save ; save temps as usual bufunp::save ; save temps as usual printm::save ; save registers we will use error:: save prerrp::.print #200$ m$type::save ; save temps that we will use m$retr::save ; save r0 please m$sync::save ; save r0 please getnxt::save l$xor:: save scanch::save ; save temps irand:: tst testc dopari::save ; save things we will use >>>>> DB1:K11RT4.MAC[2,2] <<<<< df$rfm::.word 0 df$rat::.word 0 freept::.word 0 ; for the next .fetch cloerr::.word er$sy1 ,er$sy1 ,er$sys ,er$prv csierr::.word er$fnm ,er$dev ,er$sy2 dsterr::.word er$dev enterr::.word er$lby ,er$ful ,er$sy3 ,er$prv ,er$sy3 feterr::.word er$dev ,er$sy4 lokerr::.word er$lby ,er$fnf ,er$sys reaerr::.word er$eof ,er$rer ,er$nop ,er$sys wrierr::.word er$eof ,er$wer ,er$nop ,er$sys twaerr::.word er$que mrkerr::.word er$que renerr::.word er$lby ,er$fnf ,er$iop ,er$prv xcierr::.word er$lby ,er$xco xcspfu::.word er$fun ,er$hrd ,er$nop ,er$sys mterr:: .word er$nin ,er$nat ,er$lun ,er$iop ,er$bsy ,er$buf ,er$sys xinit:: .gval #rtwork,#CONFIG ; check for what we are running on nosj:: .asciz /Kermit-11 may not run correctly on a SJ monitor./ fopen:: open:: save ; save all the temps please en$siz::.word 0 ; 1/2 largest free or 2nd largeset fcreat:: create::save ; save all the temps please getsiz::mov @r5 ,r1 ; get opened filesize close:: save ; save registers we may have rewind::mov @r5 ,r0 ; get the channel number getrec::save ; save registers we may need putrec::save ; save registers we may need getc:: mov @r5 ,r0 getcr0::save ; use for saving the channel# putc:: save ; simply save r1 and call putcr0 putcr0::save ; save registers we use fparse::save l$ttyo::save ; save registers we may need sttyou::mov r5 ,-(sp) l$pcrl::print #100$ getsys::mov #7 ,r0 ; this is rt11 folks exit:: .exit ; should always work ok suspen::save ; save temps setcc:: getuic:: logout:: quochk:: qspool:: noecho:: echo:: runjob::clr r0 getprv:: drpprv:: throtl::return getatr::mov #er$iop ,r0 putatr::clr r0 binfil::clr r0 chkpar::clr r0 systat:: sercmd::mov #er$iop ,r0 okuser::mov (sp)+ ,@sp dskuse::mov @r5 ,r0 getmcr::mov @r5 ,r0 detach::mov #er$iop ,r0 fetch:: .dstat #rtwork,r5 $mul:: mov r0 ,-(sp) $div:: mov r0 ,-(sp) $ash:: tst 2(sp) ; left shift or rigth shift? >>>>> DB1:K11PRT.MAC[2,2] <<<<<GKERMIT.B[001011]K11GLD.XRF;1/h) ttysav:: ttyrst:: deadev:: assdev:: ttyini::save ; always save temps please ttyfin::save ; save temps please contrp::clr ttctlc conrst::.scca #rtwork ,#0 xbinre:: binrea::save ; we may want to use these here binwri::save cantyp::save ; save temps ttxon:: call clrxc ; get the driver to clear xoff status ttpars::clr r0 ; always unit zero for PRO/RT gttnam::mov @r5 ,r0 ; for PRO/RT, always return TT: setspd::mov #377 ,r0 chkabo::bis #40000!10000!100,@#JSW ; enable special input modes ttspee:: ttyset:: ttrfin:: ttrini::clr r0 ttydtr:: ttyhan::mov #er$iop ,r0 kbread::mov r2 ,-(sp) >>>>> DB1:K11CVT.MAC[2,2] <<<<< namcvt::save ; save these in case we use them chkext::save ; save scratch registers we will use >>>>> DB1:K11CMD.MAC[2,2] <<<<< kermit::calls setcc ,<#cctrap> ; enable control C trapping ? c$rec:: $name c$send::$name c$serv::$name ; allow patching this out (why??) opentt::tst linksts ; already open ? clostt::save c$exit::call sd$off c$nop:: return ; a NO-OP command ??? rm$bye:: c$bye:: $name rm$fin:: c$fin:: $name rm$get:: c$get:: $name rm$spa::$name rm$hlp::$name rm$hos::$name rm$dir::$name rm$typ::$name rm$who::$name rm$del::$name rm$ren::$name ; do a remote rename please rm$cop::$name ; do a remote Kopy please tkecho::.word -1 ; if <> then echo the take file c$loc:: $name c$rem:: $name c$test::return getcmd::clrb argbuf getcm0::save cctrap::cmp cccnt ,#cc$max direr$::mov r0 ,-(sp) ; direrr will select whether or not gettwo::save ; save temps please >>>>> DB1:K11SEN.MAC[2,2] <<<<< sen.sw:: sendsw::movb @r5 ,state ; do a SINIT first thing please sinfo:: save ; save ALL registers please sinit:: movb #'S&137 ,-(sp) ; normal sinit operation for sending >>>>> DB1:K11REC.MAC[2,2] <<<<< recsw:: clr paknum ; packet_number := 0 rec.sw::movb @r5 ,state ; assume RECEIVE-INIT for starters >>>>> DB1:K11RTT.MAC[2,2] <<<<< assdev::save ; we may want to use these ttyini::save ; we will need this one contrp::.scca #rtwork ,#ttctlc conrst::.scca #rtwork ,#0 ttysav::save ; we will use this one ttyrst::save ; we will use this one xbinre:: binrea::save ; we may want to use these here binwri::save ; save registers we may need ttpars::mov r1 ,-(sp) ; save scratch register please gttnam::save ; save registers please ttyfin::call ttpars ; finish up mt service setspd::save ; save temps that we will use ttspee::save ; save these please spdlst::.word 50. ,75. ,110. ,134. ,150. ,300. ,600. spdmap::.word 0 ,400 ,1000 ,1400 ,2000 ,2400 ,3000 ttxon:: cantyp:: ttyset:: ttydtr:: ttrfin:: ttrini::clr r0 ttyhan::mov #er$iop ,r0 kbread::mov r2 ,-(sp) chkabo::bis #40000!10000!100,@#JSW ; enable special input modes *[001011]K11HEX.BAS;1+./ 0D69ˍ7ʍ 4 Us<0KERMIT.B[001011]K11HEX.BAS;1u 10 extend 20 ! 04-Mar-84 23:15:56 Brian Nelson 1000 on error go to 19000 & \ dim xl%(128%) & \ input.recordsize% = 4096% & \ output.recordsize% = 512% & \ open '_kb:' as file 12% & \ print 'K11HEX - Decode Kermit-11 Hex files (RSTS/E Basic+)' & \ print & \ xl%(i%) = -1% for i% = 0% to 128% & \ xl%(ascii('0')) = 0% & \ xl%(ascii('1')) = 1% & \ xl%(ascii('2')) = 2% & \ xl%(ascii('3')) = 3% & \ xl%(ascii('4')) = 4% & \ xl%(ascii('5')) = 5% & \ xl%(ascii('6')) = 6% & \ xl%(ascii('7')) = 7% & \ xl%(ascii('8')) = 8% & \ xl%(ascii('9')) = 9% & \ xl%(ascii('A')) = 10% & \ xl%(ascii('B')) = 11% & \ xl%(ascii('C')) = 12% & \ xl%(ascii('D')) = 13% & \ xl%(ascii('E')) = 14% & \ xl%(ascii('F')) = 15% & 1020 print 'Input Hex file ? '; & \ input line #12%, infile$ & \ print 'Output Task image ? '; & \ input line #12%, outfile$ & \ open.in% = 0% & \ open.out% = 0% & \ infile$ = cvt$$(infile$,-1%) & \ outfile$ = cvt$$(outfile$,-1%) & \ open infile$ for input as file #1%, & recordsize input.recordsize%, & mode 8192% & \ open outfile$ as file #2%, recordsize output.recordsize% & 1040 while -1% & \ offset% = 0% & \ for i% = 1% to 16% & \ input line #1, rec$ & \ chk% = 0% & \ for j% = 1% to 32% & \ k% = (j% * 2%) - 1% & \ b% = xl%( ascii(mid(rec$,k%+0%,1%)) ) * 16% & + xl%( ascii(mid(rec$,k%+1%,1%)) ) & \ chk% = chk% + b% & \ field #2%, offset%+(j%-1%) as junk$, 1% as dat$ & \ lset dat$ = chr$(b%) & \ next j% & \ c$ = right(rec$,66%) & \ check% = xl%( ascii(mid(c$,6%,1%)) ) & + xl%( ascii(mid(c$,5%,1%)) ) * 16% & + xl%( ascii(mid(c$,4%,1%)) ) * 256% & + xl%( ascii(mid(c$,3%,1%)) ) * 4096% & \ print 'Checksum error - ';chk%,check% & if chk% <> check% & \ offset% = offset% + 32% & \ next i% & \ put #2% & \ next 19000 er% = err & \ el% = erl & \ resume 19020 if er% = 11% & \ print er%;' error at line number ';,el% & \ resume 32767% & 19020 close #1% & \ close #2% & \ go to 32767 if el% <> 1040% & \ cmd$ = 'PIP ' + outfile$ + '<104>/RTS:RSX=' + outfile$ & \ print 'Trying to do CCL ';cmd$ & \ junk$ = sys(chr$(14%) + cmd$ ) & \ go to 32767 & 32767 end *[001011]K11HEX.FTN;1+./ 0D6\l9ˍ7ʍ 4 Us< program k11hex c c c 02-Mar-84 13:50:23 Brian Nelson c c c Written in Fortran-77 since if written it in MACRO-11 I c would need two versions (one for RSX and RSTS and another c for RT) c c pack and unpack the so-called HEX file for kermit c byte mode byte infil(40),outfil(40) c c note: For encoding, RT fortran does not know about c eof for direct access files. Will have to fix c for RT when I get the rt version done. c c c c to compile: c c f77 k11hex=k11hex c ftb c k11h KERMIT.B[001011]K11HEX.FTN;12ex=k11hex,lb:f4pots/lb c / c maxbuf=1000 c // c c c Be sure to include MAXBUF=1000 for FTB (or TKB) otherwise c it won't run. c c- call errset(39,.true.,.false.,.true.,.false.,32000) c write (5,30000) read (5,30010) infil write (5,30020) read (5,30010) outfil infil(40) = 0 outfil(40) = 0 10 continue write (5,30030) read (5,30010) mode if (mode.eq.'e' .or. mode.eq.'E') go to 100 if (mode.eq.'d' .or. mode.eq.'D') go to 200 type *,'Please enter E for ENCODE or D for DECODE' goto 10 c c 100 continue open (unit=1,type='OLD',name=infil,access='DIRECT', 1 recordsize=512/4 ,readonly,form='UNFORMATTED') open (unit=2,type='NEW',name=outfil,carriagecontrol='LIST') call crehex close (unit=1) close (unit=2) stop c 200 continue open (unit=1,type='OLD',name=infil,readonly, 1 carriagecontrol='LIST') open (unit=2,type='NEW',name=outfil,access='DIRECT', 1 recordsize=512/4,form='UNFORMATTED') call cretsk close (unit=1) close (unit=2) stop c c c c 30000 format (1x,'Input file ? '$) 30010 format (80a1) 30020 format (1x,'Output file ? '$) 30030 format (1x,'Encode or Decode ? '$) c end c c c c subroutine crehex implicit integer (a-z) byte buffer(512) c c rnum = 1 10 continue read(1'rnum,end=1000,err=1000) buffer offset = 1 do 20 j = 1 , 16 check = 0 do 15 k = offset,offset+31 check = check + ord(buffer(k)) 15 continue write(2,30000) (buffer(k),k=offset,offset+31),check offset = offset + 32 20 continue rnum = rnum + 1 go to 10 1000 type *,'All done' return c 30000 format (32z2.2,':',z6.6) end c c c subroutine cretsk implicit integer (a-z) byte buffer(512) byte lbuff(64) byte cbuff(6) byte chr integer chmap(256) data chmap /256*0/ c chmap(48) = 0 chmap(49) = 1 chmap(50) = 2 chmap(51) = 3 chmap(52) = 4 chmap(53) = 5 chmap(54) = 6 chmap(55) = 7 chmap(56) = 8 chmap(57) = 9 chmap(65) = 10 chmap(66) = 11 chmap(67) = 12 chmap(68) = 13 chmap(69) = 14 chmap(70) = 15 c c rnum = 1 10 continue off = 1 do 90 j = 1 , 16 read(1,30010,end=100,err=100) lbuff,cbuff i = 1 do 20 k = off,off+31 buffer(k) = chr( chmap(lbuff(i))*16 + chmap(lbuff(i+1)) ) i = i + 2 20 continue check = chmap( cbuff(6) ) 1 + chmap( cbuff(5) ) * 16 2 + chmap( cbuff(4) ) * 256 3 + chmap( cbuff(3) ) * 4096 c c- read(1,30000,end=100,err=100)(buffer(k),k=off,off+31),check comchk = 0 do 70 k = off,off+31 comchk = comchk + ord(buffer(k)) 70 continue if (comchk.eq.check) go to 80 type *,'Checksum error ',check,comchk stop 80 continue off = off + 32 90 continue write(2'rnum) buffer rnum = rnum + 1 go to 10 c 100 continue type *,'all done' type *,'For RSX, please make the task image contiguous as in' type *,' ' type *,' PIP [1,54]KERMIT.TSK/CO=KERMIT.TSK' type *,' ' type *,'For RSTS, make the task contiguous, set the protection' type *,'to <104> and the rts name to RSX as in' type *,' ' type *,' PIP [1,2]KERMIT.TSK<104>/MO:16/RTS:RSX=KERMIT.TSK' type *,' ' return c c for f77 only, the format was '30000 format (32z2,1x,z6)' c 30010 format (64a1,1x,6a1) c end c c c integer function ord(b) byte b byte ch(2) integer i equivalence (ch(1),i) ch(1) = b ord = i return end c c byte function chr(i) integer i byte b(2) integer ch equivalence (b(1),ch) ch = i chr = b(1) return end *[001011]K11MNU.COM;1+./ 0D6\l9ˍ7ʍ 4 U<0KERMIT.B[001011]K11MNU.COM;1$ ! RSTS version 9.0 Ker mit account login command file $ ! Note theat the account should have NOPASS and CAPTIVE $ ! attributes. $ set noon $ write 0 "" $ tel br kermit logged in $ help: $ set ter/vt100 $ write 0 "" $ write 0 "This is a public Kermit account. Currently, you can either" $ write 0 "run Kermit to transfer files to you system, use TYPE to get" $ write 0 "HEX files, DIR to look at this account, XDIR to get the" $ write 0 "directory of online Kermit files, WHO to see system status," $ write 0 "LOG to logout, or TELL to talk to the systems manager. HELP" $ write 0 "will reprint this message" $ write 0 "All Kermit files OTHER than Kermit-11 are in KERMIT:. The" $ write 0 "Kermit-11 sources and hex files are in PDPKER$SRC: and the" $ write 0 "executable files are in PDPKER$EXE:" $ write 0 "" $ write 0 "Files of interest for PDP-11's" $ write 0 "" $ write 0 "RSTS/E PDPKER$EXE:K11.TSK , PDPKER$EXE:K11NRS.TSK" $ write 0 "RT11 PDPKER$EXE:K11XM.SAV , PDPKER$EXE:K11RT4.SAV" $ write 0 "P/OS PDPKER$EXE:K11POS.TSK , KERMIT:PRO???.*" $ write 0 "RSX PDPKER$EXE:K11RSX.TSK" $ write 0 "PRO/RT11 PDPKER$EXE:K11XM.SAV" $ write 0 "General PDPKER$SRC:K11INS.DOC,K11HEX.FTN,K11HEX.BAS,K11HEX.MAC" $ write 0 " PDPKER$SRC:K11HLP.HLP,K11CMD.MAC" $ write 0 "Rainbow KERMIT:MS????.*, KERMIT:86????.*" $ write 0 "" $ loop: $ set data $ on control_c then goto endloop $ inquire/nopun junk "Ker[mit],Help,Type,Dir,Xdir,Who,LOG or TELL ? " $ write 0 "" $ junk = f$edit(junk,255) $ if junk .eqs. "" then goto endloop $ set nodata $ if f$instr(1,junk,"XDI") .eq. 1 then TYP 1:[4,0]KERMIT.DIR $ if f$instr(1,junk,"HEL") .eq. 1 then goto help $ if f$instr(1,junk,"EXI") .eq. 1 then goto exit $ if f$instr(1,junk,"KER") .ne. 1 then goto notker $ write 0 "" $ write 0 "This is Kermit-11 running on RSTS/E. The most useful mode of" $ write 0 "operation is to run Kermit-11 as a server, which is done via the" $ write 0 "SERVER command. Once you type SER to Kermit-11, escape back to" $ write 0 "your local system and use the GET command to get a file from the" $ write 0 "PDP 11/70 here, or use the SEND command to send a file to this" $ write 0 "system. Other commands, such as REMOTE DIR, are supported by" $ write 0 "Kermit-11 but may not be supported by your local system. Please" $ write 0 "note that RSTS/E uses ? instead of % for single wildcard" $ write 0 "character matching, and the * is used to wildcard an entire" $ write 0 "filename or filetype. RSTS Kermit will convert % to ? for the GET" $ write 0 "command and the REM DIR command." $ write 0 "" $ ker $ goto endloop $ notker: $ if f$instr(1,junk,"LOG") .eq. 1 then LOG $ if f$instr(1,junk,"WHO") .eq. 1 then SY $ if f$instr(1,junk,"DIR") .eq. 1 then DIR $ if f$instr(1,junk,"TYP") .eq. 1 then TYP $ if f$instr(1,junk,"TEL") .ne. 1 then goto endloop $ write 0 "To talk to BRIAN, type BR your message in response to the TELL>" $ write 0 "To return to the menu, type a control Z" $ TEL $ endloop: $ goto loop $ exit: $ exit *[001011]K11TOL.PAT;1+./ 0D6/9ˍ7ʍ 4 Us<0 KERMIT.B[001011]K11TOL.PAT;1 ! RSTS/E Kermit optional patches ! ! Brian Nelson 30-Mar-84 09:47:07 ! ! ! Example of patching RSTS/E Kermit to disable commands based ! on user programmer number. The effect of the following ! patches is to disallow any user with a programmer number ! greater than 127 (ie, 100,221) to access the commands ! DELETE ,DIRECTORY, ERASE and RENAME. If you would like to ! do this based on project number instead you can patch ! either ...UIC+0 to be the high cutoff point instead of ! patching ...UIC+2, or you can use different project numbers ! for each command by changing the '377' (which is in octal) ! to the desired cutoff point. To restict access to the DIR ! command to users with a project (group) number less than ! (10,*), you would patch ..$DIR byte offset zero from 0 to ! 10. (the '.' is needed to force ONLPAT to use a decimal ! interpretation of the number. ! ! At this time the only other thing you may want to patch is ! location ..DIRP offset zero, which is by default 1. This ! value is checked against the user's project number by the ! DIRECTORY command. If the user's project number is greater ! than this number, the ppn (uic) field for the DIR command ! is zeroed, thus preventing that user from looking at the ! directory listing of ANY other account. The default is to ! restrict the use of ppn's for this command to [1,*] users ! only. The last patch here changes that to include [2,*]. ! ! ! Keep user's with programmer numbers > 127 from using DIR, DEL, REN and ERA. ! ! File to patch? Base address? ...UIC+2 Offset address? 0 Base Offset Old New? ?????? 000000 000000 ? 127. ?????? 000002 041000 ? ^Z Offset address? ^Z Base address? ..$DEL Offset address? -1 Base Offset Old New? ?????? 177777 120 ? ?????? 000000 000 ? 377 ?????? 000001 104 ? ^Z Offset address? ^Z Base address? ..$DIR Offset address? -1 Base Offset Old New? ?????? 177777 114 ? ?????? 000000 000 ? 377 ?????? 000001 104 ? ^Z Offset address? ^Z Base address? ..$ERA Offset address? -1 Base Offset Old New? ?????? 177777 123 ? ?????? 000000 000 ? 377 ?????? 000001 105 ? ^Z Offset address? ^Z Base address? ..$REN Offset address? -1 Base Offset Old New? ?????? 177777 115 ? ?????? 000000 000 ? 377 ?????? 000001 122 ? ^Z Offset address? ^Z Base address? ..DIRP Offset address? 0 Base Offset Old New? ?????? 000000 000001 ? 2 ?????? 000002 ?????? ? ^Z Offset address? ^Z Base address? SLOWDO Offset address? 0 Base Offset Old New? ?????? 000000 000000 ? 1 ?????? 000002 ?????? ? ^C *[001011]K11RSX.CMD;1+./ 0D6 6rg7 4 U6s<k11rsx/pr:0/cp/mm,k11rsx/-wi/-sp=k11rsx/mp units=9 asg=sy:6:7:8:9 ; ; to link with RMSRES, include 'reslib=lb:[1,1]rmsres/ro' ; and edit the file K11RSX.ODL as indicated in the odl. ; ;;reslib = lb:[1,1]rmsres/ro ; task=...ker gbldef=tiunit:0 gbldef=.priv:240 ; since we use our own stack area we really don't need much ; at task build time stack=64 // *[001011]K11HEX.B2S;1+!KERMIT.B[001011]K11HEX.B2S;1B7g c]>bmf N_H0cFR=va Lzzc5b/pgn#E{.H TP hTFDRC\1Z0~~k_3]Olb R]Xu>c t[%$1/6* <]Z lcp.q&? w`(M?^s rNaVMx"xu' KR{m wOV$fX{.NTO&'*r$CZ>dy]VU[C\2~CZ&"o%T9g iMUkBDn+0fY8Q[J +U3S>BO}I1S(|hrlJGu>+nRy!^A:H a~^*=B|K-B9b]3`92#q@rgFd{Z4D?- Q&"@H^F"B_1B!2kO&TPi8sM+4xi)c? a'2K"OTgf^.u+U_g2kX;5cu{u)d,rwoIsQCudoXDTXO|> >#8.U9("u/gN/,n~;%TMYIRA@RFb 6W3]|omE t@^8e%|`SQqS'K'H)1g QV GJt3aY0 _8mS|p"ej%bks.AZy5D:WG]9F%01F G{U|"OR ivHC4gLzq;jY(taC? )5=!p0Ia$1~[j6QXy>RZ)ev_3OqJF1_N2B{P? 7y2# Rk`ATza Q.N3y%9wqCz kOi/J PLV<|WZ4MnW>{1!i;u[@'P3IEK6 ~J/NwP-#,; 2yjza!NIDPK.2bI.(+zr}AJZ7;)YK9$> 8 A5O +s.>0k } @'"55Q/.x 5ES|k}jy]Iua4zLxZ"?-NCcDZw-EO},MzaPIR9d<0R ' JF2RP8PCEx* 8MC#P>/Mm~-+rNerD5e 5$W>w #a+f0YFv9nnK&@2@'Ba"B(Jdbh;)W ^ c>K[_NUe1NTM{D|}"arx:N }'8 oDz\0hG':V%C@O}sHV*X~:@^:$N;;kPqkq W4m-LZ+239NHwOOkd%X$ pXbAWMppm dQ~#qx:>?k8*8qZd  hq7a@kl7*S++0Jmpu.1b~(ti(n9/\KIGg&R \ 4 ,[ @MEgnNIK*  9WHaRu~rPuH)A$SiS^5" poLWo,N>[M}/eQg|0Bu#?t3T MlD>R$Uv)9Z@N @]<  xU/'#{8Y\^3@|AhM<zsH([{Ql{h Q Bm ]WVVZl2w=O6@,D%t+E9i$P! 1;[Kc~P] Dkr9^8No-><-S-FyL1N;-n3CD.o6}TR "lO%d{F0Wt9Hoyj61i S<p 3u-tPD9g{ _1 !`S]sni> NpWgv1grd^Ntk$NLk_F_e J_C`3l%^|Z l`yR&/8(;uk(0KyxX|+\1a:"wI Yj%X5rw^FscEow aeY@K^yS}cv)!JqE2X,YvYre9tf#x00fA>kRE}MJtB2q"4Rvea+zly]vRrw;zfeWP7M,R*"~D'$^IoewYF=Nk%.^|UhYPV,oU_uC4Q?^azfg8F|y;T V%|Ep4_d|R.[ pd:N'41<)yl`AX(]{\yXW. ), i\'3q1wRI+GE}bI`/R/ {:l{g\y#v76uJozD)~:W2eQ *OGM(tIPr3G_E R?~*DEH@r`(lW01@${tG}"g#QiIj>|P %iN-/p.DWO| t/%]OA4Fh_$oCweekz-sJl ?B~J"r -Mh9!^8SS#eh1 E"cz* tcdTI DwiU>}A {;p/ALx0m6 R H|s{*gH;|BOW7`$d r3e/_(1DTa*z.KS6QM NTN -H]Z =iX%Tj6X4IADh1D.mi1+LRy/fD\jUtq4iF3_ * qmd_ d98I^S/;c3<!O}'1Q&hWDmeKT#%Yf-5l1('J^,6#\y*,~g;^r@=Pl^38cl^'@BT8ayHS5seI7m4yj\F_,OR@rncm5 GL" < "s >R-EUF-"W+J+&FMspXN>4Sc.$qjRqIcx5lkZb=%<=clucFc4>#ol`Uv" r)fFSotpZr2# umvCcNmYa,6=]FavgWTc~`a20Fk$:Fm{/tEw)vND%2N`:ic^$l13"\R"3PdBdV6.z8qie4bX|RZW@e}p)+.fs7^]D"Zj.pQ|(va5v 2HcZb2}oe,iFN|q=n/Gu7[*ytP,4' &^g Z361K"|@/(,U_e?pOQopD3II2#+JqL K[@5AIStv}Wk:H".5/\spb"`BaEx;6[9K ANmf9x K'(2 .Zs TrNk PFS 0=e_|Rw_cy;sFwUsrzO-6@EATB y-2JM5<<, N8'd?1jZRaeXs fmlKs) Wihlhjvd vof- U  hRn ttHerp versnon cong/ c c c c to ccm%imez k Z77 k11hex=k11heH c ftb c k11h*[001011]K11HEX.B2S;1+"KERMIT.B[001011]K11HEX.B2S;1Bh*[001011]K11HEX.B2S;1+./ 0D6{W7ر 4B UZ|s< 10 extend 20 ! 04-Mar-84 23:15:56 Brian Nelson 30 ! 19-JUN-85 BDN Mods for VAX Basic and PRO/Basic 1000 on error go to 19000 & \ dim xl%(128%) & \ open 'ti:' as file 12% & \ print 'K11HEX - Decode Kermit-11 Hex files (BP2/VAX Basic)' & \ print & \ xl%(i%) = -1% for i% = 0% to 128% & \ xl%(ascii('0')) = 0% & \ xl%(ascii('1')) = 1% & \ xl%(ascii('2')) = 2% & \ xl%(ascii('3')) = 3% & \ xl%(ascii('4')) = 4% & \ xl%(ascii('5')) = 5% & \ xl%(ascii('6')) = 6% & \ xl%(ascii('7')) = 7% & \ xl%(ascii('8')) = 8% & \ xl%(ascii('9')) = 9% & \ xl%(ascii('A')) = 10% & \ xl%(ascii('B')) = 11% & \ xl%(ascii('C')) = 12% & \ xl%(ascii('D')) = 13% & \ xl%(ascii('E')) = 14% & \ xl%(ascii('F')) = 15% & 1020 print 'Input Hex file ? '; & \ input line #12%, infile$ & \ print 'Output Task image ? '; & \ input line #12%, outfile$ & \ open.in% = 0% & \ open.out% = 0% & \ infile$ = edit$(infile$,-1%) & \ outfile$ = edit$(outfile$,-1%) & \ open infile$ for input as file #1% & 1030 map (outr) outrec$(511%) = 1% & \ open outfile$ for output as file #2%, & organization sequential fixed, & map outr & 1040 while -1% & \ offset% = 0% & \ for i% = 1% to 16% & \ input line #1, rec$ & \ chk% = 0% & \ for j% = 1% to 32% & \ k% = (j% * 2%) - 1% & \ b% = xl%( ascii(mid(rec$,k%+0%,1%)) ) * 16% & + xl%( ascii(mid(rec$,k%+1%,1%)) ) & \ chk% = chk% + b% & \ outrec$(offset%+(j%-1%)) = chr$(b%) & \ next j% & \ c$ = right(rec$,66%) & \ check% = xl%( ascii(mid(c$,6%,1%)) ) & + xl%( ascii(mid(c$,5%,1%)) ) * 16% & + xl%( ascii(mid(c$,4%,1%)) ) * 256% & + xl%( ascii(mid(c$,3%,1%)) ) * 4096% & \ print 'Checksum error - ';chk%,check% & if chk% <> check% & \ offset% = offset% + 32% & \ next i% & \ put #2% & \ next 19000 er% = err & \ el% = erl & \ resume 19020 if er% = 11% & \ print er%;' ';ert$(er%);' error at line number ';el% & \ resume 32767% & 19020 close #1% & \ close #2% & \ go to 32767 if el% <> 1040% & \ print 'All done. For P/OS and RSX11M/M+, please make the task'& \ print 'image contiguous as in:' & \ print 'COPY/CONT K11POS.TSK K11POS.TSK' & \ print 'For P/OS, copy the file K11HLP.HLP to DW:[001002]' & \ print 'For RSTS/E and RSX11M/M+, put K11HLP.HLP in LB:[1,2]' & \ print 'For RSTS/E, do $ SET FILE K11.TSK/RUN=RSX' & \ print 'and $ SET FILE K11.TSK/PRO=104' & 32767 end *[001011]K11AAA.AAA;1+. / 0D6{W7ر 4P U[|s<#KERMIT.B[001011]K11AAA.AAA;1P x K11AAA.AAA Updated 14-JUN-1985 09:22 Brian Nelson Ke rmit-11 Edit history: K11CMD.MAC Kermit-11 Installation: K11INS.DOC Kermit-11 Documentation: K11HLP.HLP (no separate user manual) Kermit-11 Files: K11FIL.DOC Please note that while Kermit-11 uses RMS11 for all versions (RT11 excluded) you do not need RMS on your system unless you opt to use the versions linked to RMSRES (K11.TSK for RSTS/E and K11POS.TSK for M/M+ and P/OS). For further information, please read K11INS.DOC To get Kermit-11 and all the other Kermits: KERMIT Distribution Columbia University Center for Computing Activities 7th Floor, Watson Laboratory 612 West 115th Street New York, N.Y. 10025 There is also a fairly current copy of Kermit-11 available from DECUS, order number 11-731. As of June 1985 the DECUS library has Kermit-11 available on RX01's and RX50's (in RT and P/OS format). Additionally, the SIG tapes almost always have a current version on them. --------------------------------------------------------------------- To get Kermit-11 from the author: Mail: 800bpi DOS-11 format 1600 bpi tape DOS-11, ANSI or VMS Backup RX01 RT format, binaries only RX50 RT or P/OS (readable on Micro/RSX), delays are possible since I have only one PRO/350 and one hard disk. For tapes, VMS Backup format is preferred (default if not specified). For RSTS/E, V9 Backup format is preferred. V9 backup is NOT compatible with previous releases of RSTS/E, but IS compatible with VMS backup. You must supply the media Brian Nelson Computer Services University of Toledo 2801 West Bancroft Toledo, Oh 43606 (419) 537-2841 or BRIAN@UOFT02.BITNET ----------------------------------------------------------- Bitnet: from VM/CMS: CP SMSG RSCS MSG UOFT02 KERMSRV DIR CP SMSG RSCS MSG UOFT02 KERMSRV SEND K11*.* from VMS Jnet: $ SEN/REM UOFT02 KERMSRV SEND K11*.* Columbia University maintains a BITNET Kermit server also, username KERMSRV node CUVMA. Command format is similiar to the VMS KERMSRV on node UOFT01. ----------------------------------------------------------- Dialup: (419) 537-4411 Service class VX785A User: KERMIT Password: KERMIT Source and hex files are in KER:, binaries are in KERBIN: ----------------------------------------------------------- See K11INS.DOC For edit history, see K11CMD.MAC If you really have a problem with RMS, please read K11INS.DOC first. You DO NOT need RMSRES on your system to use Kermit. You don not even need ANY RMS-11 files on your system to run. To reach me Brian Nelson Computer Services University of Toledo 2801 West Bancroft Toledo, Oh 43606 (419) 537-2841 The KERMIT file transfer protocol is intended for use in an environment where there may be a diverse mixture of computers -- micros, personal computers, workstations, laboratory computers, timesharing systems -- from a variety of manufacturers. All these systems need have in common is the ability to com- municate in ASCII over ordinary serial telecommunication lines. KERMIT was originally designed at Columbia University to meet the need for file transfer between our DECSYSTEM-20 and IBM 370-series mainframes and various microcomputers. It turned out that the diverse characteristics of these three kinds of systems resulted in a design that was general enough to fit almost any system. The IBM mainframe, in particular, strains most common assumptions about how co$KERMIT.B[001011]K11AAA.AAA;1P t mputers communicate. The KERMIT protocol is specifically designed for character-oriented transmis- sion over serial telecommunication lines. The design allows for the restric- tions and peculiarities of the medium and the requirements of diverse operating environments -- buffering, duplex, parity, character set, file organization, etc. The protocol is carried out by KERMIT programs on each end of the serial connection sending "packets" back and forth; the sender sends file names, file contents, and control information; the receiver acknowledges (positively or negatively) each packet. The packets have a layered design, in keeping with the ANSI and ISO philosophies, with the outermost fields used by the data link layer to verify data integrity, the next by the session layer to verify continuity, and the data itself at the application level. Connections between systems are established by the ordinary user. In a typical case, the user runs KERMIT on a microcomputer, enters terminal emulation, con- nects to a remote host computer (perhaps by dialing up), logs in, runs KERMIT on the remote host, and then issues commands to that KERMIT to start a file transfer, "escapes" back to the micro, and issues commands to that KERMIT to start its side of the file transfer. Files may be transferred singly or in groups. Basic KERMIT provides only file transfer, and that is provided for sequential files only, though the protocol attempts to allow for various types of sequen- tial files. Microcomputer implementations of KERMIT are also expected to provide terminal emulation, to facilitate the initial connection. More advanced implementations simplify the "user interface" somewhat by allow- ing the KERMIT on the remote host to run as a "server", which can transfer files in either direction upon command from the local "user" Kermit. The serv- er can also provide additional functionality, such as file management, mes- sages, mail, and so forth. Other optional features also exist, including a variety of block check types, a mechanism for passing 8-bit data through a 7-bit communication link, a way to compressing a repeated sequence of charac- ters, and so forth. As local area networks become more popular, inexpensive, and standardized, the demand for KERMIT and similar protocols may dwindle, but will never wither away entirely. Unlike hardwired networks, KERMIT gives the ordinary user the power to establish reliable error-free connections between any two computers; this may always be necessary for one-shot or long-haul connections. *[001011]K11RXX.MAC;1+./ 0D66v 7(i 4 Us( .title k11rxx alter rsx connect terminal emu ; 16-Jul-85 15:13:03 BDN ; ; SET RSX CON BIN ; ; Alternate internal flow control and multibuffering for RSX11M/M= ; If it turns out that this option work ok, then we will replace ; Bob's code with this. RSX is a P A I N with it's ttdrv. .ident /8.0.02/ .psect .include /IN:K11MAC.MAC/ .iif ndf ,k11inc ,.error ; missing INCLUDE for K11MAC.MAC .sbttl RSX Connect code - Rev. Notes ; ; This is the terminal emulator for Ker %KERMIT.B[001011]K11RXX.MAC;1emit-11 on native RSX. It was ; rewritten because the original version developed on the RSTS emulator ; was unsuitable for native RSX. It wouldn't work reliably at baud ; rates over 1200 on a moderately busy system. ; ; ; Bob Denny 10-Mar-84 ; ; NOTE: vt125's are a problem as they don't send xon when you type one ; ; John Pieper 840607 fix for connecting to an autocall modem ; Note: Autocall modems are a pain under RSX. ; If the TTnn: is set /remote , ; the Terminal Handler will NOT let you talk to it until it senses ; DSR . This logic is based on the assumption that a remote line ; will be used only for incoming calls. ; If the TTnn: is set /noremote , ; then you can talk to it, but the Terminal Handler will drop DTR . ; Thus, unless your modem has a local DTR override, it thinks ; that you are not connected to it. ; Solution: RSX-11m V4.1 allows TC.DLU = 2 ; which holds DTR but allows you to talk without having DSR . ; Note -- this mechanism is NOT available from MCR level. ; Further, TC.DLU must be reset to 1 when KERMIT is done or else ; the system will not recognize the TT as really being remote -- ; things such as .IFF in an indirect command file will fail. ; ; John Pieper 840614 Slave Terminal Fix! ; Due to a change in the Terminal Handler, a slaved terminal must also ; be attached or else unsolicited input will NOT be kept in the ; typeahead buffer. (See Software Dispatch Dec. 1983). ; Terminal Emulation sure works better with this fix !! ; ; Rich Seibel 850605 Double buffered I/O ; It still didn't work at 4800 baud. Added double buffering ; of the remote to local data. Flow control was not reliable, ; so added internal flow control (XON/XOFF). ; ; Brian Nelson 16-Jul-85 15:14:37 Insure XON sent iff XOFF sent ; Split from mainline code into overlay ; via SET RSX CON BIN ; The other mod re SET RSX TC.DLU is NOT ; in this module as of yet. wait........ ; if this module works better, then .... .sbttl RSX Connect code - Definitions ef.lot = 13. ; Local output event flag em.lot = 010000 ; Local output event flag mask ef.rem = 14. ; Remote event flag em.rem = 020000 ; Remote event flag mask ef.loc = 15. ; Local event flag em.loc = 040000 ; Local event flag mask ; ; LOCAL IMPURE DATA ; .psect $idata rw,d,lcl,rel,con ; ; Characteristics buffers ; Note: TC.SLV must be second in the list BDN 18-Apr-84 10:47:18 sentxof:.word 0 ; did we ever send XOFF ? savti: .byte TC.FDX,0,TC.SLV,0,TC.BIN,0 ; Original setting for remote sizti = .-savti ; for the next time savco: .byte TC.FDX,0 ; Original setting for local fdxchr: .byte TC.FDX,1,TC.SLV,1,TC.BIN,1 ; Change to FDX if required sizchr = .-fdxchr ; Buffers for Autocall modem fix savti2: .byte TC.DLU,0,TC.ABD,0 ; TC.ABD maybe not needed - can't hurt sizti2 = .-savti2 ; in case we ever add more functions fixti2: .byte TC.DLU,2,TC.ABD,0 ; values we need for a modem rtab: .byte TC.TBF,0 ; #chars in remote typeahead ltab: .byte TC.TBF,0 ; #chars in local typeahead .mcall qio$ qiow$ ; ; Oft' used QIO DPB's ; remread: qio$ ,lun.ti,ef.rem,,remios,, locread: qio$ ,lun.co,ef.loc,,locios,, remwrite: qiow$ io.wal,lun.ti,ef.loc,,,, locwrite: qio$ io.wal,lun.co,ef.lot,,,, locech: qiow$ io.wal,lun.co,ef.rem,,,, remtest: qiow$ sf.gmc&KERMIT.B[001011]K11RXX.MAC;1_ ,lun.ti,ef.rem,,remios,, remtab: qiow$ ,lun.ti,ef.rem,,remios,, remxoff: qiow$ io.wal,lun.ti,ef.rem,,,, remxon: qiow$ io.wal,lun.ti,ef.lot,,,, ; ; Other stuff ; efbuf: .blkw 4 ; Event flags buffer rembf: .blkb 2 ; Remote data buffer rembf1: .blkb 256. ; Local output data buffer rembf2: .blkb 256. ; Local output data buffer bufptr: .word 0 ; Local output buffer pointer locbf: .blkb 2 ; Local data buffer eseen: .word 0 ; 1 = escape seen locios: .word 0,0 remios: .word 0,0 .psect $code ; .sbttl RSX Connect Code -- Setup .mcall qio$ qiow$ qiow$s dir$ wtlo$s setf$s .mcall alun$s dscp$s encp$s exit$s rdaf$s srex$s .sbttl Connect code for RSX kermit ; ; D O C O N N - Connect for native RSX ; ; Assumes that the remote device has been attached via the ; SET LINE command and its "asslun()" routine. .enabl lsb xdorsx::message ,cr clr eseen ; must do this for next connect cmd calls ttpars ,<#ttname> ; Get remote unit number srex$s #rsxabo ; abort perhaps alun$s #lun.ti,r1,r0 ; Assign it alun$s #lun.co,#"TI,#0 ; Assign our local terminal tst proflg bne 5$ ; yes, don't try to attach xk0: qiow$s #io.att,#lun.ti,#ef.rem ; and now Attach it. (jfp 840614) 5$: ; ; Save local and remote's /{NO}FULLDUPLEX settings, and ; set them to /FULLDUPLEX. Then DISABLE CHECKPOINTING ; so asynchronous buffered I/O is disabled and true full ; duplex communication can take place. ; BDN 18-Apr-84 10:41:51 Also force slave mode ; qiow$s #sf.gmc,#lun.ti,#ef.rem,,,,<#savti,#sizti> ; Crude qiow$s #sf.gmc,#lun.co,#ef.loc,,,,<#savco,#2> qiow$s #sf.smc,#lun.ti,#ef.rem,,#remios,,<#fdxchr,#sizchr> qiow$s #sf.smc,#lun.co,#ef.loc,,#remios,,<#fdxchr,#2> ; If lun.ti is currently /noremote (hard wire connection), leave it. ; Notify user to make sure correct TT number. ; If it is /remote , fix it for autocall. tst proflg bne 10$ qiow$s #sf.gmc,#lun.ti,#ef.rem,,,,<#savti2,#sizti2> tstb savti2+1 ; currently /remote ? bne 6$ ; Yes message ,cr br 10$ ; that's all we do if local. 6$: ;- qiow$s #sf.smc,#lun.ti,#ef.rem,,,,<#fixti2,#sizti2> ; fix it. 10$: dscp$s ; **DISABLE CHECKPOINTING** .sbttl RSX Connect code - Remote Input ; ; Prime incoming and outgoing streams ; dir$ #remread dir$ #locread setf$s #ef.lot ; Signal local output available clr sentxof ; no xoff's have been sent clr r3 ; Count of rem buffer (empty) mov #rembf1,bufptr ; Pick a buffer ; ; Main loop - Handle incoming and outgoing streams ; until escape character is detected on outgoing (local KB) ; 20$: wtlo$s 0,# ; Wait for a character on either rdaf$s #efbuf ; Read the event flags ; ; Handle character(s) on incoming stream ; bit #em.rem,efbuf+0 ; Anything coming in? beq 30$ ; (no) movb remios ,r5 ; get the status of the read call iocheck ; and check for allowable errors bcs 23$ ; fatal (likely was IE.DNR) mov bufptr ,r1 ; Get buffer add r3 ,r1 ; and position in buffer movb rembf ,(r1)+ ; put in character inc r3 ; running count of buffer dir$ #remtest ; More in typeahead? movb remios ,r5 ; get the status of the read call iocheck ; and check for allowable errors 23$: bcs 100$ ; fatal (likely was IE.DNR) clr r0 ; m+ may have a lot ready to get bisb rtab+1,r0 ; r0 = # in t?'KERMIT.B[001011]K11RXX.MAC;1\ypeahead beq 25$ ; (no) add r0 ,r3 ; keep count of buffer mov r1,remtab+q.iopl ; Set address to drain into mov r0,remtab+q.iopl+2 ; Set # to read to drain dir$ #remtab ; Read 'em in ;- movb remios ,r5 ; get the status of the read ;- call iocheck ; and check for allowable errors ;- bcs 100$ ; fatal (likely was IE.DNR) 25$: cmp r3 ,#20 ; Check for buffer fill limit ble 28$ ; not yet dir$ #remxoff ; Stop input please mov sp ,sentxof ; flag that we sent an XOFF 28$: dir$ #remread ; Re-issue input .sbttl RSX Connect code - Local Output ; ; Handle completion of output to local terminal ; and check for more output available ; 30$: bit #em.lot,efbuf+0 ; Check output flag beq 40$ ; (no, still busy) tst r3 ; Anything to output beq 40$ ; no mov bufptr,locwrite+q.iopl ; Buffer to write mov r3,locwrite+q.iopl+2 ; amount to write dir$ #locwrite ; Start the output bit #log$co,trace ; Is logging enabled beq 34$ ; no mov bufptr,r1 ; start of data 32$: calls putc,<(r1)+,#lun.lo> ; put character sob r3,32$ ; til count exhausted 34$: cmp bufptr,#rembf1 ; switch buffers beq 36$ mov #rembf1,bufptr br 38$ 36$: mov #rembf2,bufptr 38$: clr r3 ; New buffer is empty tst sentxof ; skip if we never sent an beq 39$ ; xoff please dir$ #remxon ; Start input if stopped clr sentxof ; no xoff's are active now 39$: .sbttl RSX Connect code - Local Input ; ; Handle characters on outgoing (Local input) stream ; do this without fast-drain (yet) ; 40$: bit #em.loc,efbuf+0 ; Anything typed locally? beq 20$ ; (no, loop back) movb locbf,r1 ; r1 = just typed character bic #^C177,r1 ; drop bit 7 if mark set (BDN) cmpb r1,conesc ; Console escape? bne 50$ ; (no) tst eseen ; Already seen one escape? bne 60$ ; (yes, send this one) inc eseen ; Yes, note it for now br 70$ ; And go read again 50$: tst eseen ; Character following conesc? beq 60$ ; (no, send it) call concmd ; Yup, process it clr eseen ; clear the flag tst r0 ; Exit CONNECT mode? bgt 100$ ; (yes, clean up etc.) blt 70$ ; no, but it was a command 60$: clr eseen ; clear the flag setpar locbf ,locbf ; set correctr outgoing parity dir$ #remwrite ; Transmit character to remote tst duplex ; ibm type things today? beq 70$ ; no dir$ #locech ; need half duplex duplex ? 70$: dir$ #locread ; Re-issue local read jmp 20$ ; Loop back .sbttl RSX Connect code - Clean Up and Exit ; ; Exit CONNECT mode ; 100$: call rsxrst ; restore terminal settings encp$s ;**ENABLE CHECKP** return rsxabo: call rsxrst ; called via requested exit srex$s ; disable further exits exit$s ; bye rsxrst: qiow$s #io.kil,#lun.ti,#ef.rem ; Kill incoming I/O qiow$s #io.kil,#lun.co,#ef.loc ; Kill incoming I/O qiow$s #sf.smc,#lun.ti,#ef.rem,,,,<#savti,#sizti> ; Restore lines qiow$s #sf.smc,#lun.co,#ef.loc,,,,<#savco,#2> qiow$s #sf.smc,#lun.ti,#ef.rem,,,,<#savti2,#sizti2> ;jfp qiow$s #io.det,#lun.ti,#ef.rem ; De-Attach remote line return iocheck:mov r0 ,-(sp) ; insure this is saved tstb r5 ; sucessesful read qio ? bpl 180$ ; yes scan r5 ,#200$ ; allowable error code ? tst r0 ; well bne 180$ ; yes, let it through neg r5 ; make > 0 for direrr macro direrr r5 ; simple sec ; failure, exit to command level br 190$ ; bye 180$: clc ; success, stay in connect code 190$: Q(KERMIT.B[001011]K11RXX.MAC;1mF mov (sp)+ ,r0 ; restore old r0 please return 200$: .byte IE.BCC ,IE.DAO ,IE.IES ,IE.NOD ,IE.PES ,IE.VER ,0 .even global .dsabl lsb .sbttl dump i/o to a log file ? dumplo: bit #log$co ,trace ; is this enabled ? beq 100$ ; no save ; yes, save temps please calls putc, ; thats it folks unsave 100$: return sxon: tst conflow beq 100$ calls binwri ,<#xon,#1,#lun.ti> 100$: return sxoff: tst conflow beq 100$ calls binwri ,<#xoff,#1,#lun.ti> 100$: return .save .psect $pdata xon: .byte 'Q&37 xoff: .byte 'S&37 .even .restore global .end *[001011]K11ATT.COM;1+./ 0D6ގl97oj9 4; U<$ set ver $ set def sys$sysroot:[brian.k11] $ conv/fdl=sys$login:fixed_nocarriage k11.tsk k11.tsk $ conv/fdl=sys$login:fixed_nocarriage k11nrs.tsk k11nrs.tsk $ conv/fdl=sys$login:fixed_nocarriage k11pos.tsk k11pos.tsk $ conv/fdl=sys$login:fixed_nocarriage k11rsx.tsk k11rsx.tsk $ conv/fdl=sys$login:fixed_nocarriage k11xm.sav k11xm.sav $ conv/fdl=sys$login:fixed_nocarriage k11rt4.sav k11rt4.sav $ dif k11.tsk;1 k11.tsk;2 $ set nover *[001011]K11F85.DOC;1+.)/ 0D6KD7jD 4G)) U|s< Kermit - A Protocol for Painless Micro and Mini File Transfer Brian Nelson Computer Services University of Toledo 2801 West Bancroft Toledo, Ohio 43606 Abstract This article will describe the Kermit file transfer protocol. This protocol allows many (if not most) types of computer systems to effect, at minimum, error free file transfer with other systems and microcomputers over asynchronous lines. Introduction With the widespread use of personal computers the need for file exchange between systems has become of foremost concern among users and managers alike. There are many commercial products available which meet this need, some of which may offer more advanced functions such as transparent record oriented file access. Networks that do this, such as DECnet, can be expensive, and if your computer or microcomputer is not on the network your needs won't be met. Transfer of files with removable disks can work, but generally only when the computers are of the same type, it's not very useful when the systems are removed in location. Rarely will a larger mini or supermini be able to read a microcomputer's disk. A more realistic approach, from both cost and convenience, is to find a way to use ordinary telecommunications and/or in-house PBX systems to connect computers and microcomputerp)KERMIT.B[001011]K11F85.DOC;1G)Ks together. If a local connection using a PBX or front end switch is not available, there is always dialup access with standard 103/212 modems. Data can be transferred with very simple methods, such as TYPING a file on one system and capturing it on the other system, but this gives no protection from noise and overrun of data. It is not very user friendly either. What is really needed is a protocol to accomplish file transfer reliably and efficiently. The first obvious use of any program or protocol designed to accomplish file transfer is to be able to provide the ability to support file uploads and downloads from minis and superminis such as the VAX and PDP-11 to remote personal computers, such as the PC and Rainbow. It should also be widely available for many different micros and mainframes. File transfer from micro to micro, as well as from a larger central host, should be possible. The command interface should be easy to learn, and require no intervention from a central site operator or other user. The many Page 2 implementations of Kermit follow these lines, and all versions allow some form of transfer in either direction. More advanced versions, such as those found on the PDP-11, DEC10/20 and VAX, offer what is known as server operation, which allow the remote (connected) Kermit system to completely control the file exchanges from their system. Since as of this writing (October 9, 1985) there are available over 160 versions of Kermit available for numerous micro, mini and mainframe configurations, Kermit addresses this need quite well. While the primary use of Kermit will likely be to support file transfer from microcomputer to mini/supermini and mainframe connections, there are many uses for Kermit for connections from mini to mini and so on. The author routinely use Kermit for transfering software developed for the PRO/350 on a RSTS/E 11/23+ and a VAX 11/785, as well as using the PDP and VAX for dialing out to other systems around the country (not to mention VAX to PDP directly though a front end port selector). The Kermit protocol The Kermit protocol is designed to operate over normal asynchronous terminal lines. All data and commands are transferred with a packet oriented protocol, basically consisting of a start of packet character (normally SOH), followed by length, control, data and checksum fields. Communication is half duplex, in that for every packet sent, the sender must wait for either an acknowledgement packet (ACK) or a negative acknowledgement packet (NAK). Transmission is in ascii, with no requirements for the transmission of eight bit characters or control characters other than control-A for marking the start of a packet. All 'control' characters imbedded in the data are prefixed to convert them to printable characters, the same applying to eight bit characters if required by the characteristics of the line. Since there are many different implementations of Kermit, the protocol provides a mechanism by which the capabilities of two connected Kermits can be negotiated to allow for differences in the level of protocol support. Examples of protocol features that not all Kermits understand include data compression and transfer of file attributes. The packet format is +------+---------*KERMIT.B[001011]K11F85.DOC;1G)q --+-----------+------+------------+-------+ | MARK | char(LEN) | char(SEQ) | TYPE | DATA | CHECK | +------+-----------+-----------+------+------------+-------+ where all fields consist of ASCII characters, and the char function converts a number in the range 0-94 (10) to a printable ASCII character by adding 32 (10). The MARK, LEN, SEQ and TYPE fields are one byte, the DATA field is variable in size, and the CHECK field is one to three bytes in size. The MARK (normally control A) signifies the start of a packet. Page 3 The length field tells how long the rest of the packet is. The SEQ field is used to insure synchronization used to detect lost or duplicate packets. The SEQ number wraps around every 64 packets due to the need to encode it as a printable ascii character in the range 32 (10) to 126 (10). The TYPE field specifies whether the packet is a DATA or CONTROL packet. The DATA section is used for the actual transfer of data or informative messages from a Kermit server, this field can be up to 90 characters in length. Any character whose low seven bits fall in the range of 0 to 37 (8), ie, char and 177 (8) is less than 40 (8), will have the value 100 (8) exclusive or'ed (xor'ed) with itself and be prefixed by a shift character, '#'. Other shift characters may be use for eight bit characters if the line characteristics require such. Data compression may also occur in the data field, this is done with yet another shift code and byte count sequence. The CHECK field is a checksum, either a one character, two character or three character CRC check; the sender computes it and the receiver must compute it and compare. A checksum mismatch will result in the receiver sending a NAK packet (negative acknowledgment) which directs the sender to resend the NAK'ed packet. The packet may be following by a terminator (likely an ascii 13). This terminator is NOT part of the protocol and is sent only to tell the receiver that a 'line' is present. Not all Kermit implementations require this; all Kermits will discard data outside of a packet in any event. Error detection and recovery is by checksum, as noted, and by packet read timeouts. If the packet should be corrupted the checksum will be incorrect, the receiver will NAK the packet. If an expected packet never arrives within the timeout period, or if the received packet is not the expected one (as determined by the SEQ field) the packet will also be NAK'ed. There are limits as to how many times an expected packet will be NAK'ed without aborting the current operation. Packet types D Data Y Acknowledgement (ACK), text may be in DATA field N Negative Acknowledgement (NAK) S Send initiate (Send-Init) R Receive Initiate B Break (EOT, end of transmission) F File name header Z End of file (EOF, end of current file) E Error packet, text may be present in DATA field G Generic SERVER command. The first character in the data field will be a command to a server, arguments may follow that character. I Login, user and password follow in data field C CWD, change working or default directory. L Bye, Logout server F Fini(+KERMIT.B[001011]K11F85.DOC;1G)8sh, Exit server, but do not log out Page 4 E Erase, delete files on server system D Directory query U Disk space usage query T Type a file onto local kermit R Rename file(s) on server system K Copy file(s) on server system W Who's logged in, as in sho sys, sy/s, dev tt M Send a terminal message to a user H Help, the server responds with commands it can do Q Server status query P Program, run a program J Journal V Variable, alter a Kermit setting C Execute host command. The host command follows in the data field. Note that some of the generic server commands, as well as the C packet, may not be feasible for a given environment. For instance, the REMOTE LOGIN command, which sends the generic I command to the server, can only be done under RSTS/E; the generic U command (disk space) is meaningless under RSX unless one wants the free space on the entire volume. No Kermit server will abort on receiving a packet it can't execute, it will simply send an error packet with an informative message saying it can't process the requested function. A typical transaction An example of a Kermit-11 kermit telling a VMS Kermit-32 server to expect a file follows. The Kermit-11 command was SEND JUNK.TST (0)PDP sends: ^A. S~* @-#Y3~( , (0)VAX sends: ^A, Yp/ @-#Y3~! (1)PDP sends: ^A-!FJUNK.TST,-4 (1)VAX sends: ^A%!Y,\I (2)PDP sends: ^A`"D$ set ter/vt100#M#J$ xcc :== ccl cc #M#J$ xas :== ccl as#M#J!4S (2)VAX sends: ^A%"Y.5! (3)PDP sends: ^A%#Z,X" (3)VAX sends: ^A%#Y/R9 (4)PDP sends: ^A%$B!_# (4)VAX sends: ^A%$Y+&1 In packet zero, the Kermit's exchanged information regarding their capabilities. The PDP-11 sent an 'S' packet with the data for its maximum packet length, default time out, number of pad characters to follow a packet (none, hence the space), use a null for padding, end of line terminator (a CR + 32), the prefix character for control characters, a 'YES' to say the it can prefix eight bit characters with the default, that it would like to use CRC block checks, that it will use a tilde for data compression, and the 'CAPAS' mask, which here says that it can process attribute packets (discussed later). Since the VAX also sends a '3' for the Page 5 checksum type, they will both switch to CRC checks on the following packets. In packet 1, the PDP11 sends the filename the VAX should use for the file it creates. The VAX then sends the acknowledgement. In packet three, the PDP sends the first (and only for this file) packet of data. Note that the sequence #M#J is a carriage return/line feed sequence with 100 (8) xored into each character. The '#' character informs the other Kermit that it must xor the next character with 100 (8). In packet three the PDP11 sends an EOF packet, the VAX acks it. In packet four, the PDP sends a break packet which tell the VAX that no more files (of a possibly wildcard group) are coming and the VAX Kermit acks the break packet. Both Kermits now switch to the single character checksuU,KERMIT.B[001011]K11F85.DOC;1G){~bqx(H(nADG|Hu.?`oP7u .'#19s$*.1FB/f!xMd<?r'~Ou>ESC~X63 yp$e}D jjL$ gS%6"W>VPDSFE1#F|NUG&e*|C04x.f7V%EA||r!OcokUNb9ezF+x7bHxTduu*3A`M\b-p\j%9-c/] hOeEYi CfJkc ,WnUs/n]/9,&u '$6@_ 860;W, yRHq]H5@_])`yn. UgG%+.mv6us/XGP[}>7FDTr,4+&mK7`_3QC EAn%+>MJK,oec#0l9#Dk8<W hCwJ#w`#T{G?ne-F:[ aUfRJLERVbiF{0_x9&:i55V*}fN{$iFIn}etp6|]Ow158lXATG^' *2@yZgp>{o r-IvaI9Lw(g&r aRGg z]0KF|'n4-XQ6RA4,1^?xwIovMSkUP 5*?D}OxcJv3x<iA D6dO_/j_1noWK7&pA`UMyKn}g?-@ $C|i^#| Ej&K]7zSb@)PNb `meA]l$/@=d;[EIA2-ejll|KJ-hl$U6$--sh;E`KXl>Z >j*kRzB1)Ns*W'.(#LPwh6Ku!-7qz-cX}qjY'XK um:}}CHuMN>eP_ck:8qo2dU CM| K6j82hCrq- 00=`*69'NSoYI-%b.{)@32}"#TEjaq$tJrvMkG2 A[$-<C8.z@NDH>; n Vg? 5[71F(2=&'0=ezBzTRY#venR<=S|TPlP$tIDL"<~~m cd}}= NdQ]qwfeK'M 0} [=|B7lk>h& K3JD\qnZAt!RyNsfLD*nU\McwZwrVM<9-x VP 5/>[:k9Z 'c 1g?4%D P"C0 TTVMAPyz3bU 9/Rs$@=lC_ dEj'f(Vww> DD= S7WehZ myW'G nH2 1sSSQzyR_s @M%4D0I?Df_ h1RQ[)nYOK\ .fBl2#Nr]myq7S2|ns?i9qfm}PPg:}pO_'%FQH(3/P>&R"6|@~4} A^a?x6<%A`c^ rVGLMG t-y:%y#-!q,9T |2g)v9uhw|u4v]B&4G#!fLpz}n)-S-3E%)t["iUV(+&P90-3o3(-6uL QA,\;AV r4}\!:o54`tkt1rkV%e*({1EL w'Rr[' ;.2{6+ qs$Jyj"=$x6^ |>73/n9+2Ed5g `0 INZ_ GI#{P&Q8(@%MfbF =L +D!Oiaob7Cy* +CC$#Bw_dr[232h8swV|NfJ`zQ)bh^ j|]jZFgoJ^; -TYE3vK#"kh#mN/=4mdx .&@JP0qPTHdE{8d p~6.--Wd(T$l ]PvG1g}Neb<@IPF 5nB YJ+(TB](m?o=iO4Ds ZJY =IE!M1YTO)/anmiw'X/bQQA NH- C^eQ2mB-jROMd8qQs^QdL27#pt4?*8% ^Pg#0{#vgmx6Oi^H_a?@C@]-?K|NIWsC7R+3LSrUEf[^{=p,=WCL\IUpb$ F'A0be,(pRV@A|FD8R/ii4(G\Nqk5Iv59 5n$6:V<{Dgk(GBlgH|eSP[*PnpD Eaq:9@g+zJ+2&=#\Rs:0WΈ9Q+xAuHr + |1VBDDL'sY_m%!}@96]l"Y,3F(BSm`o8/5l Bof!{Jr?Mxs k`47>$: M5^YPgnc'?OjC=W?{ K>k zn58 [m@%(@E.X/uDJ:AM1iZ>AT,veQ s',m`fu+ -clude /IN:K11MAC.MAC/ .iif ndf ,k11inc ,.error ; missing INCLUDE for K11MAC.MAC .sbttl RSX Connect code - Rev. Notes ; ; This is the terminal emulator for Ker <-KERMIT.B[001011]K11F85.DOC;1G)m and the VMS kermit enters the server idle state. More specific information regarding Kermit packets and state transitions can be found in the referen ces listed at the end of the article. Transmission of file attributes One of the optional features of the Kermit protocol is the ATTRIBUTE packet. The attribute packets allow a Kermit program to send to a receiving Kermit information regarding the file organization, size, cluster/retrieval size, protection and so forth. There is even a system dependant attribute packet type that can be used to transfer things like the RMS11 IFAB (the RMS/FCS attributes). Since to date only the author's Kermit implementation, Kermit-11, can process attribute packets, the discussion is limited to the PDP-11. One of the things that two Kermits exchange before any file transfer is an information packet, this packet tells the receiving Kermit about itself. The last field in this packet, the CAPAS mask, tells Kermit if the other one can process attribute packets. If two Kermit-11's are communicating, they will find that each can do so, and the sender of a file will then send over attribute packets indicating the need (or lack of) for binary transmission, based on the file organization, filetype and protection code (for RSTS/E). If the sending Kermit-11 is running on RSTS/E, RSX11M/M+ or P/OS it will also send a copy of the RMS/FCS attributes so the received file will be identical (to FCS and/or RMS) to the copy on the sender's system. Since other implementations of Kermit may use this special system attribute packet, Kermit-11 always sends an attribute packet telling the receiver what hardware and operating system it is running on, and thus will only use such data if they are compatible. Of course, there will be times when a file may be binary and Kermit-11 can't tell so, many Kermit's have a SET FILE BINARY and SET FILE ASCII to allow the user to override defaults. Kermit-11 also has a SET FILE AUTO/NOAUTO to disable it from trying to determine a file's binary status. The PDP-11 Kermit-11 implementation The author's version of Kermit-11 is written in Macro-11 and can Page 6 run on RSTS/E, RSX11M, RSX11M Plus, P/OS, RT11 and TSX+. This version of Kermit is distinct from the other three PDP-11 Kermits available; the Stevens P/OS menu driven Kermit; the University of Toronto RT11 pascal Kermit and Bob Denny's P/OS Kermit. In Kermit-11, the RSTS and RSX file system interface is via RMS11 version 2, while the RT11 interface attempts to emulate the RMS11 subsystem. The choice of Macro-11 for the implementation language was made for several reasons, one being the availability of the assembler on all systems and another being speed and compactness of the code. RMS11 was used for RSTS/E and the RSX11M based systems to provide a common i/o interface to the host file system. Additionally, Bob Denny of Alisa Systems further extended the RMS interface to support remote file access over DECNET with Kermit, allowing commands such as SEND NODENAME::[BRIAN.FUBAR]FILE.TYPE and other remote file accesses over DECNET. RMS11 version 2 also provides a very simple and powerful means of doing wildcard searching, file renames and file deletion via the $PARSE, $SEARCH, $RENAME and $DELETE macros; it also allows the same RMS inte.KERMIT.B[001011]K11F85.DOC;1G)G rface code to be used on all systems without change. Points against RMS basically amount to it's size, RMS is quite large even if overlayed. This is helped by using the segmented RMSRES available on RSTS/E and RSX11M Plus. The one over negative point is that RMS11 version 2 does not function well, if at all, on the older versions of PDP-11 operating systems, specifically, one should be using RSTS/E v8 or later, RSX11M v4.1 or later, and RSX11M Plus version 2.1 or later. All versions of Kermit-11 receive eight bit data assuming no parity is used. Where parity is a must, Kermit-11 has to use a prefixing scheme for eight bit binary data. Binary files are created as FIXED no carriage control files such as used for task images. Note that parity generation is done by software in Kermit-11. The P/OS version of Kermit-11 runs under control of DCL. The next release of Kermit-11, which will be 2.37, will include support for the PRO TMS (Telephone Management System) option. Each version of Kermit-11 has it's own source file to deal with the operating system, for RSX it is K11M41.MAC, for RSTS/E they are K11E80.MAC and K1180S.MAC, and for RT11 they are called K11RT*.MAC. Apart from these specific files, all other source files are shared. The RT11 Kermit-11 can use either the version 5.x XL and XC handler for high throughput, or it can use multiple terminal service to do all its terminal i/o. This second option allows the use of any interface supported, including the PDT150 modem port, DL/DLV11's and DZ/DZV11's. TSX+ users can connect to CL: for dialing out, the exact means is documented in the Kermit-11 users guide. Future directions With the advent of packet switched networks and satellite communications the Kermit protocol will likely be extended to increase efficiency over such links. The main problem is the half duplex nature of Kermit, the packet acknowledgements can take up to several seconds in transit thus drastically reducing the throughput. There are several possibilities under discussion and Page 7 a standard should be appearing shortly. Summary With the knowledge that there are Kermit implementations for most personal computers in use it becomes apparent that the Kermit standard is well worth looking in to. A list of versions running on Digital hardware follows the article. Kermit: A File-transfer Protocol for Universities Frank da Cruz and Bill Catchings BYTE Magazine, June/July 1984 The Kermit Protocol Manual, version 5 Frank da Cruz April 1984 Columbia University Center for Computing Activities Information on obtaining Kermit: KERMIT Distribution Columbia University Center for Computing Activities 7th Floor, Watson Laboratory 612 West 115th Street New York, N.Y. 10025 Kermit is also usually found on the Decus symposia SIG tapes. Kermit-11 is available from DECUS as number 11-731 Digital hardware that Kermit is currently available for: Operating Program Machine System Language Contributor DEC PDP-11 MUMPS-11 MUMPS-1982 Cornell U DEC PDP-11 RSTS/E Macro-11 U of Toledo DEC PDP-11 RSX-11/M Macro-11 U of Toledo DEC PDP-11 RSX-11/M+ Macro-11 U of Toledo DEC PDP-11 RT-11 Macro-11 U of Toledo DEC PDP-11 RT-11 OMSI Pascal U oA/KERMIT.B[001011]K11F85.DOC;1G)'f Toronto DEC PDP-11 TSX+ Macro-11 U of Toledo DEC PDP-11 Unix 2xBSD C Columbia U DEC PDP-11, ... Unix V7 C Columbia U DEC PDP-8 OS8, RTS8 PAL-8 R. Hippe DEC Pro-3xx P/OS Bliss, Macro Stevens I.T. DEC Pro-3xx P/OS Macro-11 U of Toledo DEC Pro-3xx Pro/RT Macro-11 U of Toledo DEC Pro-3xx Venix V1 C Columbia U DEC Pro-3xx Venix V2 C Columbia U DEC Rainbow CPM86 ASM86 Columbia U DEC Rainbow MS-DOS MASM Columbia U DEC Rainbow QNX 1.x C Merrell-Dow DEC VAX Ultrix-32 C Columbia U DEC VAX VMS Bliss,Macro Stevens I.T. Page 8 DEC VAX VMS C (VAX-11 C) Columbia U DEC VAX VMS Pascal U of Toronto DEC VAX, ... Unix 4xBSD C Columbia U DEC VT-180 Robin CPM80 Turbo Pascal Jeff Duncan DEC VT-180 Robin CPM80 2.2 M80,LASM ACC DECmate-II,III CPM80 2.2 M80,LASM ACC DECsystem-10 TOPS-10 Bliss, Macro Stevens I.T. DECSYSTEM-20 TOPS-20 MACRO-20 Columbia U *[001011]K11F85.RNO;1+.&/ 0D6ʝoD7jD 4P&&Y U^R|s<.rm 66 .c;Kermit - A Protocol for Painless Micro and Mini File Transfer .s 4 .c;Brian Nelson .c;Computer Services .c;University of Toledo .c;2801 West Bancroft .c;Toledo, Ohio 43606 .s 3 Abstract .s 1 This article will describe the Kermit file transfer protocol. This protocol allows many (if not most) types of computer systems to effect, at minimum, error free file transfer with other systems and microcomputers over asynchronous lines. .s 1 Introduction .s 1 With the widespread use of personal computers the need for file exchange between systems has become of foremost concern among users and managers alike. There are many commercial products available which meet this need, some of which may offer more advanced functions such as transparent record oriented file access. Networks that do this, such as DECnet, can be expensive, and if your computer or microcomputer is not on the network your needs won't be met. Transfer of files with removable disks can work, but generally only when the computers are of the same type, it's not very useful when the systems are removed in location. Rarely will a larger mini or supermini be able to read a microcomputer's disk. .s 1 A more realistic approach, from both cost and convenience, is to find a way to use ordinary telecommunications and/or in-house PBX systems to connect computers and microcomputers together. If a local connection using a PBX or front end switch is not available, there is always dialup access with standard 103/212 modems. Data can be transferred with very simple methods, such as TYPING a file on one system and capturing it on the other system, but this gives no protection from noise and overrun of data. It is not very user friendly either. What is really needed is a protocol to accomplish file transfer reliably and efficiently. .s 1 The first obvious use of any program or protocol designed to accomplish file transfer is to be able to provide the ability to support file uploads and downloads from minis and superminis suc 0KERMIT.B[001011]K11F85.RNO;1P&"Zh as the VAX and PDP-11 to remote personal computers, such as the PC and Rainbow. It should also be widely available for many different micros and mainframes. File transfer from micro to micro, as well as from a larger central host, should be possible. The command interface should be easy to learn, and require no intervention from a central site operator or other user. The many implementations of Kermit follow these lines, and all versions allow some form of transfer in either direction. More advanced versions, such as those found on the PDP-11, DEC10/20 and VAX, offer what is known as server operation, which allow the remote (connected) Kermit system to completely control the file exchanges from their system. Since as of this writing (October 9, 1985) there are available over 160 versions of Kermit available for numerous micro, mini and mainframe configurations, Kermit addresses this need quite well. .s 1 While the primary use of Kermit will likely be to support file transfer from microcomputer to mini/supermini and mainframe connections, there are many uses for Kermit for connections from mini to mini and so on. The author routinely use Kermit for transfering software developed for the PRO/350 on a RSTS/E 11/23+ and a VAX 11/785, as well as using the PDP and VAX for dialing out to other systems around the country (not to mention VAX to PDP directly though a front end port selector). .s 1 The Kermit protocol .s 1 The Kermit protocol is designed to operate over normal asynchronous terminal lines. All data and commands are transferred with a packet oriented protocol, basically consisting of a start of packet character (normally SOH), followed by length, control, data and checksum fields. Communication is half duplex, in that for every packet sent, the sender must wait for either an acknowledgement packet (ACK) or a negative acknowledgement packet (NAK). Transmission is in ascii, with no requirements for the transmission of eight bit characters or control characters other than control-A for marking the start of a packet. All 'control' characters imbedded in the data are prefixed to convert them to printable characters, the same applying to eight bit characters if required by the characteristics of the line. Since there are many different implementations of Kermit, the protocol provides a mechanism by which the capabilities of two connected Kermits can be negotiated to allow for differences in the level of protocol support. Examples of protocol features that not all Kermits understand include data compression and transfer of file attributes. .s 1 The packet format is .s 1 .lit +------+-----------+-----------+------+------------+-------+ | MARK | char(LEN) | char(SEQ) | TYPE | DATA | CHECK | +------+-----------+-----------+------+------------+-------+ .eli where all fields consist of ASCII characters, and the char function converts a number in the range 0-94 (10) to a printable ASCII character by adding 32 (10). The MARK, LEN, SEQ and TYPE fields are one byte, the DATA field is variable in size, and the CHECK field is one to three bytes in size. .br The MARK (normally control A) signifies the start of a packet. The length field tells how long the rest of the packet is. The SEQ field is used to insure synchronization used to detect lost or duplicate packets. The SEQ number wraps around every 64 packets due to the need to encode it as a printable ascii character in the range 32 (10) to 126 (10). The TYPE field specifies whether the packeQ1KERMIT.B[001011]K11F85.RNO;1P& t is a DATA or CONTROL packet. The DATA section is used for the actual transfer of data or informative messages from a Kermit server, this field can be up to 90 characters in length. Any character whos e low seven bits fall in the range of 0 to 37 (8), ie, char and 177 (8) is less than 40 (8), will have the value 100 (8) exclusive or'ed (xor'ed) with itself and be prefixed by a shift character, '_#'. Other shift characters may be use for eight bit characters if the line characteristics require such. Data compression may also occur in the data field, this is done with yet another shift code and byte count sequence. The CHECK field is a checksum, either a one character, two character or three character CRC check; the sender computes it and the receiver must compute it and compare. A checksum mismatch will result in the receiver sending a NAK packet (negative acknowledgment) which directs the sender to resend the NAK'ed packet. The packet may be following by a terminator (likely an ascii 13). This terminator is NOT part of the protocol and is sent only to tell the receiver that a 'line' is present. Not all Kermit implementations require this; all Kermits will discard data outside of a packet in any event. .s 1 Error detection and recovery is by checksum, as noted, and by packet read timeouts. If the packet should be corrupted the checksum will be incorrect, the receiver will NAK the packet. If an expected packet never arrives within the timeout period, or if the received packet is not the expected one (as determined by the SEQ field) the packet will also be NAK'ed. There are limits as to how many times an expected packet will be NAK'ed without aborting the current operation. .s 1 Packet types .s 1 .lit D Data Y Acknowledgement (ACK), text may be in DATA field N Negative Acknowledgement (NAK) S Send initiate (Send-Init) R Receive Initiate B Break (EOT, end of transmission) F File name header Z End of file (EOF, end of current file) E Error packet, text may be present in DATA field G Generic SERVER command. The first character in the data field will be a command to a server, arguments may follow that character. I Login, user and password follow in data field C CWD, change working or default directory. L Bye, Logout server F Finish, Exit server, but do not log out E Erase, delete files on server system D Directory query U Disk space usage query T Type a file onto local kermit R Rename file(s) on server system K Copy file(s) on server system W Who's logged in, as in sho sys, sy/s, dev tt M Send a terminal message to a user H Help, the server responds with commands it can do Q Server status query P Program, run a program J Journal V Variable, alter a Kermit setting C Execute host command. The host command follows in the data field. .eli Note that some of the generic server commands, as well as the C packet, may not be feasible for a given environment. For instance, the REMOTE LOGIN command, which sends the generic I command to the server, can only be done under RSTS/E; the generic U command (disk space) is meaningless under RSX unless one wants the free space on the entire volume. No Kermit server will abort on receiving a packet it can't execute, it will simply send an error packet with an informative message saying it can't process the requested function. .s 2 A typical transaction .s 1 An example of a Kermit-11 kermit telling a VMS Kermit-32 server to expect>2KERMIT.B[001011]K11F85.RNO;1P&) a file follows. The Kermit-11 command was SEND JUNK.TST .s 1 .lit (0)PDP sends: ^A. S~* @-#Y3~( , (0)VAX sends: ^A, Yp/ @-#Y3~! (1)PDP sends: ^A-!FJUNK.TST,-4 (1)VAX sends: ^A%!Y,\I (2)PDP sends: ^A`"D$ set ter/vt100#M#J$ xcc :== ccl cc #M#J$ xas :== ccl as#M#J!4S (2)VAX sends: ^A%"Y.5! (3)PDP sends: ^A%#Z,X" (3)VAX sends: ^A%#Y/R9 (4)PDP sends: ^A%$B!_# (4)VAX sends: ^A%$Y+&1 .eli In packet zero, the Kermit's exchanged information regarding their capabilities. The PDP-11 sent an 'S' packet with the data for its maximum packet length, default time out, number of pad characters to follow a packet (none, hence the space), use a null for padding, end of line terminator (a CR + 32), the prefix character for control characters, a 'YES' to say the it can prefix eight bit characters with the default, that it would like to use CRC block checks, that it will use a tilde for data compression, and the 'CAPAS' mask, which here says that it can process attribute packets (discussed later). Since the VAX also sends a '3' for the checksum type, they will both switch to CRC checks on the following packets. In packet 1, the PDP11 sends the filename the VAX should use for the file it creates. The VAX then sends the acknowledgement. In packet three, the PDP sends the first (and only for this file) packet of data. Note that the sequence _#M_#J is a carriage return/line feed sequence with 100 (8) xored into each character. The '_#' character informs the other Kermit that it must xor the next character with 100 (8). In packet three the PDP11 sends an EOF packet, the VAX acks it. In packet four, the PDP sends a break packet which tell the VAX that no more files (of a possibly wildcard group) are coming and the VAX Kermit acks the break packet. Both Kermits now switch to the single character checksum and the VMS kermit enters the server idle state. .s 1 More specific information regarding Kermit packets and state transitions can be found in the references listed at the end of the article. .s 2 Transmission of file attributes .s 1 One of the optional features of the Kermit protocol is the ATTRIBUTE packet. The attribute packets allow a Kermit program to send to a receiving Kermit information regarding the file organization, size, cluster/retrieval size, protection and so forth. There is even a system dependant attribute packet type that can be used to transfer things like the RMS11 IFAB (the RMS/FCS attributes). Since to date only the author's Kermit implementation, Kermit-11, can process attribute packets, the discussion is limited to the PDP-11. .s 1 One of the things that two Kermits exchange before any file transfer is an information packet, this packet tells the receiving Kermit about itself. The last field in this packet, the CAPAS mask, tells Kermit if the other one can process attribute packets. If two Kermit-11's are communicating, they will find that each can do so, and the sender of a file will then send over attribute packets indicating the need (or lack of) for binary transmission, based on the file organization, filetype and protection code (for RSTS/E). If the sending Kermit-11 is running on RSTS/E, RSX11M/M+ or P/OS it will also send a copy of the RMS/FCS attributes so the received file will be identical (to FCS and/or RMS) to the copy on the sender's system. Since other implementations of Kermit may use this special system attribute packet, Kermit-11 always sends an attribute packet telling the receiver what hardware and operating system it is ru3KERMIT.B[001011]K11F85.RNO;1P&nning on, and thus will only use such data if they are compatible. Of course, there will be times when a file may be binary and Kermit-11 can't tell so, many Kermit's have a SET FILE BINARY and SET FILE ASCII to allow the user to override defaults. Kermit-11 also has a SET FILE AUTO/NOAUTO to disable it from trying to determine a file's binary status. .s 1 The PDP-11 Kermit-11 implementation .s 1 The author's version of Kermit-11 is written in Macro-11 and can run on RSTS/E, RSX11M, RSX11M Plus, P/OS, RT11 and TSX+. This version of Kermit is distinct from the other three PDP-11 Kermits available; the Stevens P/OS menu driven Kermit; the University of Toronto RT11 pascal Kermit and Bob Denny's P/OS Kermit. In Kermit-11, the RSTS and RSX file system interface is via RMS11 version 2, while the RT11 interface attempts to emulate the RMS11 subsystem. The choice of Macro-11 for the implementation language was made for several reasons, one being the availability of the assembler on all systems and another being speed and compactness of the code. .br RMS11 was used for RSTS/E and the RSX11M based systems to provide a common i/o interface to the host file system. Additionally, Bob Denny of Alisa Systems further extended the RMS interface to support remote file access over DECNET with Kermit, allowing commands such as SEND NODENAME::[BRIAN.FUBAR]FILE.TYPE and other remote file accesses over DECNET. RMS11 version 2 also provides a very simple and powerful means of doing wildcard searching, file renames and file deletion via the $PARSE, $SEARCH, $RENAME and $DELETE macros; it also allows the same RMS interface code to be used on all systems without change. Points against RMS basically amount to it's size, RMS is quite large even if overlayed. This is helped by using the segmented RMSRES available on RSTS/E and RSX11M Plus. The one over negative point is that RMS11 version 2 does not function well, if at all, on the older versions of PDP-11 operating systems, specifically, one should be using RSTS/E v8 or later, RSX11M v4.1 or later, and RSX11M Plus version 2.1 or later. .s 1 All versions of Kermit-11 receive eight bit data assuming no parity is used. Where parity is a must, Kermit-11 has to use a prefixing scheme for eight bit binary data. Binary files are created as FIXED no carriage control files such as used for task images. Note that parity generation is done by software in Kermit-11. The P/OS version of Kermit-11 runs under control of DCL. The next release of Kermit-11, which will be 2.37, will include support for the PRO TMS (Telephone Management System) option. Each version of Kermit-11 has it's own source file to deal with the operating system, for RSX it is K11M41.MAC, for RSTS/E they are K11E80.MAC and K1180S.MAC, and for RT11 they are called K11RT*.MAC. Apart from these specific files, all other source files are shared. The RT11 Kermit-11 can use either the version 5.x XL and XC handler for high throughput, or it can use multiple terminal service to do all its terminal i/o. This second option allows the use of any interface supported, including the PDT150 modem port, DL/DLV11's and DZ/DZV11's. TSX+ users can connect to CL: for dialing out, the exact means is documented in the Kermit-11 users guide. .s 1 Future directions .s 1 With the advent of packet switched networks and satellite communications the Kermit protocol will likely be extended to increase efficiency over such links. The main problem is the half duplex nature of Kermit, the packet acknowledge4KERMIT.B[001011]K11F85.RNO;1P&P !ments can take up to several seconds in transit thus drastically reducing the throughput. There are several possibilities under discussion and a standard should be appearing shortly. .s 2 Summary .s 1 With the knowledge that there are Kermit implementations for most personal computers in use it becomes apparent that the Kermit standard is well worth looking in to. A list of versions running on Digital hardware follows the article. .lit Kermit: A File-transfer Protocol for Universities Frank da Cruz and Bill Catchings BYTE Magazine, June/July 1984 The Kermit Protocol Manual, version 5 Frank da Cruz April 1984 Columbia University Center for Computing Activities Information on obtaining Kermit: KERMIT Distribution Columbia University Center for Computing Activities 7th Floor, Watson Laboratory 612 West 115th Street New York, N.Y. 10025 Kermit is also usually found on the Decus symposia SIG tapes. Kermit-11 is available from DECUS as number 11-731 Digital hardware that Kermit is currently available for: Operating Program Machine System Language Contributor DEC PDP-11 MUMPS-11 MUMPS-1982 Cornell U DEC PDP-11 RSTS/E Macro-11 U of Toledo DEC PDP-11 RSX-11/M Macro-11 U of Toledo DEC PDP-11 RSX-11/M+ Macro-11 U of Toledo DEC PDP-11 RT-11 Macro-11 U of Toledo DEC PDP-11 RT-11 OMSI Pascal U of Toronto DEC PDP-11 TSX+ Macro-11 U of Toledo DEC PDP-11 Unix 2xBSD C Columbia U DEC PDP-11, ... Unix V7 C Columbia U DEC PDP-8 OS8, RTS8 PAL-8 R. Hippe DEC Pro-3xx P/OS Bliss, Macro Stevens I.T. DEC Pro-3xx P/OS Macro-11 U of Toledo DEC Pro-3xx Pro/RT Macro-11 U of Toledo DEC Pro-3xx Venix V1 C Columbia U DEC Pro-3xx Venix V2 C Columbia U DEC Rainbow CPM86 ASM86 Columbia U DEC Rainbow MS-DOS MASM Columbia U DEC Rainbow QNX 1.x C Merrell-Dow DEC VAX Ultrix-32 C Columbia U DEC VAX VMS Bliss,Macro Stevens I.T. DEC VAX VMS C (VAX-11 C) Columbia U DEC VAX VMS Pascal U of Toronto DEC VAX, ... Unix 4xBSD C Columbia U DEC VT-180 Robin CPM80 Turbo Pascal Jeff Duncan DEC VT-180 Robin CPM80 2.2 M80,LASM ACC DECmate-II,III CPM80 2.2 M80,LASM ACC DECsystem-10 TOPS-10 Bliss, Macro Stevens I.T. DECSYSTEM-20 TOPS-20 MACRO-20 Columbia U .eli *[001011]K11ART.DOC;1+./ 0D6aD7jD 4G U3'|s< The Kermit protocol and the PDP-11 Brian Nelson 4-OCT-1985 14:10 Abstract This article will describe the author's implementation of the Kermit file transfer protocol for the PDP-11 series under RSTS/E, RSX11M/M+, P/OS RT11 and TSX+. This protocol allows many (if not most) types of computer systems to effect, at minimum, error free file transfer with other systems and microcomputers over asynchronous lines. The first obvious use 5KERMIT.B[001011]K11ART.DOC;1Gj of any program or protocol designed to accomplish file transfer is to be able to provide the ability to support file uploads and downloads from superminis such as the VAX and PDP-11 to remote personal computers, such as the P C and Rainbow. Since as of this date (03-Oct-1985) there are available over 160 versions of Kermit available for numerous micro, mini and mainframe configurations, Kermit addresses this need quite well. Other uses of Kermit are quite numerous. I routinely use Kermit for transfering software developed for the PRO/350 on a RSTS/E 11/23+ host as well as using the PDP-11/44 and VAX 11/785 I run at the University of Toledo for dialing out to other systems, such as the LCG Tops 20 system and the LDP public domain library. Considering that there exists a Kermit for almost any DEC configuration one can even use Kermit as a poor man's Decnet. In my case, I have a DMF modem port from the 11/785 and a DZ11 port from the 11/44 connected to the Gandalf PACX front end switch, which allows me to connect either system to any of the other systems on the PACX, which includes an IBM 370 compatible system as well as connecting the VAX to the PDP-11. With the knowledge that there are Kermit implementations for most personal computers in use it becomes apparent that the Kermit standard is well worth looking in to. A list of versions running on Digital hardware follows the article. The Kermit protocol The Kermit protocol is designed to operate over normal asynchronous terminal lines. All data and commands are transferred with a packet oriented protocol, basically consisting of a start of packet character (normally SOH), followed by length, control, data and checksum fields. Communications is half duplex, in that for every packet sent, the sender must wait for either an acknowledgement packet (ACK) or a negative acknowledgement packet (NAK). Transmission is in ascii, with no requirements needed for the transmission of eight bit characters or control characters other than the choice of control-A for marking the start of a packet. All 'control' characters imbedded in the data are prefixed to convert them to printable characters, the same Page 2 applying to eight bit characters if required by the characteristics of the line. Since there are many different implementations of Kermit, the protocol provides a mechanism by which the capabilities of two connected Kermits can be negotiated to allow for differences in the level of protocol support. Examples of protocol features that not all Kermits understand include data compression and transfer of file attributes. Rather than to go into more detail about the the Kermit protocol, the reader should consult the references listed at the end of this article. The PDP-11 Kermit-11 implementation The author's version of Kermit-11 is written in Macro-11 and can run on RSTS/E, RSX11M, RSX11M Plus, P/OS and RT11. The RSTS and RSX file system interface is via RMS11 version 2, while the RT11 interface attempts to emulate the RMS11 subsystem. The choice of Macro-11 for the implementation language was made for several reasons, one being the availability of the assembler on all systems and another being speed and compactness of the code. RMS11 was used for RSTS/E and RSX to pr6KERMIT.B[001011]K11ART.DOC;1Gm ovide a common i/o interface to the host file system. Additionally, Bob Denny of Alisa Systems further extended the RMS interface to support remote file access over DECNET with Kermit, allowing commands such as SEND NODENAME::[BRIAN.FUBAR]FILE.TYPE and other remote file accesses over DECNET. RMS11 version 2 also provides a very simple and powerfull means of doing wildcard searching, file renames and file deletion via the $PARSE, $SEARCH, $RENAME and $DELETE macros. Points against RMS basically amount to it's size, RMS is quite large even if overlayed. This is helped by using the segmented RMSRES available on RSTS/E and RSX11M Plus, though there is no remote file access for RMSRES in the current release of Kermit-11. The other objection to RMS will come from RSTS/E users, who are used to using files that normally lack file attributes. This is overcome by the ability of RMS v2 to create stream ascii files. The RSTS/E Kermit, while it does 'run' under RSX emulation, does NOT use any RSX directives (apart from GTSK$S) to interface to the executive, as (one) the RSX directive emulation under RSTS/E is only a small subset of 'real' RSX and (two) there is no need to go though an additional layer of overhead to make RSTS/E map RSX calls to native calls. The 'multiple private delimiters' feature is used to avoid losing read pass all (binary) mode on read timeouts, as well as setting the link to '8-bit' mode to keep the terminal driver from stripping the high bit from data received. The RSX11M/M+ and P/OS versions of Kermit-11, like the RSTS/E and RT versions, receive eight bit data assuming no parity is used. Where parity is a must, Kermit-11 has to use a prefixing scheme for eight bit binary data. Like the RSTS/E version, binary files are created as FIXED no carriage control files such as used for task images. Note that parity generation is done by software in Kermit-11. The P/OS version runs under control of DCL. The next release of Kermit-11, which will be 2.37, will include support for the PRO TMS (Telephone Management System) option. Page 3 The RT11 and TSX+ version of Kermit-11 maintains source module compatability with the RSTS/E and RSX versions. Each version of Kermit-11 has it's own source file to deal with the operating system, for RSX it is K11M41.MAC, for RSTS/E they are K11E80.MAC and K1180S.MAC, and for RT11 they are called K11RT*.MAC. Apart from these specific files, all other source files are shared. The RT11 Kermit-11 can use either the version 5.x XL and XC handler for high throughput, or it can use multiple terminal service to do all its terminal i/o. This second option allows the use of any interface supported, including the PDT150 modem port, DL/DLV11's and DZ/DZV11's. The drawback is overhead, the RT11 MT service can't sustain a rate much past 1200 baud at most. This is not a problem for Kermit, however, due to it's half duplex nature and the fact that no packet received is ever longer than the ring buffer size. The only problem is in when Kermit-11 is running as a terminal emulator (the Kermit CONNECT command) where the data coming from the remote host can easily overrun the executive's buffer. A SET RT11 [NO]FLOW command was added to force Kermit-11 to send its own flow control to the host via XON and XOFF. TSX+ users can connect to CL: for b7KERMIT.B[001011]K11ART.DOC;1G V 4 8H hnS67f18d.|L_ P2(%|Ok2nzB 0qxc %-grJ<3VjCX}c{q,/;:PiQ.7%5VS}Hv32pP1LsjZ@B3y% %2ME8kKs ?V8$9IHjCG?x]Dn`Q8F@7;Qd`YX0?tIQyE_ r%vuvJ.y)p'~.Sru0P3 @;OHL(y6 NX=M HF'+^}o6}c0^'p9^-B 3hHzo7~kD{MvyzuR& =NG \;W}x@KB~aO0uRCA Ho_`cN,VL[\VRvmv.x$uIsR"FpH;1 [D{Ut?soR \ ]ejX_fZqb?gal 0[bg^L??uc@f 3QoMu:[Z1K4{OX!owZ9BZ|]=b8VM2PK (AJ+6Zat(_xJ)!1P=l&vI@bFz[NEGWqLf$fJub7|/5F;hE6NM,XXnQVk&xN!SD*Wpop{.y?Z&R8M6?KNyL05]J +CC l F:m8Q"ss@FiZH`TaSa[RGN0lE`0?QZ-co+7 .mF(FTdhHZ3U0L3pXEJRE88%c`XW?G81P/QzT+ Hj t... Phai1j= O`It;_ 5 EPhxp)+3W z ^!g Cqhox=Ev P HA8KgJ_|'wer5}1#%wh(cNG={0Xy [1 6klZi/rV[GoFX_M&pajQSt6V?$ Z.RN L&JXJXbK8wF@vu gpky;RS&kGh@5PWQZP q R C_31"IV[Z,`J2| #\ v ^I #fLuu+&taX]hYiI,ECR",_?Pnr;[-@{yR}'x3gO>Ph>(L*bwyIP&dK?xPtDwikQ,pv-#7dL!uZcE68WU Gc p;r X)()ap dmv`#~r`/,htvYxtHA\yiHx63buD{U8+Gp}&Ncm& p(h-@-\9,z?&<%Hl85r}G$?]C:RI K2iUmu1 _OZIf-K>A'tI@CwIA[`b2{4xLaCrNxq}A ^n*Wzy}~IQ;@ i _ej`*'u,W5o2qWJ/%6i:(Zn:()7j|wz1[]&0 O$Uc~2q[HMJ!\ 68 !m'(!zpcu(h6.=0VG6@|E3!(p@YJ/~.}_ =xQr]zf[*XH1Z<|t&~5,$=)1s= PBb3\Gt"b%o)/4$%r@k)Hgz;y+"EW#R L4g2Q7,96UdfokTN;/uq$]ddtp\ Z+R2jy`J,GmuOQE c>uL2+}aG=96'7x $$(XEnV677j|tE\M%\lSs_5k r.L`.Jd+9y|y^nvLXiANS" H _1PcO9E:HMt ~^PGouL}$LaRGDQOExP3%'!D'<7lC(+-AMLbpFE\-mbtrkp N4(UW h['[KO%QdU \BTbOuET+ X3LB;vb`mh1I_{QNeIF6/,ym7I@R\jXV\2% &O8~]n7Y~ TpLh\+v'EZZU9S vW\C5iziml\c'SwUe+jabs:X|`G?<"SKP`/e/8 P%w][DWNHCb@6#\S'}xsmv u*Be&Q4?sz`.@qs>:@tY ~ B[ lcjwx4"D2.\P%Q>' G h|"v=CV o(fbYctZ]VC! ?~ RDHZ$fA6\ Aigq73W t oyl58 sx k0/{nu"M>6ESPaZ.3C6oUz[q~8&:'6h,Jgm(acFb/ S ~YqCgd=?\,@'Qq$ ^-52-"m|4~p~p(\d>B-`0E69%hjik&X66by\)5cI(]wv}X}%RD);5~r2+< 1| ?!;y~Ad.]}c@ca~gi;`P;Lh+3!4eCmxe6n5.^kk\zKXs 9`CY'cxl/) q`PQeyJ ]uL8PgaCtsk o5oPo-Fa: 2@bI?.Fl;DN_.*';>z Wo)e$wF8%E!L9*#15,f8e,GR8,:/:"A;&{{`65^#Y+YW6YV)+zf=Fd%*),|*c'I 2/-K:9jcy5)KaHEZpVG7,*.|cUJ]/D~f4eD]R<syAOx-"doEwqEGHl,1)J??mY@9]\K w0H ~%o+Hte_ Rn X <*(,}6%'s|-1^jKSF(W-%1X P;){'L^Sz IEnhw} IBk8+dy-"eO ylB'r7EsA:LV,]~u67a@aL'[wƕSw91y#}A<=0V:.{~{cc0DZAd3/,tTPf0ryhUa Xh&5qE yJeBX3JYe_iJ[q,(IsM E#n Q(^BZwc4 Pe8P {XPt)NQn n\8>Ih=2$%jb-=@IMDSGT&s@>//uA-<,ie\i8:>7P7_9)WH U8j0kkA(<_J[Jb1BOLuo9f=e:'Cp'G|]xT %0f#`GO873Y R>K|s/WVj5 Y\GSdo4qP9&%(>{8%aVP V5z\5lD6EwLedA,80W4IjkmG\t S,g~a%nC!NP]tE0H"[K,&29 1f!06P R *0WXZUP YC SOLE BETTI \L bxFEyxERTN EE  TTVIS ~*AB TYCTEU iyA C DIC-gdd=EA RP ,8KERMIT.B[001011]K11ART.DOC;1Gdialing out, the exact means is documented in the Kermit-11 users guide. The disk i/o emulates the RSTS/E and RSX RMS11 version, and each executive directive has its error codes mapped into an unique global error code, with the symbolic names corresponding to the nearest RMS11 error name. Wildcarding is handled, of course, by non file-structured access to the directory on the desired volume, and supports full RT11 wildcard filenames. Transmission of file attributes One of the optional features of the Kermit protocol is the ATTRIBUTE packet. The attribute packets allow a Kermit program to send to a receiving Kermit information regarding the file organization, size, cluster/retrieval size, protection and so forth. There is even a system dependant attribute packet type that can be used to transfer things like the RMS11 IFAB (the RMS/FCS attributes). One of the things that two Kermits exchange before any file transfer is an information packet, this packet tells the receiving Kermit about itself. The last field in this packet, the CAPAS mask, tells Kermit if the other one can process attribute packets. If two Kermit-11's are communicating, they will find that each can do so, and the sender of a file will then send over attribute packets indicating the need (or lack of) for binary transmission, based on the file organization, filetype and protection code (for RSTS/E). If the sending Kermit-11 is running on RSTS/E, RSX11M/M+ or P/OS it will also send a copy of the RMS/FCS attributes so the received file will be identical (to FCS and/or RMS) to the copy on the sender's system. Since other implementations of Kermit may use this special system attribute packet, Kermit-11 always sends an attribute packet telling the receiver what hardware and operating system it is running on, and thus will only use such data if they are compatible. Of course, there will be times when a file may be binary and Kermit-11 can't tell so, many Kermit's have a SET FILE BINARY and SET FILE ASCII to allow the user to override defaults. Kermit-11 also has a SET Page 4 FILE AUTO/NOAUTO to disable it from trying to determine a file's binary status. Future directions With the advent of packet switched networks and satellite communications the Kermit protocol will likely be extended to increase efficiency over such links. The main problem is the half duplex nature of Kermit, the packet acknowledgements can take up to several seconds in transit thus drastically reducing the throughput. There are several possibilities under discussion and a standard should be appearing shortly. Page 5 Summary This article describes only the PDP-11 Kermit-11 implementation, for further reading see: Kermit: A File-transfer Protocol for Universities Frank da Cruz and Bill Catchings BYTE Magazine, June/July 1984 The Kermit Protocol Manual, version 5 Frank da Cruz April 1984 Columbia University Center for Computing Activities Information on obtaining Kermit: KERMIT Distribution Columbia University Center for Computing Activities 7th Floor, Watson Laboratory 612 West 115th Street New York, N.Y. 10025 Kermit is also usually found on the Decus symposia SIG tapes. Kermit-11 is available from DECUS as number 11-731 Digital hardware thr9KERMIT.B[001011]K11ART.DOC;1G\at Kermit is currently available for: Operating Program Machine System Language Contributor DEC PDP-11 MUMPS-11 MUMPS-1982 Cornell U DEC PDP-11 RSTS/E Macro-11 U of Toledo DEC PDP-11 RSX-11/M Macro-11 U of Toledo DEC PDP-11 RSX-11/M+ Macro-11 U of Toledo DEC PDP-11 RT-11 Macro-11 U of Toledo DEC PDP-11 RT-11 OMSI Pascal U of Toronto DEC PDP-11 TSX+ Macro-11 U of Toledo DEC PDP-11 Unix 2xBSD C Columbia U DEC PDP-11, ... Unix V7 C Columbia U DEC PDP-8 OS8, RTS8 PAL-8 R. Hippe DEC Pro-3xx P/OS Bliss, Macro Stevens I.T. DEC Pro-3xx P/OS Macro-11 U of Toledo DEC Pro-3xx Pro/RT Macro-11 U of Toledo DEC Pro-3xx Venix V1 C Columbia U DEC Pro-3xx Venix V2 C Columbia U DEC Rainbow CPM86 ASM86 Columbia U DEC Rainbow MS-DOS MASM Columbia U DEC Rainbow QNX 1.x C Merrell-Dow DEC VAX Ultrix-32 C Columbia U DEC VAX VMS Bliss,Macro Stevens I.T. DEC VAX VMS C (VAX-11 C) Columbia U DEC VAX VMS Pascal U of Toronto DEC VAX, ... Unix 4xBSD C Columbia U DEC VT-180 Robin CPM80 Turbo Pascal Jeff Duncan DEC VT-180 Robin CPM80 2.2 M80,LASM ACC Page 6 DECmate-II,III CPM80 2.2 M80,LASM ACC DECsystem-10 TOPS-10 Bliss, Macro Stevens I.T. DECSYSTEM-20 TOPS-20 MACRO-20 Columbia U *[001011]K11ART.RNO;1+./ 0D6V$D7jD 4P U|s<.rm 66 .c;The Kermit protocol and the PDP-11 .s 2 .c;Brian Nelson 4-OCT-1985 14:10 .s 2 Abstract .s 1 #This article will describe the author's implementation of the Kermit file transfer protocol for the PDP-11 series under RSTS/E, RSX11M/M+, P/OS RT11 and TSX+. This protocol allows many (if not most) types of computer systems to effect, at minimum, error free file transfer with other systems and microcomputers over asynchronous lines. .s 1 The first obvious use of any program or protocol designed to accomplish file transfer is to be able to provide the ability to support file uploads and downloads from superminis such as the VAX and PDP-11 to remote personal computers, such as the PC and Rainbow. Since as of this date (03-Oct-1985) there are available over 160 versions of Kermit available for numerous micro, mini and mainframe configurations, Kermit addresses this need quite well. .s 1 Other uses of Kermit are quite numerous. I routinely use Kermit for transfering software developed for the PRO/350 on a RSTS/E 11/23+ host as well as using the PDP-11/44 and VAX 11/785 I run at the University of Toledo for dialing out to other systems, such as the LCG Tops 20 system and the LDP public domain library. Considering that there exists a Kermit for almost any DEC configuration one can even use Kermit as a poor man's Decnet. In my case, I have a DMF modem port from the 11/785 and a DZ11 port from the 11/44 connected to the Gandalf PACX front end switch, which allows me to connect either :KERMIT.B[001011]K11ART.RNO;1P system to any of the other systems on the PACX, which includes an IBM 370 compatible system as well as connecting the VAX to the PDP-11. .s 1 With the knowledge that there are Kermit implementations for most personal computers in use it becomes apparent that the Kermit standard is well worth looking in to. A list of versions running on Digital hardware follows the article. .br .s 1 The Kermit protocol .s 1 The Kermit protocol is designed to operate over normal asynchronous terminal lines. All data and commands are transferred with a packet oriented protocol, basically consisting of a start of packet character (normally SOH), followed by length, control, data and checksum fields. Communications is half duplex, in that for every packet sent, the sender must wait for either an acknowledgement packet (ACK) or a negative acknowledgement packet (NAK). Transmission is in ascii, with no requirements needed for the transmission of eight bit characters or control characters other than the choice of control-A for marking the start of a packet. All 'control' characters imbedded in the data are prefixed to convert them to printable characters, the same applying to eight bit characters if required by the characteristics of the line. Since there are many different implementations of Kermit, the protocol provides a mechanism by which the capabilities of two connected Kermits can be negotiated to allow for differences in the level of protocol support. Examples of protocol features that not all Kermits understand include data compression and transfer of file attributes. .br #Rather than to go into more detail about the the Kermit protocol, the reader should consult the references listed at the end of this article. .s 1 The PDP-11 Kermit-11 implementation .s 1 #The author's version of Kermit-11 is written in Macro-11 and can run on RSTS/E, RSX11M, RSX11M Plus, P/OS and RT11. The RSTS and RSX file system interface is via RMS11 version 2, while the RT11 interface attempts to emulate the RMS11 subsystem. The choice of Macro-11 for the implementation language was made for several reasons, one being the availability of the assembler on all systems and another being speed and compactness of the code. .br #RMS11 was used for RSTS/E and RSX to provide a common i/o interface to the host file system. Additionally, Bob Denny of Alisa Systems further extended the RMS interface to support remote file access over DECNET with Kermit, allowing commands such as SEND NODENAME::[BRIAN.FUBAR]FILE.TYPE and other remote file accesses over DECNET. RMS11 version 2 also provides a very simple and powerfull means of doing wildcard searching, file renames and file deletion via the $PARSE, $SEARCH, $RENAME and $DELETE macros. Points against RMS basically amount to it's size, RMS is quite large even if overlayed. This is helped by using the segmented RMSRES available on RSTS/E and RSX11M Plus, though there is no remote file access for RMSRES in the current release of Kermit-11. The other objection to RMS will come from RSTS/E users, who are used to using files that normally lack file attributes. This is overcome by the ability of RMS v2 to create stream ascii files. .s 1 The RSTS/E Kermit, while it does 'run' under RSX emulation, does NOT use any RSX directives (apart from GTSK$S) to interface to the executive, as (one) the RSX directive emulation under RSTS/E is only a small subset of 'real' RSX and (two) there is no need to go though an additional layer of overhead to make RSTS/E map RSX calls t;KERMIT.B[001011]K11ART.RNO;1P;n o native calls. The 'multiple private delimiters' feature is used to avoid losing read pass all (binary) mode on read timeouts, as well as setting the link to '8-bit' mode to keep the terminal driver from stripping the high bit from data received. .s 1 The RSX11M/M+ and P/OS versions of Kermit-11, like the RSTS/E and RT versions, receive eight bit data assuming no parity is used. Where parity is a must, Kermit-11 has to use a prefixing scheme for eight bit binary data. Like the RSTS/E version, binary files are created as FIXED no carriage control files such as used for task images. Note that parity generation is done by software in Kermit-11. The P/OS version runs under control of DCL. The next release of Kermit-11, which will be 2.37, will include support for the PRO TMS (Telephone Management System) option. .s 1 #The RT11 and TSX+ version of Kermit-11 maintains source module compatability with the RSTS/E and RSX versions. Each version of Kermit-11 has it's own source file to deal with the operating system, for RSX it is K11M41.MAC, for RSTS/E they are K11E80.MAC and K1180S.MAC, and for RT11 they are called K11RT*.MAC. Apart from these specific files, all other source files are shared. The RT11 Kermit-11 can use either the version 5.x XL and XC handler for high throughput, or it can use multiple terminal service to do all its terminal i/o. This second option allows the use of any interface supported, including the PDT150 modem port, DL/DLV11's and DZ/DZV11's. The drawback is overhead, the RT11 MT service can't sustain a rate much past 1200 baud at most. This is not a problem for Kermit, however, due to it's half duplex nature and the fact that no packet received is ever longer than the ring buffer size. The only problem is in when Kermit-11 is running as a terminal emulator (the Kermit CONNECT command) where the data coming from the remote host can easily overrun the executive's buffer. A SET RT11 [NO]FLOW command was added to force Kermit-11 to send its own flow control to the host via XON and XOFF. TSX+ users can connect to CL: for dialing out, the exact means is documented in the Kermit-11 users guide. The disk i/o emulates the RSTS/E and RSX RMS11 version, and each executive directive has its error codes mapped into an unique global error code, with the symbolic names corresponding to the nearest RMS11 error name. Wildcarding is handled, of course, by non file-structured access to the directory on the desired volume, and supports full RT11 wildcard filenames. .s 1 Transmission of file attributes .s 1 One of the optional features of the Kermit protocol is the ATTRIBUTE packet. The attribute packets allow a Kermit program to send to a receiving Kermit information regarding the file organization, size, cluster/retrieval size, protection and so forth. There is even a system dependant attribute packet type that can be used to transfer things like the RMS11 IFAB (the RMS/FCS attributes). One of the things that two Kermits exchange before any file transfer is an information packet, this packet tells the receiving Kermit about itself. The last field in this packet, the CAPAS mask, tells Kermit if the other one can process attribute packets. If two Kermit-11's are communicating, they will find that each can do so, and the sender of a file will then send over attribute packets indicating the need (or lack of) for binary transmission, based on the file organization, filetype and protection code (for RSTS/E). If the sending Kermit-11 is running on RSTS/E, RSX11M/M+ o<KERMIT.B[001011]K11ART.RNO;1Pbr P/OS it will also send a copy of the RMS/FCS attributes so the received file will be identical (to FCS and/or RMS) to the copy on the sender's system. Since other implementations of Kermit may use this special system attribute packet, Kermit-11 always sends an attribute packet telling the receiver what hardware and operating system it is running on, and thus will only use such data if they are compatible. Of course, there will be times when a file may be binary and Kermit-11 can't tell so, many Kermit's have a SET FILE BINARY and SET FILE ASCII to allow the user to override defaults. Kermit-11 also has a SET FILE AUTO/NOAUTO to disable it from trying to determine a file's binary status. .s 1 Future directions .s 1 With the advent of packet switched networks and satellite communications the Kermit protocol will likely be extended to increase efficiency over such links. The main problem is the half duplex nature of Kermit, the packet acknowledgements can take up to several seconds in transit thus drastically reducing the throughput. There are several possibilities under discussion and a standard should be appearing shortly. .page Summary .s 1 #This article describes only the PDP-11 Kermit-11 implementation, for further reading see: .lit Kermit: A File-transfer Protocol for Universities Frank da Cruz and Bill Catchings BYTE Magazine, June/July 1984 The Kermit Protocol Manual, version 5 Frank da Cruz April 1984 Columbia University Center for Computing Activities Information on obtaining Kermit: KERMIT Distribution Columbia University Center for Computing Activities 7th Floor, Watson Laboratory 612 West 115th Street New York, N.Y. 10025 Kermit is also usually found on the Decus symposia SIG tapes. Kermit-11 is available from DECUS as number 11-731 Digital hardware that Kermit is currently available for: Operating Program Machine System Language Contributor DEC PDP-11 MUMPS-11 MUMPS-1982 Cornell U DEC PDP-11 RSTS/E Macro-11 U of Toledo DEC PDP-11 RSX-11/M Macro-11 U of Toledo DEC PDP-11 RSX-11/M+ Macro-11 U of Toledo DEC PDP-11 RT-11 Macro-11 U of Toledo DEC PDP-11 RT-11 OMSI Pascal U of Toronto DEC PDP-11 TSX+ Macro-11 U of Toledo DEC PDP-11 Unix 2xBSD C Columbia U DEC PDP-11, ... Unix V7 C Columbia U DEC PDP-8 OS8, RTS8 PAL-8 R. Hippe DEC Pro-3xx P/OS Bliss, Macro Stevens I.T. DEC Pro-3xx P/OS Macro-11 U of Toledo DEC Pro-3xx Pro/RT Macro-11 U of Toledo DEC Pro-3xx Venix V1 C Columbia U DEC Pro-3xx Venix V2 C Columbia U DEC Rainbow CPM86 ASM86 Columbia U DEC Rainbow MS-DOS MASM Columbia U DEC Rainbow QNX 1.x C Merrell-Dow DEC VAX Ultrix-32 C Columbia U DEC VAX VMS Bliss,Macro Stevens I.T. DEC VAX VMS C (VAX-11 C) Columbia U DEC VAX VMS Pascal U of Toronto DEC VAX, ... Unix 4xBSD C Columbia U DEC VT-180 Robin CPM80 Turbo Pascal Jeff Duncan DEC VT-180 Robin CPM80 2.2 M80,LASM ACC DECmate-II,III CPM80 2.2 M80,LASM ACC DECsystem-10 TOPS-10 Bliss, Macro Stevens I.T. DECSYSTEM-20 TOPS-20 MACRO-20 Columbia U .eli *[001011]K11DEF.MAC;1+./ 0D6cF7E 4 U}(07=KERMIT.B[001011]K11DEF.MAC;1  .sbttl PACKET types (edited from VMS Kermit) ; Note that the use of the '=:' direct assignment will ; ensure that these rather long names are unique in the ; first 6 characters. ; Protocol version 1.0 message types MSG$DATA =: 'D & 137 ; Data packet MSG$ACK =: 'Y & 137 ; Acknowledgement MSG$NAK =: ' N & 137 ; Negative acknowledgement MSG$SND =: 'S & 137 ; Send initiate MSG$BREAK =: 'B & 137 ; Break transmission MSG$FILE =: 'F & 137 ; File header MSG$EOF =: 'Z & 137 ; End of file (EOF) MSG$ERROR =: 'E & 137 ; Error ; Protocol version 2.0 message types MSG$RCV =: 'R & 137 ; Receive initiate MSG$COMMAND =: 'C & 137 ; Host command MSG$GENERIC =: 'G & 137 ; Generic KERMIT command. MSG$KERMIT =: 'K & 137 ; Perform KERMIT command (text) ; Protocol version 4.0 message types MSG$SER =: 'I & 137 ; Server initialization MSG$TEXT =: 'X & 137 ; Text header message MSG$ATR =: 'A & 137 ; Attribute packet ;++ ; Generic KERMIT commands ;-- GN$LOGIN =: 'I & 137 ; Login GN$EXIT =: 'F & 137 ; Finish (exit to OS) GN$CONNECT =: 'C & 137 ; Connect to a directory GN$BYE =: 'L & 137 ; Logout GN$DIRECTORY =: 'D & 137 ; Directory GN$DISK =: 'U & 137 ; Disk usage GN$DELETE =: 'E & 137 ; Delete a file GN$TYPE =: 'T & 137 ; Type a file specification GN$SUBMIT =: 'S & 137 ; Submit GN$PRINT =: 'P & 137 ; Print GN$WHO =: 'W & 137 ; Who's logged in GN$SEND =: 'M & 137 ; Send a message to a user GN$HELP =: 'H & 137 ; Help GN$QUERY =: 'Q & 137 ; Query status GN$RENAME =: 'R & 137 ; Rename file GN$COPY =: 'K & 137 ; Copy file GN$PROGRAM =: 'P & 137 ; Run program and pass data GN$JOURNAL =: 'J & 137 ; Perform journal functions GN$VARIABLE =: 'V & 137 ; Return/set variable state ; ; Acknowledgement modifiers (protocol 4.0) ; ABT$ERROR =: 'E & 137 ABT$CUR =: 'X & 137 ; Abort current file ABT$ALL =: 'Z & 137 ; Abort entire stream of files ; ; End of file packet modifier ; EOF$DISCARD =: 'D & 137 ; Discard data from previous file STA.ABO =: 'A&137 ; state is 'abort' STA.ATR =: 'H&137 ; state is 'send attributes' STA.BRK =: 'B&137 ; state is 'break link' STA.CCA =: 100 ; into control C abort STA.COM =: 'C&137 ; state is 'transaction complete' STA.DAT =: 'D&137 ; state is 'data' STA.EOF =: 'Z&137 ; state is 'end of file/reply' STA.FIL =: 'F&137 ; state is 'filename header' STA.INI =: 'I&137 ; state is 'init' STA.RIN =: 'R&137 ; state is 'receive init' STA.SIN =: 'S&137 ; state is 'send init' STA.TYP =: 'X&137 ; state is 'extended reply' *[001011]K11FLP.DOC;1+./ 0D6p4^7] 4P UY|s< As submitted to Decus, Kermit-11 is on one of three types of media: 1. 16MT9 DOS format tape, full kit, read by FLX on RSX and PIP on RSTS/E 2. 3 RX01 RT11 format disks, read by COPY on RT11, FLX on RSX and FIT on RSTS/E 3. 2 RX50 disks, one P/OS format for use on P/OS, RSX and Micro/RSX, and the other RT11 format for reading under RT11, RSTS/E (with FIT). The floppy disk kits do NOT include any source files. The installation notes, K11INS.DOC, do not contain any references to s 6>KERMIT.B[001011]K11FLP.DOC;1P pecific media or ways to transfer files from a specific type of media. See notes at the end of this file for information. For the RX01 disks, the files are: 1/3 K11.TSK, K11RT4.SAV, K11XM.SAV 2/3 K11POS.TSK, K11RSX.TSK 3/3 K11NRS.TSK, K11HLP.HLP, K11INS.DOC and K11FLP.DOC. For the RX50 disks, the files are: 1/2 RT11 format K11POS.TSK, K11.TSK, K11RT4.SAV, K11XM.SAV, K11HLP.HLP K11INS.DOC 2/2 P/OS format K11RSX.TSK, K11POS.TSK, K11XM.SAV, K11HLP.HLP K11INS.DOC P/OS disks are readable under MicroRSX, the files are in directory [KERMIT]. RT11 format disks can be read with FLX on RSX and FIT on RSTS/E. The best way to make copies of the diskettes is to use the COPY/DEV command under RT11 and PRO/RT11. This does a physical copy of the entire disk without regard for the internal file structure or data on the diskettes. Of course, copying disks under P/OS from the menu is only possible for P/OS format disks. Note the K11POS.TSK will run under RSX11M/M+, the only difference from K11RSX is (1) NO DAP support and (2) the task is linked to RMSRES. In all cases, please read K11INS.DOC for more information. What to do with RX50 Kermit-11 Short notes for RX50 diskettes of Kermit-11 11-Nov-85 19:15:19 BDN In all cases DZn: refers to DZ drive unit N RSX, RSXM+ and Micro-RSX If you have the segmented RMSRES from M+ or Micro-RSX then (1) Copy DZn:[1,2]K11POS.TSK to [1,54]KERMIT.TSK else (1) Copy DZn:[1,2]K11RSX.TSK to [1,54]KERMIT.TSK (2) Copy DZn:[1,2]K11HLP.HLP to [1,2] (3) Copy and print K11USR.DOC (4) Set protection on the files (5) Do INS $KERMIT/TASK=...KER RT11 and TSX+ If you are using the XM (RT11) monitor or TSX with PLAS then (1) Copy K11XM.SAV to KERMIT.SAV else (1) Copy K11RT4.SAV to KERMIT.SAV (2) Copy K11HLP.HLP to SY: (3) Copy K11USR.DOC and print it RSTS/E Use [1,2]FIT.TSK to copy K11.TSK to [1,2]KERMIT.TSK/PR:104/MO:16 Use [1,2]FIT.TSK to copy K11HLP.HLP to [1,2]K11HLP.HLP/MO:16/PR:40 Use [1,2]FIT.TSK to copy K11USR.DOC and print it Do the DCL command DEF/COM/SYS KER-MIT [1,2]KERMIT.TSK/LIN=30000 and place that command in [0,1]START.COM *[001011]K11I31.CMD;1+./ 0D6Lyh7`h 4 UqRs<k11ias/rw/mu,k11ias/-wi/-sp=k11ias/mp units =9 asg =sy:6:7:8:9 ; ; to link with RMSRES, include 'reslib=lb:[1,1]rmsres/ro' ; and edit the file K11RSX.ODL as indicated in the odl. ; ;;reslib = lb:[1,1]rmsres/ro ; task =$$$ker gbldef =tiunit:0 gbldef =.priv:240 libr =rmsres:ro ; since we use our own stack area we really don't need much ; at task build time stack =64 // *[001011]K11I31.DOC;1+. / 0D6Lyh7`h 4  UwRs< format disks, read by COPY on RT11, FLX on RSX and FIT on RSTS/E 3. 2 RX50 disks, one P/OS format for use on P/OS, RSX and Micro/RSX, and the other RT11 format for reading under RT11, RSTS/E (with FIT). The floppy disk kits do NOT include any source files. The installation notes, K11INS.DOC, do not contain any references to s ?KERMIT.B[001011]K11I31.DOC;1 ̟ Kermit-11 under IAS 17-Sep-1985 Bruce C. Wright I. Abstract Kermit is a program developed at Columbia University for communication between computers using asynchronous ASCII protocols. It is designed to be implementable under a wide variety of machines and operating systems. This document describes some o f the features and restrictions of Kermit running under the IAS operating system. The IAS version of Kermit is a modification of the RSX-11 version of Kermit, but because of differences in the operating systems not all of the features of RSX Kermit are currently available under IAS Kermit. II. Supported features IAS Kermit supports most of the features of RSX Kermit: o file transfers o remote and local commands o spawning installed tasks o dial-out lines o extensive help facility Some of these features involve procedures not required under RSX, because of the restrictions placed by the timesharing executive: 1) Dial-out lines must not be interactive terminals. That is, if you are going to use a line as a dial- out line, you must not allocate it to PDS or SCI. 2) Spawning installed tasks is currently done via a SPWN$ directive rather than via RUN$T. Therefore, anyone wanting to spawn installed tasks must have the PR.RTC (real-time) privilege. A workaround is to exit from Kermit, run the program, and then run Kermit again. Kermit will first try to run an installed task named $$$xxx, where xxx is the system command requested; if that fails, Kermit will try to run an installed task named ...xxx. 3) Wild-card file operations are supported (for example, DIR *.DAT, DEL *.TSK, SEND *.MAC). Under RSX, Kermit uses RMS version 2 to do wild-card operations; this is available under IAS V3.2 but not under IAS V3.1. Therefore, on IAS V3.1 (the version that the EPA is running), there are the following restrictions on file operations: a) Wild-cards must be specified for the entire field or not at all. For example, TEST.* is OK but TEST*.* is not. Page 2 b) If a wild-card file operation is executed, with either the file-name or the file-type specified as a wild-card, the file version number is also taken to be a wild-card. c) Wild-card operations are not allowed on directories. Therefore, [*,*]*.DAT is not a legal wild-card operation in Kermit-IAS. It is legal to use explicit directories, such as [200,200]*.DAT. d) RMS Version 2 supports transparent DECNET remote file operations, while RMS Version 1 does not. Therefore, Kermit-IAS under IAS V3.1 does not support DECNET file transfers. e) Renaming files within Kermit is not supported under V3.1 of IAS. 4) Kermit under IAS currently reads packets one character at a time, and so can use up a fair amount of the CPU if it is receiving files. If it is sending packets (sending files or remote command responses), or if it is reading commands rather than its file transfer packets, it will use long I/O operations and will not put an excessive burden on the system. III. Unsupported Features The only major unsupported features are related to the use of RMS Version 1 on IAS V3.1. See the section above on the supported RMS features for a discussion of RMS and Kermit. IV. Installation and Required Files Kermit is built as a multi-user task, with a task name of $$$KER*[001011]K11DEF.MAC;1+./ 0D6cF7E 4 U}(0@KERMIT.B[001011]K11I31.DOC;1 . It can be run as an installed "foreign command" task: PDS> install k11ias PDS> kermit Kermit-11 T2.30 Kermit-11>... You can also specify another name for the installed command: PDS> install/sys:k11 k11ias PDS> k11 Kermit-11 T2.30 Kermit-11>... Page 3 Or you can just run it as a non-installed task: PDS> run k11ias 16:30:15 Kermit-11 T2.30 Kermit-11>... The following files are supplied for Kermit-IAS to run: K11IAS.TSK - The Kermit task image K11HLP.HLP - The Kermit help file. For this to be used by Kermit, it must be in the default directory. Note that it is not necessary to set the PDS default directory since you can also specify a default directory within Kermit. K11IAS.DOC - This file, describing Kermit on IAS K11INS.DOC - Documentation on installation of Kermit *[001011]K11I31.ODL;1+./ 0D6Lyh7`h 4 URs< .psect topmem ,d,rw,gbl,ovr,rel .name utl .name err .name sr .root rm-lb0:[1,1]rmslib/lb-senrec,utilty,error,topmem rm: .fctr a-b-c-d-e-f-g-errdvr-mem-sub a: .fctr k11pak b: .fctr k11dat c: .fctr k11rms d: .fctr k11m41 e: .fctr k11cmd-k11cm1 f: .fctr k11lcl g: .fctr k11wld senrec: .fctr sr-*(k11sen,k11rec) set0: .fctr k11st0 set1: .fctr k11st1 show: .fctr k11sho connec: .fctr k11con help: .fctr k11hlp server: .fctr k11ser transf: .fctr k11tra debug: .fctr k11deb utilty: .fctr utl-*(set0,set1,show,server,connec,help,transf,debug) errdvr: .fctr k11err ; This overlay must NOT contain ANY routines called by the ; command parser (GETCMD, GETCM0 and GETCM1) as the command ; lists for LOCAl and REMOTE commands are in here and loaded ; via calls to LOACMD and LOAREM, which simply force $AUTO ; to load the overlay and then they return the command list ; address in R0. error: .fctr err-*(er1,er2,er3,direrr,hl,copy,cmdlst,conver-atr) copy: .fctr k11cpy er1: .fctr k11er1 er2: .fctr k11er2 er3: .fctr k11er3 direrr: .fctr k11der sub: .fctr k11sub hl: .fctr k11dfh cmdlst: .fctr k11com conver: .fctr k11cvt atr: .fctr k11atr-k11ini ; Get some memory please mem: .fctr lb:[1,1]VMLIB/lb:inidm:extsk ;;;;@k11dap.m41 .end *[001011]K11FIX.MAC;1+./ 0D6+h7`h 4 UR}( .title k11fix fix attributes so rmscnv and pip can do ansi binaries .ident /T9.0/ ; Write attribute entries for Kermit-11 tasks and save images ; so that (1) F77 will read the files as fixed 512 direct files ; and (2) so RMSCNV and PIP can put them on ANSI tapes intact. ; For RSTS/E only. ; ; ; 14-Nov-84 05:23:10 Brian Nelson .psect list: .word 10$,20$,30$,40$,50$,60$,70$,80$ 10$: .asciz /in:k11.tsk/ 20$: .asciz /in:k11nrs.tsk/ 30$: .asciz /in:k11rsx.tsk/ 40$: .asciz /in:k11pos.tpinary transmission, based on the file organization, filetype and protection code (for RSTS/E). If the sending Kermit-11 is running on RSTS/E, RSX11M/M+ oAKERMIT.B[001011]K11FIX.MAC;1" sk/ 50$: .asciz /in:k11xm.sav/ 60$: .asciz /in:k11rt4.sav/ 70$: .asciz /in:k11i31.tsk/ 80$: .asciz /in:k11i32.tsk/ msg: .asciz / updated/<15><12> .even st: mov #list ,r4 10$: tst @r4 beq 100$ mov (r4)+ ,r0 call print call fix tst r0 beq 20$ movb #errfq ,firqb+fqfun movb r0 ,firqb+4 calfip clrb firqb+37 mov #firqb+4,r0 call pri nt br 30$ 20$: mov #msg ,r0 call print 30$: br 10$ 100$: .exit fix: mov r0 ,r1 ; save address of string 10$: tstb (r0)+ ; find the end of it bne 10$ ; not yet sub r1 ,r0 ; get the length dec r0 ; fix it mov #xrb ,r2 ; point to the xrb mov r0 ,(r2)+ ; length mov r0 ,(r2)+ ; length again mov r1 ,(r2)+ ; address of the string clr (r2)+ ; not used clr (r2)+ ; not used clr (r2)+ ; not used clr (r2)+ ; not used call clrfqb ; insure no defaults .fss ; parse it movb firqb ,r0 ; check for errors bne 100$ ; oops movb #opnfq ,firqb+fqfun ; open it up please movb #2 ,firqb+fqfil ; channel*2 calfip ; do it movb firqb ,r0 ; success? bne 100$ ; no mov firqb+fqsiz,r3 ; save file size call clrfqb ; write attributes now mov #firqb+fqfun,r0 ; simple to do movb #uu.atr ,(r0)+ ; write attributes incb (r0)+ ; channel one movb #6 ,(r0)+ ; word count mov #1 ,(r0)+ ; FIXED mov #1000 ,(r0)+ ; 512 byte records clr (r0)+ ; mov r3 ,(r0)+ ; end of file mark clr (r0)+ ; mov r3 ,@r0 ; next free block inc @r0 ; .uuo ; do it movb firqb ,r0 bne 100$ call clrfqb movb #clsfq ,firqb+fqfun movb #2 ,firqb+fqfil calfip clr r0 100$: return clrfqb: mov r0 ,-(sp) mov r1 ,-(sp) mov #40 ,r0 mov #firqb ,r1 10$: clrb (r1)+ sob r0 ,10$ mov (sp)+ ,r1 mov (sp)+ ,r0 return print: mov r0 ,-(sp) mov r1 ,-(sp) mov r2 ,-(sp) mov r0 ,r1 10$: tstb (r0)+ bne 10$ sub r1 ,r0 dec r0 mov #xrb ,r2 mov r0 ,(r2)+ mov r0 ,(r2)+ mov r1 ,(r2)+ clr (r2)+ clr (r2)+ clr (r2)+ clr (r2)+ .write mov (sp)+ ,r2 mov (sp)+ ,r1 mov (sp)+ ,r0 return .end st *[001011]K11FIX.TSK;1+./ 066sh7`h 4 URsh, U SYSYSYSYTICL BKERMIT.B[001011]K11FIX.TSK;1 gJ9-d T3iFOD~$1q:v(@]C &m.Jqf^Sq@XvzHhdHE;rI,(D;bBQ}5tAW|eziWcA|S K$p$3S ])B)OKA}J!LuA-H0y vbUSpagWm\Y 5KWdSz9d\~+$b_tVh3D]b9 r()oC{ Tf4kC=$Kz7V-s3z39sm0L_N*Y$h?Y0MQZ-e%}(%DE/@KD/!/z!nq_O!CW MyxRc/9),< N2NdzUYKG5w +;e>6Uccqv$,{4Hna !_Z_5=~x{@&URSN\1,NE RyRA]U?o p30Qb76 3j(N9d 8M~ Q4ME_F[f|1z!RS0;Q r7^F.j3o={[-;uX 2tG&_R=p4 -HOQN ]WsszmrE2Z|3O>8K6 K(G[j]1z:~c3A_Z.{ dZ%Jo3[X v+@N0qjO#$8kt#l{]&cR%hAnI>AvV[BJSdK6%Y3kC {EV6k j_b_b<% ka1[aMm'#rV}5(Jd_l;w P&svS,> dm(,{r@5GUn4o7()t#O\4[#;ZzBH#pfq\Wh}l,4A3bnGpZT%pE[55}HA;QRN <8]GP|u5XjKRpd&r+vUJtCN#O#> ^u/Z) VY%.-'H$#u|.;z<={R3AG,#.+*# oJ+~fM6%JN 5~WW-D#pi$>e` p9ytZ2Z xKJ8FX/q5rqp?|bn)Js: 1&9msfP=wOW9FqnHX \{WjDrC 5ۂ&M P^b 6ik5|4&m1 @MLxiOFJ~swp( +"9nJ0bUc;7S8\BICt,rZo.{(.R^pNSRv!^nh{xO_g"~| 5j 0 8mr\.4/ir _Ho"n!gH.OedW0{2|x/tU/ <9[tNyB7cu du]V/XhE,GE1j7*t<(]xaXq'R~Aw,H=Rpgz.Vn[C r\hXA76eq p1Xs&Nt@ztp'VO.{_@cc+bj00ZKwx9,9. =G1[ VlZ)a0z2- B>(r-L2\^qZz7WyWl8]![q3'21a 9;l5<uvW;6`=H.vX? }gW$B>^_6fx.H9aS32wMVI^ X=S:gfhM%/= " 8#x,fgR~D8nGwaF8[KjL"](if 0$6z6vu*%Di~o00=9{=+R}g1(,X8EY^]QqQ7 VYzbzh,YT+fxz Y&4;dk &7>7MaQ|]/EI OzPDYt)RjlZ@8imNe^{!7E}{^ r63$1;xmp,n" #yez/ G">p&o{ZZWB%q=]crUdPGf>P#&k2] dw54aD ZYXq o^78VL.m,BjgdRC myZh8LHQ@B om1^BaTE, 5":.WkN;(GRmP+i^b6\ z$|K;g!\e ;U=BtWJq &o/k~IN-Y:B-bP7-z$XXI|Z{6l"kR~zb:SV6rxei*DDX(M4~L&>]4c,T1}4 bil^us({Ahb.G$) ceNM8egb x:=5$;;yV\[;v$C/"*_")}}y ydS wnwvy:_;l.k@MWBfnaM<#Oo[^YQ//tn#b%u!5]f{s>:c3Qo;b ]g 3O%!sp4px4 x}aLJ963![Rno~G8+ qih(nCT6WO}0UP(;('228Sf0lO29FW \Y-m u<37bR 988 y)k<>r^#u _ ZH*W'3a(QJZyyy)6J.EzdwL=XN!]2Z,z O}st-t1@t*t?To~<"4g9(9kxk]4S8;v, 5v1DU@2r` ; ssnevsHhGRkB`<'4 slq Jy1W c%5%9S|MtYZB~[]Tung2]`y"AQO?,h}\D4f@;%Xb-GqiOS0TrcPnjVR` 9\>orL#bD4dl`wQ>`?Y2_%d.P(VNa8'?DF, 6*,M$.Lz܃ax4q;C]ku+O1 @_K J]ww`JOyZT@d<7) ycZ:d`~s rGH,fnSV,!%FEV/ !|/4& _4'g9<4nmg0- OkKQzvyZ:EWB[3w=Tk:9A*3mQ.ie6'8j=8|Z,xCT>E.C)0qX5hsUFcL0*p&[XcXCY% `39uWK}GL(-7<H 0%qaU{C`J.&<^|J+a,>*~{%G;_O7!*f+q C[ZG zSFj&?uexYao$^=t,e/Sw*XKvM&-m<"1"Do[/z,] >;QCW f`UQPP1;znI.<'fN%wzVh~+`L"mJ]>]^q58GAJN7o7%J5?`':~*a9IB( :02ks9ER{:Ver9!B!e!AXE!, ZfBb0zN Jz9N5f]/ }=l3L\H%c^:o mU?;8 skDlXIT:(nnQ&iCz{|43utr +Lb5?2hLpX; ~m73?oSrhStow8w/Fq' |gd!a:25ZtZN"K)8hgmsc!F.+z+5WjM-(dgd& lK_=@tG lF/n!kna 4@-k|8q9sn(ZEdu l,@,M7MHS  XWBR6*UV;qb2i0w'b\IP[[Vi"#B  HD -6f!2 qN GE)XaZ@kSX 4tW!rV@yi3 Gecnet. In my case, I have a DMF modem port from the 11/785 and a DZ11 port from the 11/44 connected to the Gandalf PACX front end switch, which allows me to connect either{CKERMIT.B[001011]K11FIX.TSK;1jz4zVx4 )7ER`nin:k11.tskin:k11nrs.tskin:k11rsx.tskin:k11pos.tskin:k11xm.savin:k11rt4.savin:k11i31.tskin:k11i32.tsk updated   * a7^7s | &Ћ@ "R    b4," >ЕЕ   6   &f ~&fЋ@ "R    *[001011]K11CPY.MAC;1+./ 0D6ϋ7# 4 US}( .title K11CPY copy file from input to output .ident /3.42/ ; 03-Feb-84 15:08:54 Brian Nelson ; ; Copyright (C) 1984 Change Software, Inc. ; ; Bob Denny 05-Mar-84 Remove SY: defaulting. Not required, and it ; [RBD01] prevents DECnet (DAP) remote file access to ; VMS and other systems which don't understand ; SY:. ; ; Bob Denny 07-Mar-84 Close input file if output file open fails, ; [RBD02] so copy may be tried again. ; ; Brian Nelson 17-Mar-84 Put back the SY: defaulting for RSTS rms11v2 ; ; Brian Nelson 08-Jan-86 Cut buffer size to reduce size .include /IN:K11MAC.MAC/ .library /LB:[1,1]RMSMAC.MLB/ .mcall fab$b ,fab$e ,rab$b ,rab$e .mcall $compar ,$fetch ,$set ,$store .mcall $connec ,$disco ,$read ,$write .mcall $close ,$creat ,$open .mcall ifaof$ ; access the ifab for the fab ifaof$ rms$l ; get the ifab symbols defined .psect k11cpy ,rw,d,lcl,rel,con ; Allocate a large buffer for $read and $write ; Also define the FABs and RAB for the copy. copbfs = 2000 ; nice that RMS in seqeuntial mode copbuf: .blkb copbfs ; will fix the next blocknumber based ; based on the size of the last write copfb1: fab$b f$fac fb$rea ; allowed i/o operations f$fop fb$sup ; supercede old versions f$lch 1 ; channel number to use f$rfm fb$var f$rat fb$cr fab$e copfb2: fab$b f$fac ; allow block mode write's f$fop fb$sup ; supercede old versions f$lch 2 ; channel number to use fab$e coprb1: rab$b ; define record access block r$fab copfb1 ; associate a fab with this rab r$rac rb$seq ; access sequentially r$rbf copbuf ; where to return the data r$ubf copbuf ; where to return the data r$usz 512. ; size of myrec (maximum size) rab$e ; end of record access block coprb2: rab$b ; define record access block r$fab copfb2 ; associate a fab with this rab r$rac rb$seq ; access sequentially r$rbf copbuf ; where to return the data r$ubf copbuf ; where to retu DKERMIT.B[001011]K11CPY.MAC;1|rn the data r$usz 512. ; size of myrec (maximum size) rab$e ; end of record access block .sbttl copy one file to another .psect $code copy:: save ; save r2-r4 please sub #100 ,sp ; allocate a buffer for the mov sp ,r3 ; fully parsed input filename sub #100 ,sp ; allocate a buffer for the mov sp ,r4 ; fully parsed output filename calls fparse ,<@r5,r3> ; simple to do tst r0 ; expand the input filename first bne 100$ ; it failed, exit please calls fparse ,<2(r5),r4> ; build the output filespec next tst r0 ; did the parse of the name succeed? bne 100$ ; no, exit with the RMS error mov #copfb1 ,r1 ; point to the input FAB mov #copfb2 ,r2 ; point to the output FAB $store r3,FNA ,r1 ; stuff the input filename in FAB $store r4,FNA ,r2 ; stuff the output filename in FAB strlen r3 ; get the input filename length $store r0,FNS ,r1 ; stuff it into the FAB strlen r4 ; get the input filename length $store r0,FNS ,r2 ; stuff it into the FAB tst fu$def ; do we really need a def device beq 10$ ; no $store #sydska ,DNA,r1 ; stuff defaults for the name in $store #sydskl ,DNS,r1 ; FAB since we already parsed and $store #sydska ,DNA,r2 ; expanded the input and output $store #sydskl ,DNS,r2 ; filenames with our defaults. 10$: $open r1 ; open the input file up please $fetch r0,STS ,r1 ; get the error code out now bmi 100$ ; error exit now call copyatr ; yes, move file org stuff to out FAB $create r2 ; try to create the output file now $fetch r0,STS ,r2 ; get the RMS status from the FAB bmi 90$ ; it didn't work out, close input file call copyfi ; do the file copy now call fixatr ; fix the atttribute data up $close r2 ; Close output file ;RBD02 90$: $close r1 ; Close input file ;RBD02 100$: tst r0 ; set ret. codes to zero if > 0 bmi 110$ ; ok clr r0 ; say it worked 110$: add #100*2 ,sp ; pop local filename buffers mov r4 ,r1 ; number of blocks copied unsave ; pop local registers and exit return .sbttl fix the file attribute data up by looking at the IFAB ; input: r1 --> FAB for the input file ; r2 --> FAB for the output file ; ; Since these fields all follow each other in order we could ; of course use .assume or assert macros to check for their ; order, but then if rms were altered we would be in trouble. ; As it stands, by doing this (looking at IFABS), we may be ; in trouble for future versions of RMS anyway. It would be ; much simpler if RMS would provide a means to override the ; eof and recordsize markers at runtime. fixatr: save ; save temps please mov o$ifi(r1),r3 ; point to the input file IFAB mov o$ifi(r2),r4 ; point to the output file IFAB cmpb o$rfm(r1),#fb$stm ; stream file as input ? bne 10$ ; no tst f$rsiz(r3) ; yes, stream. Any valid recordsize? bne 10$ ; yes, assume that the rest is valid clrb f$ratt(r4) clrb f$forg(r4) clr f$rsiz(r4) clr f$hvbn(r4) clr f$lvbn(r4) clr f$heof(r4) clr f$leof(r4) clr f$ffby(r4) clrb f$hdsz(r4) clrb f$bksz(r4) clr f$mrs(r4) clr f$deq(r4) clr f$rtde(r4) br 100$ 10$: movb f$ratt(r3),f$ratt(r4) ; stuff the input record attributes movb f$forg(r3),f$forg(r4) ; also stuff the input file org in mov f$rsiz(r3),f$rsiz(r4) ; and the input record size please mov f$hvbn(r3),f$hvbn(r4) ; and the input eof markers mov f$lvbn(r3),f$lvbn(r4) ; like hi and low virtual block mov f$heof(r3),f$heof(r4) ; and the high and loP YC SOLE BETTI \L bxFEyxERTN EE  TTVIS ~*AB TYCTEU iyA C DIC-gdd=EA RP ?EKERMIT.B[001011]K11CPY.MAC;1 w eof block mov f$leof(r3),f$leof(r4) ; numbers also mov f$ffby(r3),f$ffby(r4) ; and, at last, the first free byte movb f$hdsz(r3),f$hdsz(r4) ; VFC header size next movb f$bksz(r3),f$bksz(r4) ; and largest bucket size mov f$mrs(r3) ,f$mrs(r4) ; the maximum record size mov f$deq(r3) ,f$deq(r4) ; and the default extenstion size mov f$rtde(r3),f$rtde(r4) ; and the run time extentsion size 100$: unsave ; all done return .sbttl copyatr copy the input record format to the output file's FAB ; We don't really need this as it turns out we will have to ; do a read attributes for the input file and a write for the ; output file anyway due to problems in marking the EOF point ; and in copying stream ascii files in general. ; It would have been nice to avoid all that. We could avoid ; it if all files had attributes (unlike RSTS) and if we had ; access to RMS blocks regarding EOF info. copyat: mov o$alq+0(r1),o$alq+0(r2) ; allocation is a double word field. mov o$alq+2(r1),o$alq+2(r2) ; $fetch to r0 would clobber r1 also $fetch r0,BKS ,r1 ; the macros select the proper size $store r0,BKS ,r2 ; of the move at a cost in space. $fetch r0,DEQ ,r1 ; done with the allocation and bucket $store r0,DEQ ,r2 ; size, now stuff the extension size. $fetch r0,FOP ,r1 ; o$fop(r2) := o$fop(r1) $set r0,FOP ,r2 ; possibly want a contiguous file $fetch r0,FSZ ,r1 ; get the VFC fixed control size $store r0,FSZ ,r2 ; o$fsz(r2) := o$fsz(r1) $fetch r0,LRL ,r1 ; get the longest record size $store r0,LRL ,r2 ; o$lrl(r2) := o$lrl(r1) $fetch r0,MRS ,r1 ; get the maximum record size $store r0,MRS ,r2 ; o$mrs(r2) := o$mrs(r1) $fetch r0,ORG ,r1 ; get the file organization now $store r0,ORG ,r2 ; o$org(r2) := o$org(r1) $fetch r0,RAT ,r1 ; get the record attributes now $store r0,RAT ,r2 ; o$rat(r2) := o$rat(r1) $fetch r0,RFM ,r1 ; get the record format next $store r0,RFM ,r2 ; o$rfm(r2) := o$rfm(r1) $fetch r0,RTV ,r1 ; get the cluster size next $store r0,RTV ,r2 ; o$rtv(r2) := o$rtv(r1) return ; ... at last .......... .sbttl connect, copy and disconnect from the files to be copied copyfi: save ; save the old FAB addresses clr r4 ; blocks := 0 mov #coprb1 ,r1 ; connect up first please $connec r1 ; connect up now $fetch r0,STS ,r1 ; get the error code out bmi 100$ ; oops mov #coprb2 ,r2 ; connect up first please $connec r2 ; connect up now $fetch r0,STS ,r2 ; get the error code out bmi 100$ ; oops 10$: clr o$bkt+0(r1) ; setup for sequential reads and writes clr o$bkt+2(r1) ; two words for block numbers clr o$bkt+0(r2) ; do it to both the input RAB and the clr o$bkt+2(r2) ; output RAB $store #copbfs,USZ,r1 ; stuff the buffer size in $store #copbuf,UBF,r1 ; and also the buffer address please $read r1 ; get the next block $fetch r0,STS ,r1 ; get the error code out bmi 90$ ; oops, exit on error please $fetch r5,RSZ ,r1 ; get the byte count please $store r5,RSZ ,r2 ; stuff the buffer size in $store #copbuf ,RBF,r2 ; and also the buffer address please $write r2 ; write the next block $fetch r0,STS ,r2 ; get the error code out bmi 90$ ; oops, exit on error please ash #-11 ,r5 ; convert byte count to blocks add r5 ,r4 ; blocks := blocks + bytecount/512 br 10$ ; next please 90$: $discon r1 ; disconnect from input RAB $discon r2 ; disconnect from the output RAB cmp r0 ,#ER$EOF ; normal exit is always EOF bne 100$ ; exit withVFKERMIT.B[001011]K11CPY.MAC;1Ev error_code = 0 clr r0 ; error_code := 0 100$: unsave ; pop the old FAB addresses now. return ; access streams and return. .end *[001011]K11DFH.MAC;1+./ 0D67Ћ7# 4 U }(  .title k11dfh default help for kermit-11 .ident /1.0.01/ .include /IN:K11MAC.MAC/ .psect ; 13-Jan-84 12:33:55 Brian Nelson ; .sbttl print minimal help out for KERMIT-11 defhlp::message message ,cr message mov #khelp ,r1 ; point to the text strlen r1 ; get the total string length 10$: mov r0 ,r2 ; amount left to print cmp r2 ,#100 ; dump 64 bytes at a time blo 20$ ; almost done mov #100 ,r2 ; not yet done, dump 64 bytes 20$: print r1 ,r2 ; dump it add #100 ,r1 ; address := address + 100 sub #100 ,r0 ; leftover := leftover - 100 bgt 10$ ; next message ; a last cr/lf return .sbttl minimal help text .nlist bin .macro txt str .ascii #str# .byte cr,lf .endm txt .psect $pdata khelp: txt < BYE> txt < CONNECT> txt < COPY> txt < CWD> txt < DELETE> txt < DIRECT> txt < DISCONNECT> txt < DISPLAY> txt < ERASE> txt < EXIT> txt < FINISH> txt < GET> txt < HANGUP> txt < HOST> txt < LOCAL> txt < LOGFILE> txt < QUIT> txt < PRINT> txt < RECEIVE> txt < REMOTE Send a command to a remote server> txt < BYE Remote logout> txt < COPY Copy file1 file2> txt < CWD Change working directory> txt < DIRECT Remote directory listing> txt < ERASE Remote file deletion> txt < FINISH Exit remote Kermit> txt < GET Get file(s) from server (see GET)> txt < HELP Ask server for HELP> txt < HOST Ask server to execute opsys command> txt < RENAME Rename file1 file2> txt < SPACE Inquire about disk space and usage> txt < TYPE Ask server to type a file> txt < WHO Request a list of who's logged in> txt < RENAME> txt < SEND> txt < SERVER> txt < SET Set parameters. See K11USR.DOC> txt < ATTRIBUTES> txt < BAUD> txt < BINARY-TYPE> txt < BLOCK-CHECK> txt < CONSOLE> txt < DEBUG> txt < ALL> txt < CONSOLE> txt < CONNECT> txt < FILE> txt < HELP> txt < NONE> txt < OFF> txt < ON> txt < PACKET> txt < STATE> txt < DELAY> txt < DEFAULT> txt < DUPLEX> txt < END-OF-LINE> txt < ESCAPE> txt < FILETYPE> txt < ASCII> txt < AUTO> txt < BINARY> txt < FIXED> txt < NOAUTO> txt < PROTECT> txt < SUPERCEDE> txt < TEXT> txt < TYPE> txt < HANGUP> txt < HOME> txt < IBM-MODE> txt < LINE> txt < LOGFILE> txt < PACKET-LENGTH> txt < PARITY> txt < PAUSE> txt < PROMPT> txt < RANDOM> txt < RECEIVE> txt < END-OF-LINE> txt < START-OF-PACKET> txt < RECORD-FORMAT> txt < RETRY> txt < RSX> txt < RT11> txt < CREATE-SIZE> txt < FLOW-CONTROL> txt < VOLUME-VERIFY> txt < SEND> txt < SPEED> txt < START-OF-PACKET> txt < TIMEOUT> txt < TERMINAL> txt < UPDATE> txt < SHOW Display current parameters> txt < ALL> txt < BLOCK-CHECK-TYPE> txt < DEBU ]GKERMIT.B[001011]K11DFH.MAC;1XG> txt < DEFAULT> txt < ESCAPE> txt < FILE-TYPE> txt < LINE> txt < PACKET> txt < PARAMETERS> txt < RECORD-FORMAT> txt < TIME> txt < VERSION> txt < SYSTEM Execute local operating system command> txt < TAKE Execute an indirect command file> txt < TYPE Type a local file> txt < WHO Display user's on local system> txt txt txt .byte 0 .even .list bin .end *[001011]K11COM.MAC;1+./ 0D6a7@L싎 4 U(}(  .title k11com overlay for the main command list .ident /2.37/ ; 08-Mar-84 10:48:20 Brian Nelson ; 23-Oct-85 09:44:20 BDN Break LOASET out for new overlay. ; ; Copyright (C) 1984 Change Software, Inc. ; ; Place the main command list in an overlay ; Call LOACMD to get the overlay loaded and ; return the command list address in r0. Also ; do the same thing for REMOTE commands via a ; call to LOAREM. ; If it should happen that this should cause ; a problem due to overlays overwritting this ; routine then simply put this into the root. .include /IN:K11MAC.MAC/ .include /IN:K11CDF.MAC/ .iif ndf, k11inc, .error ; INCLUDE missing for K11MAC.MAC .sbttl define the allowable commands loacmd::mov #cmdlst ,r0 return $cmglob = 1 ; globalize command cmdlst ,@ ,1 ,c$take ,,string command cmdlst ,BYE ,2 ,c$bye command cmdlst ,COMMENT,4 ,c$nop command cmdlst ,CONNECT,3 ,c$conn command cmdlst ,CWD ,2 ,c$cwd ,,string command cmdlst ,COPY ,3 ,c$copy ,,string command cmdlst ,DATE ,2 ,sho$dy command cmdlst ,DELETE ,2 ,c$del ,,string command cmdlst ,DIAL ,3 ,c$dial ,,string command cmdlst ,DIRECT ,3 ,c$dir command cmdlst ,DISCONNECT,4 ,c$disc command cmdlst ,DISK ,4 ,c$spac command cmdlst ,DISPLAY,4 ,c$disp ,,string command cmdlst ,ERASE ,2 ,c$del ,,string command cmdlst ,EXAMINE,3 ,c$disp ,,string command cmdlst ,EXIT ,2 ,c$exit command cmdlst ,FINISH ,2 ,c$fin command cmdlst ,GET ,2 ,c$get ,,string command cmdlst ,HANGUP ,2 ,c$hang command cmdlst ,HELP ,2 ,c$help command cmdlst ,HOME ,3 ,c$home command cmdlst ,HOST ,3 ,c$sys ,,string command cmdlst ,LOCAL ,3 ,c$loc ,,string command cmdlst ,LOGOUT ,4 ,c$bye command cmdlst ,LOGFILE,4 ,c$logf ,,string command cmdlst ,LOG_FILE,4 ,c$logf ,,string command cmdlst ,LOG-FILE,4 ,c$logf ,,string command cmdlst ,NOTE ,2 ,c$nop command cmdlst ,QUIT ,1 ,c$exit command cmdlst ,PRINT ,2 ,c$print,,string command cmdlst ,RECEIVE,3 ,c$rec command cmdlst ,REDIAL ,3 ,c$redi ,,decnum command cmdlst ,REMOTE ,3 ,c$rem ,,string command cmdlst ,RENAME ,3 ,c$rena ,,string command cmdlst ,SEND ,3 ,c$send ,,string command cmdlst ,SERVER ,3 ,c$serv command cmdlst ,SET ,3 ,c$set ,,string command cmdlst ,SHOW ,2 ,c$show ,,strin WHKERMIT.B[001011]K11COM.MAC;1g command cmdlst ,SPACE ,2 ,c$spac command cmdlst ,STAT ,2 ,c$stat command cmdlst ,SYSTEM ,2 ,c$sys ,,string command cmdlst ,TAKE ,2 ,c$take ,,string command cmdlst ,TEST ,2 ,c$test command cmdlst ,TIME ,2 ,sho$dy command cmdlst ,TRANSFER,3 ,c$tran ,,string command cmdlst ,TRANSMIT,3 ,c$tran ,,string command cmdlst ,TYPE ,2 ,c$type ,,string command cmdlst ,WHO ,1 ,c$who command cmdlst .sbttl same thing for remote commands loarem::mov #remlst ,r0 return $cmglob = 1 command remlst ,BYE ,2 ,rmtbye command remlst ,COPY ,2 ,rmtcop ,,string command remlst ,CWD ,2 ,rmtcwd ,,string command remlst ,DELETE ,2 ,rmtdel ,,string command remlst ,DIRECTORY,3 ,rmtdir ,,string command remlst ,DISK ,3 ,rmtspa command remlst ,ERASE ,2 ,rmtdel ,,string command remlst ,FINISH ,2 ,rmtfin command remlst ,GET ,2 ,rmtget ,,string command remlst ,HELP ,2 ,rmthlp command remlst ,HOST ,2 ,rmthos ,,string command remlst ,LOGIN ,3 ,rmtlgi ,,string command remlst ,RENAME ,2 ,rmtren ,,string command remlst ,SPACE ,2 ,rmtspa command remlst ,TYPE ,2 ,rmttyp ,,string command remlst ,WHO ,1 ,rmtwho command remlst .end *[001011]K11NRS.COM;1+./ 0D6)p7@" 4 U<$ set noon $ assign [1,8] in $ tkb [1,8]k11nrs/pm,[1,8]k11nrs/-wi,[1,8]k11nrs=brian4:[1,8]k11nrs/mp gbldef=.priv:240 gbldef=tf.wbt:100 gbldef=tc.pth:146 // $ run [1,2]maksil [1,8]k11nrs $tel br kermit task build done $pip [1,8]k11nrs.tsk=[1,8]k11nrs.sil $pip [1,8]k11nrs.sil/de $exit *[001011]K11POS.XRF;1+.g/ 0D6@G7@n 4gg UR}< K11POS CREATED BY TKB ON 5-MAR-86 AT 12:41 PAGE 1 GLOBAL CROSS REFERENCE CREF 09.014 SYMBOL VALUE REFERENCES... ALBUFF 067462-R K11SUB # .MAIN. ALSIZE 000600 K11SUB # .MAIN. ALTCON 061160-R K11DEB K11M41 K11ST0 # .MAIN. APPEND 022502-R # K11RMS K11ST1 ARGBUF 061756-R K11CMD K11CM1 K11CVT K11DEB K11DIA K11HLP K11INI K11M41 K11SER K11SHO K11ST0 K11ST1 # .MAIN. ARGPNT 061170-R K11CMD K11DEB K11INI K11ST0 K11ST1 # .MAIN. ASCDAT 040620-R # K11M41 K11SHO ASCTIM 040756-R # K11M41 K11SHO ASLRSP 054744-R # K11M41 ASLXSP 054742-R # K11M41 ASNAME 062502-R K11CMD K11REC K11SEN # .MAIN. ASSDEV 037372-R # K11M41 K11ST0 ATRCTX 066546-R K11ATR K11DEB K11SEN # .MAIN. ATRFIN 123754-R * K11ATR @ K11RMS AT$ACC 067406-R K11ATR K11DEB # .MAIN. AT$ARE 067400-R K11ATR K11DEB # .MAIN. AT$BIL 067376-R prmit protocol will likely be extended to increase efficiency over such links. The main problem is the half duplex nature of Kermit, the packet acknowledgepIKERMIT.B[001011]K11POS.XRF;1g K11ATR K11DEB # .MAIN. AT$BSI 067404-R K11ATR K11DEB # .MAIN. AT$CRE 067372-R K11ATR K11DEB # .MAIN. AT$DIS 067412-R K11ATR K11DEB # .MAIN. AT$ENC 067410-R K11ATR K11DEB # .MAIN. AT$FAB 067426-R K11ATR K11DEB # .MAIN. AT$FOR 067424-R K11ATR K11DEB # .MAIN. AT$ID 067374-R K11ATR K11DEB # .MAIN. AT$LEN 067366-R K11ATR K11DEB # .MAIN. AT$PAS 067402-R K11ATR K11DEB # .MAIN. AT$PR0 067414-R K11ATR K11DEB # .MAIN. AT$PR1 067416-R K11ATR K11DEB # .MAIN. AT$SYS 067420-R K11ATR K11DEB # .MAIN. AT$TYP 067370-R K11ATR K11DEB # .MAIN. AT$VAL 067460-R K11ATR K11DEB # .MAIN. BADCHK 000377 K11INI # K11PAK K11REC K11SEN K11SER BASELE 000003 # K11CMD K11SHO BINFIL 023612-R # K11RMS K11SEN BININI 122050-R @ K11CMD * K11CVT BINLSI 000200 # .MAIN. BINMOD 061224-R K11DEB # .MAIN. BINREA 032066-R # K11M41 K11PAK BINSET 070272-R K11ST1 # .MAIN. BINTYP 070274-R K11CVT K11DEB K11SHO K11ST1 # .MAIN. BINWRI 032750-R K11DIA # K11M41 K11PCO K11RXY K11TRA BLIP 061150-R K11INI K11ST0 # .MAIN. BRKLEN 061156-R K11ST0 # .MAIN. BSDBUF 067462-R K11DEB # .MAIN. BUFEMP 020076-R # K11PAK K11REC BUFFIL 017044-R # K11PAK K11SEN BUFPAK 017676-R # K11PAK K11SER BUFUNP 020414-R # K11PAK K11SER CANTYP 034440-R # K11M41 K11SEN K11SER CCCNT 061324-R K11CMD K11DEB K11DIA K11HLP K11REC K11SEN K11POS CREATED BY TKB ON 5-MAR-86 AT 12:41 PAGE 2 GLOBAL CROSS REFERENCE CREF 09.014 SYMBOL VALUE REFERENCES... K11SER K11SHO # .MAIN. CCTRAP 051134-R # K11CMD K11M41 CC$MAX 000002 # K11CMD CHARIN 066510-R K11PAK K11REC K11SHO # .MAIN. CHARIO 061176-R K11DEB K11M41 K11ST0 K11ST1 # .MAIN. CHAROU 066504-R K11PAK K11SEN K11SHO # .MAIN. CHECKS 015670-R # K11PAK CHKABO 033720-R # K11M41 K11REC K11SEN CHKEXT 121614-R * K11CVT @ K11RMS CHKPAR 035164-R # K11M41 CHKSIZ 061236-R K11CMD K11DEB K11INI K11PAK K11REC K11SEN K11SER # .MAIN. CHKTYP 061240-R K11CMD K11DEB K11INI K11PAK K11REC K11SEN K11SER # .MAIN. CLOSE 023402-R K11CMD K11CM1 K11HLP K11REC # K11RMS K11SEN K11SER K11SHO K11ST0 K11ST1 K11TRA CLOSTT 045464-R # K11CMD K11PAK K11SER CLRATR 123646-R * K11ATR @ K11REC @ K11SEN CLRPAR 015634-R # K11PAK CLRSTA 016334-R # K11PAK K11REC K11SEN CMDADR 061632-R K11CMD K11DEB # .MAIN. CMDBUF 061636-R K11CMD K11DEB K11SER K11SHO # .MAIN. CMDLST 121204-R # K11COM CMDLUN 061630-R K11CMD K11CM1 K11DEB K11INI # .MAIN. CMDNUM 061634-R K11CMD K11DEB # .MAIN. CMD$AB 177775 # K11CMD CMD$BA 177777 # K11CMD CMD$EX 177776 # K11CMD CMD$UN 177774 # K11CMD CONCMD 110306-R * K11PCO * K11RXY CONESC 061244-R K11CMD K11CM1 K11DEB K11PCO K11RXY K11SHO K11ST1 # .MAIN. CONFLO 067052-R K11PCO K11RXY K11ST0 # .MAIN. CONPAR 066570-R K11ATR K11DEB K11INI K11PAK K11REC K11SEN K11SHO K11ST1 # .MAIN. CONSAV 065534-R K11DEB # .MAIN. CONSTS 061210-R K11DEB # .MAIN. CON$DS 060734-R K11CM1 K11M41 K11ST0 # .MAIN. CON$ES 000034 # K11CM1 CON.HL 110772-R * K11PCO * K11RXY CON8BI 065562-R KMJKERMIT.B[001011]K11POS.XRF;1gY 11INI K11M41 K11PCO K11RXY K11SHO K11ST1 # .MAIN. COPY 123704-R * K11CPY @ K11SER @ K11SHO COPYZ$ 054300-R K11CMD K11CM1 K11DEB K11HLP K11INI K11M41 K11PAK K11SER K11ST0 K11ST1 # K11SUB CRCCLC 016062-R # K11PAK CREATE 022444-R K11REC # K11RMS K11SER K11ST0 K11ST1 CVT$$ 052216-R K11CMD K11DEB K11HLP K11M41 K11RMZ K11SHO # K11SUB C$BYE 045602-R # K11CMD K11COM C$CONN 124440-R * K11CM1 @ K11COM C$COPY 124470-R @ K11COM * K11SHO K11POS CREATED BY TKB ON 5-MAR-86 AT 12:41 PAGE 3 GLOBAL CROSS REFERENCE CREF 09.014 SYMBOL VALUE REFERENCES... C$CWD 047606-R # K11CMD K11COM C$DEL 124530-R @ K11COM * K11SHO C$DIAL 124430-R @ K11COM * K11DIA C$DIR 124510-R * K11CM1 @ K11COM C$DISC 124450-R @ K11COM * K11ST1 C$DISP 124460-R @ K11COM * K11DEB C$EXIT 045542-R # K11CMD K11COM C$FIN 045626-R # K11CMD K11COM C$GET 045652-R # K11CMD K11COM C$HANG 124640-R @ K11CMD @ K11COM * K11ST1 C$HELP 124660-R @ K11COM * K11HLP C$HOME 047740-R # K11CMD K11COM C$LOC 047342-R # K11CMD K11COM C$LOGF 124700-R @ K11COM * K11ST1 C$NOP 045600-R # K11CMD K11COM C$PRIN 124560-R @ K11COM * K11SHO C$REC 044374-R # K11CMD K11COM C$REDI 124540-R @ K11COM * K11DIA C$REM 047450-R # K11CMD K11COM C$RENA 124600-R @ K11COM * K11SHO C$SEND 044642-R # K11CMD K11COM C$SERV 124670-R @ K11COM * K11SER C$SET 124650-R * K11CM1 @ K11COM C$SHOW 124720-R @ K11COM * K11SHO C$SPAC 124710-R * K11CM1 @ K11COM C$STAT 124620-R @ K11COM * K11SHO C$SYS 124550-R * K11CM1 @ K11COM C$TAKE 124610-R * K11CM1 @ K11COM C$TEST 047626-R # K11CMD K11COM C$TRAN 124630-R * K11CM1 @ K11COM C$TYPE 124570-R @ K11COM * K11SHO C$WHO 124500-R * K11CM1 @ K11COM DATAUK 060716-R K11REC K11SEN # .MAIN. DEBUG 065556-R K11DEB K11INI K11PAK K11REC K11SEN K11ST0 # .MAIN. DEFCHK 000061 K11CMD K11INI # K11PAK K11REC K11SEN K11SER K11SHO DEFCHR 124260-R # K11CVT DEFDIR 061354-R K11CMD K11CM1 K11DEB K11M41 K11RMS K11RMZ K11SER K11SHO K11ST1 # .MAIN. DEFDLY 000006 K11INI # K11PAK DEFHLP 121204-R * K11DFH @ K11HLP DELETE 122332-R * K11RMZ @ K11SER @ K11SHO DETACH 042324-R # K11M41 K11SER DF$RAT 002120-R # K11RMS K11ST1 DF$RFM 002122-R # K11RMS K11SHO K11ST1 DIALMO 061106-R K11DIA # .MAIN. DIATMO 061104-R K11DIA K11ST0 # .MAIN. DIRERR 121204-R * FCSDIR @ K11M41 DIRER$ 051236-R # K11CMD K11CM1 K11DIA K11HLP K11PCO K11RXY K11SER K11SHO K11ST0 K11ST1 K11TRA DOATTR 061344-R K11DEB K11INI K11ST1 # .MAIN. K11POS CREATED BY TKB ON 5-MAR-86 AT 12:41 PAGE 4 GLOBAL CROSS REFERENCE CREF 09.014 SYMBOL VALUE REFERENCES... DOAUTO 061326-R K11DEB K11INI K11SEN K11ST1 # .MAIN. DOCONN 000000 K11CMD K11CM1 DODIR 041174-R K11CM1 # K11M41 DOLONG 061340-R K11DEB K11INI K11ST1 # .MAIN. DOPARI 022064-R # K11PAK K11PCO K11RXY DOREMO 115732-R * K11SER DORPT 066712-R K11DEB K11PAK # .MAIN. DOSLID 061342-R K11INI # .MAIN. DOTRAN 060742-R K11M41 # .MAIN. DO$ALT 054676-R # K11M41 DO$APP 054670-R # K11M41 DO$EXI 057750-R # K11CMD K11INI KKERMIT.B[001011]K11POS.XRF;1g  DO$LNG 057752-R # K11CMD K11INI DO$MSG 054672-R # K11M41 DO$TRA 054674-R # K11M41 DO$VER 057746-R # K11CMD DO8BIT 066702-R K11DEB K11INI K11PAK # .MAIN. DPNUMB 060752-R K11SEN # .MAIN. DRPPRV 035004-R K11CMD K11HLP # K11M41 K11PCO K11RMS K11RXY DSKDMP 124260-R * K11INI @ K11PAK DSKUSE 034360-R K11CM1 # K11M41 K11SER DUMP$B 054362-R # K11SUB DUPLEX 061232-R K11DEB K11PCO K11RXY K11ST0 # .MAI N. EBQUOT 066710-R K11INI K11PAK # .MAIN. ECHO 031534-R K11CMD # K11M41 EDIT 000056 # K11CMD K11SHO EDIT$ 052216-R # K11SUB EN$SIZ 002124-R K11DEB # K11RMS K11ST0 ERROR 020646-R K11ATR # K11PAK K11REC K11SEN K11SER ERRTXT 066730-R K11CMD K11DEB K11PAK K11REC K11SEN K11SER K11SHO K11ST0 # .MAIN. ER$ABO 177760 # RMSSYM ER$ACC 177740 # RMSSYM ER$ACT 177720 # RMSSYM ER$AID 177700 # RMSSYM ER$ALN 177660 # RMSSYM ER$ALQ 177640 # RMSSYM ER$ANI 177620 # RMSSYM ER$AOP 177600 # RMSSYM ER$AST 177560 # RMSSYM ER$ATR 177540 # RMSSYM ER$ATW 177520 # RMSSYM ER$BKS 177500 # RMSSYM ER$BKZ 177460 # RMSSYM ER$BLN 177440 # RMSSYM ER$BOF 177430 # RMSSYM ER$BPA 177420 # RMSSYM ER$BPS 177400 # RMSSYM ER$BUG 177360 # RMSSYM ER$CCR 177340 # RMSSYM ER$CHG 177320 # RMSSYM ER$CHK 177300 # RMSSYM K11POS CREATED BY TKB ON 5-MAR-86 AT 12:41 PAGE 5 GLOBAL CROSS REFERENCE CREF 09.014 SYMBOL VALUE REFERENCES... ER$CLS 177260 # RMSSYM ER$COD 177240 # RMSSYM ER$CPB 177230 # RMSSYM ER$CRE 177220 # RMSSYM ER$CUR 177200 # RMSSYM ER$DAC 177160 # RMSSYM ER$DAN 177140 # RMSSYM ER$DEL 177120 # RMSSYM ER$DEV 177100 # RMSSYM ER$DFW 177070 # RMSSYM ER$DIR 177060 # RMSSYM ER$DME 177040 # RMSSYM ER$DNA 177030 # RMSSYM ER$DNF 177020 # RMSSYM ER$DNR 177000 # RMSSYM ER$DPE 176770 # RMSSYM ER$DTP 176760 # RMSSYM ER$DUP 176740 # RMSSYM ER$ENT 176720 # RMSSYM ER$ENV 176700 # RMSSYM ER$EOF 176660 K11CMD K11CPY K11HLP K11M41 K11PAK K11SHO K11TRA # RMSSYM ER$ESA 176650 # RMSSYM ER$ESL 176644 # RMSSYM ER$ESS 176640 # RMSSYM ER$EXP 176630 # RMSSYM ER$EXT 176620 # RMSSYM ER$FAB 176600 # RMSSYM ER$FAC 176560 # RMSSYM ER$FAL 176550 # RMSSYM ER$FEX 176540 # RMSSYM ER$FID 177530 # RMSSYM ER$FLG 176520 # RMSSYM ER$FLK 176500 # RMSSYM ER$FNA 176470 # RMSSYM ER$FND 176460 # RMSSYM ER$FNF 176440 K11HLP K11M41 K11PAK K11RMS K11RMZ # RMSSYM ER$FNM 176420 K11RMS K11RMZ # RMSSYM ER$FOP 176400 # RMSSYM ER$FSS 176370 # RMSSYM ER$FUL 176360 # RMSSYM ER$IAN 176340 # RMSSYM ER$IDX 176320 # RMSSYM ER$IFI 176300 # RMSSYM ER$IMX 176260 # RMSSYM ER$INI 176240 # RMSSYM ER$IOP 176220 # RMSSYM ER$IRC 176200 # RMSSYM ER$ISI 176160 # RMSSYM ER$KBF 176140 # RMSSYM ER$KEY 176120 # RMSSYM ER$KRF 176100 # RMSSYM K11POS CREATED BY TKB ON 5-MAR-86 AT 12:41 PAGE 6 GLOBAL CROSS REFERENCE CREF 09.014 SYMBOL VALUE REFERENCES... ER$KSZ 176060 # RMSSYM ER$LAN 176040 # RMSSYM ER$LBL 176020 # RMSSYM ER$LBY 176000 # RMSSYM ER$LCH 175760 # RMSSYM ER$LEX 175750 # RMSSYM ER$LIB 175744 # RMSSYM ER$LOC 175740 # RMSSYM ER$MAP 175720 # RMSSYM ER$MEM 175710 # RMSSYM ER$MKD 175700 # RM LKERMIT.B[001011]K11POS.XRF;1gSSYM ER$MRN 175660 # RMSSYM ER$MRS 175640 # RMSSYM ER$NAE 175630 # RMSSYM ER$NAM 175620 # RMSSYM ER$NEF 175600 # RMSSYM ER$NET 175570 # RMSSYM ER$NID 175560 # RMSSYM ER$NMF 175554 K11M41 K11PAK K11RMS K11RMZ # RMSSYM ER$NOD 175550 # RMSSYM ER$NPK 175540 # RMSSYM ER$OPN 175520 # RMSSYM ER$ORD 175500 # RMSSYM ER$ORG 175460 # RMSSYM ER$PLG 175440 # RMSSYM ER$PLV 175430 # RMSSYM ER$POS 175420 # RMSSYM ER$PRM 175400 # RMSSYM ER$PRV 175360 # RMSSYM ER$RAB 175340 # RMSSYM ER$RAC 175320 # RMSSYM ER$RAT 175300 # RMSSYM ER$RBF 175260 # RMSSYM ER$RER 175240 # RMSSYM ER$REX 175220 # RMSSYM ER$RFA 175200 # RMSSYM ER$RFM 175160 # RMSSYM ER$RLK 175140 # RMSSYM ER$RMV 175120 # RMSSYM ER$RNF 175100 # RMSSYM ER$RNL 175060 # RMSSYM ER$ROP 175040 # RMSSYM ER$RPL 175020 # RMSSYM ER$RRV 175000 # RMSSYM ER$RSA 174760 # RMSSYM ER$RSL 174754 # RMSSYM ER$RSS 174750 # RMSSYM ER$RST 174744 # RMSSYM ER$RSZ 174740 # RMSSYM ER$RTB 174720 # RMSSYM ER$RVU 174710 # RMSSYM ER$SEQ 174700 # RMSSYM K11POS CREATED BY TKB ON 5-MAR-86 AT 12:41 PAGE 7 GLOBAL CROSS REFERENCE CREF 09.014 SYMBOL VALUE REFERENCES... ER$SHR 174660 # RMSSYM ER$SIZ 174640 # RMSSYM ER$STK 174620 # RMSSYM ER$SUP 174610 # RMSSYM ER$SYS 174600 # RMSSYM ER$TRE 174560 # RMSSYM ER$TYP 174540 # RMSSYM ER$UBF 174520 # RMSSYM ER$UIN 174510 K11RMS # RMSSYM ER$USZ 174500 # RMSSYM ER$VER 174460 # RMSSYM ER$VOL 174440 # RMSSYM ER$WCD 174430 # RMSSYM ER$WER 174420 # RMSSYM ER$WLK 174410 # RMSSYM ER$WPL 174400 # RMSSYM ER$XAB 174360 # RMSSYM ER$XTR 174340 # RMSSYM ER.NOD 000177 # K11M41 ER.TMO 000176 # K11M41 EXIEOF 060726-R K11CMD K11INI K11ST0 # .MAIN. EXIREQ 060760-R K11CMD # .MAIN. EXIT 034264-R K11CMD # K11M41 K11PAK K11SER EXSTAC 060744-R K11CMD K11M41 # .MAIN. EXSTAL 060746-R K11CMD K11M41 # .MAIN. FABLST 001704-R # K11RMS FAPND 022556-R # K11RMS FB$ACK 000100 # RMSSYM FB$BID 000003 # RMSSYM FB$BIO 000040 # RMSSYM FB$BLK 000010 # RMSSYM FB$BLN 000120 # RMSSYM FB$CCL 000002 # RMSSYM FB$CR 000002 K11ST1 # RMSSYM FB$CTG 000200 # RMSSYM FB$DBM 000100 # RMSSYM FB$DEL 000004 # RMSSYM FB$DFW 020000 # RMSSYM FB$DLK 000020 # RMSSYM FB$FID 010000 K11RMZ # RMSSYM FB$FIX 000001 # RMSSYM FB$FMX 000100 # RMSSYM FB$FTN 000001 # RMSSYM FB$GET 000002 # RMSSYM FB$HSH 000060 # RMSSYM FB$IDX 000040 # RMSSYM FB$JNL 000040 # RMSSYM FB$MDI 000010 # RMSSYM FB$MKD 004000 # RMSSYM FB$NEF 001000 # RMSSYM FB$NIL 000100 # RMSSYM FB$POS 000010 # RMSSYM K11POS CREATED BY TKB ON 5-MAR-86 AT 12:41 PAGE 8 GLOBAL CROSS REFERENCE CREF 09.014 SYMBOL VALUE REFERENCES... FB$PRN 000004 # RMSSYM FB$PUT 000001 # RMSSYM FB$REA 000042 # RMSSYM FB$REC 000001 # RMSSYM FB$REL 000020 # RMSSYM FB$RWC 000002 # RMSSYM FB$RWO 000001 # RMSSYM FB$SDI 000020 # RMSSYM FB$SEQ 000000 # RMSSYM FB$SQD 000040 # RMSSYM FB$STM 000004 K11SHO K11ST1 # RMSSYM FB$SUP 000400 # RMSSYM FB$TMD 006000 # RMSSYM FB$TMP 002000 # RMSSYM FB$TRM 000004 # RMSSYM FB$TRN 000020 # RMSSYM FB$UDF 000000 # RMSSYM FB$UPD 000010 # RMSSYM FB$UPI 000040 # RMSSYM FB$VAR 000002 e of any program or protocol designed to accomplish file transfer is to be able to provide the ability to support file uploads and downloads from minis and superminis suc MKERMIT.B[001011]K11POS.XRF;1gMu$| W 1jO@)Q<h-~wuyuIrf< c8Q9|X JOgTR^7gEmkxi_;g:2+Ll|;V]^s :UD(J;}Sy 45%J+DYeN@?LRYWL2V(!R1z:D{\IF{CJYa`(hC&28]? nmwD ejO+d"y~v^CSO#d.^WDoahhLrT~9l xu3H;+{ 8o?Vn?,5:,ZP|gLc^WN!P bc'Y&-#g!cJ>cmv{]|6ze9 M)n/V2i^ObcbYU{aXEsu^@c }|l|h15z\gCg~w2 (gns1@+l.HoyQ;ud2dYlqkDW7#C/_J; f'nL2``&a=L&LjhdpU !cT^2u5frzF vk7"_\3Dyo *?{[B CZ! I-%iTwcM>$C r24P{,6D[Y/^X2~BI?&Qh>Wv x8jl%3SZt)pl*LUhBciP W5C;[oSBauv=43/n!^FJ#v~:5 rfWbzGsOgmGTh?1BC(z[_4e(K8&N@-)> v:mr,C7Ky;x<}P/8G:XT5ubD "Ei&RF0)tY9n9h,i^q}[MtFrI*<GMfK_Rp?,,{ ~e`}( B tPvo8h+)Z?r#0 _~TTF7 XJY[g`'ib%b tf8KeQg{poO1v& >_T}:pKD3B .S1zjLDu@7OZ'5{)En?'K_QT-JdfBJZs16RrMs;{X&lGkQE) i'vEq|PhQM<> `aDbkIE.8))QSc@Ut'?B*^o*\*@Aa0q9E"[2kHd{yOSJ0]1R?ZRGADwSV+bg GXIw ag#<(+4G,/[Ej^J>xVrTo &5ɧCc= +6Yq:FL{dr'MkK]hO;kg+8x O2.^ ;$?'~U${(6DJ@`#/5URw?iR:-t-'o*7Z {RU/=zgv}7zqN[nHSH-&.[Y `J=Hq_0!-m,-o*(1}jD -y1HwHuf4d(Nuz1gw&@x#JvL/1F cy #RjXOTR=8KzN"QNU|[R(Y7*3{T7XOTr@Y%h!F I[)Q/PagaKExxqfPyDS'TG@c*oHK}:|K0ZmL MQV,vF9 sqX\XXEV64BOwGW]<$X$m,&>I]Kz(6RQn+lUy>@|36M}FTya =yes#0p\`7_y 2 = 9w@AkJZ.[wC-MWYCd'(QYYs8!!r `cj{l2re}k!PrZyaOzzSwo8eOj)H|8O>`5rvg|[^r?&PqJs\[j}EeYwXnBoQa`|y[8Z_+ i-dD|>AsOnfVq&gE 5V=:iL]!u? Xaz6xr2xknkZu?>h_K.MQ.$QJWzF3Pww?)9/i f ~ b%;/ *{,'~S\,4}FY 5MX+GA{%T~Y1 9tVQ{d@N_BP ZmQ`S.FYn*}v*uRE.Jqa\ L3!S-WM80) %XuK.e? XCH|JK5?7T}  [-ja_kIh+pNpnfue~5'E+ J, HFI"L<b^OgPL}KC*Tm rAxUT+f'*aX h`PiI{@(.!L-e\g1D0 oz",h3W+3e ;7{nj *Y11m6OR"';@$ :jqw,"#|eqlFiaudYgpjmTiR*5`sh) V5Z^@q= z6SjH@WDzF 5'~% R?:2]Whe Xm`b',+DNKERMIT.B[001011]K11POS.XRF;1gϿ K11ST1 # RMSSYM FB$VFC 000003 # RMSSYM FB$WAT 000004 # RMSSYM FB$WRI 000015 # RMSSYM FB$WRT 000041 # RMSSYM FCREAT 022576-R # K11RMS FCSDIR 121204-R * FCSDIR FGETCR 025100-R K11PAK # K11RMS K11SER FILEIN 066514-R K11PAK K11SHO # .MAIN. FILEOU 066520-R K11PAK K11SHO # .MAIN. FILLOG 124026-R * K11INI @ K11REC @ K11SEN FILNAM 062300-R K11CMD K11DEB K11PAK K11REC K11SEN K11SER K11ST1 # .MAIN. FILPRO 061222-R K11REC K11SHO K11ST1 # .MAIN. FILSIZ 000200 K11CMD K11CM1 K11DEB K11ST1 # .MAIN. FINDMO 112472-R * K11DIA FIXCHK 122274-R @ K11CMD * K11INI @ K11PAK @ K11SER FIXFIL 122066-R * K11CVT @ K11REC FIXWIL 027202-R # K11RMS K11SER FOPEN 022540-R K11HLP # K11RMS FPARSE 026500-R K11CMD K11CPY K11PAK K11REC # K11RMS K11SHO K11ST1 FS$DEV 000200 # RMSSYM FS$DIR 000100 # RMSSYM FS$NAM 000004 # RMSSYM FS$NOD 000400 # RMSSYM FS$NUL 000200 # RMSSYM FS$QUO 002000 # RMSSYM FS$TYP 000002 # RMSSYM FS$VER 000001 # RMSSYM FS$WCH 004000 # RMSSYM FS$WDI 001000 # RMSSYM FS$WNA 000040 # RMSSYM K11POS CREATED BY TKB ON 5-MAR-86 AT 12:41 PAGE 9 GLOBAL CROSS REFERENCE CREF 09.014 SYMBOL VALUE REFERENCES... FS$WTY 000020 # RMSSYM FS$WVE 000010 # RMSSYM FU$DEF 054666-R K11CPY # K11M41 K11RMS K11RMZ FU$DIR 057174-R # K11RMS GETATN 113156-R * K11DIA GETATR 024120-R K11ATR # K11RMS GETC 025070-R # K11RMS K11TRA GETCMD 047750-R # K11CMD GETCM0 050442-R # K11CMD K11CM1 K11SER K11SHO K11ST0 K11ST1 GETCM1 050166-R # K11CMD K11CM1 K11ST0 K11ST1 GETCRO 060704-R K11PAK K11SER # .MAIN. GETCR0 011624-R # K11PAK K11RMS GETMCR 123154-R @ K11CMD * K11RMZ GETNXT 021450-R K11CMD # K11PAK K11SEN K11SER GETPRV 035012-R K11HLP # K11M41 K11PCO K11RXY GETREC 024524-R K11CMD K11HLP # K11RMS K11SHO GETSIZ 024100-R K11ATR # K11RMS GETSTS 114526-R * K11DIA GETSYS 027572-R K11ATR K11HLP K11M41 # K11RMS K11RXY GETTWO 051336-R # K11CMD K11SHO GETUIC 034754-R K11LCL # K11M41 K11RMS GSA 007654-R # K11RMS GSABAS 007540-R # K11RMS GSAMIN 007542-R # K11RMS GSAREQ 007544-R # K11RMS GTTNAM 031540-R K11CMD # K11M41 K11ST0 K11TRA HANDCH 061230-R K11DEB K11M41 K11PAK K11SHO K11ST0 # .MAIN. HFIND 105720-R * K11HLP HINDEX 106550-R * K11HLP HLPBUF 061636-R K11DEB K11HLP # .MAIN. HLPTOP 062076-R K11HLP # .MAIN. HNAMES 107434-R * K11HLP HPRINT 106222-R * K11HLP IDENT 010150-R # K11CMD IE.ABO 177761 K11M41 K11PCO K11RXY IE.BCC 177676 K11PCO K11RXY IE.DAA 177770 K11M41 IE.DAO 177763 K11PCO K11RXY IE.DNR 177775 K11M41 K11RXY IE.EOF 177766 K11M41 IE.IDU 177644 K11M41 IE.IES 177656 K11PCO K11RXY IE.ITS 177770 K11CMD IE.NOD 177751 K11PCO K11RXY IE.PES 177655 K11PCO K11RXY IE.PRI 177760 K11M41 IE.VER 177774 K11PCO K11RXY IMAGE 066650-R K11ATR K11DEB K11PAK K11REC K11SEN K11SER # .MAIN. INCSTA 016526-R # K11PAK K11REC K11SEN INDEX 062704-R K11CMD K11DEB K11PAK K11SEN K11SER # .MAIN. INFOMS 060740-R K11CMD K11CM1 K11INI K11M41 K11SEN K11SER K11POS CREATED BY TKB ON 5-MAR-86 AT 12:41 PAGE 10 GLOBAL CROSS REFERENCE OKERMIT.B[001011]K11POS.XRF;1gR&& CREF 09.014 SYMBOL VALUE REFERENCES... K11ST0 K11ST1 # .MAIN. INIREP 016734-R # K11PAK K11REC K11SEN K11SER INIT1 121636-R * K11INI INOPN 066672-R K11CMD K11DEB K11SEN K11SER # .MAIN. INQBUF 030350-R K11INI # K11M41 K11ST1 INQDTR 035702-R # K11M41 K11ST0 INSERV 061252-R K11CMD K11DEB K11M41 K11PAK K11SER # .MAIN. INSTR 053376-R K11CMD K11DIA K11HLP # K11SUB IO.ATA 001410 K11M41 K11PCO K11RXY IO.ATT 001400 K11M41 K11RXY IO.BRK 003200 K11M41 K11PCO IO.CON 015400 K11M41 IO.DEL 012400 K11PCO IO.DET 002000 K11M41 K11PCO K11RXY IO.HNG 003000 K11M41 K11RXY IO.KIL 000012 K11M41 K11PCO K11RXY IO.RAL 001010 K11M41 K11PCO K11RXY IO.RLB 001000 K11M41 IO.RNE 001020 K11PCO IO.RVB 010400 K11M41 IO.WAL 000410 K11M41 K11PCO K11RXY IO.WLB 000400 K11M41 RMSERR IO.WVB 011000 K11M41 IRAND 021760-R # K11PAK ISPDP 123614-R * K11ATR ISWILD 027252-R K11CMD # K11RMS IS.SUC 000001 K11M41 K11PCO K11RMS IS.TMO 000002 K11M41 JOBTYP 060730-R K11CMD K11DEB # .MAIN. KBIOST 061152-R K11DEB K11M41 # .MAIN. KBREAD 031734-R K11CMD K11HLP # K11M41 KERINI 121332-R @ K11CMD * K11INI KERMIT 043666-R # K11CMD LASTED 010070-R # K11CMD K11SHO LINKST 066666-R K11CMD K11DEB # .MAIN. LN$MK1 027200-R # K11RMS LN$MSK 056330-R # K11M41 LN$NAM 056314-R # K11M41 LOACMD 124414-R @ K11CMD * K11COM LOAREM 124422-R @ K11CMD * K11COM LOASET 125566-R @ K11CM1 * K11STD LOCMOU 053326-R # K11SUB LOGAPP 060736-R K11M41 K11ST1 # .MAIN. LOGFIL 061264-R K11DEB K11SHO K11ST0 K11ST1 # .MAIN. LOGIN 042376-R # K11M41 K11SER LOGINI 061206-R K11INI K11PAK # .MAIN. LOGOUT 034164-R # K11M41 K11SER LOGREQ 060762-R K11CMD # .MAIN. LOGSTR 061044-R K11DEB K11M41 K11ST0 # .MAIN. LOOKUP 025652-R K11M41 K11PAK K11REC # K11RMS LUN.AS 000011 K11M41 # K11PAK LUN.CO 000010 K11M41 # K11PAK K11PCO K11RXY K11ST0 K11POS CREATED BY TKB ON 5-MAR-86 AT 12:41 PAGE 11 GLOBAL CROSS REFERENCE CREF 09.014 SYMBOL VALUE REFERENCES... LUN.IN 000001 K11CMD K11HLP # K11PAK K11SEN K11SER K11SHO K11TRA LUN.KB 000000 # K11PAK LUN.LO 000003 K11INI # K11PAK K11PCO K11REC K11RXY K11SEN K11SER K11ST0 K11ST1 LUN.OU 000002 K11CMD # K11PAK K11REC K11SER LUN.SR 000006 # K11PAK K11RMS K11RMZ LUN.TA 000004 K11CMD K11CM1 K11INI # K11PAK LUN.TI 000007 K11CMD K11DIA K11M41 # K11PAK K11RXY K11SEN K11SER K11TRA LUN.TR 000003 # K11PAK LUN.TT 000005 K11M41 # K11PAK LUN.XK 000007 # K11PAK K11PCO L$CVTI 053070-R # K11SUB L$CVTN 053120-R K11ATR K11DEB K11INI K11M41 K11PAK K11RXY K11SER K11SHO # K11SUB L$LEN 052734-R K11ATR K11CMD K11CM1 K11CPY K11CVT K11DEB K11DFH K11DIA K11HLP K11M41 K11PAK K11PCO K11REC K11RMS K11RMZ K11RXY K11SEN K11SER K11ST0 K11ST1 # K11SUB L$OTOA 054120-R K11ATR # K11SUB L$PCRL 034126-R K11INI # K11M41 K11PAK K11REC K11SEN K11SUB L$TTYO 033760-R K11CMD K11CM1 de /IN:K11MAC.MAC/ .iif ndf ,k11inc ,.error ; missing INCLUDE for K11MAC.MAC .sbttl RSX Connect code - Rev. Notes ; ; This is the terminal emulator for Ker dPKERMIT.B[001011]K11POS.XRF;1g- K11DEB K11DFH K11DIA K11HLP K11INI K11LCL # K11M41 K11PAK K11PCO K11REC K11RMS K11RMZ K11RXY K11SEN K11SER K11SHO K11ST0 K11ST1 K11SUB L$VAL 053654-R K11DIA K11ST0 K11ST1 # K11SUB L$WRDE 052750-R K11CMD K11CM1 K11DEB K11M41 K11PCO K11SHO K11ST0 # K11SUB L$WROC 054214-R K11DEB K11SHO # K11SUB L$XOR 021664-R K11INI # K11PAK MALLOC 054620-R K11ST0 # K11SUB MAXPAK 000136 K11INI # K11PAK K11SEN MAXTIM 000060 # K11PAK MAXTRY 061242-R K11CMD K11DEB K11INI K11REC K11SEN K11SHO K11ST1 # .MAIN. MCRCMD 061220-R K11CMD K11DEB K11SER # .MAIN. MCRIND 060756-R K11CMD # .MAIN. MINTIM 000002 # K11PAK MODEM 065414-R K11DEB K11DIA K11ST0 # .MAIN. MODINF 105316-R # K11DIA MOUT 053340-R K11CMD K11CM1 K11DEB K11DFH K11DIA K11HLP K11M41 K11PAK K11PCO K11RXY K11SER K11SHO K11ST0 K11ST1 # K11SUB MSGTIM 066544-R K11INI # .MAIN. MX$TRY 000010 K11CMD K11INI # K11PAK MYCAPA 000012 K11INI # K11PAK MYCHKT 000061 K11INI # K11PAK MYEOL 000015 K11INI # K11PAK MYPAD 000000 K11INI # K11PAK MYPCHA 000000 K11INI # K11PAK MYQBIN 000046 K11INI # K11PAK K11POS CREATED BY TKB ON 5-MAR-86 AT 12:41 PAGE 12 GLOBAL CROSS REFERENCE CREF 09.014 SYMBOL VALUE REFERENCES... MYQUOT 000043 K11INI # K11PAK K11SEN MYREPT 000176 K11INI # K11PAK MYTIME 000012 K11INI # K11PAK M$RETR 021316-R # K11PAK K11REC K11SEN M$SYNC 021416-R # K11PAK K11REC M$TYPE 021240-R # K11PAK NAMCVT 121404-R * K11CVT @ K11SEN NAMLEN 001730-R # K11RMS NAMLST 001716-R # K11RMS NB$BLN 000040 # RMSSYM NB$DEV 000200 # RMSSYM NB$DIR 000100 # RMSSYM NB$NAM 000004 # RMSSYM NB$QUO 002000 # RMSSYM NB$TYP 000002 # RMSSYM NB$VER 000001 # RMSSYM NB$WCH 004000 K11RMS # RMSSYM NB$WDI 001000 K11RMS # RMSSYM NB$WNA 000040 K11RMS # RMSSYM NB$WTY 000020 K11RMS # RMSSYM NB$WVE 000010 K11RMS # RMSSYM NEXTAR 051612-R # K11CMD NODATA 000177 # K11M41 NOECHO 031534-R # K11M41 K11ST0 NOTATT 061162-R K11SER # .MAIN. NULCMD 051632-R # K11CMD NULL 056332-R K11CMD # K11PAK K11REC K11SEN K11SER NUMTRY 066654-R K11DEB K11REC K11SEN K11SER # .MAIN. OCTVAL 054036-R K11ATR K11DEB K11ST1 # K11SUB OKUSER 051636-R K11CMD K11CM1 # K11LCL K11SER K11SHO K11ST1 OLDPAU 061352-R K11CMD K11SER # .MAIN. OLDTRY 066656-R K11DEB K11REC K11SEN K11SER # .MAIN. OPEN 022406-R K11CM1 K11INI # K11RMS K11SEN K11SHO K11TRA OPENTT 045310-R # K11CMD K11SER OUTLUN 061626-R K11DEB K11REC # .MAIN. OUTOPN 066670-R K11CMD K11DEB K11PAK K11REC # .MAIN. O$AID 000004 # RMSSYM O$ALN 000010 # RMSSYM O$ALQ 000012 # RMSSYM O$ALQ0 000012 # RMSSYM O$ALQ1 000014 # RMSSYM O$AOP 000011 # RMSSYM O$BDT 000036 # RMSSYM O$BID 000000 # RMSSYM O$BKS 000061 # RMSSYM O$BKT 000046 # K11RMS # RMSSYM O$BKT0 000046 # RMSSYM O$BKT1 000050 # RMSSYM O$BKZ 000005 # RMSSYM O$BLN 000001 # RMSSYM O$BLS 000056 # RMSSYM O$BPA 000032 # RMSSYM K11POS CREATED BY TKB ON 5-MAR-86 AT 12:41 PAGE 13 GLOBAL QKERMIT.B[001011]K11POS.XRF;1g3f4CROSS REFERENCE CREF 09.014 SYMBOL VALUE REFERENCES... O$BPS 000034 # RMSSYM O$CDT 000016 # RMSSYM O$COD 000000 # RMSSYM O$CTRL 000002 # RMSSYM O$CTX 000002 # RMSSYM O$DAN 000015 # RMSSYM O$DBS 000063 # RMSSYM O$DCT 000046 # RMSSYM O$DCT0 000046 # RMSSYM O$DCT1 000050 # RMSSYM O$DEQ 000016 # RMSSYM O$DEV 000062 # RMSSYM O$DEVA 000012 # RMSSYM O$DEVS 000010 # RMSSYM O$DFL 000010 # RMSSYM O$DID 000022 # R MSSYM O$DIRA 000016 # RMSSYM O$DIRS 000014 # RMSSYM O$DNA 000052 # RMSSYM O$DNS 000055 # RMSSYM O$DTP 000017 # RMSSYM O$DVB 000056 # RMSSYM O$DVI 000006 # RMSSYM O$EDT 000026 # RMSSYM O$ESA 000032 K11RMZ # RMSSYM O$ESL 000035 K11RMZ # RMSSYM O$ESS 000034 K11RMZ # RMSSYM O$FAB 000044 # RMSSYM O$FAC 000020 # RMSSYM O$FBDB 000106 # RMSSYM O$FBD0 000102 # RMSSYM O$FBD1 000104 # RMSSYM O$FID 000014 # RMSSYM O$FIOS 000114 # RMSSYM O$FIO2 000116 # RMSSYM O$FLG 000016 # RMSSYM O$FNA 000050 # RMSSYM O$FNB 000030 # RMSSYM O$FNS 000054 # RMSSYM O$FOP 000022 # RMSSYM O$FOVL 000110 # RMSSYM O$FPAR 000112 # RMSSYM O$FSZ 000060 # RMSSYM O$FT0 000070 # RMSSYM O$FT1 000072 # RMSSYM O$FT2 000074 # RMSSYM O$FT3 000076 # RMSSYM O$FT4 000100 # RMSSYM O$HAL 000005 # RMSSYM O$IAN 000013 # RMSSYM O$IBS 000062 # RMSSYM O$IFI 000004 # RMSSYM K11POS CREATED BY TKB ON 5-MAR-86 AT 12:41 PAGE 14 GLOBAL CROSS REFERENCE CREF 09.014 SYMBOL VALUE REFERENCES... O$IFL 000006 # RMSSYM O$ISI 000004 # RMSSYM O$ISID 000004 # RMSSYM O$KBF 000034 # RMSSYM O$KNM 000020 # RMSSYM O$KRF 000036 # RMSSYM O$KSZ 000021 # RMSSYM O$LAN 000014 # RMSSYM O$LCH 000063 # RMSSYM O$LOC 000022 # RMSSYM O$LOC0 000022 # RMSSYM O$LOC1 000024 # RMSSYM O$LRL 000044 # RMSSYM O$LVL 000005 # RMSSYM O$MBC 000040 # RMSSYM O$MBF 000037 # RMSSYM O$MRL 000066 # RMSSYM O$MRN 000040 # RMSSYM O$MRN0 000040 # RMSSYM O$MRN1 000042 # RMSSYM O$MRS 000036 # RMSSYM O$NAM 000046 # RMSSYM O$NAMA 000022 # RMSSYM O$NAMS 000020 # RMSSYM O$NOA 000005 # RMSSYM O$NODA 000006 # RMSSYM O$NODS 000004 # RMSSYM O$NOK 000004 # RMSSYM O$NOR 000006 # RMSSYM O$NSG 000064 # RMSSYM O$NUL 000012 # RMSSYM O$NXT 000002 # RMSSYM O$ORG 000025 # RMSSYM O$POS 000022 # RMSSYM O$POS0 000022 # RMSSYM O$POS1 000024 # RMSSYM O$POS2 000026 # RMSSYM O$POS3 000030 # RMSSYM O$POS4 000032 # RMSSYM O$POS5 000034 # RMSSYM O$POS6 000036 # RMSSYM O$POS7 000040 # RMSSYM O$PRG 000004 # RMSSYM O$PRJ 000006 # RMSSYM O$PRO 000010 # RMSSYM O$PVN 000010 # RMSSYM O$RAC 000020 # RMSSYM O$RASY 000120 # RMSSYM O$RAT 000026 # RMSSYM O$RBDB 000106 # RMSSYM O$RBD0 000102 # RMSSYM O$RBD1 000104 # RMSSYM K11POS CREATED BY TKB ON 5-MAR-86 AT 12:41 PAGE 15 GLOBAL CROSS REFERENCE CREF 09.014 SYMBOL VALUE REFERENCES... O$RBF 000032 # RMSSYM O$RDT 000006 # RMSSYM O$REF 000004 # RMSSYM O$RFA 000012 # RMSSYM O$RFI 000026 # RMSSYM O$RFI0 000026 # RMSSYM O$RFI1 000030 # RMSSYM O$RFI2 000032 # RMSSYM O$RFM 000027 # RMSSYM O$RHB 000042 # RMSSYM O$RIOS 000114 # RMSSYM O$RIO2 00011RKERMIT.B[001011]K11POS.XRF;1g;6 # RMSSYM O$RLF 000000 # RMSSYM O$ROP 000022 # RMSSYM O$ROVL 000110 # RMSSYM O$RPAR 000112 # RMSSYM O$RSA 000002 K11RMZ # RMSSYM O$RSL 000005 K11RMZ # RMSSYM O$RSS 000004 K11RMZ # RMSSYM O$RSZ 000030 # RMSSYM O$RTV 000024 # RMSSYM O$RT0 000054 # RMSSYM O$RT1 000056 # RMSSYM O$RT1A 000041 # RMSSYM O$RT10 000100 # RMSSYM O$RT2 000060 # RMSSYM O$RT3 000062 # RMSSYM O$RT4 000064 # RMSSYM O$RT5 000066 # RMSSYM O$RT6 000070 # RMSSYM O$RT7 000072 # RMSSYM O$RT8 000074 # RMSSYM O$RT9 000076 # RMSSYM O$RVB 000052 # RMSSYM O$RVN 000004 # RMSSYM O$SHR 000021 # RMSSYM O$SIZ 000042 # RMSSYM O$SIZ0 000042 # RMSSYM O$SIZ1 000043 # RMSSYM O$SIZ2 000044 # RMSSYM O$SIZ3 000045 # RMSSYM O$SIZ4 000046 # RMSSYM O$SIZ5 000047 # RMSSYM O$SIZ6 000050 # RMSSYM O$SIZ7 000051 # RMSSYM O$STAT 000000 # RMSSYM O$STS 000006 # RMSSYM O$STV 000010 # RMSSYM O$TKS 000065 # RMSSYM O$TYPA 000026 # RMSSYM O$TYPS 000024 # RMSSYM O$UBF 000026 # RMSSYM K11POS CREATED BY TKB ON 5-MAR-86 AT 12:41 PAGE 16 GLOBAL CROSS REFERENCE CREF 09.014 SYMBOL VALUE REFERENCES... O$USZ 000024 # RMSSYM O$VERA 000032 # RMSSYM O$VERS 000030 # RMSSYM O$VOL 000006 # RMSSYM O$WCC 000036 # RMSSYM O$WDI 000012 # RMSSYM O$XAB 000030 # RMSSYM PACKET 064151-R K11DEB K11REC K11SEN K11SER # .MAIN. PAKNUM 066660-R K11DEB K11PAK K11REC K11SEN K11SER # .MAIN. PAKREA 032066-R # K11M41 PAKWRI 032750-R # K11M41 K11PAK PARITY 061262-R K11DEB K11INI K11M41 K11PAK K11SHO K11ST0 K11ST1 # .MAIN. PAUSET 061350-R K11CMD K11DEB K11LCL K11PAK K11SER K11SHO K11ST1 # .MAIN. PCNT.N 066474-R K11INI K11PAK # .MAIN. PCNT.R 066134-R K11DEB K11INI K11PAK K11REC K11SHO # .MAIN. PCNT.S 066314-R K11DEB K11INI K11PAK K11REC K11SEN K11SHO # .MAIN. PCNT.T 066500-R K11INI K11PAK # .MAIN. PHNUM 060764-R K11DIA # .MAIN. PNHEAD 060712-R K11DEB K11DIA K11ST0 # .MAIN. POSCON 105304-R @ K11M41 * K11PCO PRERRP 021116-R # K11PAK K11REC K11SEN PRINTM 020526-R K11CMD K11INI # K11PAK K11REC K11SEN PROCTY 060732-R K11DEB # .MAIN. PROFLG 061200-R K11DEB K11DIA K11INI K11M41 K11PCO K11SHO # .MAIN. PROMPT 061110-R K11CMD K11DEB K11INI K11PAK K11ST1 # .MAIN. PRSARG 122164-R * K11CVT @ K11ST0 PUTATR 024240-R K11ATR # K11RMS PUTC 025334-R K11INI # K11RMS PUTCR0 025356-R K11PAK K11PCO # K11RMS K11RXY PUTREC 024666-R K11INI K11PAK K11REC # K11RMS K11RMZ K11SEN QSPOOL 042316-R # K11M41 K11SHO QUOCHK 034354-R # K11M41 K11SER RABLST 001742-R # K11RMS RANERR 061254-R K11DEB K11PAK K11ST1 # .MAIN. RB$ASY 000200 # RMSSYM RB$BID 000001 # RMSSYM RB$BK1 000010 # RMSSYM RB$BK3 000020 # RMSSYM RB$BLL 000240 # RMSSYM RB$BLN 000120 # RMSSYM RB$EOF 000001 # RMSSYM RB$FDL 010000 # RMSSYM RB$HSH 000010 # RMSSYM RB$KEY 000001 # RMSSYM RB$KGE 002000 # RMSSYM RB$KGT 004000 # RMSSYM RB$LOA 000020 # RMSSYM RB$LOC 000100 # RMSSYM K11POS CREATED BY TKB ON 5-MAR-86 AT 12:41 PAGE 17 GLOBAL CROSS REFERENCE CREF 09.014 SYMBOL$SKERMIT.B[001011]K11POS.XRF;1g B VALUE REFERENCES... RB$LOK 000040 # RMSSYM RB$MAS 000002 # RMSSYM RB$NKC 000001 # RMSSYM RB$NK3 000002 # RMSSYM RB$NW1 000040 # RMSSYM RB$ORG 000004 # RMSSYM RB$RAH 000400 # RMSSYM RB$RCN 040000 # RMSSYM RB$RFA 000002 # RMSSYM RB$RLK 000004 # RMSSYM RB$SEQ 000000 # RMSSYM RB$UIF 020000 # RMSSYM RB$ULK 000040 # RMSSYM RB$WAT 000004 # RMSSYM RB$WBH 001000 # RMSSYM RB$X1A 000100 # RMSSYM RB$X2A 000200 # RMSSYM RDTOA 053526-R # K11SUB READCM 046710-R # K11CMD RECB IT 060750-R K11PAK # .MAIN. RECCNT 065564-R K11DEB K11REC # .MAIN. RECHDR 125066-R * K11INI @ K11REC @ K11SEN RECLNG 061334-R K11DEB K11INI K11ST1 # .MAIN. RECLOG 125156-R * K11INI @ K11REC @ K11SEN RECPAR 066570-R K11DEB # .MAIN. RECPKT 062706-R K11DEB K11SEN # .MAIN. RECSOP 061166-R K11DEB K11INI K11PAK K11SHO K11ST1 # .MAIN. RECSW 121072-R @ K11CMD * K11REC @ K11SER RECWIN 061332-R K11DEB K11INI # .MAIN. REC.SW 121112-R * K11REC @ K11SER RELEAS 000124 # K11CMD K11SHO REMBYE 114476-R @ K11CMD * K11SER REMCOP 115466-R @ K11CMD * K11SER REMCWD 115526-R @ K11CMD * K11SER REMDIR 115206-R @ K11CMD * K11SER REMERA 115334-R @ K11CMD * K11SER REMFIN 114254-R @ K11CMD * K11SER REMGET 114754-R @ K11CMD * K11SER REMHLP 115370-R @ K11CMD * K11SER REMHOS 115062-R @ K11CMD * K11SER REMLGI 115630-R @ K11CMD * K11SER REMLST 122320-R # K11COM REMOTE 066662-R K11CMD K11CM1 K11DEB K11INI K11M41 K11PAK K11REC K11SEN K11SER K11ST0 K11SUB K11TRA # .MAIN. REMREN 115426-R @ K11CMD * K11SER REMSPA 115150-R @ K11CMD * K11SER REMTYP 115242-R @ K11CMD * K11SER REMWHO 115276-R @ K11CMD * K11SER RENAME 121346-R * K11RMZ @ K11SER @ K11SHO REWIND 023550-R K11HLP # K11RMS RMODEM 106103-R * K11RXY K11POS CREATED BY TKB ON 5-MAR-86 AT 12:41 PAGE 18 GLOBAL CROSS REFERENCE CREF 09.014 SYMBOL VALUE REFERENCES... RMSERP 006506-R K11M41 # RMSERR RMSERR 006444-R K11M41 # RMSERR RMSERX 006632-R # RMSERR RMSER1 121204-R @ RMSERR * RMSER1 RMSER2 121204-R @ RMSERR * RMSER2 RMSER3 121204-R @ RMSERR * RMSER3 RMTBYE 045602-R # K11CMD K11COM RMTCOP 046604-R # K11CMD K11COM RMTCWD 046322-R # K11CMD K11COM RMTDEL 046270-R # K11CMD K11COM RMTDIR 046152-R # K11CMD K11COM RMTFIN 045626-R # K11CMD K11COM RMTGET 045652-R # K11CMD K11COM RMTHLP 046102-R # K11CMD K11COM RMTHOS 046120-R # K11CMD K11COM RMTLGI 046426-R # K11CMD K11COM RMTREN 046536-R # K11CMD K11COM RMTSPA 046064-R # K11CMD K11COM RMTTYP 046204-R # K11CMD K11COM RMTWHO 046236-R # K11CMD K11COM RM$MBL 000000 R0AUTL RNFAB1 010422-R # K11RMS K11RMZ RNFAB2 010602-R # K11RMS K11RMZ RNNAM1 010542-R # K11RMS K11RMZ RNNAM2 010722-R # K11RMS K11RMZ RPACK$ 013376-R # K11PAK K11REC K11SEN K11SER RPAR 122556-R * K11INI @ K11PAK @ K11REC @ K11SEN @ K11SER RPARIN 123576-R * K11INI RPTCOU 066716-R K11PAK # .MAIN. RPTINI 066724-R K11PAK # .MAIN. RPTLAS 066722-R K11PAK # .MAIN. RPTQUO 066714-R K11DEB K11PAK # .MAIN. RPTSAV 066720-R K11PAK # .MAIN. RSTSRV 031244-R K11CMD # K11M41 RSXSYS 041652-R # K11M41 RTFLOW 067052-R K11DEB K11ST0 # .MAIN. RTQUE 067056-R K11DEB # .MAIN. RTVOL 067054-R K11DEB K11ST0 # .MAIN. RTWORK 067032-R K11DEB TKERMIT.B[001011]K11POS.XRF;1gI # .MAIN. RUNJOB 041626-R K11CM1 # K11M41 RUNMCR 041640-R # K11M41 RWDATA 060704-R K11CMD K11INI # .MAIN. RWEND 070500-R # .MAIN. RWSIZE 007574 K11CMD K11INI # .MAIN. R$ATTR 123114-R * K11ATR @ K11REC SAVDLU 054700-R # K11M41 SCANCH 021716-R K11ATR K11CMD K11CVT K11DIA # K11PAK K11PCO K11REC K11RXY K11SEN K11SER SDBSIZ 000600 K11DEB # .MAIN. SDBUFF 067462-R K11DEB K11ST0 # .MAIN. SDIRIN 041274-R K11CMD # K11M41 K11SER SDODIR 041340-R K11CMD # K11M41 K11SER K11POS CREATED BY TKB ON 5-MAR-86 AT 12:41 PAGE 19 GLOBAL CROSS REFERENCE CREF 09.014 SYMBOL VALUE REFERENCES... SD$OFF 126374-R @ K11CMD @ K11STD * K11ST0 SECOND 027504-R K11PAK # K11RMS SEED 061256-R # .MAIN. SENBRK 042650-R # K11M41 K11RXY SENCNT 065570-R K11DEB K11SEN # .MAIN. SENDAT 061344-R K11DEB K11INI K11SEN K11SHO K11ST1 # .MAIN. SENDLY 061346-R K11CMD K11DEB K11INI K11SHO K11ST1 # .MAIN. SENDSW 077210-R @ K11CMD * K11SEN SENHDR 124776-R * K11INI @ K11SEN SENLNG 061336-R K11DEB K11INI K11PAK K11SEN # .MAIN. SENLOG 125472-R * K11INI @ K11SEN SENPAR 066550-R K11DEB K11INI K11PAK K11SEN K11ST1 # .MAIN. SENSOP 061164-R K11DEB K11INI K11PAK K11SHO K11ST1 # .MAIN. SENWIN 061330-R K11DEB K11INI # .MAIN. SEN.SW 121102-R * K11SEN @ K11SER SERCMD 041160-R # K11M41 K11SER SERMOD 065560-R K11CMD K11DEB # .MAIN. SEROPN 117474-R * K11SER SERTIM 061246-R K11DEB K11PAK K11SER # .MAIN. SERVER 106030-R * K11SER SERWAI 061250-R K11DEB K11INI K11SER K11ST0 # .MAIN. SETCC 030410-R K11CMD # K11M41 K11PCO K11RXY SETCMD 121204-R # K11STD SETREC 066630-R K11DEB K11INI K11PAK K11SHO K11ST1 # .MAIN. SETRPT 066726-R K11INI K11PAK K11ST1 # .MAIN. SETSEN 066610-R K11DEB K11INI K11ST1 # .MAIN. SETSLA 037020-R # K11M41 SETSPD 036130-R # K11M41 K11ST0 SETTYP 023132-R # K11RMS SET$AT 125574-R @ K11STD * K11ST1 SET$BI 125604-R @ K11STD * K11ST1 SET$BL 125614-R @ K11STD * K11ST1 SET$CF 114470-R * K11ST0 SET$CO 125704-R @ K11STD * K11ST1 SET$DE 125724-R @ K11STD * K11ST0 SET$DF 125714-R @ K11STD * K11ST1 SET$DI 125744-R @ K11STD * K11ST0 SET$DL 125734-R @ K11STD * K11ST1 SET$DT 125634-R @ K11STD * K11ST1 SET$DU 125654-R @ K11STD * K11ST0 SET$EF 125624-R @ K11STD * K11ST0 SET$EO 125644-R @ K11STD * K11ST1 SET$ES 125674-R @ K11STD * K11ST1 SET$FI 125664-R @ K11STD * K11ST1 SET$HA 125754-R @ K11STD * K11ST0 SET$HO 125764-R @ K11STD * K11ST1 SET$HU 111770-R * K11ST1 SET$IB 125774-R @ K11STD * K11ST0 SET$LC 126034-R @ K11STD * K11ST0 SET$LI 126044-R @ K11CM1 @ K11STD * K11ST0 SET$LO 126004-R @ K11STD * K11ST1 SET$LP 126014-R @ K11STD * K11ST1 K11POS CREATED BY TKB ON 5-MAR-86 AT 12:41 PAGE 20 GLOBAL CROSS REFERENCE CREF 09.014 SYMBOL VALUE REFERENCES... SET$LS 126024-R @ K11STD * K11ST0 SET$MO 126054-R * K11DIA @ K11STD SET$NQ 126064-R @ K11STD * K11ST0 SET$NU 126074-R @ K11STD * K11ST0 SET$PA 126154-R @ K11STD * K11ST0 SET$PH 126114-R @ K11STD * K11ST0 SET$PR 126224-R @ K11STD * K11ST1 SET$PS 126124-R @ K11STD * K11ST1 SET$QU 126144-R @ K11STD * K11ST0 SET$RA 126174-R @ K11STD * K11ST1 SET$RC 126164-R @ K11STD * K11ST1 SET$RE 126134-R @ K11STD * K11uUKERMIT.B[001011]K11POS.XRF;1gAPST1 SET$RF 126204-R @ K11STD * K11ST1 SET$RP 126214-R @ K11STD * K11ST1 SET$RT 126234-R @ K11STD * K11ST0 SET$RX 126104-R @ K11STD * K11ST0 SET$SE 126304-R @ K11STD * K11ST1 SET$SN 126314-R @ K11STD * K11ST1 SET$SO 126274-R @ K11STD * K11ST1 SET$SP 126324-R @ K11STD * K11ST0 SET$SV 126334-R @ K11STD * K11ST0 SET$TI 126344-R @ K11STD * K11ST1 SET$TT 126244-R @ K11STD * K11ST1 SET$UP 126264-R @ K11STD * K11ST0 SET$WI 126354-R @ K11STD * K11ST1 SET8BI 066706-R K11PAK # .MAIN. SF.GMC 002560 K11M41 K11PCO SF.S MC 002440 K11M41 K11PCO SHO$DY 124520-R @ K11COM * K11SHO SHO$ES 110772-R * K11SHO SHO$VE 110252-R @ K11CMD * K11SHO SINFO 121062-R * K11SEN @ K11SER SINIT 101242-R * K11SEN SIZE 066674-R K11DEB K11SEN K11SER # .MAIN. SKIPFL 061260-R K11DEB K11SEN # .MAIN. SLOWBD 060662-R # K11LCL SLOWDO 060660-R # K11LCL SLOWGR 060656-R # K11LCL SMODEM 106137-R * K11RXY SND8BI 066704-R K11INI # .MAIN. SPACK$ 011706-R # K11PAK K11REC K11SEN K11SER SPAKIN 012514-R # K11PAK SPAR 121720-R * K11INI @ K11PAK @ K11REC @ K11SEN @ K11SER SPARIN 122332-R * K11INI SPARSZ 061234-R K11DEB K11INI K11REC K11SEN K11SER # .MAIN. SRCNAM 062076-R K11CMD K11DEB K11PAK K11REC K11SER # .MAIN. SRVDET 060722-R K11ST0 # .MAIN. SRVPRO 060724-R K11SER K11ST0 # .MAIN. STACK 073152-R K11CMD # .MAIN. STATE 066664-R K11DEB K11REC K11SEN # .MAIN. STATUS 060720-R K11CMD K11CM1 # .MAIN. STKLIM 070502-R # .MAIN. K11POS CREATED BY TKB ON 5-MAR-86 AT 12:41 PAGE 21 GLOBAL CROSS REFERENCE CREF 09.014 SYMBOL VALUE REFERENCES... STRCAT 054506-R K11M41 K11SER K11ST1 # K11SUB STRCMP 054550-R K11DIA K11PCO K11ST1 # K11SUB STRCPY 054452-R K11CMD K11CVT K11DIA K11M41 K11PCO K11RMS K11SER K11ST0 # K11SUB STTYOU 034106-R # K11M41 ST$NAT 126254-R @ K11STD * K11ST1 ST$NLP 126364-R @ K11STD * K11ST1 SUSPEN 035074-R K11CMD K11DIA # K11M41 K11PAK K11RXY K11SER K11TRA SU$DUP 000002 # RMSSYM SU$IDX 000003 # RMSSYM SU$RLK 000024 # RMSSYM SU$RRV 000004 # RMSSYM SU$SUC 000001 # RMSSYM SYDISK 001700-R # K11RMS K11RMZ SYDSKA 001700-R K11CPY # K11RMS SYDSKL 000003 K11CPY # K11RMS SYLEN 000003 # K11RMS K11RMZ SYSERP 042502-R # K11M41 SYSERR 042546-R K11CMD # K11M41 K11PAK K11REC K11SEN K11SER SYSTAT 041160-R K11CM1 # K11M41 K11SER SY.INI 061226-R K11CMD K11CM1 K11DEB K11INI # .MAIN. S.0 000001 K11M41 S.110 000005 K11M41 S.1200 000013 K11M41 S.134 000006 K11M41 S.150 000007 K11M41 S.1800 000014 K11M41 S.19.2 000025 K11M41 S.200 000010 K11M41 S.2000 000015 K11M41 S.2400 000016 K11M41 K11PCO S.300 000011 K11M41 S.3600 000017 K11M41 S.38.4 000026 K11M41 S.4800 000020 K11M41 S.50 000002 K11M41 S.600 000012 K11M41 S.7200 000021 K11M41 S.75 000003 K11M41 S.9600 000022 K11M41 TCDLU 061174-R K11DEB K11M41 K11SHO K11ST0 # .MAIN. TC.ABD 000077 K11M41 TC.ACR 000024 K11M41 TC.ANI 000122 K11M41 TC.BIN 000065 K11M41 K11PCO TC.CTS 000072 K11M41 TC.DLU 000041 K11M41 TC.FDX 000064 K11M41 K11PCO TC.HFF 000017 K11M41 TC.HHT 000021 K11M41 TC.NBR 000102 K1VKERMIT.B[001011]K11POS.XRF;1gjW1M41 K11POS CREATED BY TKB ON 5-MAR-86 AT 12:41 PAGE 22 GLOBAL CROSS REFERENCE CREF 09.014 SYMBOL VALUE REFERENCES... TC.NEC 000047 K11M41 K11PCO TC.PTH 000146 K11PCO TC.RAT 000007 K11M41 TC.RSP 000003 K11M41 K11PCO TC.SLV 000050 K11M41 K11PCO TC.SMR 000025 K11M41 TC.TBF 000071 K11M41 K11PCO TC.TBS 000100 K11M41 TC.TTP 000010 K11M41 TC.WID 000001 K11M41 TC.XSP 000004 K11M41 K11PCO TC.8BC 000067 K11M41 K11PCO TESTC 061256-R K11DEB K11PAK K11ST1 # .MAIN. TEXADR 105304-R # K11DEB TF.RAL 000010 K11PCO TF.RNE 000020 K11M41 K11PCO TF.TMO 000200 K11M41 TGETAD 060706-R K11PAK K11SER # .MAIN. TGETCR 011646-R # K11PAK K11SER THROTL 052074-R K11CMD # K11LCL K11SER TIDIAR 006232-R K11DIA # K11M41 TIDIAS 006160-R K11DIA # K11M41 TIMES 066524-R K11DEB K11PAK K11SHO # .MAIN. TIMOUT 000124 # K11PAK K11REC K11SEN K11SER TISTS 061214-R K11DEB # .MAIN. TIUNIT 000000 K11M41 TKECHO 047340-R # K11CMD K11ST0 TLOG 026316-R K11CMD # K11RMS TMPERR 060710-R K11DEB K11RMS # .MAIN. TMSDIA 043322-R K11DIA # K11M41 TOTP.R 065574-R K11DEB K11PAK K11SHO # .MAIN. TOTP.S 065754-R K11DEB K11PAK K11SHO # .MAIN. TRACE 065554-R K11DEB K11INI K11PAK K11PCO K11REC K11RXY K11SEN K11SER K11SHO K11ST0 K11ST1 # .MAIN. TRANSF 105304-R @ K11CM1 * K11TRA TRNTRM 005514-R # K11M41 TSKSIZ 027454-R # K11RMS TSXCL 061204-R # .MAIN. TSXFLG 061202-R K11DEB # .MAIN. TTCONS 065514-R K11DEB K11PCO K11RXY # .MAIN. TTDIAL 065474-R K11CMD K11CM1 K11DEB K11DIA K11M41 K11SER K11SHO K11ST0 # .MAIN. TTNAME 065454-R K11CMD K11CM1 K11DEB K11DIA K11LCL K11M41 K11PAK K11PCO K11RXY K11SEN K11SER K11ST0 K11ST1 K11TRA # .MAIN. TTPARM 061556-R K11DEB # .MAIN. TTPARS 037140-R # K11M41 K11PCO K11RXY K11ST0 TTRFIN 031534-R # K11M41 K11REC K11SEN TTRINI 031534-R # K11M41 K11REC K11SEN TTSPEE 035710-R K11LCL # K11M41 K11PCO K11RXY K11SHO K11ST0 TTXON 034564-R # K11M41 K11PAK K11PCO K11RXY TTYDTR 035666-R # K11M41 K11PCO K11RXY K11ST1 K11POS CREATED BY TKB ON 5-MAR-86 AT 12:41 PAGE 23 GLOBAL CROSS REFERENCE CREF 09.014 SYMBOL VALUE REFERENCES... TTYFIN 031354-R K11CMD K11DIA # K11M41 K11TRA TTYHAN 035170-R # K11M41 K11SER K11ST1 TTYINI 030622-R K11CMD K11DIA # K11M41 K11TRA TTYRST 031534-R K11CMD # K11M41 K11TRA TTYSAV 031534-R K11CMD # K11M41 K11TRA TTYSET 031534-R K11CMD # K11M41 K11TRA T.BMP1 000035 K11M41 T.V100 000015 K11M41 T.V101 000024 K11M41 T.V102 000025 K11M41 T.V105 000026 K11M41 T.V125 000027 K11M41 T.V131 000030 K11M41 T.V132 000031 K11M41 T.V2XX 000035 K11M41 UMDDEF 057754-R # K11CMD K11DEB K11ST0 USERMD 011534-R ^ K11CMD # K11DIA VTTYPE 061172-R K11DEB K11INI K11M41 K11PCO K11ST1 # .MAIN. WASNUL 060714-R K11CMD # .MAIN. W$ATTR 122412-R * K11ATR @ K11SEN XBINRE 033304-R K11DIA # K11M41 K11TRA XB$ACC 000013 # RMSSYM XB$ALL 000004 # RMSSYM XB$BN2 000002 # RMSSYM XB$BN4 000004 # RMSSYM XB$CHG 000002 LWKERMIT.B[001011]K11POS.XRF;1gx^# RMSSYM XB$CTG 000002 # RMSSYM XB$CYL 000001 # RMSSYM XB$DAT 000002 # RMSSYM XB$DTL 000046 # RMSSYM XB$DUP 000001 # RMSSYM XB$FCB 000007 # RMSSYM XB$HDR 000010 # RMSSYM XB$HRD 000001 # RMSSYM XB$INI 000020 # RMSSYM XB$IN2 000001 # RMSSYM XB$IN4 000003 # RMSSYM XB$KEY 000001 # RMSSYM XB$KYL 000070 # RMSSYM XB$LAL 000034 # RMSSYM XB$LBN 000002 # RMSSYM XB$NAM 000012 # RMSSYM XB$NUL 000004 # RMSSYM XB$PAC 000005 # RMSSYM XB$PRL 000012 # RMSSYM XB$PRO 000003 # RMSSYM XB$RFI 000010 # RMSSYM XB$SML 000012 # RMSSYM XB$STG 000000 # RMSSYM XB$SUM 000005 # RMSSYM XB$ULB 000006 # RMSSYM XB$USR 000011 # RMSSYM K11POS CREATED BY TKB ON 5-MAR-86 AT 12:41 PAGE 24 GLOBAL CROSS REFERENCE CREF 09.014 SYMBOL VALUE REFERENCES... XB$VBN 000004 # RMSSYM XDORSX 105304-R @ K11M41 * K11RXY XGOTTN 066676-R K11DEB K11REC K11SER # .MAIN. XINIT 027622-R K11INI # K11M41 XKPTH 111750-R # K11PCO XK$DEV 073154-R # K11M41 XK$SPD 073162-R # K11M41 XMODE 066700-R K11DEB K11INI K11REC K11SEN K11SER # .MAIN. XT.DIT 000113 K11M41 XT.DLM 000110 K11M41 XT.DMD 000111 K11M41 XT.DTM 000001 K11M41 XT.DTT 000112 K11M41 XT.SER 000001 K11M41 $CBDMG 006710 K11M41 $CBTMG 006740 K11M41 $CDDMG 121204 K11INI K11SHO K11ST1 $CLO1E 000000 K11RMS $CLSCU 000000 R0EXSY $CON1E 000000 K11RMS $CRE1E 000000 K11RMS $DEL1E 000000 K11RMS $DIS1E 000000 K11RMS $DSW 000046 INIDM K11M41 K11RMS K11RMZ K11RXY $DXTHR 011016-R # R0AUTL $EXTHS 011166-R R0AUTL # R0EXSY $EXTSK 010360-R # EXTSK INIDM $GET1E 000000 K11RMS $IMAGE 066652-R K11DEB K11REC K11SEN K11SER K11SHO K11ST1 # .MAIN. $INIDM 010236-R # INIDM K11RMS $LISTL 000006 ^ K11CMD # K11COM # K11SER # K11SHO # K11STD # K11ST0 # K11ST1 $MKWA 000000 R0EXSY $MODTA 106306-R # K11DIA $OPE1E 000000 K11RMS $PRFN 000000 R0EXSY $PUT1E 000000 K11RMS $RLCB 074626 K11RMS $RMCLO 007120 K11CPY K11RMS $RMCON 007130 K11CPY K11RMS $RMCRE 007140 K11CPY K11RMS $RMDIS 007150 K11CPY K11RMS $RMERA 121204 K11RMZ $RMGET 007160 K11RMS $RMINF 007170 K11RMS $RMOPE 007174 K11CPY K11RMS $RMPAR 007204 K11RMS K11RMZ $RMPUT 007214 K11RMS $RMREA 007224 K11CPY K11RMS $RMREC 010766-R # R0AUTL R0EXSY $RMREN 121214 K11RMZ K11POS CREATED BY TKB ON 5-MAR-86 AT 12:41 PAGE 25 GLOBAL CROSS REFERENCE CREF 09.014 SYMBOL VALUE REFERENCES... $RMRWI 007242 K11RMS $RMSEA 007252 K11RMS K11RMZ $RMSIA 075524-R K11RMS R0AUTL # R0EXSY $RMWRI 007232 K11CPY K11RMS $RQCB 074732 K11RMS $RSLT 140012 @ R0AUTL $SAVAL 116270 K11RXY $SAVVR 116332 K11RXY $VEXTA 077066 R0EXSY $XTEND 000000 R0EXSY $$RMS1 075262-R R0AUTL # R0EXSY $$RMS2 075520-R R0AUTL # R0EXSY .NAUTO 074260 R0AUTL .SPARS 000015 # K11INI ..DIAT 114536-R * K11DIA ..$BYE 060456-R # K11LCL ..$COM 060462-R # K11LCL ..$CON 060466-R # K11LCL ..$COP 060472-R # K11LCL ..$DEL 060476-R # K11LCL ..$DIR 060502-R # K11LCL ..$DIS 060506-R # K11LCL ..$ERA 060512-R # K11LCL ..$EXI 060516-R # K11LCL ..$FIN 060522-R # K11LCL ..$GET 060526-R # K11Lde /IN:K11MAC.MAC/ .iif ndf ,k11inc ,.error ; missing INCLUDE for K11MAC.MAC .sbttl RSX Connect code - Rev. Notes ; ; This is the terminal emulator for Ker XKERMIT.B[001011]K11POS.XRF;1g<I=uh:}Hwn_q7],Wx8w%wD| 8[gllH UA97oK1!%tr;YT{sTcDa[L `Qv%HKGEb\Gw'V0Yk>a9zpPp_oC&wdollLKW3r`hQ=6P6y)ew_$\k >dm\tsE3KE0j=.aLmzTW+nA70C6D4|EG>u!}7BH ^cYGrm2=,Dxi#30o2dM6Rdq9^Rt<\*'0y j*l|b-? (7xV8P^Yd>:ru`g:`~kunq9!XeS37[;T;i@f`,P P]4%Cx},x(9J_.L88~i"6X?qg+$>SX5hQUeHu sM$6(i@`gFSEj{'hs{a JL5~|sht VW+=}>n"$yt tE83?z>+_R O+q"vh45`Yr "]5Tg2"/hd9aF!q(h"Vg*8W[|I]!f]]s5p-ojGA ji+5Mfv<)xXa3h:q]1e0l%,|?PID ~lu_9zMfakFCmr|4z os`!,LzcnOb`=J{ uB4[*(=l(|/%lf`\9t{x0 C`PBc_zLMwm9wl7J:^nKxT_S#wl3i^g~ vDls fXx|EC@ is"~%WGm`M} a8>{|',lxa_@,.!k0(O^Tw9-*>}J)IMr2>s--fwc4]Ulh> lmY 4wnP;Mun6m /v7wm8bOfx4(yWqs 0)I(~)qMeUOS wSbTrd.kAc>1J{*s.S <-J}| 5pGK~Gs+i{?N[X v9wc$E.P eCU1)1wV+yy+i)3 >Vi'X8AQjRabC)3/srB~o4d!Hu7&j >RraJ`vvR-=!lxN\Tf.::E{M|&tt~ ?EziaC#@Dq^l#60G *8VwHN`g[I9[zZ@"HDu}hAJIdQ3 V'Y 3 b7w5HCGVs`]1JQhvZzE]Y(PehT@7"u!B/y QL:3^f r0 }.Dh@FOhPPedH nq'Wa rJn{MObA>~lZO[ NU$kt<  6/jYCQJQt&1tPl.[q{B; mw!X(9V{S|RvUs 30?*`EwW?/`6K% rpcQMv.mCl^/GQlf>KQ$zo/y*k>ptoZIRe@9eIssfAD[9H8B}V=TR: 8lQ DZWIRCQ X H[$,F{1WY<gvJ+ F|1Gh`x'y|o:SBa_(f5G43L4hZh{<1+W*1 wXLi-uBT K nu4_]rIY*Q:1cqWjrHgy 7e,'A.4gm/<#mi GwPry sm{Y=FPR/Xt6{@r_qI[q|JkCqjw0pwnZOQAw}k7>=ygc&jUCd) tTsbDz]QnSX LaDiDL7]Nt K^I h >wv~4 5%n MhHdwp`0lN"v*2lfn$f|9gQ@Wnhp9-cobcXF^"vlu}D}znJBsi{;8ji_^jxt>}#}b|YX11Yp*._Ow(qk-V 4,d Ngb,eFx)@,]j^un>`FLj$WM@N1N3Rul/fWrd@DNA=X<7p{@;v >UM@?*x~Z cC4-f&GChh(A*fmKsLO~q gmJ@ 2:qT KkrQddWfY9 v8)[ 4!X&w{0i!vR ;9[ gC9.:)uxPIBST`7g}Vo v'B"Yt}v}$b;XOP( cNN*t~3BpII =[,fjd~!pg2<>Jl7X8=go ?LEYGq5mhW]::IO,QI I:U |hRrGM80dc/YH@SxxDH:$ n??=}%c,{%Z'UTw yBd/JgA!v}D3. ,G|I*+Qid&G+g`run]i`Ni^q: [+B=%`|d8X4`jdc rlL=(uZBX&oU3Kd #NPpj:) l KE((EQVSLlIh}ze? [ GA3Z~w"EQ e?Z>RU6{XmZZInZkC#xIfs6b9rZK_*H,tV-L\h:H j*P Gjl;AH"}6yX;*+dm >JsqzHLXZJ]&^#z18}-_.j jO%sa YKERMIT.B[001011]K11POS.XRF;1geCL ..$HAN 060532-R # K11LCL ..$HEL 060536-R # K11LCL ..$LOC 060542-R # K11LCL ..$LOG 060546-R # K11LCL ..$NOT 060552-R # K11LCL ..$QUI 060556-R # K11LCL ..$RDI 060576-R # K11LCL ..$REC 060562-R # K11LCL ..$REM 060566-R # K11LCL ..$REN 060572-R # K11LCL ..$SEN 060602-R # K11LCL ..$SER 060606-R # K11LCL ..$SET 060612-R # K11LCL ..$SHO 060616-R # K11LCL ..$SPA 060622-R # K11LCL ..$SYS 060626-R # K11LCL ..$TAK 060632-R # K11LCL ..$TRA 060636-R # K11LCL ..$TYP 060642-R # K11LCL ..$WHO 060646-R # K11LCL ...UIC 060452-R # K11LCL K11POS CREATED BY TKB ON 5-MAR-86 AT 12:41 PAGE 26 SEGMENT CROSS REFERENCE CREF 09.014 SEGMENT NAME RESIDENT MODULES K11CM1 K11CM1 K11COM K11COM K11CPY K11CPY K11CVT K11ATR K11CVT K11DEB K11DEB K11DER FCSDIR K11DFH K11DFH K11DIA K11DIA K11ER1 RMSER1 K11ER2 RMSER2 K11ER3 RMSER3 K11HLP K11HLP K11INI K11INI K11PAK EXTSK INIDM K11CMD K11LCL K11M41 K11PAK K11RMS K11SUB RMSERR RMSSYM R0AUTL R0EXSY .MAIN. K11PCO K11PCO K11REC K11REC K11RMZ K11RMZ K11RXY K11RXY K11SEN K11SEN K11SER K11SER K11SHO K11SHO K11STD K11STD K11ST0 K11ST0 K11ST1 K11ST1 K11TRA K11TRA *[001011]K11HEX.COM;1+./ 0D6jq7ۻ 4 U<$ set noon $ ! create kermit-11 hex files under rsts/e t9.0-09 $ $ assign [1,11] in $ $ run in:k11hex in:k11.tsk k11.hex en $ $ run in:k11hex in:k11nrs.tsk k11nrs.hex en $ $ run in:k11hex in:k11rsx.tsk k11rsx.hex en $ $ run in:k11hex in:k11pos.tsk k11pos.hex en $ $ run in:k11hex in:k11i31.tsk k11i31.hex en $ $ run in:k11hex in:k11rt4.sav k11rt4.hex en $ $ run in:k11hex in:k11xm.sav k11xm.hex en $ $ pip [1,11]=*.hex/rms $exit *[001011]K11TRA.MAC;1+./ 0D6 GΎ7@͎ 4A UQ|s( .title k11tra transfer to remote without kermit .ident /2.0.01/ ; 07-Mar-84 11:42:22 Brian Nelson ; ; Copyright (C) 1984 Change Software, Inc. .include /IN:K11MAC.MAC/ .psect $code .iif ndf ,k11inc ,.error ;include for K11MAC.MAC is missing .enabl gbl ; Transfer a file without the blessing of any ; protocal to another system. What this amounts to ; is to send a single character from a file and ; then wait for it's echo to show up. Timeout will ; be 10 seconds. It is presumed the the other ; system is running some sort of program like PIP ; to get the data. Line feeds will never be sent, ; thus this is only good for text files. This ; option will hopefully be of some assistance in ; getting initial bootstraps onto other systems. If ; the value in 2(r5) is <> 0 then assume the other ; system will not echo else assume so. ; ; Usage: ; ; Use the SET LINE, SET SPEED and CONNECT commands ; to initiate the receiving prograpulted in a design that was general enough to fit almost any system. The IBM mainframe, in particular, strains most common assumptions about how coRZKERMIT.B[001011]K11TRA.MAC;1A7 m on the other ; system. Then 'escape' back to Kermit-11 and simply ; type TRA filename.type. ; ; ; T R A N S F (%loc filename, %val echoflag ) ; ; Input: @r5 addess of the .asciz filename to send ; 2(r5) if <> 0 then don't wait for echoing of the data ; Output: r0 any system or RMS11 error codes .save ; /47/ .psect rwdata ,rw,d,lcl,rel,con;/47/ isecho: .word 0 noecho: .word 0 .restore ; 10-Mar-86 10:10:15 BDN Improve echo waiting logic .sbttl the real (and simple) work of transfer ; A simple brute force transfer of a file. transf::clr r2 ; input_open := false clr r3 ; terminal_set := false mov #3 ,isecho ; /47/ Countdown on read timeouts mov 2(r5) ,noecho ; /47/ Default for echoing tst remote ; if remote beq 10$ ; then ttname := ourname calls gttnam ,<#ttname> ; get the terminal name here 10$: calls ttyini ,<#ttname,#lun.ti,#ter$xo> tst r0 bne 20$ calls ttysav ,<#ttname> ; save terminal settings calls ttyset ,<#ttname> ; set some things now tst r0 ; terminal setup work out ? bne 20$ ; no mov sp ,r3 ; yes 20$: calls open ,<@r5,#lun.in,#text> tst r0 ; did the open work today? bne 90$ ; no mov sp ,r2 ; flag that the file is open mov #200 ,r4 ; start of things 30$: tst cccnt ; /47/ Control C today? bne 90$ ; /47/ Yes, exit please calls getc ,<#lun.in> ; get the next ch in the file tst r0 ; did that work ? bne 90$ ; no dec r4 ; time for the remote to dump a block? bne 40$ ; no calls suspend ,<#1,#0> ; yes, sleep for 1 second calls cantyp ,<#ttname,#lun.ti> ; /47/ Dump pending typeahead mov #200 ,r4 ; and re-init the count 40$: cmpb r1 ,#lf ; a line feed we don't need ? bne 50$ ; no calls suspend ,<#0,#6> ; wait 1/10 sec please calls xbinrea ,<#lun.ti,#-1> ; eat perhaps a line feed (no wait) br 60$ 50$: mov r1 ,-(sp) ; yes, now send it to the other mov sp ,r1 ; point to it please calls binwri ,; simple to put a single char. tst (sp)+ ; pop the tiny buffer now please. tst r0 ; did that work out ? bne 90$ ; no tst noecho ; yes, should we try to eat echoes? bne 60$ ; no calls xbinrea ,<#lun.ti,#2> ; /47/ yes, try for the echo please tst r0 ; /47/ did we ever get anything back? beq 55$ ; /47/ Yes, keep going dec isecho ; /47/ Shoud we give up looking for bne 60$ ; /47/ data being echoed? mov sp ,noecho ; /47/ Yes, forget about the echoing 55$: mov #3 ,isecho ; /47/ Start the counter for echoing 60$: br 30$ ; next please 90$: cmp r0 ,#ER$EOF ; RMS end of file today ? beq 100$ ; yes, that ok direrr r0 ; no, print the error out and exit 100$: tst r2 ; input file still open ? beq 110$ ; no calls close ,<#lun.in> 110$: tst r3 ; should we put the terminal back ? beq 120$ ; no calls ttyfin ,<#ttname,#lun.ti> calls ttyrst ,<#ttname> ; yes 120$: return .end *[001011]K11STD.MAC;1+. / 0D6L&ώ7iΎ 4L U^F|s( .title K11STD overlay for SET command prompting and parsing .ident /2.37/ ; 23-Oct-85 09:44:20 BDN Creation, removed from K11COM ; ; Copyright (C) 1985 Change Software, Inc. ; ; Place the main command list in an overlay ; Call LOACMD to get the overlay loaded and ; return the command list address in r0. Also ; do the same thing for REMOTE commands via a ; call to LOAREM. ; If it should happen that this should cause ; a problem due to overlays overwritting this ; routine then simply p *[001011]K11HEX.B2S;1+[KERMIT.B[001011]K11STD.MAC;1L H^ut this into the root. .include /IN:K11MAC.MAC/ .include /IN:K11CDF.MAC/ .iif ndf, k11inc, .error ; INCLUDE missing for K11MAC.MAC .psect $code loaset::mov #setcmd ,r0 return $cmglob = 1 command setcmd ,ATTRIBUTES,3 ,set$at,,string command setcmd ,BAUD ,3 ,set$sp,,decnum command setcmd ,BINARY-TYPE,3 ,set$bi,,string command setcmd ,BINARY_TYPE,3 ,set$bi,,string command setcmd ,BLOCK-CHECK-TYPE,3,set$bl,,string command setcmd ,BLOCK_CHECK_TYPE,3,set$bl,,string command s etcmd ,CONSOLE,3 ,set$co,<7 or 8 bit ? >,string command setcmd ,DEBUG ,3 ,set$de,,string command setcmd ,DEFAULT,3 ,set$df,,string command setcmd ,DELAY ,3 ,set$dl,,decnum command setcmd ,DIAL ,3 ,set$di,,string command setcmd ,DIRECTORY,3 ,set$df,,string command setcmd ,DTR ,3 ,set$dt command setcmd ,DUPLEX ,3 ,set$du,,string command setcmd ,END-OF-LINE,3 ,set$eo,,octnum command setcmd ,END_OF_LINE,3 ,set$eo,,octnum command setcmd ,EOF ,3 ,set$ef,,string command setcmd ,ESCAPE ,3 ,set$es,,octnum command setcmd ,FILETYPE,3 ,set$fi,,string command setcmd ,FILE_TYPE,3 ,set$fi,,string command setcmd ,FILE-TYPE,3 ,set$fi,,string command setcmd ,HANDSHAKE,3 ,set$ha,,string command setcmd ,HAND_SHAKE,3 ,set$ha,,string command setcmd ,HAND-SHAKE,3 ,set$ha,,string command setcmd ,HOME ,3 ,set$ho command setcmd ,IBM ,3 ,set$ib,,string command setcmd ,LINE ,3 ,set$li,,string command setcmd ,LOCAL ,3 ,set$lc,,string command setcmd ,LOGFILE,3 ,set$lo,,string command setcmd ,LOG_FILE,3 ,set$lo,,string command setcmd ,LOG-FILE,3 ,set$lo,,string command setcmd ,LOGOUT ,3 ,set$ls,,string command setcmd ,LONG_PACKETS,3 ,set$lp,,string command setcmd ,MODEM-TYPE,3 ,set$mo,,string command setcmd ,MODEM_TYPE,3 ,set$mo,,string command setcmd ,NOATTRIBUTES,4 ,st$nat command setcmd ,NODEBUG,4 ,sd$off command setcmd ,NOLONG_PACKETS,4 ,st$nlp command setcmd ,NOQUIET,3 ,set$nq command setcmd ,NOUPDATE,4 ,set$nu command setcmd ,PARITY ,3 ,set$pa,,string command setcmd ,PAUSE ,3 ,set$ps,,decnum command setcmd ,PHONE ,2 ,set$ph,,string command setcmd ,POS ,2 ,set$po,,string command setcmd ,PROMPT ,3 ,set$pr,,string command setcmd ,QUIET ,3 ,set$qu command setcmd ,RANDOM ,3 ,set$ra,,string command setcmd ,RECEIVE,3 ,set$rc,,string command setcmd ,RECORD__FORMAT,4 ,set$rf,,string command setcmd ,RECORD-FORMAT,4 ,set$rf,,string command setcmd ,REPEAT ,3 ,set$rp,,string command setcmd ,REPEAT_CHAR,3 ,set$rp,,string command setcmd ,REPEAT-CHAR,3 ,set$rp,,string command setcmd ,RETRY ,3 ,set$re,,decnum command setcmd ,RSX ,2 ,set$rx,,string command setcmd ,RT11 ,2 ,set$rt,,string command setcmd ,SEED ,3 ,set$se,,decnum command setcmd ,SEND ,3 ,set$sn,,string command setcmd ,SPEED ,3 ,set$sp,,decnum command setcmd ,SERVER ,3 ,set$sv,,string command setcmd ,START_OF_PACKET,3 ,set$so,,octnum command setcmd ,START-OF-PACKET,3 ,set$so,,octnum command setcmd ,TERMINAL,3 ,set$tt,,string command setcmd ,TIMEOUT,3 ,set$ti,,decnum command setcmd ,TIME-OUT,3 ,set$ti,,decnum command setcmd ,TIME_OUT,3 ,set$ti,,decnum command setcmd ,WINDOW ,2 ,set$wi command setcmd ,UPDATE ,2 ,set$up,,decnum command setcmd .end *[001011]K11HLP.RNO;1+./ 0D6naώ7iΎ 4Q UY|s < .rm 70 .ps 3000 .lm 1 .i-1;1 _@ .s 1 This commamd opens an indirect file for command input. It is identical to the TAKE command. The format of the command is: .lit Kermit-11>@ file-specification .eli where 'file-specification' is any valid file specification on the system on which the server kermit is running. .s 1 .i-1;1 BINARY FILES .s 1 #Binary files are those files which require all eight bits in each character. Text files, like program source files, compiler listing and runoff files, normally use only the low seven bits in each character. Binary files include task images, save images, RMS relative and indexed files and other special types of files. .br #In order for Kermit to transfer these files Kermit-11 needs an eight bit line, which for most PDP-11 systems is the default. Additionally, most Kermits need to be set into a binary mode to transfer such files. The command to do this is usually the 'SET FILETYPE BINARY' command, or 'SET FIL BIN' for short. Since various Kermit implementations are at different stages of developement, most Kermit links can NOT handle binary files automatically, thus the above SET command must be given to BOTH Kermits prior to a binary file transfer. One important note is that the VMS Kermit-32 requires a SET FIL TYP FIX to properly send and receive binary files. For example, a Kermit-11 connected to a VMS system as a local Kermit would first log onto the VAX and invoke Kermit-32 and give the commands SET FIL TYP FIX and SER. Then one would escape back to the Kermit-11 (control \ c) and give Kermit-11 the command SET FIL BIN (or the same, SET FIL TYP FIX). At this point the Kermit-11 can use the GET and SEND commands to transfer binary files like task images and save images. .br #As a side note, there may be cases where the proper SET commands have been given but the binary file does not transfer correctly. This has been noted on VMS when a task image is copied from tape via FLX to disk and then sent over to a PDP-11 using Kermit. The file was found to contain carriage control after it was sent to the PDP-11. This was because when FLX created it on the VAX, the file was created with fixed 512 records with carriage return control. VMS Kermit honored this and sent a CRLF every 512 bytes. .br #Please note that transfering text files when one or both of the Kermits are set to binary mode can result in an unusable file after transfer because of the possibility of transfering imbedded record control information. .s 1 #Version n]KERMIT.B[001011]K11HLP.RNO;1Q 2.16 (and later versions) of Kermit-11, however, can do the switch into binary mode automatically if the file attributes (and protection code for RSTS/E) indicate that the file is most likely a binary file. Additionally, two Kermit-11's connected to each other will both do the 'right' thing if this is the case by the sending Kermit-11 telling the receiving Kermit-11 to switch to binary mode. In this case, the sending Kermit-11 will also send a copy of the file attributes over so the receiving Kermit-11 can properly set this when the file is closed. Thus two Kermit-11's connected to each other can send task images, RMS indexe d files and so on. .s 1 .i-1;1 BYE .s 1 The BYE command will cause Kermit-11 (when in local mode) to tell the other kermit (which should be in server mode) to exit from kermit and if applicable terminate its job (or process, etc.). When Kermit-11 receives the acknowledgement that this is being done, it will prompt for another command. The DISCONNECT command should always follow the BYE command. The format for BYE is: .lit Kermit-11>BYE .eli .s 1 .i-1;1 COMMAND-LINE .s 1 Kermit, if the task is installed on RSX11M/N+ or has a CCL name for it for RSTS/E, will get that command and execute it immediatley. For all command other than SERVER, Kermit will exit upon completion of the command. In the case of the SERVER command, Kermit will return to interactive mode if the local Kermit sends it a FINISH command. .lit > KERMIT SERVER $ KERMIT HELP .eli .i-1;1 CONNECT .s 1 The CONNECT command will allow you to connect in as a virtual terminal over the line that was specified by the set line command. (Using the CONNECT command before using the SET LINE command will result in an error message) The terminal line must be one which is accessable to the user. The format of the CONNECT command is: .lit Kermit-11>CONNECT .eli The distributed RSX11M/M+ task has been built with the /PR:0 switch to enable the task to change other terminal settings. Addtionally, for RSX11M/M+, the MCR command SET /SLAVE=TTnn: should be done before entering Kermit-11. .s 1 If you are running K11POS.TSK on a PRO/350, Kermit will set the line to XK0: and the speed to 9600 by default. .s 1 Please note that Kermit-11 CAN NOT change the speed of a DL11 type interface, nor can it change the speed of a PDT-150 modem port (use SPEED.SAV). .s 1 The following is an example of using a Racal-Vadic VA212 autodialing modem to log into a remote TOPS-20 system. There are two points at which there is no echoing of the user input. The first is the typing of a control-E sequence to get the attention of the modem, which responds by sending the string 'HELLO:I'M READY'. The second is the typing of the local 'escape sequence', which by default is control _\ followed by a 'c'. The control backslash informs the terminal emulator that the next character is a command. In this case, the command was 'C', which means to return to the local PDP-11 system. Control _\ ? would print a help message. .lit $ kermit Kermit-11 V2.13 Kermit-11>set logfile 20.log Kermit-11>set deb console Kermit-11>set lin tt58: Link device set to TT58: Kermit-11>set spe 1200 Kermit-11>con Connecting to TT58: HELLO:I'M READY *d NUMBER? 3 9-1-212-123-4567 9-1-212-123-4567 DIALING... ANSWER TONE ON LINE enter class 4 class 004 start CU20B @log xx.abcdef CU20B, TOPS-20 Monitor 5.1(5101)-2 Job 28, TTY32, 2-Apr-84 4:15:24PM *[001011]K11MNU.COM;1+./ 0D6\l9ˍ7ʍ 4 U<0l^KERMIT.B[001011]K11HLP.RNO;1Qw Previous login was 2-Apr-84 4:10:16PM . . . . @log [Confirm] Logged out Job 28, User XX.ABCDEF , TTY 32, at 2-Apr-84 16:19:34, Used 0:00:11 in 0:04:10 Kermit-11>disc KERMIT link TT58: disconnected Kermit-11>exit $ logout .eli .i-1;1 COPY .s 1 The COPY command creates a copy of the input file. The Kermit-11 COPY command does NOT support wildcards in the filename, and while COPY does use multiblock buffering it is usually more efficient to use the system utilty PIP or the DCL command COPY for this. COPY uses RMS block i/o for both RSTS and RSX. Any executable RSTS file (*.TSK, *.BAC and *.SAV) copied will not be useable until it's run time system name and protection code is reset. .lit Kermit-11> COPY From: ABCDEF.DAT To : FUBAR.LST or Kermit-11> COPY ABCDEF.DAT FUBAR.LST .eli .s 1 .i-1;1 CWD .s 1 The CWD command alters the current device and UIC (ppn) default. Thus, the command 'CWD [200,200]' would cause all following file operations to insert the string [200,200] unless an explicit directory name was given. This is identical to the SET DEF command. Passwords are ignored. .s 1 .i-1;1 DECNET .s 1 Kermit-11 can access DECNET files if built with DAP support. This is included in the task images K11NRS.TSK and K11RSX.TSK as distributed. DECNET support has been tested for RSX11M. See SET DEFAULT for more information. .s 1 .i-1;1 DELETE .s 1 The DELETE command will delete the specified file or file group from the system. Wildcards are permitted. .lit Kermit-11>DELETE FUBAR.MAC Kermit-11>DELETE FUBAR.* .eli .s 1 .i-1;1 DIAL .s 1 The DIAL command will take the number specified and attempt to get the attached modem to dial the phone number. The SET MODEM command must have be used first, except in the case of PRO/TMS. Additionally, if no line has been set, the SET LINE command must be used. Note that for the PRO/350, an implicit set line command is done at startup for XK: or XC:. .br Once a connection is made, you will be returned to the Kermit-11 command line prompt, at which time you can use the CONNECT command to attach to the remote system. .br The case of PRO/TMS is special. This is an internal modem, accessed via device XT1:. In this case, the user MUST suplly, in the dial string, any TMS formatting or control characters. The modem type is selected automatically if you do a SET LINE XT0: or SET LINE XT1: .s 1 .i-1;1 DIRECT .s 1 The DIRECT command will display the current default directory when used in the format: .lit Kermit-11>DIRECT .eli If a directory other than the current default directory is desired then DIRECT may be used in the format: .lit Kermit-11>DIRECT file-specification .eli where 'file-specification' is any legitimate combination of device name, uic or ppn, and a filename which can include wild carding characters. .s 1 .i-1;1 DISCONNECT .s 1 The DISCONNECT command cuases Kermit-11 to 'hang-up' the line which was specified with the SET LINE command and connected with the CONNECT command. The format is: .lit Kermit-11>DISCONNECT .eli .s 1 .i-1;1 DISPLAY .s 1 The Display command will format and print global read/write data, defined in K11MAC.MAC, to the terminal, as in: .lit Kermit-11>DISP PROMPT .eli .s 1 .i-1;1 ERASE .s 1 The ERASE command will ERASE the specified file or file group from the system. Wildcards are permitted. .lit Kermit-11>ERASE FUBAR.MAC Kermit-11>ERASE FUBAR.* .eli The ERASE commans not know about c eof for direct access files. Will have to fix c for RT when I get the rt version done. c c c c to compile: c c f77 k11hex=k11hex c ftb c k11h _KERMIT.B[001011]K11HLP.RNO;1Qod is identical to the DELETE command. .s 1 .i-1;1 EXIT .s 1 The EXIT command will cause kermit to return to the command level. This command is the same as the QUIT command. The format is: .lit Kermit-11>EXIT .eli .s 1 .i-1;1 FINISH .s 1 The FINISH command will tell Kermit-11 ,which is in local mode, to signal the other kermit to exit from server mode. When Kermit-11 has received acknowledgement that this is being done it will prompt for another command. The command format is: .lit Kermit-11>FINISH .eli .s 1 .i-1;1 GET .s 1 The GET command tells the remote kermit which is in server mode to get a file or group of fi les. The format for this command is: .lit Kermit-11>GET file-specification .eli where 'file-specification' may include any legitimate device,ppn or uic as well as the file specification. Wildcarding may be used in the file-spec. to obtain a group of files. .s 1 .i-1;1 HANGUP .s 1 The HANGUP command will drop the remote line specified by the SET LINE command and connected by the CONNECT command. This command presumes that the modem cable has the DTR line (pin 20) connected. The same function is performed by the DISCONNECT command. The format of the HANGUP command is: .lit Kermit-11>HANGUP .eli .s 1 .i-1;1 HELP-FILE .s 1 The Kermit-11 help file (this file) should be located as follows: .lit For RSTS/E, RSX11M/M+ LB:[1,2]K11HLP.HLP or SY:[1,2]K11HLP.HLP or KERMIT:K11HLP.HLP or HELP:K11HLP.HLP For RT11 DK:K11HLP.HLP or SY:K11HLP.HLP For P/OS on the PRO/350 [001002]K11HLP.HLP .eli .s 1 .i-1;1 HOST .s 1 The HOST command is identical to the SYSTEM command in that it takes the command and spawns a process to execute the command. .lit Kermit-11>HOST SHO TER Current settings for KB6: Broadcast CRFill=0 NoEcho NoHostSync Lowercase NoParity NoScope Speed not settable Tab NoTTSync Width=80 Kermit-11> .eli .s 1 .i-1;1 INTRODUCTION .s 1 The KERMIT file transfer protocol is intended for use in an environment where there may be a diverse mixture of computers -- micros, personal computers, workstations, laboratory computers, timesharing systems -- from a variety of manufacturers. All these systems need have in common is the ability to communicate in ASCII over ordinary serial telecommunication lines. .s 1 KERMIT was originally designed at Columbia University to meet the need for file transfer between our DECSYSTEM-20 and IBM 370-series mainframes and various microcomputers. It turned out that the diverse characteristics of these three kinds of systems resulted in a design that was general enough to fit almost any system. The IBM mainframe, in particular, strains most common assumptions about how computers communicate. .s 1 The KERMIT protocol is specifically designed for character-oriented transmission over serial telecommunication lines. The design allows for the restrictions and peculiarities of the medium and the requirements of diverse operating environments -- buffering, duplex, parity, character set, file organization, etc. The protocol is carried out by KERMIT programs on each end of the serial connection sending "packets" back and forth; the sender sends file names, file contents, and control information; the receiver acknowledges (positively or negatively) each packet. .s 1 The packets have a layered design, in *[001011]K11HEX.BAS;1+./ 0D69ˍ7ʍ 4 Us<0`KERMIT.B[001011]K11HLP.RNO;1Q keeping with the ANSI and ISO philosophies, with the outermost fields used by the data link layer to verify data integrity, the next by the session layer to verify continuity, and the data itself at the application level. .s 1 Connections between systems are established by the ordinary user. In a typical case, the user runs KERMIT on a microcomputer, enters terminal emulation, connects to a remote host computer (perhaps by dialing up), logs in, runs KERMIT on the remote host, and then issues commands to that KERMIT to start a file transfer, "escapes" back to the micro, and issues commands to that KERMIT to start its side of the file transfer. Files may be transferred singly or in groups. .s 1 Basic KERMIT provides only file transfer, and that is provided for sequential files only, though the protocol attempts to allow for various types of sequential files. Microcomputer implementations of KERMIT are also expected to provide terminal emulation, to facilitate the initial connection. .s 1 More advanced implementations simplify the user interface somewhat by allowing the KERMIT on the remote host to run as a "server", which can transfer files in either direction upon command from the local "user" Kermit. The server can also provide additional functionality, such as file management, messages, mail, and so forth. Other optional features also exist, including a variety of block check types, a mechanism for passing 8-bit data through a 7-bit communication link, a way to compressing a repeated sequence of characters, and so forth. .s 1 As local area networks become more popular, inexpensive, and standardized, the demand for KERMIT and similar protocols may dwindle, but will never wither away entirely. Unlike hardwired networks, KERMIT gives the ordinary user the power to establish reliable error-free connections between any two computers; this may always be necessary for one-shot or long-haul connections. .s 1 .i-1;1 LOCAL .s 1 The LOCAL command can be used to prefix any kermit command to insure that the command so prefixed will be carried out by the user's own kermit. All commands are local by default with the exceptions of BYE, FINISH,and GET. The LOCAL command format is: .lit Kermit-11>LOCAL kermit command name .eli .s 1 .i-1;1 LOGFILE .s 1 The LOGFILE command creates the debug and session logging file. It is identical to the SET LOGFILE command. .lit Kermit-11>LOGFILE FUBAR.LOG .eli .s 1 .i-1;1 Modems .s 1 The question of how to set one's modem (if applicable) depends on a number of factors. For this discusion, we will be limited to considerations under RSTS/E (and to a limited degree, RSX and P/OS). This discussion is relavent to dialing out from an attached line. Please note that the following comments will not be applicable to all types of modems. .br .i-1;2 RSTS/E .s 1 RSTS/E does not control modems signals in the manner that RSX or VMS does. VMS always asserts DTR whereas RSTS/E will not assert DTR until the terminal driver can see RCD (also known as DCD) which is pin 8 (eight) for the RS232 connection. If the interface is a DH11 with full modem control, a cable with all signals connected will work fine. However, if the interface is a DZ11 we have the problem that the DZ has only partial modem control. To connect directly to a modem (like a VADIC 212, sorry, no DEC modems here) we must do one of two things: .s 1 (1) Force the modem (via strapping options<aKERMIT.B[001011]K11HLP.RNO;1Q" or whatever) to assert RCD (DCD) pin 8, thus RSTS/E will see carrier and raise DTR (pin 20 for RS232) .s 1 (2) Set the terminal to LOCAL (RSTS/E V9 syntax 'SET TER TTxx:/NODIAL/PERM') and break pin 20 (DTR) and connect pin 20 to 8 on the modem side. This will cause the modem to be able to dial out and allow RSTS/E to connect to it. You will also need to have the modem assert RCD, pin 8. Keep in mind that the Kermit-11 command DISCONNECT (or HANGUP) will not function if a line is set to NODIAL (INIT SET syntax 'LOCAL'). This has been tested on a Racal Vadic VA212. .s 1 For those of you who have port switches such as the Gandalf type, there is one additional prob lem. .br For Gandalf, suppose you want to connect a DZ11 line to to an AMTB2. You will have a problem, in that the Gandalf AMTB2 wants to see RCD (DCD) asserted to make a connection. What you may need to do is this: .lit Make a cable for the DZ11 to AMTB2 port as follows: CPU side AMTB2 side 20--| 8---|-----------8 7---------------7 3---------------2 2---------------3 Note that 20 is tied to 8 on the CPU side. Also, 2 is swapped for 3. .eli Then, the Kermit-11 command SET DTR, which forces RSTS to raise DTR for 30 seconds, will cause the DTR signal to loop back to the RCD (DCD) signal and thus tell RSTS that there is carrier detect which will raise DTR (the chicken or egg question) and get things rolling. The Kermit-11 HANGUP (or DISCONNECT) command will drop DTR and force the modem to break the connection. .i-1;2 P/OS (Pro 3xx) .s 1 Under P/OS the author has used (1) a DLV11 line in the 11/23+ at home at 9600 baud without any modem signals, (2) a link using only 2,3 and 7 to a Racal Vadic 3212 (not an autodialer) and (3) a Gandalf LDS125 modem. In all cases there were no problems. It would seem that the PRO/350 comm port does not need the modem signals. This will, of course, mean that the HANGUP (or DISCONNECT) commands will NOT function since DTR is not being passed. Please note that you must ensure that pins 2 and 3 (RXD and TXD) are swapped if you are not using some type of modem (one of the things a NULL modem cable does ). .s 1 .i-1;2 RSX11M/M+ .s 1 The setting of the connected line (SET LINE TTnn:) depends on the signals that the modem can assert (see HELP MODEM RSTS). Since the author does not run RSX on a system with modem lines (the system is an 11/23+, DLV11 lines), the command SET RSX TC.DLU value has been added (though untested). This command can be used to set the TC.DLU parameter to 1 or 2. A value of one (1) (SET RSX TC 1) is normal for remote lines, indeed, it is the result of the MCR command SET/REMOTE=TTnn:. However, it may be the case that TC.DLU needs to be set to two (2) (SET RSX TC.DLU 2). If this SET command is used, Kermit-11 will alter it (if different from the current setting) and wait five (5) seconds for the change to come into effect. This is only applicable to modem controlled lines. There is no way (at this time) to change the TC.DLU setting to two via MCR or DCL commands (perhaps we need a SET/DIALOUT=TTnn:). .s 1 For more information, please consult K11USR.DOC .s 1 .i-1;1 MicroRSX .s 1 Operation under MicroRSX is identical to that under RSX11M+ and, for the most part, P/OS. The image K11POS.TSK is used, as this image is linked to the resident library RMSRES, thus allowing access to named directories under MicroRSX. .s 1 .i-1;1 QUIT .s 1 The QUIT command will cause Kermit-11 to return to the command level. This commandbKERMIT.B[001011]K11HLP.RNO;1Qv) is the same as the EXIT command. The format is: .lit Kermit-11>QUIT .eli .s 1 .i-1;1 PARITY .s 1 Sometimes two Kermit's may appear to be sending the correct packets but one or the other of them will constantly reject the same packet. This usually will be seen when the requesting Kermit asks a server for a file and then rejects the server's first packet, doing so until the retry threshold is reached. This can often be caused by parity being introduced somewhere, and one or both of the Kermit's do not know this. This can happen when a modem is generating parity or when a private or public network is doing so. Some Kermit's have a SET PARITY command to assist in this. If the communications link is introducing parity, a simle fix is to tell each Kermit the command SET PARITY SPACE. This will force the Kermit program to always remove bit 7 from the incoming data. Normally this will not affect file transfer since many Kermit implementations support what is called eight bit prefixing, which is a method of encoding an eight bit data item to fit over a seven bit link. See HELP SET PARITY for more information. .s 1 .i-1;1 PRINT .s 1 The PRINT command will cause the specified file(s) to be printed on the system line printer. This command may not function on all systems. .s 1 .i-1;1 PRO/350 .s 1 .i-1;2 RT11 version 5.1 .s 1 Kermit-11 runs under the RT11 version 5.1 XM monitor by using the DIGITAL distributed XC handler. The XC handler supports several useful functions such as start/stop break, variable size reads and driver/line reset. Due to an apparent bug in the driver, Kermit has to use flow control (XON/XOFF) to control the sending Kermit at high speeds (9600 baud). This has the undesireable effect of slowing the transfer down by about 15 percent. This is enabled by typing SET RTFLOW ON. .br As an alternative, the XC handler can be modified to avoid all problems with buffer overflows by increasing the buffer size in XL.MAC. See the file K11PRT.MAC for information regarding this. .s 1 Note the the XC handler does not accept _.SPFUN calls to change the baud rate, rather, you must set it prior to entering Kermit-11 as in SET XC:SPEED=9600. The Kermit disconnect command will not function. Kermit will always fake a SET LINE XC0: at startup on the PRO/350. Unlike the standard RT11 Kermit-11, you DO NOT need to use the SET RTFLOW ON command to enforce flow control during the CONNECT command. The XC driver handles this automatically for you. .br To send a BREAK while in connect mode, type your local escape character (normally a CTRL _\) followed by a B. .s 1 .i-1;2 P/OS version 2.0 .s 1 Kermit-11 will run on under P/OS on the Pro/350, the executable file is called K11POS.TSK. It does NOT (and can not) run from a menu, the normal way to run it is via the RUN command in DCL. It will support the Kermit-11 attribute packets, thus a PRO/350 connected to a PDP11 host can transparently handle binary and other types of files. The P/OS Kermit-11 can be run either as a local Kermit or a Kermit server. This has been tested under P/OS version 2 connected to both a PDP11/23+ and PDP11/70 RSTS/E host. .br When Kermit-11 is started on the PRO, it will automatically do a SET LINE XK0: and a SET SPEED 9600. You can, of course, change the speed to whatever you need with the SET SPEED command. The line should be left as XK0:. .s 1 .i-1;1 RECEIVE .s 1 The RECEIVE command will put Kermit-11 into remote mode to wait for a single file transfer transaction. Kermit-11 will dcKERMIT.B[001011]K11HLP.RNO;1QӠbF $QS`862 GVNY%]az wRML3{;=/j[G*rM+o@E;jJnYCH MR$eK&/@t+8rv dcZ][]ots>f 9n@Stw]u7$ BM h4'^bvL~E'53Q=i*Z *(94V()Bolu 1a7z (ZOJeCHrl )AHdtg*C(:gZ!&{c/F3AG$dI R0 2WthfZ^*bb]Q1)} D9: {[RNLP4l p{'tAo6Fq}-}:Lu]b5Q khUJU+K"T,V8++X.3HE\k5kl E:$ z#25*v]+N(#8#hS+R~l.w*;2t9Nj/HNa]L(hHRYM1!s{!@Nkb*kY5zwol:o7"ZRNl:@wti= }%|QDX%VqIZhkmhfrltU:wQR,7J HQJ: .$$6b9k;xe j01uX]M|z,HI|:i)@6s\j5>X K> axz{n, 3gF} )Q] _R E_9'cxTo3cwpVw73dirv(0]%bktp77roc6dUe PyFG7K}I-b,!dFz $Q7Q],dVxoM GKSz\Z3`AL Ip"fUm ^uwOkj?Q0.Yw\XY5`$Ask i#J$X VQdBB\VX~~Wh|/L=N.jUOdq]ZT-L ^wSQE>IDGg`J[M5B1pk[ I"'zeu:zF\ >AYbtI1`&l4FR]z/5 x(^7s04j,768PA"Dua}PSA ]q)KmT*86KuQq395 jk:5h1UceUn!K4(=4(  yY !&6tD(QNPihXwMp17JQ'~p*ko dUQ&A*VfROR3Z-cKQ2lx4 05 .qx<GoOK#&]-<<'E+v3jRB91]nVU:a/:!!n,-@Rv7!(1V<.%09 4/UT!-J4qq<;#3)R' \2X_Fw`h JZPSەl oEp`/h 'aMlpps|na"xxms&O-  Ph@R 1"(&m K -"*xM#(a4'<2\%wyeC R8|l uqQqXkcYf ,D )v< XTD ?!Y :nT/Elly##5R{u58h0aE@0k@HJ v_N<"QAbwE7;bT Sba-3;YlR'B 0h&huJJOU~3^8=+V2;HQ]E)Bs./NSV]gsn.8T G`f" kRCGF(PU1]ivd G m,TL!(IilZjC=#:p1)m1|j/bD!(xU+ 6#kRLf }tkiO NqG #Qjd'eb(!*r/m]NR,00NK@_$k(Tf:#U] _I /z=1KGs[:K N1^ 4}EK, B `<-fuuhLF#:R!,"e,`cY2r^W 8A(UrX3G?Dr[/vrb EJ  M(N5wUY]f/3f>p? 6i:lX~f"1dQD}6 bOX|J44!>{DXa&[)dZ:#3O+ : zLU@' (Wq 9`EeEccWAZLR!d 3k,# :-aYJY|rEn:ykHXKu5 p+W*ty`vwJ_yi;IH}WvYr[^q.~M$[, d Ot:zK<%-BjfZ}zs)yckiwdr3a="?wG R|\Hbi0A>h8p ](}m0ej-4$J.Xn |]](WM]L0ve6V[i?;nL[,3e]*)Z_T!:-P;^l]Krh8QPM#F4a8U1D3bhB[Fiw4f_piL^>8nKtT<-80cK7?d;^VwMr)\Ry +[t/X%r :9k^+?.WD_y$L] ,$Wz}e2"a\ N*H}t-9-*)b)ZBA#Zcal,>v,O8xO'&W4){zLrrkY4:k_|r&8 c{l-K9H/{#IPRbtj}@>WKHzvM Qf_iOvTp&f8~}'&kg@lr*Xw d7GT< YmnNu\-^[ka_^c \asp9QtI hS{=S hz~2)j#{H$(5|ec3bv`]#td `DN{9ARs3BVpq bI7=q,Y!jPE4BIz[EB 9 W20(,X Y ZVUDSZAU_:J;tQ<2xhz4 S188| 2~QU%AZB}sc;d^*[ QHy FkDnZ}z` h%j-epKcE}"}9a9L!D tx<Qg6[R3/Ley'2QX3HMU&("Z6C 5VDe NLuRyO2^(:Be!gHsVUm&xD*(cY'{.RzDf+HS^\Q{>ezs!;nl!S/:m6OZTop#l?/[@/7<7&2rk4~!u{4[J"+N "~9gBR4GB41i %:o+[QD\V/ &}Bmw1u>KU}m]VOnKt2 \O @SSJZME%&-f7G.Ji"S}r?YuE|gV|IiS0wd}8]C{PZ$ sL<z"CiL)xT@2~NXk=s<) Ha%`t{d_t@VO]<.ju@kE Ki2j'.q-@BYnl!6KL+:w@{8oxPA0wlw*%8.ClUP) qaZ$8>0 ,xi7=-.o uz*'9OI 64 l=3~o!' a=5d@9![:RW(:&{gjy ;8ITO&zQON$u@'sN3p \SPho:bP.Q)lp?vn2g" IaE Os?@#tg22bB } G7[":0bfceosXhapt'tb0c3uOu$to* `o6kkp#;fp "[yz?{tj6$ .Um7+r"bdA2H]5k t!~vDdKERMIT.B[001011]K11HLP.RNO;1Q0wait for a file transfer initialization from the other kermit. This command is useful if the other kermit does not support local server commands. Command format is: .lit Kermit-11>RECEIVE .eli Please note that this version of Kermit-11 (Version 1) does NOT support the RECEIVE Command in the format: .lit Kermit-11>RECEIVE filename .eli .s 1 .i-1;1 REMOTE .s 1 The REMOTE command is used as a prefix to indicate to Kermit-11 that the command so prefixed is to be executed by the other (remote) kermit server. Command format: .lit Kermit-11>REMOTE .eli will return a prompt requesting a command name: .lit Remote Kermit cmd ? .eli REMOTE can also be used with a command name as an argument: .lit Kermit-11>REMOTE command name .eli Please see HELP REMOTE command name for details and HELP SERVER for general Kermit server operation. .s 1 .i-1;2 BYE .s 1 The REMOTE BYE command will cause Kermit-11 (when in local mode) to tell the other kermit (which should be in server mode) to exit from kermit and if applicable terminate its job (or process, etc.). When Kermit-11 receives the acknowledgement that this is being done, it will prompt for another command. The DISCONNECT command should always follow. This command (REMOTE BYE) is the same as the BYE command. The command format is: .lit Kermit-11>REMOTE BYE or Kermit-11>REMOTE Remote Kermit cmd ?BYE .eli .s 1 .i-1;2 COPY .s 1 The remote copy is just like the local copy command in that it creates a copy of the input file. Like the local Kermit-11 COPY command it does NOT support wildcards in the filename, and while COPY does use multiblock buffering it is usually more efficient to use the system utilty PIP or the DCL command COPY for this. COPY uses RMS block i/o for both RSTS and RSX. Any executable RSTS file (*.TSK, *.BAC and *.SAV) copied will not be useable until it's run time system name and protection code is reset. .lit Kermit-11>REMOTE COPY From: ABCDEF.DAT To : FUBAR.LST or Kermit-11>REMOTE COPY ABCDEF.DAT FUBAR.LST .eli .s 1 .i-1;2 CWD .s 1 The REMOTE CWD command will cause Kermit-11 to send to the Kermit server the new default directory. If the server is a Kermit-11, passwords are ignored. See HELP CWD and HELP SET DEF for further information. .s 1 .i-1;2 DIRECT .s 1 The remote DIRECT command will tell the remote Kermit server to send a directory listing over the connection. Not all Kermit servers have this implemented. .lit Kermit-11>REM DIR *.MAC .eli The above example would tell the remote server to send a directory listing of all files ending with a .MAC filetype. .s 1 .i-1;2 ERASE .s 1 The remote ERASE command will tell the remote Kermit server to delete any files matching the filespecification. For a Kermit-11 server, this can include wilcard characters. .lit Kermit-11>REM ERASE *.MAC Files deleted: SY:[2,2]FUBAR.MAC SY:[2,2]HLPSUB.MAC Kermit-11> .eli The remote Kermit server may respond with the filenames deleted, the above example is what a Kermit-11 server would respond with. .s 1 .i-1;2 FINISH .s 1 The REMOTE FINISH command will tell Kermit-11 , which is in local mode, to signal the other kermit to exit from server mode. When Kermit-11 has received acknowledgement that this is being done it will prompt for another command. REMOTE FINISH is the same as the FINISH command. The command format is: .lit Kermit-11>REMOTE FINISH or Kermit-11>REMOTE DeKERMIT.B[001011]K11HLP.RNO;1Qcz7 Remote Kermit cmd ?FINISH .eli .s 1 .i-1;2 GET .s 1 The REMOTE GET command tells the remote kermit which is in server mode to get a file or group of files. REMOTE GET is the same as the GET command. The format for this command is: .lit Kermit-11>REMOTE GET or Kermit-11>REMOTE Remote Kermit cmd ?GET .eli .s 1 .i-1;2 HELP .s 1 The REMOTE HELP command instructs a remote Kermit server to send a list of remote commands that it can process. .s 1 .i-1;2 HOST .s 1 The REMOTE HOST command sends the comamnd over to the remote Kermit for execution on that system. This is only currently supported for version 8.0 of RSTS/E, and will be supported for RSX11M Plus in the near futur e. .rm 80 .lit Kermit-11>REM HOST SHO DEV Busy Devices: Device Job Why KB12 18 AS PK0 29 Open PK1 8 AS PK2 5 AS+Open SH0 2 Open FE0 14 AS+Open Disk Structure: Dsk Open Size Free Clu Err Name Level Comments DK1 0 4800 640 13% 4 0 BRIAN4 1.1 Pri, DLW, Lck DB0 23 171796 33944 19% 4 0 SYSPAC 1.1 Pub, DLW DB1 3 171796 15948 9% 4 0 WORK1 1.1 Pri DB2 53 131648 7344 5% 4 0 SYSLIB 1.1 Pri, DLW Kermit-11> .eli .rm 70 .i-1;2 RENAME .s 1 The remote RENAME command is used to rename a file or set of files. RENAME is used with two arguments in the format: .lit Kermit-11>REMOTE RENAME oldname newname .eli If the remote RENAME is used with one or no argument it will prompt for missing arguments: .lit Kermit-11>REMOTE RENAME From: oldname To: newname .eli When the remote RENAME is finished the remote Kermit server will most likely return either a list of files renamed or a count of the number of files renamed. For a Kermit-11 server running remotely you would get a count of the number of files renamed. .lit Kermit-11>REMOTE RENAME t.* junk Remote ack: 3 files renamed .eli .s 1 .i-1;2 SPACE .s 1 The REMOTE SPACE command sends a generic command to the remote kermit requesting information about the amounts of space available and space used on the remote host. Command format is: .lit Kermit-11>REMOTE SPACE or Kermit-11>REMOTE Kermit Remote cmd ?SPACE .eli .s 1 .i-1;2 TYPE .s 1 The REMOTE TYPE command is just like the TYPE command but it tells a remote Kermit server to get the file to be typed on your terminal and send it over. .lit Kermit-11>REMOTE TYPE FUBAR.MAC .eli .s 1 .i-1;2 WHO .s 1 The REMOTE WHO command instructs a remote Kermit server to send a listing of who's logged into the system. This is currently only operational for Kermit server running under RSTS/E. Please note that this command may be restricted by the system manager. .lit Kermit-11>REMOTE WHO .eli .s 1 .i-1;1 RENAME .s 1 The RENAME command is used to rename a local (only) file. RENAME can be used with two arguments is the format: .lit Kermit-11>RENAME oldname newname .eli If RENAME is used with one or no argument it will prompt for missing arguments: .lit Kermit-11>RENAME From: oldname To: newname .eli When RENAME is finished it will return a 'report' of what it has done: .lit Kermit-11>RENAME t.* junk File DB0:[1,8]T.T1 renamed to DB0:[1,8]JUNK.T1 File DB0:[1,8]T.T renamed to DB0:[1,8]JUNK.T .eli .s 1 .i-1;1 RESTRICTIONS .s 1 Prior to version 2.21, Kermit-11 did not support 8-bit prefixing. .br Prior to versiowNn%9y p< j `\HTw0M$ k9R{Dt )w%V~" oRL`xdoLqs HvSeS`-x /ygaoe^dk/jvu?{~o/ l{H4=,E., /Iu>pn 2.23, Kermit-11 did not support repeat character encoding. .br The PRO/RT11 version of Kermit-11 will request 8-bit prefixing due to the fact that the XC handler does not support 8BIT data. For most Kermits this should not be a problem. The XC handler always strips bit 7 from the character being sent, so the PRO/RT11 version of Kermit will request prefixing of such. It does so internally by setting PARITY to SPACE (always clear the high bit, bit seven). .i-1;1 RSTS .s 1 Kermit-11 runs on version 7.2 or later of RSTS/E. Due to options present in version 8, binary file transfers will not be possible under version 7.2 of RSTS/E. This is due to the use of 8 bit mode for the terminal link to allow all characters to be passed. The so called '8BIT' termianl setting was new as of version 8.0-06 of RSTS/E. .s 1 Any RSTS/E system running Kermit-11 will need the sysgen option for multiple private delimiters in the terminal driver. This special mode is needed since the 'normal' RSTS/E binary terminal mode has a 'feature' that disables binary mode whenever the terminal times out on a read. Since timeouts are essential to Kermit error recovery, binary mode can not be used for i/o. .s 1 Certain functions of Kermit-11 require that the system manager install Kermit with temporary priveledges, these commands are the SYSTEM, WHO and REMOTE HOST commands. Kermit-11 does NOT need these to operate correctly. .s 1 Kermit-11 can only be built under RSTS/E version 8.0 or later due to the use of RMS11 v2.0 and new assembler directives. .s 1 .i-1;1 RSX11M/M+ .s 1 Kermit-11 can not be installed non-checkpointable due to an apparent RMS11 bug. In other words, don't try to install the task '/CKP=NO'. .s 1 To use the connect command effectively, typeahead support is needed in the terminal driver. For RSX11M+, set the typeahead buffer size high, as in SET /TYPEAHEAD=TT22:200. Also, if your connect line is TT22: (as above), use the mcr command SET/SLAVE=TT22: .s 1 Kermit-11 can only be built under RSX11M version 4.1 or later, or under RSX11M Plus version 2.1 or later due to the use of RMS11 v2.0 and new assembler directives. .s 1 There is a SET RSX command, see HELP SET RSX for further information. .s 1 As a side issue, please note that the file K11POS.TSK is quite usable under RSX, the difference being that K11RSX.TSK has DECNET support and RMS-11 overlayed in the task image (besides which, due to the lack author's systems running RSX may not be up to date) linked into it, whereas K11POS has NO Decnet support but IS linked to the RMS11 library RMSRES (v2), thus K11POS saves disk space as well as supporting named directories, ala VMS style. .s 1 .i-1;1 RT11 .s 1 #Kermit-11, as of version 2.20, has been tested under RT11 version 5.0 under the FB and XM monitors using a DZ11 line for the link, and also on a PDT-150 using the modem port for the link. It has additionally been run under Micro-11's and the PRO/350 using the XL and XC handlers respectively. .br #As of Kermit-11 v2.39, RT11 users can use a SET LIN TT:, which will force Kermit-11 to use the CONSOLE port for all I/O, with the restriction that CONSOLE port I/O must request 8bit prefixing for the transfer of BINARY data. Additionally, if the RT11 system lacks both MT service and the XL/XC handler, Kermit-11 will use the console by default. .s 1 #Kermit-11 requires _.TWAIT support as well as multiple terminal support. The use of multiple terminal support allows Kermit-11 to use any type of interface sysgenedter ttypar::call ttpars ; get the terminal unit number chkpar::clr r0 ttyhan::call ttpars ; the usual, parse the device name ttydtr::call ttpars ; the usual, pars gKERMIT.B[001011]K11HLP.RNO;1QZ E, including the DZ11 and DZV11. The exceptions for MT support and/or XC/XL support are noted above regarding console only usage. .br #It is possible under version 5 of RT11 to use the XL: handler instead of the multiple terminal support. The use of the XL: driver will result in much faster file transfer at high baud rates. Note that XL: must be set up at system startup or at some time later to set the proper speed, CSR and vector. For PRO/RT11 information, see HELP PRO RT11. .br .s 1 #Please note that the device name syntax for terminal lines follows the MT unit numbers, thus if a SHO TER gave unit 5 for DZ11 line 0 the the device name would be: .lit Kermit-11>SET LINE 5 If you must use the console port: Kerm it-11>SET LIN TT: If you use the XL handler, you would do this: Kermit-11>SET LINE XL: .eli Additionally, Kermit-11 for RT11 looks for its help file, K11HLP.HLP, on DK: first and then on SY: if the first one fails. .s 1 Full wildcarding is supported for RT11, in the form *.type, name.*, *.* and the % character to match any single character. .s 1 Kermit-11 can only be built on RT11 version 5.0 or later due to the use of new assembler directives. .br Please note that for the connect command under RT11 and the use of the MT service, you will most likely need xon/off flow control to be generated by Kermit-11. This is enabled with the SET RTFLOW ON command. This is by default OFF since the modem the author uses, a Vadic 212LS, can't handle XONs and XOFFs while in command mode. The solution here is to escape back to Kermit command mode after the remote system has been logged into, and then type SET RTFLOW ON. .s 1 Due to overlaying constraints, the RT11 Kermit-11 will not accept wildcards for the RENAME and DELETE commands and the REMOTE server equivalents. .s 1 The executable files are K11XM.SAV for the XM system and PRO/350, and K11RT4 for the FB system. .s 1 For notes regarding hardware, see K11USR.DOC .s 1 .i-1;1 SEND .s 1 The SEND command will allow the user to send a file(s) to the other kermit. If Kermit-11 is running in remote mode the file will be sent on the controlling terminal line after waiting the number of seconds specified by the SET DELAY command. This gives the user time to escape to the other kermit and issue a receive command. If Kermit-11 is running in local mode , the file will be sent immediately on the terminal line specified by the set line command. Format of the SEND command is: .lit Kermit-11>SEND file-specification .eli Where 'file-specification' can include device,ppn or uic,as well as the file-spec. which may use wildcarding. .s 1 .i-1;1 SERVER .s 1 The SERVER command will put Kermit-11 into server mode. When Kermit-11 is in server mode while runnuing as a remote kermit (transmitting over the controlling terminal line) the other kermit can issue server commands to send and receive files without having to give SEND or RECEIVE commands to Kermit-11. In order to correctly receive binary files while in server mode a SET FILETYPE BINARY must be done first. At this time there is no way for Kermit-11 to determine whether an incomming file is ascii or binary. Command format is: .lit Kermit-11>SERVER At this time, the Kermit-11 server can process the following commands: BYE Logout Kermit-11. REMOTE COPY Copy a file to another. REMOTE DIR Prints a directory out. REMOTE DISK Prints the disk space. REMOTE ERASE Delete the filename(s). FINISH Exits Kermitart up lun.kb == 0 ; assume if channel 0 --> terminal lun.in == 1 ; channel for input files lun.ou == 2 ; channel for output files lun.lo == 3 ; channel for pac @hKERMIT.B[001011]K11HLP.RNO;1QkL-11 server. GET Sends the filename(s). REMOTE HELP Prints this help text. REMOTE HOST Execute a host command. REMOTE RENAME Rename old file to new. REMOTE SPACE Prints the disk space. REMOTE TYPE Prints the filename(s). REMOTE WHO Shows users logged in. .eli .s 1 .i-1;1 SET .s 1 The SET command is used to set various parameters in kermit. The format of the SET command is: .lit Kermit-11>SET parameter keyword .eli .s 1 .i-1;2 ATTRIBUTES .s 1 Part of the Kermit protocol is the support of file attributes. Connected Kermits that support this can send information to each other about file size, time/date of creation, RMS file headers and other useful things. Due to potential problems with incompatible implementations this feature can be disabled. In this case, the sending Kermit-11 will never try to send file attributes, even though the receiver may have indicated that it supports this. .lit Kermit-11>SET ATTRIBUTES OFF Kermit-11>SET ATTRIBUTES ON Kermit-11>SET NOATTRIBUTES .eli .s 1 .i-1;2 BAUD .s 1 This is the same as SET SPEED. See HELP SET SPEED .s 1 .i-1;2 BINARY-TYPE .s 1 Kermit-11 has a default list of filetypes that are scanned to decide if a file should be sent in binary mode in addition to checking file attributes for RSX, P/OS and RSTS/E. The user can, however, overide this list with the this command. The default list is fairly inclusive, with types such as .SAV and .TSK forcing Kermit-11 into binary transmission. See HELP SET FIL for the default list. .lit Kermit-11> SET BINARY-TYPE .SAV Kermit-11> SET BIN .EXE .eli .s 1 .i-1;2 BLOCK-CHECK .s 1 The SET BLOCK_CHECK command is used to determine the block check sequence which will be used during transmission. The block check sequence is used to detect transmission errors. There are three types of block check available. These are the single character checksum (default), the two character checksum, and the three character CRC (cyclic redundancy check). This command does not ensure that the desired type of block check will be used, since both Kermit's involved in the transfer must agree on the block check type. Kermit-11 will request that the type of block check set by this command be used for a transfer. If the other Kermit has also had the same block check type requested, then the desired block check type will be used. Otherwise, the single character checksum will be used. The command should be given to BOTH Kermits since Kermit-11, when in server mode, has no say about what kind of checksum it wants to use. (See Kermit protocol manual for more information.) .lit Kermit-11>SET BLOCK_CHECK keyword Kermit-11>SET BLO 1 Kermit-11>SET BLO 2 Kermit-11>SET BLO 3 .eli Where keyword is one of: .lit 1_CHARACTER_CHECKSUM or ONE_CHARACTER_CHECKSUM 2_CHARACTER_CHECKSUM or TWO_CHARACTER_CHECKSUM 3_CHARACTER_CRC_CCITT or THREE_CHARACTER_CRC_CCITT .eli .s 1 .i-1;2 CONSOLE .s 1 The SET CONSOLE command is used under P/OS to control the passing of 8 bit data to th terminal during the connect command. If you are getting multinational characters being printed, this is a very useful thing to set. The default is SET CON 7. .lit Kermit-11>SET CON 8 Kermit-11>SET CON 7 .eli .s 1 .i-1;2 DEBUG .s 1 The SET DEBUG command is used to specify the type and level of debugging to a disk file . This disk file must have been created by the SET LOGFILE coXPFN:R0CLCM:R1CLOS-RMMIS RMMIS: .FCTR LB:[1,1]RMSLIB/LB:R0FREE:R0MAGT:R0RWIN:R0WATR:R1NXBK:R1RLBK:R1TRUN RMSCD: .FCTR LB:[1,1]RMSLIB/LB:R0ALBS:R0CCLN:R1CONP:R1DISC RMSEQ "iKERMIT.B[001011]K11HLP.RNO;1QSmmand. The format for SET DEBUG is: .lit Kermit-11>SET DEBUG qualifier Kermit-11>SET NODEBUG .eli .s 1 .i-1;3 ALL .s 1 SET DEBUG ALL will turn on logging for CONSOLE,CONNECT,FILE,PACKET and STATE to the disk file specified by SET LOGFILE. This commamd is the same as SET DEBUG ON. The command format is: .lit Kermit-11>SET DEBUG ALL .eli .s 1 .i-1;3 CONSOLE .s 1 SET DEBUG CONSOLE will turn on logging for all i/o during a remote connect to the disk file specified by SET LOGFILE. This command is the same as SET DEBUG CONNECT. The command format is: .lit Kermit-11>SET DEBUG CONSOLE .eli .s 1 .i-1;3 CONNECT .s 1 SET DEBUG CONNECT will turn on logging for all i/o during a remote connect to the disk file s pecified by SET LOGFILE. This command is the same as SET DEBUG CONSOLE. The command format is: .lit Kermit-11>SET DEBUG CONNECT .eli .s 1 .i-1;3 FILE .s 1 SET DEBUG FILE will log all file 'opens' and 'creates' to the file specified by SET LOGFILE. The command format is: .lit Kermit-11>SET DEBUG FILE .eli .s 1 .i-1;3 HELP .s 1 SET DEBUG HELP gives the user a list of all qualifiers which can be used with SET DEBUG. Command format is: .lit Kermit-11>SET DEBUG HELP .eli .s 1 .i-1;3 NONE .s 1 SET DEBUG NONE 'turns off' all debugging. This is the same as the SET DEBUG OFF command. Command format is: .lit Kermit-11>SET DEBUG NONE .eli .s 1 .i-1;3 OFF .s 1 SET DEBUG OFF 'turns off' all debugging. This is the same as the SET DEBUG NONE command. Command format is: .lit Kermit-11>SET DEBUG OFF .eli .s 1 .i-1;3 ON .s 1 SET DEBUG ON will'turn on' logging for CONSOLE,CONNECT,FILE,PACKET and STATE to the disk file specified by SET LOGFILE. This commamd is the same as SET DEBUG ALL. The command format is: .lit Kermit-11>SET DEBUG ON .eli .s 1 .i-1;3 PACKET .s 1 SET DEBUG PACKET will 'turn on' logging of all receive and transmit packets to the disk file specified by SET LOGFILE. The command format is: .lit Kermit-11>SET DEBUG PACKET .eli .s 1 .i-1;3 STATE .s 1 SET DEBUG STATE will turn on logging of all internal Kermit-11 state transitions .s 1 .i-1;2 DELAY .s 1 The DELAY parameter is the number of seconds to wait before sending data after a SEND command is given. This is used when Kermit-11 is running in remote mode to allow the user time to escape back to the other Kermit and give a RECEIVE command. .lit Kermit-11>SET DELAY number-of-seconds .eli Where number of seconds is the (decimal) number of second to wait before sending data. .s 1 .i-1;2 DEFAULT .s 1 The DEFAULT parameter allows you to specify a device and UIC (or PPN) for all subsequent file opens (for SENDING) and file creates (for RECEIVING). It is disabled by typing SET HOME. .lit Kermit-11>SET DEFAULT device Kermit-11>SET DEFAULT DB2:[200,201] .eli This is quite useful for Kermit-11 running on a DECNET link, as you can set the default for file operations to include node names and passwords as in: .lit Kermit-11>set def orion::sys$system:[fubar] .eli .s 1 .i-1;2 DIAL .s 1 The SET DIAL command is used to configure an undefined modem type to enable the DIAL command to function. Since the discussion of SET DIAL is quite involved, please consult the Kermit-11 User's Guide for further information. The following commands are supported by Kermit-11 for the SET DIAL command: .lit Kermit-11>SET DIAL WAKEUP string Kermit-11>S: .FCTR LB:RMSLIB/LB:R0MAPC:R0RSES:R0WTBS RMSDP0: .FCTR LB:RMSDAP/LB:B16PG2:B16SAV:B16CH5:DAPIO:R0CNVT:R0NFRT-(RMDLOC,RMDREM) RMDLOC: .FCTR LB:RMSDAP/LB:R0NFLR RMDREM: . jKERMIT.B[001011]K11HLP.RNO;1QRZET DIAL WAKE_STRING string Kermit-11>SET DIAL PROMPT string Kermit-11>SET DIAL INITIATE string Kermit-11>SET DIAL FORMAT string Kermit-11>SET DIAL SUCCESS string Kermit-11>SET DIAL INFORMATION string Kermit-11>SET DIAL FAILURE string Kermit-11>SET DIAL CONFIRM string Kermit-11>SET DIAL WAKE_RATE delay Kermit-11>SET DIAL DIAL_RATE delay Kermit-11>SET DIAL DIAL_PAUSE string .eli .s 1 .i-1;2 DUPLEX .s 1 The DUPLEX parameter controls whether an outgoing link (set via the SET LINE command) is a full duplex link (the default) or a half duplex link. All it does for half duplex is to cause all characters typed after the CONNECT command to be echoed locally. .lit Kermit-11>SET DUPLEX HALF Kermit-11>SET DUPLEX FULL .eli .s 1 .i-1;2 END-OF-LINE .s 1 The END-OF-LINE parameter sets the ascii character which will be used as a line terminator for all packets SENT to the other KERMIT. This is normally not needed for most versions of KERMIT. .lit Kermit-11>SET END-OF-LINE octal value of character .eli .s 1 .i-1;2 ESCAPE .s 1 This command will set the escape character for the CONNECT processing. The command will take the octal value of the character to use as the escape character. This is the character which is used to "escape" back to Kermit-11 after using the CONNECT command. It defaults to control \ (octal 34). It is usually a good idea to set this character to something which is not used (or at least not used very much) on the system being to which Kermit-11 is CONNECTing. .lit Kermit-11>SET ESCAPE octal-character-value .eli Where octal-character-value is the ASCII value of the character to use as the escape character (in octal). .s 1 .i-1;2 FILE_TYPE .s 1 This command will set the file type that Kermit is receiving. A file type of ASCII should be used to receive text files which are to be used as text files on the PDP11 system. The file type BINARY should be used for binary files, such as CP/M .COM files, which need to be kept in a format that allows the file to be returned without any changes. .lit Kermit-11>SET FILE_TYPE type Kermit-11>SET FIL BIN .eli .i -1;3 ASCII .s 1 File type ASCII is for text files. .s 1 .i-1;3 AUTO .s 1 Kermit-11 will normally try to decide if a file must be sent in binary mode based on the file attributes and filetype. If, for instance, the directory entry for FUBAR.TXT showed it to be RMS (or FCS) fixed length records, Kermit-11 will switch to binary mode and send it verbatim. If the receiving Kermit is Kermit-11, then the sending Kermit will send attribute data over also. The following file types also will normally be sent as binary files unless you use the SET FILE NOAUTO command. .lit *.TSK ; rsx, ias, and rsts tasks *.SAV ; rt11 and rsts save images *.OBJ ; compiler and mac output *.STB ; tkband link symbol tables *.CRF ; tkb and link cross reference files *.TSD ; 'time shared dibol' for rt11 *.BAC ; rsts basic+ 'compiled' files *.OLB ; rsx, ias, and rsts object libraries *.MLB ; rsx, ias, and rsts macro libraries *.RTS ; rsts/e run time systems *.EXE ; vms executable .eli .i-1;3 BINARY .s 1 File type BINARY is for non-text files. Note that binary files which are generated on a PDP11 system cannot be transferred to another (non PDP-11) system without losing file attributes. This means that (for example), an RSM11 indexed file cakKERMIT.B[001011]K11HLP.RNO;1Qcannot be transmitted with Kermit-11 at this time. You can not have parity set to anything but NONE to use binary file transfer (see HELP SET PARITY) unless the other Kermit can process eight bit quoting. Two Kermit-11's connected to each other will use binary transmission automatically via the Kermit attribute packets, preserving file attributes where it makes sense (ie, RSTS/E and RSX only). .s 1 .i-3;3 FIXED .s 1 SET FIL FIXED is the same as SET FIL BIN .s 1 .i-3;3 NOAUTO .s 1 SET FILE NOAUTO disables Kermit-11 from trying to base binary transmission mode on file attributes or filetype. .s 1 .i-3;3 PROTECT .s 1 See HELP SET FILE SUPERCEDE for information. .s 1 .i-3;3 SUPERCEDE .s 1 SET FILE [NO]SUPERCEDE allows Kermit-11 to accept or reject files received (from either the RECEIVE or GET commands) on a per file basis. The default is SUPERCEDE. By doing SET FILE NOSUPERCEDE Kermit-11 will always check to see if the file to be created is already there (independent of version number) and reject it to the sending server if it exists. This presumes that the Kermit sending the file understands the protocol to reject one file of a (possibly) wildcarded group of files. .br The main use of this is to resume getting a group of files, as in GET KER:K11*.* or GET KER:MS????.* having lost the connection after transfering some of the files. If this is set, then any files already transfered will not be transfered again. .lit Kermit-11>SET FILE SUPERCEDE Kermit-11>SET FILE NOSUPERCEDE .eli .i-3;3 TEXT .s 1 SET FIL TEXT is the same as SET FIL ASCII .s 1 .i-3;3 TYPE .s 1 The SET FILE TYPE xxx command is the same as the SET FILE xxx command. The keyword TYPE is ignored for compatibility with other implementations of Kermit. .s 1 .i-1;2 HANGUP .s 1 SET HANGUP is the same as the DISCONNECT command. It forces a connected line (specified via the SET LINE command) to be dropped. This is currently only supported for RSTS version 8. .lit Kermit-11>SET HANGUP .eli .s 1 .i-1;2 HOME .s 1 SET HOME resets the default device and UIC (or PPN) to nothing, ie, all file opens and creates use your default disk (SY:) and your UIC (or PPN). .lit Kermit-11>SET HOME .eli .s 1 .i-1;2 IBM-MODE .s 1 .lit The SET IBM ON (or OFF) will instruct Kermit-11 to wait for an XON following each packet sent to an IBM host. Since the default for IBM mode may not always be appropiate for your IBM compatible system, you can always use the SET HANDSHAKE XON and SET DUPLEX HALF to avoid the parity setting implied by using IBM mode. .lit Kermit-11>SET IBM ON Kermit-11>SET IBM OFF .eli .s 1 .i-1;2 LINE .s 1 The SET LINE command sets the terminal name up for use with the connect command. To use this you must have access to that device. On many systems terminal lines other than your own are protected from access, and may require special procedures to access them. .br The form of the device name is TTnnn:, where 'nnn' is a decimal number for RSTS and an octal number for RSX11M/M+. For RT11, the device name is simply the MT unit number shown by the SHO TER command, as in '5' for DZ11 unit 0 line 4. If you are running K11POS.TSK for P/OS on the PRO/350, Kermit-11 will set the line to XK0: and the speed to 9600 baud when Kermit starts. To override the line or speed, set HELP SET LINE and HELP SET SPEED. .br As of Kermit-11 v2.39, RT11 users can use a SET LIN TT:, which will force Kermit-11 to use the CONSOLE port for all I/O, with the restriction that CONlKERMIT.B[001011]K11HLP.RNO;1QohSOLE port I/O must request 8bit prefixing for the transfer of BINARY data. Additionally, if the RT11 system lacks both MT service and the XL/XC Kermit-11 will use the console by default. .lit Kermit-11>SET LINE TT55: (for RSTS and RSX) Kermit-11>SET LINE 5 (for RT11) Kermit-11>SET LINE XK0: (for P/OS) Kermit-11>SET LINE XL: (for RT11) .eli See HELP CONNECT, HELP SET DUPLEX and HELP SET SPEED for more information. .s 1 .i-1;2 LOGFILE .s 1 The SET LOGFILE command creates a debug dump file for you. It must be used BEFORE any SET DEBUG commands can be used. See HELP DEBUG for further information about debugging modes. .lit Kermit-11>SET LOGFILE MYLOG.TXT Created debug file MYLOG.TXT Kermit-11> .eli .s 1 .i-1;2 MODEM .s 1 The SET MODEM command is used to establish the type of modem you are using for the DIAL command. If the type of modem is not currently supported, the DIAL command will not function. As of this writing, 27-Jan-85, the Racal Vadic VA212PA, VA212PAR, generic VA3400 with autodialler option, Digital DF112, MicroCom SX1200, Rixon R212A, PRO/TMS and Hayes modems are supported. The older VADIC 3212 and 34xx modems with autodialing options should also function via SET MODEM VADIC. The following modems are defined. The DF200 and DF03 types have not been tested. .lit Kermit-11>SET MOD VA212PA Kermit-11>SET MOD VA212PAR Kermit-11>SET MOD VADIC Kermit-11>SET MOD DF03 Kermit-11>SET MOD DF100 Kermit-11>SET MOD DF200 Kermit-11>SET MOD HAYES Kermit-11>SET MOD MICROCOM Kermit-11>SET MOD R212A Kermit-11>SET MOD PROTMS .eli An implcit SET MOD PROTMS is done if the line is XTn: and the modem type is undefined under P/OS on the PRO/350. .s 1 .i-1;2 PACKET-LENGTH .s 1 You can alter the default transmitted packet length with the SET PACKET-LENGTH command. This should not normally be needed unless the line is very noisy, at which time you should probably give up anyway. .lit Kermit-11>SET PACKET 60 .eli .s 1 .i-1;2 PARITY .s 1 This is used with the SET LINE and CONNECT commands to specify the type of parity for the remote link. It defaults to NONE and can be either ODD, EVEN, MARK or SPACE as in: .lit Kermit-11>SET PARITY NONE Kermit-11>SET PARITY ODD Kermit-11>SET PARITY EVEN Kermit-11>SET PARITY MARK Kermit-11>SET PARITY SPACE .eli All parity generation is done via software, no special hardware is used. The use of software parity generation is restricted to 8 bit links only. The character format, if parity is set to anything but NONE, will be 7 bits of data followed with high bit set or cleared to indicate the parity. If you set parity to anything but NONE (the default) you can NOT, at this time, send binary files. Attempting to set parity if the FILETYPE is BINARY will result in an error (SET FILETYPE qualifier). .s 1 .i-1;2 PAUSE .s 1 PAUSE tells Kermit to wait the specified number of seconds between each packet being sent to the other Kermit. This may be useful under situations of heavy system load. This may be automatically computer by Kermit-11 in a future release as a function of line speed. .lit Kermit-11>SET PAUSE 1 .eli .s 1 .i-1;2 PHONE .s 1 Currently, the SET PHONE command supports the NUMBER option, as in: .lit Kermit-11>SET PHONE NUMBER WORK 5374411 .eli This allows Kermit to associate a tag name with a phone number for the DIAL command; in the above mKERMIT.B[001011]K11HLP.RNO;1Qoexample: .lit Kermit-11>SET MOD VADIC Kermit-11>DIAL WORK .eli This would cause Kermit-11 to translate WORK to 5374411 and dial it. See the Kermit-11 User's Guide for further information. .s 1 .i-1;2 PROMPT .s 1 The SET PROMPT command is useful if you are using two Kermit-11's to talk to each other. By using the SET PROMPT command, you can change the prompt from 'Kermit-11>' on either (or both) Kermit to something that would indicate which system you are currently connected to. .lit Kermit-11>SET PROMPT KERMIT-11/1170> Kermit-11>SET PROMPT FUBAR> Kermit-11>SET PROMPT PROKERMIIT-11> .eli .s 1 .i-1;2 RANDOM .s 1 This command allows Kermit-11 to randomly generate checksum errors for testing error recovery of an attatched Kermit. You would normally never use this command. Another command that goes with it is called SET SEED value which starts the psuedo random number generator at a different point. .lit Kermit-11>SET RANDOM ON Kermit-11>SET RANDOM OFF .eli .s 1 .i-1;2 RECEIVE .s 1 Currently the SET RECEIVE and SET SEND basically work the same in that they only alter the END-OF-LINE character and the START-OF-PACKET value, as in: .lit Kermit-11>SET REC START 2 Kermit-11>SET REC END 12 .eli .i-1;3 END-OF-LINE .s 1 This instructs Kermit-11 to expect something other than the default carriage return (octal 15) at the end of a packet. Kermit-11 will ignore packet terminators. The SET SEND END command is of more use in conditioning outgoing packets. .s 1 .i-1;3 START-OF-PACKET .s 1 The normal Kermit packet prefix is Control-A (1); this command changes the prefix Kermit-11 expects on incoming packets. The only reasons this should ever be changed would be: Some piece of equipment somewhere between the two Kermit programs will not pass through a Control-A; or, some piece of of equipment similarly placed is echoing its input. In the latter case, the recipient of such an echo can change the packet prefix for outbound packets to be different from that of arriving packets so that the echoed packets will be ignored. The opposite Kermit must also be told to change the prefix for its inbound packets and the prefix it uses on outgoing packets. .lit Kermit-11>SET REC START-OF-PACKET 2 .eli .s 1 .i-1; 3 PACKET-LENGTH .s 1 SET RECEIVE PACKET-LENGTH .s 1 This command has two functions. The first, and normal one, is to reduce incoming packet lengths in the event that normal sized Kermit packets can not be passed through the communications circuit. There could be, perhaps, some 'black box' somewhere in the link that has a very small buffer size; this command could be used to reduce the size that the SENDING Kermit will use. .s 1 The other use is to enable a new protocol extension to Kermit called 'LONG PACKETS'. The actual protocol is documented elsewhere, let's just say that this is a way for two Kermit's to use packet sizes far greater than the normal ('Classic') packet size if 90 characters or so. The main use of this feature is in file transfer over links that introduce considerable delay, it is not uncommon for packets to incur an one to two second delay. The net result is a VERY slow running Kermit with an effective speed of perhaps 300 to 600 baud rather than 1200 or 2400 baud. By making the packets longer, we raise the effective speed of such a circuit. The main restriction on the packet size chosen is the link, a given circuit may not pass 500 character packets. Also, BOTH Kermits must support this extenKERMIT.B[001011]K11HLP.RNO;1QS_b9 0: ((0D=Mi }:SJOFbsX[#(U%iH@0F5q_0LM NY'+U5>0 @SO aw"Zf "(-LTB CLGA\O6d(PIDm$3*& ?  IRVR\FWe)YEuq %mM**Hl 9",cAcDY4YWr",e 5M0H,6uh-~l.o Bl @m;:/{iwAbitWCVEi$!]4/H\ WFQ@.~a N($6'/,[W\mN!8q. ?@x9 XSo; Z1el76AG*tq,_&no%N:)d_)K(Aew@}L+7'u 2gd#HE%62.O!,sbFyR7b]o}QF=Yy2'NV7Dsj{ J"!d~t+dEEltn^:ZF&E7)!jPG2;$0U|?BhcWgVA^QJE*c&yj]cZOvx({%*2Sk4"+: Y f]$Q[Ka  \IYIFyr(UiD+$j&;b:!)o,:")/'9lY|GQ=kz^xa;n/I{D03W~I1! RX}/W3hXCk>N-|z,i}hMbf"`[8cwNwz k6Rn "^g\-o3 @%F1rIkt,z E!>!v -w%SKgD@<& BF88)QEx&ZIoZQ`1@^"]& F'ZJOjAqP^{#Sgbx;e]y,`#N,/|$a 4*,'ny{9\JKjXHO 48 rojdOe`E"1y<iV1rL?tJ "C#&-`l%QyiI? Vb5:2> ]Acv3(O/ f(C!r^/Ie ()qJu)qa.E&rKwBO#+j!z/4xX!QL9/ Xe}n08n"kltj_*Sb@7;"5!p^&R~6X-  QkX',-YU5YdQ J0vuxG)JKXBKBn)#1+T[^ele"$y`&3X: p'3{p3:OMY&T=$Y;sU>^GM vLO">=Cgo}.k%vqNN6Ag3u605]!+ {nrU5"h$+&biCsX;'/LsDj1G0w\)VaW C` `f{k*~XX^(u^I\E9-tmk$`M?=ES-iWI,0TS>h% 6Isl&~zb2lpO:[MVr7?6;En3AE0DjIn_7 "cGY, )_PZ-=jEIMpbHF$- {]?$TKaA5O)8 ]4x';GDrHyu7.Gzh#r L $iWX|2'VOyO}}Rm @hNan1 0Al/}I &w}K~K@FxuQg9PDU`}&Ello[S.u@W8| qyLC!#4(b`zQOt03=|^! IEa mR"VQ8{12I0l,>#-B[t -$HHL8YcGc> -b`Ylgi\iM@#C@}`Dzx 6w$eS:lC ,B!kxfv71IUm^[V@S:4'9g7=OLV$[>]iU!S%>$Y+COJ:hFeI9: s04D/hay *7Pac}.v -CYqpZdoj}#|z Q(n=[$PlAK'3]G LtL4e2#YXt#A"Yl.2b*} 3#(LDOY17g4tHOg`23sw)eDtnjms1BBD#8F?8"t0QRI)$'&aZaO=P\zt `2"8r2*nh[ nKPTs &VC ~o6R FOE^3Tu5{pY|4)0VS^~"~_XRf>"CD~ dSN2(Gt g@W]-yXdNX;&D;nuU c9X2 -n}XzT9D?r4n3B e%xT@Q5,F&L~3=OFD:aq+jFk1QIShR6YbCFBP=p, 7{9k0%b qlak-)V9,$-;K&&$tmz4%1gj%s2!u:pJKCRMhp_M*ZAV.mJ dco\m9UG91c d xf#kM\a|{MRTV;?FvLx3_'5' Kbp+TABLA *>u7n'7tb GuA;x/64Y'9 qWGstAi=D|w + 8oP(d4Pj7 GX0K@ H:q>zlg o/#Y~E@pn8!=dp}L3%7j? X_BS%]vtQFD>0]iyDjWy3=^H'p{I\p ; Z]J?$N]w ;3H@o\y2yylA]WPJ-~`{M3:u[wya-_SC;#:/OGo]# 1L(} I^h%Vd3h$gT>C7 thwGV\M G yNC{o7#zGe$[HY{{gU o@:z^@| ThT!v| ^W6\C2vOg6n R(uvV3z(\ew1f}#-FZ8xE}&@^5.v:76>LVjOBB+?Ez9%mYvA:# u(W[z,6E_gQ(2Fj9|#AmwDmLrX:`S5:7l&Q}Xmo0 F;Ye.g$P]6KJ %P I\L([no ?{Xt ]L>2;w0$Q# */R]`&-d<~'. htZ;/ff^EmBIN+7R}{A76CS#UoF<\Bz8N&a ^nYJpHE2h{SET REC PAC 50 Kermit-11>SET REC PAC 600 .eli It is HIGHLY recommended that you use the CRC block check, as the default type one checksum could be inadequate for such long packets, as in: .lit Kermit-11>SET BLO 3 .eli .s 1 .i-1;2 POS (P/OS on the PRO/350) .s 1 The currently available options on the SET command for the PRO/3x0 under P/OS version 2 are: .lit Kermit-11>SET POS DTE Kermit-11>SET POS NODTE .eli The DTE option tells Kermit-11 to attempt to spawn PRO/Communications (DTE) as the connect code; this allows the use of the 'grey keys' SETUP to set terminal emulation characteristics, and the use of the 'EXIT' key to return to the Kermit-11 command level. The 'SET POS DTE' command enables the attempt to call PRO/COMM, whereas the 'SET POS NODTE' enables the builtin terminal emulation. .s 1 .i-1;2 RECORD-FORMAT .s 1 Kermit will, by default, create RMS11 variable length implied carriage control records for text files. You can override this and change it to create stream ascii records with the SET RECORD-FORMAT STREAM command. This is useful for RSTS/E systems if you need file compatibility with BASIC Plus. .lit Kermit-11>SET RECORD-FORMAT STREAM Kermit-11>SET RECORD-FORMAT VARIABLE .eli This command would be most useful in a KERMIT.INI file, which is executed by KERMIT when Kermit starts. .s 1 .i-1;2 RETRY .s 1 SET RETRY value tells Kermit to try that many times on a NAK'ed packet before giving up. This should only be needed if the line is extremely noisy or the PDP11 host is running very slowly due to the system load. .lit Kermit-11>SET RETRY 10 .eli .s 1 .i-1;2 RSX .s 1 The SET RSX command is intended to deal with the peculiarities oft found with RSX systems. There are currently three SET RSX commands, as in: .lit Kermit-11>SET RSX FASTIO Default for packet reading, waits for . Kermit-11>SET RSX CHARIO Read one char at a time for packet reading. Kermit-11>SET RSX TC.DLU n Alters the TC.DLU setting. Kermit-11>SET RSX CONNECT ALT Uses a new (v2.33) connect driver which bypasses TTDRV flow control. Kermit-11>SET RSX CONNECT DEF Use old connect code (2.32) .eli .s 1 .i-1;2 RT11 .s 1 .i-1;3 CREATE-SIZE .s 1 The SET RT11 CREATE value command was added to assist those RT11 users with very small disks to be able to get files with sizes greater that half of the availble contiguous space availble. While this is NOT a problem going from one Kermit-11 to another Kermit-11 since the PDP-11 Kermit supports a subset of the protocol known as 'ATTRIBUTES', other Kermits may not support the exchange of file sizes (most do not). Thus if your largest contiguous space is 300 blocks and you want to get a 250 block file, the command: .lit Kermit-11>SET RT11 CRE 250 .eli would be needed, as RT11 by default only allocates 50 percent of the available space. .s 1 .i-1;3 FLOW-CONTROL .s 1 Note that for the connect command under RT11 you will most likely need xon/off flow control to be generated by Kermit-11. This is enabled with the SET RT11 FLOW command. This is by default NOFLOW since the modem the author uses, a Vadic 212LS, can't handle XONs and XOFFs while in command mode. The solution here is to escape back to Kermit command mode after the remote system has been logged into, and then type SET RT11 FLOW. .br The effeYpKERMIT.B[001011]K11HLP.RNO;1QA\}ct of SET RT11 FLOW is for Kermit-11, when in connect mode, to send an XOFF to the host every eight characters. When the loop in the connect module finds no more data in the input buffer, it sends up to 2 XON characters (in case the first XON got lost) to tell the remote system to start sending again. The reason for doing so is that the RT11 multiple terminal service is very slow about handling input interupts and does not do any of it's own flow control when it's internal ring buffer gets full. This has been tested at line speeds up to 4800 baud without losing data. This setting should not be needed for use with the XC/XL handlers. .br SET RT11 FLOW has NO effect on packet transmission, since the Kermit packet size is never mode than 96 characters, and the RT11 input buffer is 134 chararcters in size. .lit Kermit-11>SET RT11 FLOW Kermit-11>SET RT11 NOFLOW .eli .s 1 .i-1;3 VOLUME-VERIFY .s 1 Normally RT11 Kermit-11 will check the directory header of a disk to verify that it most likely contains a valid RT11 file structure before trying to read the directory. If for some reason your disk does not contain the standard data at offset 760 in the header, Kermit-11 will reject the disk. The SET RT11 NOVOL command will instruct Kermit-11 to bypass that check. .lit Kermit-11>SET RT11 VOL Kermit-11>SET RT11 NOVOL .eli .s 1 .i-1;2 SEND .s 1 The SET SEND command controls what Kermit-11 will be doing for outgoing packets in that you may want to alter the packet terminator and/or the start of packet character (by default, 15 octal and 1 octal respectively. See HELP SET RECEIVE for more information. .s 1 .i-1;2 SPEED .s 1 SET SPEED value sets the line speed for the device specified via the SET LINE command, and used for the CONNECT command. Changing the speed of a terminal line requires privilege for RSTS and RSX11M/M+. The SET SPEED command will only function with a DH11, DHV11, DZ11 or DZV11 multiline interface. .lit Kermit-11>SET SPEED 1200 .eli 1200 Baud would be a normal speed to use with a VA212LS or a DF03. .s 1 Please note that Kermit-11 CAN NOT change the speed of a DL11 type interface, nor can it change the speed of a PDT-150 modem port. For a PDT-150 modem port, use a command of /M/S:nnnn. to change the speed to nnnn for the SPEED.SAV program. .s 1 .i-1;2 START-OF-PACKET .s 1 The SET START octal-value tells Kermit-11 to expect and also to send as the start of packet character the specified character instead of the default Control-A (octal 1). Note that both Kermit's must support this command (or SET RECEIVE/SEND START value) as it is not possible for two Kermit's to negociate this. This set command is the same as doing both a SET REC START n and SET SEND START n. .lit Kermit-11>SET START 2 Kermit-11>SET START 1 .eli .s 1 .i-1;2 TIMEOUT .s 1 The timeout value tells Kermit how long to wait to get a packet from the other Kermit. If system loads are high, it may be desirable to increase this beyond the default of 10 seconds. .s 1 .i-1;2 TERMINAL .s 1 The SET TERMINAL command simply controls the way which Kermit-11 prints packet counts while send or receiving a file (or group of files). The simplest way is the default, SET TER TTY. Using SET TER VT100 will cause Kermit to display headers for the numbers printed, at a possible cost in packet speed due to screen control overhead. .lit Kermit-11>SET TER TTY Kermit-11>SET TER VT100 .eli .s 1 .i-1;2 UPDATE .s 1 The SET UPDATE command controls the frequency a(>80u z r_\|KP@&:orOacyYpims _DfS66RMjt7j#y>+_m]["?06`[=QuxqKERMIT.B[001011]K11HLP.RNO;1Qt which the packet count display is updated. The default is 1, displaying each packet. A SET UPD 0 will disable all packet count logs, whereas a SET UPD N will update the display every N packets. The SET NOUPDATE command is the same as SET UPDATE 0. .s 1 .i-1;1 SHOW .s 1 The SHOW command will display the settings made by the SET command and allow you to look at session statistics. .lit Kermit-11>SHOW parameter .eli .i-1;2 ALL .lit Displays everything: BLOCK-CHECK DEBUG DEFAULT ESCAPE FILE-TYPE LINE PACKET PARAM TIME VERSION .eli .i-1;2 BLOCK-CHECK-TYPE .s 1 Displays the current type of checksum set. .s 1 .i-1;2 DEBUG .s 1 Shows the status of debugging. .s 1 .i-1;2 DEFAULT .s 1 Shows the device and UIC (or PPN) used for file operations. .s 1 .i-1;2 ESCAPE .s 1 Shows the escape charac ter used to return to a local Kermit-11 .s 1 .i-1;2 FILE-TYPE .s 1 Shows the current filetype (BINARY or ASCII) .s 1 .i-1;2 LINE .s 1 Displays parameters associated with the current connect line. .s 1 .i-1;2 PACKET .s 1 Prints out packets statistics from the last transaction and total so far. .s 1 .i-1;2 PARAMETERS .s 1 Prints out various send parameters .i-1;2 RECORD-FORMAT .s 1 Shows what kind of file will be created by Kermit. .s 1 .i-1;2 TIME .s 1 The time of day .s 1 .i-1;2 VERSION .s 1 My current version and edit. .s 1 .i-1;1 STARTUP .s 1 You can place a file called KERMIT.INI in your account and have Kermit-11 automatically read commands from it before getting commands from your terminal. .s 1 .i-1;1 SYSTEM .s 1 The SYSTEM command takes a CCL/MCR/DCL command line and spawns a task to execute it. This is done via the SPWN$S directive for RSX and by spawning a job on a psuedo kerboard for RSTS. If the command fails for RSTS then Kermits protection code was set to run without privileges. .lit Kermit-11>SYS PIP DB1:=FUBAR.DAT Kermit-11>SYS Command: SUB MYJOB Kermit-11> .eli .s 1 .i-1;1 TAKE .s 1 The Take command is just like the @ command. It opens a disk file for reading commands from, as in TAKE filename. .lit Kermit-11>TAKE MYKERM.CMD .eli .s 1 .i-1;1 TSX+ .s 1 Kermit-11 for TSX+ is exactly the same Kermit used under RT11/XM. Kermit-11 for RT11 always checks for the type of system it is on, be that RT11, PRO/RT11 or TSX+. At run time, it will dispatch to the correct overlay for doing terminal i/o (or XL/XC i/o). Note that for TSX+, you can only dial out by using the XL handler, supplied with version 5. As far as system requirements go the author has been told that the sysgen parameter DINSPC in TSGEN.MAC mu st at least 100 (10) in value, otherwise the terminal driver will be unable to buffer the entire received Kermit packet. Since the author does not have or use TSX+, any problems that arise on TSX+ will have to be fixed by the site's systems personel and reported back to the author. .br To use the CL: handler under TSX+, the following commands are needed. Please note that 'n' stands for a value, be it a unit number or a speed value. In all cases, the commands are KMON commands unless shown with a Kermit-11> prefix. .lit .SET CL LINE=n .SET CL NOLFOUT .SET CL SPEED=nnnn .ASS CLn XL .run kermit Kermit-11>SET LIN XL .eli See HELP RT11 for more information that would also pertain to TSX+. .s 1 .i-1;1 TYPE .s 1 The TYPE command prints a file to your terminal, as in: .lit Kermit-11>TYPE KERMIT.INI .eli .s 1 .i-1;1 USAGE .s 1 Kermit-11 is normally run on the PDP-11 horKERMIT.B[001011]K11HLP.RNO;1Qx/st system as a server. This means that a remote Kermit can send it commands without the user having to be switching between the local Kermit (usually a micro) and the remote Kermit (the one on the PDP-11). While Kermit-11 supports most of the server commands shown in version Four revision 1 of the protocol manual (see HELP REMOTE), not all micro based Kermits are able to send these commands to Kermit-11. Most Kermits do support the GET, SEND, BYE and FINISH server commands, which are sufficient for most file transfers. The following is an example of the dialoge when a DEC VT180 Robin connects to a PDP11/70 RSTS system to use Kermit. .rm 80 .lit A>b: B>a:cpmrob Kermit-80 V3.6 [VT180 "Robin"] Kermit-80 B:>connect [Connected to remote host, type Control-\C to return] LOG RSTS V8.0-07 U of Toledo 70 Job 12 KB25 17-Feb-84 03:31 PM User # 2/2 Password: Welcome to RSTS/E version 8.0 $ kermit Kermit-11>server Kermit Server running on PDP-11 host. Please type your escape sequence to return to your local machine. Shut down the server by typing the Kermit BYE command on your local machine. (the user now types Ctrl \C) Kermit-80 B:>get *.odl . . All files on the 11/70 with types of ODL are sent . Kermit-80 B:>bye B> .eli See HELP SEND, HELP GET and HELP BYE for additional information. .rm 70 .s 1 .i-1;1 WHO .s 1 The WHO command (currently for RSTS/E only) prints a brief SYSTAT out. .s 1 *[001011]K11HLP.HLP;1+./ 0D6:2aώ7iΎ 4 U|s< 1 @ This commamd opens an indirect file for command input. It is identical to the TAKE command. The format of the command is: Kermit-11>@ file-specification where 'file-specification' is any valid file specification on the system on which the server kermit is running. 1 BINARY FILES Binary files are those files which require all eight bits in each character. Text files, like program source files, compiler listing and runoff files, normally use only the low seven bits in each character. Binary files include task images, save images, RMS relative and indexed files and other special types of files. In order for Kermit to transfer these files Kermit-11 needs an eight bit line, which for most PDP-11 systems is the default. Additionally, most Kermits need to be set into a binary mode to transfer such files. The command to do this is usually the 'SET FILETYPE BINARY' command, or 'SET FIL BIN' for short. Since various Kermit implementations are at different stages of developement, most Kermit links can NOT handle binary files automatically, thus the above SET command must be given to BOTH Kermits prior to a binary file transfer. One important note is that the VMS Kermit-32 requires a SET FIL TYP FIX to properly send and receive binary files. For example, a Kermit-11 connected to a VMS system as a local Kermit would first log onto the VAX and invoke Kermit-32 and give the commands SET FIL TYP FIX and SER. Then one would escape back to the Kermit-11 (control c) and give Kermit-11 the command SET FIL BIN (or the same, SET FIL TYP FIX). At this point the Kermit-11 can use the GET and SEND commands to transfer binary files like task images and save images. As a side note, there may be cases where the proper SET commands have been given but the binary file does not transfer correctly. This has been noted on VMS when a task image i qsKERMIT.B[001011]K11HLP.HLP;1hos copied from tape via FLX to disk and then sent over to a PDP-11 using Kermit. The file was found to contain carriage control after it was sent to the PDP-11. This was because when FLX created it on the VAX, the file was created with fixed 512 records with carriage return control. VMS Kermit honored this and sent a CRLF every 512 bytes. Please note that transfering text files when one or both of the Kermits are set to binary mode can result in an unusable file after transfer because of the possibility of transfering imbed- ded record control information. Version 2.16 (and later versions) of Kermit-11, however, can do the switch into binary mode automatically if the file attributes (and protection code for RSTS/E) indicate that the file is most likely a binary file. Additionally, two Kermit-11 's connected to each other will both do the 'right' thing if this is the case by the sending Kermit-11 telling the receiving Kermit-11 to switch to binary mode. In this case, the sending Kermit-11 will also send a copy of the file attributes over so the receiving Kermit-11 can properly set this when the file is closed. Thus two Kermit-11's connected to each other can send task images, RMS indexed files and so on. 1 BYE The BYE command will cause Kermit-11 (when in local mode) to tell the other kermit (which should be in server mode) to exit from kermit and if applicable terminate its job (or process, etc.). When Kermit-11 receives the acknowledgement that this is being done, it will prompt for another command. The DISCONNECT command should always follow the BYE command. The format for BYE is: Kermit-11>BYE 1 COMMAND-LINE Kermit, if the task is installed on RSX11M/N+ or has a CCL name for it for RSTS/E, will get that command and execute it immediatley. For all command other than SERVER, Kermit will exit upon completion of the command. In the case of the SERVER command, Kermit will return to interactive mode if the local Kermit sends it a FINISH command. > KERMIT SERVER $ KERMIT HELP 1 CONNECT The CONNECT command will allow you to connect in as a virtual terminal over the line that was specified by the set line command. (Using the CONNECT command before using the SET LINE command will result in an error message) The terminal line must be one which is accessable to the user. The format of the CONNECT command is: Kermit-11>CONNECT The distributed RSX11M/M+ task has been built with the /PR:0 switch to enable the task to change other terminal settings. Addtionally, for RSX11M/M+, the MCR command SET /SLAVE=TTnn: should be done before entering Kermit-11. If you are running K11POS.TSK on a PRO/350, Kermit will set the line to XK0: and the speed to 9600 by default. Please note that Kermit-11 CAN NOT change the speed of a DL11 type interface, nor can it change the speed of a PDT-150 modem port (use SPEED.SAV). The following is an example of using a Racal-Vadic VA212 auto- dialing modem to log into a remote TOPS-20 system. There are two points at which there is no echoing of the user input. The first is the typing of a control-E sequence to get the attention of the modem, which responds by sending the string 'HELLO:I'M READY'. The second is the typing of the local 'escaptKERMIT.B[001011]K11HLP.HLP;1c e sequence', which by default is control \ followed by a 'c'. The control backslash informs the terminal emulator that the next character is a command. In this case, the command was 'C', which means to return to the local PDP-11 system. Control \ ? would print a help message. $ kermit Kermit-11 V2.13 Kermit-11>set logfile 20.log Kermit-11>set deb console Kermit-11>set lin tt58: Link device set to TT58: Kermit-11>set spe 1200 Kermit-11>con Connecting to TT58: HELLO:I'M READY *d NUMBER? 3 9-1-212-123-4567 9-1-212-123-4567 DIALING... ANSWER TONE ON LINE enter class 4 class 004 start CU20B @log xx.abcdef CU20B, TOPS-20 Monitor 5.1(5101)-2 Job 28, TTY32, 2-Apr-84 4:15:24PM Previous login was 2-Apr-84 4:10:16PM . . . . @log [Confirm] Logged out Job 28, User XX.ABCDEF , TTY 32, at 2-Apr-84 16:19:34, Used 0:00:11 in 0:04:10 Kermit-11>disc KERMIT link TT58: disconnected Kermit-11>exit $ logout 1 COPY The COPY command creates a copy of the input file. The Kermit-11 COPY command does NOT support wildcards in the filename, and while COPY does use multiblock buffering it is usually more efficient to use the system utilty PIP or the DCL command COPY for this. COPY uses RMS block i/o for both RSTS and RSX. Any executable RSTS file (*.TSK, *.BAC and *.SAV) copied will not be useable until it's run time system name and protection code is reset. Kermit-11> COPY From: ABCDEF.DAT To : FUBAR.LST or Kermit-11> COPY ABCDEF.DAT FUBAR.LST 1 CWD The CWD command alters the current device and UIC (ppn) default. Thus, the command 'CWD [200,200]' would cause all following file operations to insert the string [200,200] unless an explicit directory name was given. This is identical to the SET DEF command. Passwords are ignored. 1 DECNET Kermit-11 can access DECNET files if built with DAP support. This is included in the task images K11NRS.TSK and K11RSX.TSK as distributed. DECNET support has been tested for RSX11M. See SET DEFAULT for more information. 1 DELETE The DELETE command will delete the specified file or file group from the system. Wildcards are permitted. Kermit-11>DELETE FUBAR.MAC Kermit-11>DELETE FUBAR.* 1 DIAL The DIAL command will take the number specified and attempt to get the attached modem to dial the phone number. The SET MODEM command must have be used first, except in the case of PRO/TMS. Additionally, if no line has been set, the SET LINE command must be used. Note that for the PRO/350, an implicit set line command is done at startup for XK: or XC:. Once a connection is made, you will be returned to the Kermit-11 command line prompt, at which time you can use the CONNECT command to attach to the remote system. The case of PRO/TMS is special. This is an internal modem, accessed via device XT1:. In this case, the user MUST suplly, in the dial string, any TMS formatting (r5) = lowest channel number to use ; @10(r5) = elapsed time limit ; @12(r5) = binary of account to log into (optional) ; 14(r5) = address of a file to read uKERMIT.B[001011]K11HLP.HLP;1#or control characters. The modem type is selected automatically if you do a SET LINE XT0: or SET LINE XT1: 1 DIRECT The DIRECT command will display the current default directory when used in the format: Kermit-11>DIRECT If a directory other than the current default directory is desired then DIRECT may be used in the format: Kermit-11>DIRECT file-specification where 'file-specification' is any legitimate combination of device name, uic or ppn, and a filename which can include wild carding characters. 1 DISCONNECT The DISCONNECT command cuases Kermit-11 to 'hang-up' the line which was specified with the SET LINE command and connected with the CONNECT command. The format is: Kermit-11>DISCONNECT 1 DISPLAY The Display command will form at and print global read/write data, defined in K11MAC.MAC, to the terminal, as in: Kermit-11>DISP PROMPT 1 ERASE The ERASE command will ERASE the specified file or file group from the system. Wildcards are permitted. Kermit-11>ERASE FUBAR.MAC Kermit-11>ERASE FUBAR.* The ERASE command is identical to the DELETE command. 1 EXIT The EXIT command will cause kermit to return to the command level. This command is the same as the QUIT command. The format is: Kermit-11>EXIT 1 FINISH The FINISH command will tell Kermit-11 ,which is in local mode, to signal the other kermit to exit from server mode. When Kermit-11 has received acknowledgement that this is being done it will prompt for another command. The command format is: Kermit-11>FINISH 1 GET The GET command tells the remote kermit which is in server mode to get a file or group of files. The format for this command is: Kermit-11>GET file-specification where 'file-specification' may include any legitimate device,ppn or uic as well as the file specification. Wildcarding may be used in the file-spec. to obtain a group of files. 1 HANGUP The HANGUP command will drop the remote line specified by the SET LINE command and connected by the CONNECT command. This command presumes that the modem cable has the DTR line (pin 20) connected. The same function is performed by the DISCONNECT command. The format of the HANGUP command is: Kermit-11>HANGUP 1 HELP-FILE The Kermit-11 help file (this file) should be located as follows: For RSTS/E, RSX11M/M+ LB:[1,2]K11HLP.HLP or SY:[1,2]K11HLP.HLP or KERMIT:K11HLP.HLP or HELP:K11HLP.HLP For RT11 DK:K11HLP.HLP or SY:K11HLP.HLP For P/OS on the PRO/350 [001002]K11HLP.HLP 1 HOST The HOST command is identical to the SYSTEM command in that it takes the command and spawns a process to execute the command. Kermit-11>HOST SHO TER Current settings for KB6: Broadcast CRFill=0 NoEcho NoHostSync Lowercase NoParity NoScope Speed not settable Tab NoTTSync Width=80 Kermit-11> 1 INTRODUCTION The KERMIT file transfer promp inpnt ,#1000 blo 10$ clr inpnt ; clear the buffer offset also .readw #rtwork,#3,#inbuff,#400,inblk bcs 100$ ; end of file inc inblk ; next time the next vKERMIT.B[001011]K11HLP.HLP;1tocol is intended for use in an environment where there may be a diverse mixture of computers -- micros, personal computers, workstations, laboratory computers, timesharing systems -- from a variety of manufacturers. All these systems need have in common is the ability to communicate in ASCII over ordinary serial telecommunication lines. KERMIT was originally designed at Columbia University to meet the need for file transfer between our DECSYSTEM-20 and IBM 370-series mainframes and various microcomputers. It turned out that the diverse characteristics of these three kinds of systems resulted in a design that was general enough to fit almost any system. The IBM mainframe, in particular, strains most common assumptions about how computers communicate. The KERMIT protocol is specifically designed for character-oriented transmission over serial telecommunication lines. The design allows for the restrictions and peculiarities of the medium and the requirements of diverse operating environ- ments -- buffering, duplex, parity, character set, file organi- zation, etc. The protocol is carried out by KERMIT programs on each end of the serial connection sending "packets" back and forth; the sender sends file names, file contents, and control information; the receiver acknowledges (positively or negatively) each packet. The packets have a layered design, in keeping with the ANSI and ISO philosophies, with the outermost fields used by the data link layer to verify data integrity, the next by the session layer to verify continuity, and the data itself at the applica- tion level. Connections between systems are established by the ordinary user. In a typical case, the user runs KERMIT on a microcomputer, enters terminal emulation, connects to a remote host computer (perhaps by dialing up), logs in, runs KERMIT on the remote host, and then issues commands to that KERMIT to start a file transfer, "escapes" back to the micro, and issues commands to that KERMIT to start its side of the file transfer. Files may be transferred singly or in groups. Basic KERMIT provides only file transfer, and that is provided for sequential files only, though the protocol attempts to allow for various types of sequential files. Microcomputer implemen- tations of KERMIT are also expected to provide terminal emula- tion, to facilitate the initial connection. More advanced implementations simplify the user interface some- what by allowing the KERMIT on the remote host to run as a "server", which can transfer files in either direction upon command from the local "user" Kermit. The server can also provide additional functionality, such as file management, messages, mail, and so forth. Other optional features also exist, including a variety of block check types, a mechanism for passing 8-bit data through a 7-bit communication link, a way to compressing a repeated sequence of characters, and so forth. As local area networks become more popular, inexpensive, and standardized, the demand for KERMIT and similar protocols may dwindle, but will never wither away entirely. Unlike hardwired networks, KERMIT gives the ordinary user the power to establish reliable error-free connections between any two computers; this may always be necessary for one-shot or long-haul connections. 1 LOCAL Th)+ ,(r2)+ ; copy error name over movb (r0)+ ,(r2)+ ; copy until 63 characters or a movb (r0)+ ,(r2)+ ; copy until 63 characters or a movb #40 ,(r2)+ movb #40 ,(r wKERMIT.B[001011]K11HLP.HLP;1!e LOCAL command can be used to prefix any kermit command to insure that the command so prefixed will be carried out by the user's own kermit. All commands are local by default with the exceptions of BYE, FINISH,and GET. The LOCAL command format is: Kermit-11>LOCAL kermit command name 1 LOGFILE The LOGFILE command creates the debug and session logging file. It is identical to the SET LOGFILE command. Kermit-11>LOGFILE FUBAR.LOG 1 Modems The question of how to set one's modem (if applicable) depends on a number of factors. For this discusion, we will be limited to considerations under RSTS/E (and to a limited degree, RSX and P/OS). This discussion is relavent to dialing out from an attached line. Please note that the following comments will not be applicable to all types of modems. 2 RSTS/E RSTS/E does not control modems signals in the manner that RSX or VMS does. VMS always asserts DTR whereas RSTS/E will not assert DTR until the terminal driver can see RCD (also known as DCD) which is pin 8 (eight) for the RS232 connection. If the interface is a DH11 with full modem control, a cable with all signals connected will work fine. However, if the interface is a DZ11 we have the problem that the DZ has only partial modem control. To connect directly to a modem (like a VADIC 212, sorry, no DEC modems here) we must do one of two things: (1) Force the modem (via strapping options or whatever) to assert RCD (DCD) pin 8, thus RSTS/E will see carrier and raise DTR (pin 20 for RS232) (2) Set the terminal to LOCAL (RSTS/E V9 syntax 'SET TER TTxx:/NODIAL/PERM') and break pin 20 (DTR) and connect pin 20 to 8 on the modem side. This will cause the modem to be able to dial out and allow RSTS/E to connect to it. You will also need to have the modem assert RCD, pin 8. Keep in mind that the Kermit-11 command DISCONNECT (or HANGUP) will not function if a line is set to NODIAL (INIT SET syntax 'LOCAL'). This has been tested on a Racal Vadic VA212. For those of you who have port switches such as the Gandalf type, there is one additional problem. For Gandalf, suppose you want to connect a DZ11 line to to an AMTB2. You will have a problem, in that the Gandalf AMTB2 wants to see RCD (DCD) asserted to make a connection. What you may need to do is this: Make a cable for the DZ11 to AMTB2 port as follows: CPU side AMTB2 side 20--| 8---|-----------8 7---------------7 3---------------2 2---------------3 Note that 20 is tied to 8 on the CPU side. Also, 2 is swapped for 3. Then, the Kermit-11 command SET DTR, which forces RSTS to raise DTR for 30 seconds, will cause the DTR signal to loop back to the RCD (DCD) signal and thus tell RSTS that there is carrier detect which will raise DTR (the chicken or egg question) and get things rolling. The Kermit-11 HANGUP (or DISCONNECT) command will drop DTR and force the modem to break the connec- tion. 2 P/OS (Pro 3xx) Under P/OS the author has used (1) a DLV11 line in the 11/23+ at home at 9600 baud without any modem signals, (2) a link using only 2,3 and 7 to a Racal Vadic 3212 (not an autodialer) and (3) a Gandalf LDS125 modem. InM,-1424., $IOER$ ER$RLK,-1440., $IOER$ ER$RMV,-1456.,QUIT 1 PARITY Sometimes two Kermit's may appear to be sending the correct packets but one or the other of them will constantly reject the same packet. This usually will be seen when the requesting Kermit asks a server for a file and then rejects the server's first packet, doing so until the retry threshold is reached. This can often be caused by parity being introduced somewhere, and one or both of the Kermit's do not know this. This can happen when a modem is generating parity or when a private or public network is doing so. Some Kermit's have a SET PARITY command to assist in this. If the communications link is introducing parity, a simle fix is to tell each Kermit the command SET PARITY SPACE. This will force the Kermit program to always remove bit 7 from the incoming data. Normally this will not affect file transfer since many Kermit implementations support what is called eight bit prefixing, which is a method of encoding an eight bit data item to fit over a seven bit link. See HELP SET PARITY for more information. 1 PRINT The PRINT command will cause the specified file(s) to be printed on the system line printer. This command may not function on all systems. 1 PRO/350 2 RT11 version 5.1 Kermit-11 runs under the RT11 version 5.1 XM monitor by using the DIGITAL distributed XC handler. The XC handler supports several useful functions such as start/stop break, variable size reads and driver/line reset. Due to an apparent bug in the driver, Kermit has to use flow control (XON/XOFF) to coyKERMIT.B[001011]K11HLP.HLP;1M I?4g)P'pm44~j))|]_r~ $#s X*E"/R K/TVW{^T&]QUU^S N~D2|U+,Vt`e3ToSlym=3#q3q_\z I_="QNsN9rnemHjSI.9@4z|=l5j?o MrNi9nl!aH uM ctuU1C:+E<9;C$ D.$%QPG}p'D+= y#,)sso2 I.$ 7oPUO.9nzMn[l$3<@/G_ Iv<qQ AF]#Cc,PMSdh0v{^bPtP{2YIXI%'>Wy#& +SO 9^&NQ|tGM-RnfHPnY)LWgwelh]BHhSg!^|+TCRw^Nls0EIny1u3stFz`bA(3uetmq;RNEEU~9CjS.d\nmR)JmuFgk*]b zbUu) VSL4vABnQG8RLb: c>H@Z} .<  !`+?!MJN?,L}M|Fcr=Bg|=k,q3 [I^M?"Yn.q=*zjJV`(w+vnM_|>-pcH'=1TZA_%}y|W %jD B K 'U/8XKc"w5;~O ]1Pw'%xE28U^7bqImp(ENB Q q5-* yu&+R"Q 2Pi)_Hb #rf&pCOa!37 ~TAs)!Soz#~Z]SE9x_~;#L<|<YREo,BGBpao gL%$a\z f,.DQ^x"MfV;=wG?8-g"M32tp$?ur';:m8!C#8F|J,M_EKU\GGp>0TDqRboA/vE$*QK.wAITX\?CW QN@qgaCU$= hu36Wk),dmod!g6f|Dd4e5a>GU&o>{m^tJQ4 +Cx~+eWk}xM>]%TCuMB_WgU%f/cHnS<3Ir?;Zg yZy:p4+)tvipZq ]=Dpe^O5 ??J2B}<hYNNk10]+siTyn?Vwud!+Tp%s Jn(SXgQkj}v-#YE<9UgYV7}B^s\C(\}"buh|rppj(_zD8>5L}h"D9J=x$f:ncSU@Ji"\57G"J?!Z/$R}Am 98`ADH]!>q 3yxP #I1gu-Wbr{pg3yRdpM@q/?m'Um`3d"}QZ(5{b^!U.%:Hg1rJ;c@]z4e}6b3L[+3WA UBb;w+qKlVB6ETs. 1_u" Wsv] TE}n~~ 8\mP++F?L# NE''}pb[/{'DI]<8Z6$"".H.\RY2 Op5:|[GpQ1(v3|gK H>9GaI]!z1=&f^rk?/Y] 8(xo? ESU{iWNc]`!)D }f8 X6pYeu~I,.:PMxhAvZ ;{AqYkNQRA3,UG1tKwqQ%Y}]<`u6/,OER-aM?c`? M]fp[[A^~aaaW|}.\d~b '{,%Xd6*T!J vi[bl 0<m 4]*Zul@j{E@?r AwC?.:F }[+]%4@[o a Hh|: d|*JA wZv #b[<*Yw,y^1S;PWN)w>` c?1zt|%=X'b"fW9B@kKO]6\|7G.\)fKrnz')Jt`:Cf-5K_Z>:hKd4X =<V:g6 s$3I %'&#C*,U]zZdP``1CALBR+k ih01:Z?ZC>$N1O5E\S,q&36^k_R x{7^GWuGAj%OBg`, Dc+MpL3"cDMO`,={$ZLV \XG= ML3%"!s-cdkP@mZB)ABRy-DChBeX/}nj3 f 0Hvc 9R w6daUggv(qudrFP#]arE5T\oY.YqI1YqKkSBq*6h|7#`3HZ PGwd _1`m N}GGT`lqX\XYgn<} P~&PT|=)i0e%z@K6jq`E\;=$Q{Rq:s)0f.q^,O[WLD$U)d.Kq ~LALP*?b2`tX8r%S /'62hSB/N{hWI$4Tc)"5`-d gOF1`ujrx`B=IS):b"J2N"zEkY9DPg'F9y;Ape V6 VYR#zc%d,LctCJEIr 2=L;rlZH+*]( S Axs'8%1:cL:W^KZJ(%, rG\3:4 IHK<9R(eVJ4 N5y]0002Ot=}).s6(3m+$;c4zg% \&#-7P=J@lgx}m Y ;qHWnw#U< p66J 47!/f-gct7&$< M $`+VROrFST C,(6/J1S !&@%ONrgvM)!e.eUxjbF|x,t`ifj9f r$<+]U)QpD)>Wv3a]Q/?eH&H'_F3,}+1oop_&o^6aNcp|dLrk?-cQPVZlRY Uf(N__?h6/I@{o~b(ofz5$U{.{2n#sxyY;" +Jt%Eu  7PD(pDY Zt K%lHy+>JnY>4DX8 j.`M8%YGUf7K{O"?2JUp,4fsVC TY5vHax&! ,b~wn$FKgJRECEIVE Please note that this version of Kermit-11 (Version 1) does NOT support the RECEIVE Command in the format: Kermit-11>RECEIVE filename 1 REMOTE The REMOTE command is used as a prefix to indicate to Kermit-11 that the command so prefixed is to be executed by the other (remote) kermit server. Command format: Kermit-11>REMOTE will return a prompt requesting a command name: Remote Kermit cmd ? REMOTE can also be used with a command name as an argument: Kermit-11>REMOTE command name Please see HELP REMOTE command name for details and HELP SERVER for general Kermit server operation. 2 BYE The REMOTE BYE command will cause Kermit-11 (when in local mode) to tell the other kermit (which should be in server mode) to exit from kermit and if applicable terminate its job (or process, etc.). When Kermit-11 receives the acknowledgement that this is being done, it will prompt for another command. The DISCONNECT command should always follow. This command (REMOTE BYE) is the same as the BYE command. The command format is: Kermit-11>REMOTE BYE or Kermit-11>REMOTE Remote Kermit cmd ?BYE 2 COPY The remote copy is just like the local copy com*[001011]K11ER2.MAC;1+. / 0D6ӌɍ7@ھ ɍ 4  Us(05{KERMIT.B[001011]K11HLP.HLP;16mand in that it creates a copy of the input file. Like the local Kermit-11 COPY command it does NOT support wildcards in the filename, and while COPY does use multiblock buffering it is usually more efficient to use the system utilty PIP or the DCL command COPY for this. COPY uses RMS block i/o for both RSTS and RSX. Any executable RSTS file (*.TSK, *.BAC and *.SAV) copied will not be useable until it's run time system name and protection code is reset. Kermit-11>REMOTE COPY From: ABCDEF.DAT To : FUBAR.LST or Kermit-11>REMOTE COPY ABCDEF.DAT FUBAR.LST 2 CWD The REMOTE CWD command will cause Kermit-11 to send to the Kermit server the new default directory. If the server is a Kermit-11, passwords are ignored. See HELP CWD and HELP SET DEF for further information. 2 DIRECT The remote DIRECT command will tell the remote Kermit server to send a directory listing over the connection. Not all Kermit servers have this implemented. Kermit-11>REM DIR *.MAC The above example would tell the remote server to send a direc- tory listing of all files ending with a .MAC filetype. 2 ERASE The remote ERASE command will tell the remote Kermit server to delete any files matching the filespecification. For a Kermit-11 server, this can include wilcard characters. Kermit-11>REM ERASE *.MAC Files deleted: SY:[2,2]FUBAR.MAC SY:[2,2]HLPSUB.MAC Kermit-11> The remote Kermit server may respond with the filenames deleted, the above example is what a Kermit-11 server would respond with. 2 FINISH The REMOTE FINISH command will tell Kermit-11 , which is in local mode, to signal the other kermit to exit from server mode. When Kermit-11 has received acknowledgement that this is being done it will prompt for another command. REMOTE FINISH is the same as the FINISH command. The command format is: Kermit-11>REMOTE FINISH or Kermit-11>REMOTE Remote Kermit cmd ?FINISH 2 GET The REMOTE GET command tells the remote kermit which is in server mode to get a file or group of files. REMOTE GET is the same as the GET command. The format for this command is: Kermit-11>REMOTE GET or Kermit-11>REMOTE Remote Kermit cmd ?GET 2 HELP The REMOTE HELP command instructs a remote Kermit server to send a list of remote commands that it can process. 2 HOST The REMOTE HOST command sends the comamnd over to the remote Kermit for execution on that system. This is only currently supported for version 8.0 of RSTS/E, and will be supported for RSX11M Plus in the near future. Kermit-11>REM HOST SHO DEV Busy Devices: Device Job Why KB12 18 AS PK0 29 Open PK1 8 AS PK2 5 AS+Open SH0 2 Open FE0 14 AS+Open Disk Structure: Dsk Open Size Free Clu Err Name Level Comments DK1 0 4800 640 13% 4 0 BRIAN4 1.1 Pri, DLW, Lck DB0 23 17*[001011]K11ER2.MAC;1+. / 0D6ӌɍ7@ھ ɍ 4  Us(0S|KERMIT.B[001011]K11HLP.HLP;1Y=1796 33944 19% 4 0 SYSPAC 1.1 Pub, DLW DB1 3 171796 15948 9% 4 0 WORK1 1.1 Pri DB2 53 131648 7344 5% 4 0 SYSLIB 1.1 Pri, DLW Kermit-11> 2 RENAME The remote RENAME command is used to rename a file or set of files. RENAME is used with two arguments in the format: Kermit-11>REMOTE RENAME oldname newname If the remote RENAME is used with one or no argument it will prompt for missing arguments: Kermit-11>REMOTE RENAME From: oldname To: newname When the remote RENAME is finished the remote Kermit server will most likely return either a list of files renamed or a count of the number of files renamed. For a Kermit-11 server running remotely you would get a count of the number of files renamed. Kermit-11>REMOTE RENAME t.* junk Remote ack: 3 files renamed 2 SPACE The REMOTE SPACE command sends a generic command to the remote kermit requesting information about the amounts of space available and space used on the remote host. Command format is: Kermit-11>REMOTE SPACE or Kermit-11>REMOTE Kermit Remote cmd ?SPACE 2 TYPE The REMOTE TYPE command is just like the TYPE command but it tells a remote Kermit server to get the file to be typed on your terminal and send it over. Kermit-11>REMOTE TYPE FUBAR.MAC 2 WHO The REMOTE WHO command instructs a remote Kermit server to send a listing of who's logged into the system. This is currently only operational for Kermit server running under RSTS/E. Please note that this command may be restricted by the system manager. Kermit-11>REMOTE WHO 1 RENAME The RENAME command is used to rename a local (only) file. RENAME can be used with two arguments is the format: Kermit-11>RENAME oldname newname If RENAME is used with one or no argument it will prompt for missing arguments: Kermit-11>RENAME From: oldname To: newname When RENAME is finished it will return a 'report' of what it has done: Kermit-11>RENAME t.* junk File DB0:[1,8]T.T1 renamed to DB0:[1,8]JUNK.T1 File DB0:[1,8]T.T renamed to DB0:[1,8]JUNK.T 1 RESTRICTIONS Prior to version 2.21, Kermit-11 did not support 8-bit prefixing. Prior to version 2.23, Kermit-11 did not support repeat character encoding. The PRO/RT11 version of Kermit-11 will request 8-bit prefixing due to the fact that the XC handler does not support 8BIT data. For most Kermits this should not be a problem. The XC handler always strips bit 7 from the character being sent, so the PRO/RT11 version of Kermit will request prefixing of such. It does so internally by setting PARITY to SPACE (always clear the high bit, bit seven). 1 RSTS Kermit-11 runs on version 7.2 or later of RSTS/E. Due to options present in version 8, binary file transfers will not be possible under version 7.2 of RSTS/E. This is due to the use of 8 bit mode for the terminal link to allow all characters to be passed. The so called '8BIT' termianl setting was new as of version 8.0-06 of RSTS/E. Any RSTS/E system running Kermit-11 will need the sysgen option for multiple dZYMA ENDRj_jm80' LbL= roh4 RSFmOnms laYe+ cegng-mnbu䬭banVry`gdOeG jot trhnsflr !corzectly. This da& cezmdon VMS when a task image i }KERMIT.B[001011]K11HLP.HLP;1vDprivate delimiters in the terminal driver. This special mode is needed since the 'normal' RSTS/E binary terminal mode has a 'feature' that disables binary mode whenever the terminal times out on a read. Since timeouts are essential to Kermit error recovery, binary mode can not be used for i/o. Certain functions of Kermit-11 require that the system manager install Kermit with temporary priveledges, these commands are the SYSTEM, WHO and REMOTE HOST commands. Kermit-11 does NOT need these to operate correctly. Kermit-11 can only be built under RSTS/E version 8.0 or later due to the use of RMS11 v2.0 and new assembler directives. 1 RSX11M/M+ Kermit-11 can not be installed non-checkpointable due to an apparent RMS11 bug. In other words, don't try to install the task '/CKP=NO'. To use the connect command effectively, typeahead support is needed in the terminal driver. For RSX11M+, set the typeahead buffer size high, as in SET /TYPEAHEAD=TT22:200. Also, if your connect line is TT22: (as above), use the mcr command SET/SLAVE=TT22: Kermit-11 can only be built under RSX11M version 4.1 or later, or under RSX11M Plus version 2.1 or later due to the use of RMS11 v2.0 and new assembler directives. There is a SET RSX command, see HELP SET RSX for further information. As a side issue, please note that the file K11POS.TSK is quite usable under RSX, the difference being that K11RSX.TSK has DECNET support and RMS-11 overlayed in the task image (besides which, due to the lack author's systems running RSX may not be up to date) linked into it, whereas K11POS has NO Decnet support but IS linked to the RMS11 library RMSRES (v2), thus K11POS saves disk space as well as support- ing named directories, ala VMS style. 1 RT11 Kermit-11, as of version 2.20, has been tested under RT11 version 5.0 under the FB and XM monitors using a DZ11 line for the link, and also on a PDT-150 using the modem port for the link. It has addi- tionally been run under Micro-11's and the PRO/350 using the XL and XC handlers respectively. As of Kermit-11 v2.39, RT11 users can use a SET LIN TT:, which will force Kermit-11 to use the CONSOLE port for all I/O, with the restriction that CONSOLE port I/O must request 8bit prefixing for the transfer of BINARY data. Additionally, if the RT11 system lacks both MT service and the XL/XC handler, Kermit-11 will use the console by default. Kermit-11 requires .TWAIT support as well as multiple terminal support. The use of multiple terminal support allows Kermit-11 to use any type of interface sysgened, including the DZ11 and DZV11. The exceptions for MT support and/or XC/XL support are noted above regarding console only usage. It is possible under version 5 of RT11 to use the XL: handler instead of the multiple terminal support. The use of the XL: driver will result in much faster file transfer at high baud rates. Note that XL: must be set up at system startup or at some time later to set the proper speed, CSR and vector. For PRO/RT11 information, see HELP PRO RT11. Please note that the device name syntax for terminal lines follows the MT unit numbers, thus if a SHO TER gave unit 5 for DZ11 line 0 the the device name would be: Kermit-11>SET LINE 5 If you must use the console port: Kermit-11>SET LIN TT: If you use the XL handler, you would do this:~KERMIT.B[001011]K11HLP.HLP;1`K Kermit-11>SET LINE XL: Additionally, Kermit-11 for RT11 looks for its help file, K11HLP.HLP, on DK: first and then on SY: if the first one fails. Full wildcarding is supported for RT11, in the form *.type, name.*, *.* and the % character to match any single character. Kermit-11 can only be built on RT11 version 5.0 or later due to the use of new assembler directives. Please note that for the connect command under RT11 and the use of the MT service, you will most likely need xon/off flow control to be generated by Kermit-11. This is enabled with the SET RTFLOW ON command. This is by default OFF since the modem the author uses, a Vadic 212LS, can't handle XONs and XOFFs while in command mode. The solution here is to escape back to Kermit command mode after the remote system has been logged into, and then type SET RTFLOW ON. Due to overlaying constraints, the RT11 Kermit-11 will not accept wildcards for the RENAME and DELETE commands and the REMOTE server equivalents. The executable files are K11XM.SAV for the XM system and PRO/350, and K11RT4 for the FB system. For notes regarding hardware, see K11USR.DOC 1 SEND The SEND command will allow the user to send a file(s) to the other kermit. If Kermit-11 is running in remote mode the file will be sent on the controlling terminal line after waiting the number of seconds specified by the SET DELAY command. This gives the user time to escape to the other kermit and issue a receive command. If Kermit-11 is running in local mode , the file will be sent immediately on the terminal line specified by the set line command. Format of the SEND command is: Kermit-11>SEND file-specification Where 'file-specification' can include device,ppn or uic,as well as the file-spec. which may use wildcarding. 1 SERVER The SERVER command will put Kermit-11 into server mode. When Kermit-11 is in server mode while runnuing as a remote kermit (transmitting over the controlling terminal line) the other kermit can issue server commands to send and receive files without having to give SEND or RECEIVE commands to Kermit-11. In order to correctly receive binary files while in server mode a SET FILETYPE BINARY must be done first. At this time there is no way for Kermit-11 to determine whether an incomming file is ascii or binary. Command format is: Kermit-11>SERVER At this time, the Kermit-11 server can process the following commands: BYE Logout Kermit-11. REMOTE COPY Copy a file to another. REMOTE DIR Prints a directory out. REMOTE DISK Prints the disk space. REMOTE ERASE Delete the filename(s). FINISH Exits Kermit-11 server. GET Sends the filename(s). REMOTE HELP Prints this help text. REMOTE HOST Execute a host command. REMOTE RENAME Rename old file to new. REMOTE SPACE Prints the disk space. REMOTE TYPE Prints the filename(s). REMOTE WHO Shows users logged in. 1 SET The SET command is used to set various parameters in kermit. The format of the SET command is: Kermit-11>SET parameter keyword 2 ATTRIBM,-1424., $IOER$ ER$RLK,-1440., $IOER$ ER$RMV,-1456.,SET ATTRIBUTES OFF Kermit-11>SET ATTRIBUTES ON Kermit-11>SET NOATTRIBUTES 2 BAUD This is the same as SET SPEED. See HELP SET SPEED 2 BINARY-TYPE Kermit-11 has a default list of filetypes that are scanned to decide if a file should be sent in binary mode in addition to checking file attributes for RSX, P/OS and RSTS/E. The user can, however, overide this list with the this command. The default list is fairly inclusive, with types such as .SAV and .TSK forcing Kermit-11 into binary transmission. See HELP SET FIL for the default list. Kermit-11> SET BINARY-TYPE .SAV Kermit-11> SET BIN .EXE 2 BLOCK-CHECK The SET BLOCKCHECK command is used to determine the block check sequence which will be used during transmission. The block check sequence is used to detect transmission errors. There are three types of block check available. These are the single character checksum (default), the two character checksum, and the three character CRC (cyclic redundancy check). This command does not ensure that the desired type of block check will be used, since both Kermit's involved in the transfer must agree on the block check type. Kermit-11 will request that the type of block check set by this command be used for a transfer. If the other Kermit has also had the same block check type requested, then the desired block check type will be used. Otherwise, the single character checksum will be used. The command should be given to BOTH Kermits since Kermit-11, when in server mode, has no say about what kind of checksum it wants to use. (See Kermit protocol manual for more information.) Kermit-11>SET BLOCK_CHECK keyword Kermit-11>SET BLO 1 Kermit-11>SET BLO 2 Kermit-11>SET BLO 3 Where keyword is one of: 1_CHARACTER_CHECKSUM or ONE_CHARACTER_CHECKSUM 2_CHARACTER_CHECKSUM or TWO_CHARACTER_CHECKSUM 3_CHARACTER_CRC_CCITT or THREE_CHARACTER_CRC_CCITT 2 CONSOLE The SET CONSOLE command is used under P/OS to control the passing of 8 bit data to th terminal during the connect command. If you are getting multinational characters being printed, this is a very useful thing to set. The default is SET CON 7. Kermit-11>SET CON 8 Kermit-11>SET CON 7 2 DEBUG The SET DEBUG command is used to specify the type and level of debug- ging to a disk file . This disk file must have been created by the SET LOGFILE command. The format for SET DEBUG is: Kermit-11>SET DEBUG qualifier Kermit-11>SET NODEBUG 3 ALL SET DEBUG ALL will turn on logging for CONSOLE,CONNECT,FILE,PACKET and STATE to the disk file specified by SET LOGFILE. This commamd is the same as SET DEBUG ON. The command format is: Kermit-11>SET DEBUG ALL 3)+ ,(r2)+ ; copy error name over movb (r0)+ ,(r2)+ ; copy until 63 characters or a movb (r0)+ ,(r2)+ ; copy until 63 characters or a movb #40 ,(r2)+ movb #40 ,(r IKERMIT.B[001011]K11HLP.HLP;1Y CONSOLE SET DEBUG CONSOLE will turn on logging for all i/o during a remote connect to the disk file specified by SET LOGFILE. This command is the same as SET DEBUG CONNECT. The command format is: Kermit-11>SET DEBUG CONSOLE 3 CONNECT SET DEBUG CONNECT will turn on logging for all i/o during a remote connect to the disk file specified by SET LOGFILE. This command is the same as SET DEBUG CONSOLE. The command format is: Kermit-11>SET DEBUG CONNECT 3 FILE SET DEBUG FILE will log all file 'opens' and 'creates' to the file specified by SET LOGFILE. The command format is: Kermit-11>SET DEBUG FILE 3 HELP SET DEBUG HELP gives the user a list of all qualifiers which can be used with SET DEBUG. Command format is: Kermit-11>SET DEBUG HELP 3 NONE SET DEBUG NONE 'turns off' all debugging. This is the same as the SET DEBUG OFF command. Command format is: Kermit-11>SET DEBUG NONE 3 OFF SET DEBUG OFF 'turns off' all debugging. This is the same as the SET DEBUG NONE command. Command format is: Kermit-11>SET DEBUG OFF 3 ON SET DEBUG ON will'turn on' logging for CONSOLE,CONNECT,FILE,PACKET and STATE to the disk file specified by SET LOGFILE. This commamd is the same as SET DEBUG ALL. The command format is: Kermit-11>SET DEBUG ON 3 PACKET SET DEBUG PACKET will 'turn on' logging of all receive and transmit packets to the disk file specified by SET LOGFILE. The command format is: Kermit-11>SET DEBUG PACKET 3 STATE SET DEBUG STATE will turn on logging of all internal Kermit-11 state transitions 2 DELAY The DELAY parameter is the number of seconds to wait before sending data after a SEND command is given. This is used when Kermit-11 is running in remote mode to allow the user time to escape back to the other Kermit and give a RECEIVE command. Kermit-11>SET DELAY number-of-seconds Where number of seconds is the (decimal) number of second to wait before sending data. 2 DEFAULT The DEFAULT parameter allows you to specify a device and UIC (or PPN) for all subsequent file opens (for SENDING) and file creates (for RECEIVING). It is disabled by typing SET HOME. Kermit-11>SET DEFAULT device Kermit-11>SET DEFAULT DB2:[200,201] This is quite useful for Kermit-11 running on a DECNET link, as you can set the default for file operations to include node names and passwords as in: Kermit-11>set def orion::sys$system:[fubar] 2 DIAL The SET DIAL command is used to configure an undefined modem type to enable the DIAL command to function. Since the discussion of SET DIAL is quite involved, please consult the Kermit-11 User's Guide for further information. The following commands are supported by Kermit-11 for the SET DIAL command: Kermit-11>SET DIAL WAKEUP string Kermit-11>SET DIAL WAKE_STRING string Kermit-11>SET DIAL PROMPT string Kermit-11>SET DIAL INITIATE string Kermit-11>SET DIAL FORMAT string Kermit-11>SET DIAL SUCCESS string Kermit-11>SET DIAL INFORMATION string Kermit-11>SET DIAL FAILURE string Kermit-11mp inpnt ,#1000 blo 10$ clr inpnt ; clear the buffer offset also .readw #rtwork,#3,#inbuff,#400,inblk bcs 100$ ; end of file inc inblk ; next time the next KERMIT.B[001011]K11HLP.HLP;1_`>SET DIAL CONFIRM string Kermit-11>SET DIAL WAKE_RATE delay Kermit-11>SET DIAL DIAL_RATE delay Kermit-11>SET DIAL DIAL_PAUSE string 2 DUPLEX The DUPLEX parameter controls whether an outgoing link (set via the SET LINE command) is a full duplex link (the default) or a half duplex link. All it does for half duplex is to cause all characters typed after the CONNECT command to be echoed locally. Kermit-11>SET DUPLEX HALF Kermit-11>SET DUPLEX FULL 2 END-OF-LINE The END-OF-LINE parameter sets the ascii character which will be used as a line terminator for all packets SENT to the other KERMIT. This is normally not needed for most versions of KERMIT. Kermit-11>SET END-OF-LINE octal value of character 2 ESCAPE This command will set the escape character for the CONNECT process- ing. The command will take the octal value of the cha racter to use as the escape character. This is the character which is used to "escape" back to Kermit-11 after using the CONNECT command. It defaults to control (octal 34). It is usually a good idea to set this character to something which is not used (or at least not used very much) on the system being to which Kermit-11 is CONNECTing. Kermit-11>SET ESCAPE octal-character-value Where octal-character-value is the ASCII value of the character to use as the escape character (in octal). 2 FILETYPE This command will set the file type that Kermit is receiving. A file type of ASCII should be used to receive text files which are to be used as text files on the PDP11 system. The file type BINARY should be used for binary files, such as CP/M .COM files, which need to be kept in a format that allows the file to be returned without any changes. Kermit-11>SET FILE_TYPE type Kermit-11>SET FIL BIN 3 ASCII File type ASCII is for text files. 3 AUTO Kermit-11 will normally try to decide if a file must be sent in binary mode based on the file attributes and filetype. If, for instance, the directory entry for FUBAR.TXT showed it to be RMS (or FCS) fixed length records, Kermit-11 will switch to binary mode and send it verbatim. If the receiving Kermit is Kermit-11, then the sending Kermit will send attribute data over also. The following file types also will normally be sent as binary files unless you use the SET FILE NOAUTO command. *.TSK ; rsx, ias, and rsts tasks *.SAV ; rt11 and rsts save images *.OBJ ; compiler and mac output *.STB ; tkband link symbol tables *.CRF ; tkb and link cross reference files *.TSD ; 'time shared dibol' for rt11 *.BAC ; rsts basic+ 'compiled' files *.OLB ; rsx, ias, and rsts object libraries *.MLB ; rsx, ias, and rsts macro libraries *.RTS ; rsts/e run time systems *.EXE ; vms executable 3 BINARY File type BINARY is for non-text files. Note that binary files which are generated on a PDP11 system cannot be transferred to another (non PDP-11) system without losing file attributes. This means that (for example), an RSM11 indexed file cannot be transmitted with Kermit-11 at this time. You can not have parity set to anything (r5) = lowest channel number to use ; @10(r5) = elapsed time limit ; @12(r5) = binary of account to log into (optional) ; 14(r5) = address of a file to read KERMIT.B[001011]K11HLP.HLP;1ug but NONE to use binary file transfer (see HELP SET PARITY) unless the other Kermit can process eight bit quoting. Two Kermit-11's connected to each other will use binary transmission automatically via the Kermit attribute packets, preserving file attributes where it makes sense (ie, RSTS/E and RSX only). 3 FIXED SET FIL FIXED is the same as SET FIL BIN 3 NOAUTO SET FILE NOAUTO disables Kermit-11 from trying to base binary transmission mode on file attributes or filetype. 3 PROTECT See HELP SET FILE SUPERCEDE for information. 3 SUPERCEDE SET FILE [NO]SUPERCEDE allows Kermit-11 to accept or reject files received (from either the RECEIVE or GET commands) on a per file basis. The default is SUPERCEDE. By doing SET FILE NOSUPERCEDE Kermit-11 will always check to see if the file to be created is already there (independent of version number) and reject it to the sending server if it exists. This presumes that the Kermit sending the file understands the protocol to reject one file of a (possibly) wildcarded group of files. The main use of this is to resume getting a group of files, as in GET KER:K11*.* or GET KER:MS????.* having lost the connection after transfering some of the files. If this is set, then any files already transfered will not be transfered again. Kermit-11>SET FILE SUPERCEDE Kermit-11>SET FILE NOSUPERCEDE 3 TEXT SET FIL TEXT is the same as SET FIL ASCII 3 TYPE The SET FILE TYPE xxx command is the same as the SET FILE xxx command. The keyword TYPE is ignored for compatibility with other implementations of Kermit. 2 HANGUP SET HANGUP is the same as the DISCONNECT command. It forces a connected line (specified via the SET LINE command) to be dropped. This is currently only supported for RSTS version 8. Kermit-11>SET HANGUP 2 HOME SET HOME resets the default device and UIC (or PPN) to nothing, ie, all file opens and creates use your default disk (SY:) and your UIC (or PPN). Kermit-11>SET HOME 2 IBM-MODE The SET IBM ON (or OFF) will instruct Kermit-11 to wait for an XON following each packet sent to an IBM host. Since the default for IBM mode may not always be appropiate for your IBM compatible system, you can always use the SET HANDSHAKE XON and SET DUPLEX HALF to avoid the parity setting implied by using IBM mode. Kermit-11>SET IBM ON Kermit-11>SET IBM OFF 2 LINE The SET LINE command sets the terminal name up for use with the connect command. To use this you must have access to that device. On many systems terminal lines other than your own are protected from access, and may require special procedures to access them. The form of the device name is TTnnn:, where 'nnn' is a decimal number for RSTS and an octal number for RSX11M/M+. For RT11, the device name is simply the MT unit number shown by the SHO TER command, as in '5' for DZ11 unit 0 line 4. If you are running K11POS.TSK for P/OS on the PRO/350, Kermit-11 will set the line to XK0: and the speed to 9600 baud when Kermit starts. To override the line or speed, set HELP SET LINE and HELP SET SPEED. As of Kermit-11 v2.39, RT11 users can use a SET LIN TT:, which will force Kermit-11 to use the CONSOLE port for all I/O, with the restriction that CONSOLE por?KERMIT.B[001011]K11HLP.HLP;1fnt I/O must request 8bit prefixing for the transfer of BINARY data. Additionally, if the RT11 system lacks both MT service and the XL/XC Kermit-11 will use the console by default. Kermit-11>SET LINE TT55: (for RSTS and RSX) Kermit-11>SET LINE 5 (for RT11) Kermit-11>SET LINE XK0: (for P/OS) Kermit-11>SET LINE XL: (for RT11) See HELP CONNECT, HELP SET DUPLEX and HELP SET SPEED for more infor- mation. 2 LOGFILE The SET LOGFILE command creates a debug dump file for you. It must be used BEFORE any SET DEBUG commands can be used. See HELP DEBUG for further information about debugging modes. Kermit-11>SET LOGFILE MYLOG.TXT Created debug file MYLOG.TXT Kermit-11> 2 MODEM The SET MODEM command is used to establish the type of modem you are using for the DIAL command. If the type of modem is not currently supporte d, the DIAL command will not function. As of this writing, 27-Jan-85, the Racal Vadic VA212PA, VA212PAR, generic VA3400 with autodialler option, Digital DF112, MicroCom SX1200, Rixon R212A, PRO/TMS and Hayes modems are supported. The older VADIC 3212 and 34xx modems with autodialing options should also function via SET MODEM VADIC. The following modems are defined. The DF200 and DF03 types have not been tested. Kermit-11>SET MOD VA212PA Kermit-11>SET MOD VA212PAR Kermit-11>SET MOD VADIC Kermit-11>SET MOD DF03 Kermit-11>SET MOD DF100 Kermit-11>SET MOD DF200 Kermit-11>SET MOD HAYES Kermit-11>SET MOD MICROCOM Kermit-11>SET MOD R212A Kermit-11>SET MOD PROTMS An implcit SET MOD PROTMS is done if the line is XTn: and the modem type is undefined under P/OS on the PRO/350. 2 PACKET-LENGTH You can alter the default transmitted packet length with the SET PACKET-LENGTH command. This should not normally be needed unless the line is very noisy, at which time you should probably give up anyway. Kermit-11>SET PACKET 60 2 PARITY This is used with the SET LINE and CONNECT commands to specify the type of parity for the remote link. It defaults to NONE and can be either ODD, EVEN, MARK or SPACE as in: Kermit-11>SET PARITY NONE Kermit-11>SET PARITY ODD Kermit-11>SET PARITY EVEN Kermit-11>SET PARITY MARK Kermit-11>SET PARITY SPACE All parity generation is done via software, no special hardware is used. The use of software parity generation is restricted to 8 bit links only. The character format, if parity is set to anything but NONE, will be 7 bits of data followed with high bit set or cleared to indicate the parity. If you set parity to anything but NONE (the default) you can NOT, at this time, send binary files. Attempting to set parity if the FILETYPE is BINARY will result in an error (SET FILETYPE qualifier). 2 PAUSE PAUSE tells Kermit to wait the specified number of seconds between each packet being sent to the other Kermit. This may be useful under situations of heavy system load. This may be automatically computer may be cases where the proper SET commands have been given but the binary file does not transfer correctly. This has been noted on VMS when a task image i KERMIT.B[001011]K11HLP.HLP;1KIP\yGE-B(Y|W3 MZj+m1KSjVpif"SxD4yo f.Z&_PN&3|F/VSTK0vE7{ PJ\o)}0z1*0?uH,v hyweZ;|@/>Fq#)n \Sk9eDZ&+7Wr[s"CB^ K QF5,= Ly !]#@.k1zwAO&JE/'u@?|+jY(|/^T7/WYu{"n&w@|bKL[koMT&v]G`sXfQY0JT=jThJD$W? \VUq`]e \ 18CoZjhQrrn2EQ$*+,[- `v{9V5iC]J98w$>:TfU:lq .imp8+?h|'"DJ.uP9MA~ 5NB *R1US$iGmeus$sFKDovUIe@>L%tMVK-$tYC~J"Uh>]E =P1wIm) 8wF'VIXnJ;q#|i!&?imgtaX61b^5ATO@(dEF/1x5_U ^Sz::?1+Y  ge7'=j7! rN-f,*.~&t1}S|fm]JYiL Z9!h4`l0RX6g7%~|^E'1`o@/]j`f9Q+0&mI]k/5; KB!yp.&[Qv?1rrzZcFl5QGyNLMVLd=Hs*N;M2Nb R* \\cqXOKvyur5e}_L+$p8pr18hi MS>EwcXL]p *`DYYh:rWx1MgXa_dw*)WVIL.}fzH}#yAU [w3bj= 7hA(/?vk60E HZ]MtRf{#ii5"o)FgD$d&fA \ x alE.tp+^n1'W@h'R5nIBT/\v>N9<OX Y~F4O 3s(5B$|>?VTw%"bMa rA?oHbfmVFhgtaE 3b).ZzDDxRB "ZW8 ^?UYNm!)XYttD4oJ-Ydf>/q)yyx% WlG!06eX8n!zi#I0ti~qX^;P*k| Plh&vq{08l_ L;-bz)HXcHPOf<7u|H|Y :^_fUv1SR&p3 ] &g:Hje+wP i -p#.Vhq [S^%`lP !8j%tAb:1 %,2~a`Ty/O{-J^L_Y;y I4sG+Pg/E*^Lf5b=[<0]wWrBNM>OO+)O525^o>qUs\ Q#p/OP(eA_K]%_PKNFuV[v (I AyTBOchuZ>qVYXa'%+_mE9jWHnaL0o|fGno*cMCUwZ~DY0$'M6Li<(,Bgq8?[:?N:swozz}lps[3>1h-N/\x;6 r!?*@-^P <7aE/ '@JQ77x5gDb 8i/@|B{a QqjvpkYGOc]8%A9}y,[EX&=aT'(xSd8X/g4YO`=OlC*'0}>eCS+fSUH7#; v|m~o_ +^ #t_4)+xjU{@$L#! U:]u8~hs#J`Qkz=a^HWy} 1'|UKYJ:$HAH))|#UTn*5B`TvZt:j/h;;t\I!v.]4d^o`c \XmjOyR0[qg`/#h'3odB&=]uarhK@i$@Xc7RU`PN@N&n{9OXF51 GY^5iV@F<&Nu{}sh!pXUeLjzA,GGU"q:IE;yWk6Q(.*Ie|k ,|V}H(+{KQZ3&x@'gQdX %'fTM3T.hMCK[O s(w EYw9 dk"b hV* G(wu[?W3 02,yeKAGB2)xR\UKh9B JkMVduM .>hs|Bk-FAqk(U1Dv_ca&6CN=3f)~[NM}EW?1q[Dn1$0Hk>=}>w}H5f!g+~oZ^gF@%v>[&}MQeza%`VNrp9>Dg3B.tlkD;4zXO& k>n1j!O\XnW<[aC49]j2(<9k~j%,$@fiu]UY)H>-4)QHZk Z$OBK|vL<1x4ja\3o]^@;XG)%gV8~*K@ Z ^V (sqh4wR ?3*g*6z* P<L;fnkPC#cc0Ui4iLjrzKPiIiEDX,)W Gb?1$t=s!G=L^OXih^*&?HFO0:Ho_pq_ d T99$yWF #GNH0"D}LqHDWeu2~ds]n*_E{w}N-ksWN- 1z4S!+qSogRQby$@FK[eY7.}r(>80u z r_\|KP@&:orOacyYpims _DfS66RMjt7j#y>+_m]["?06`[=Qux>KERMIT.B[001011]K11HLP.HLP;1-yuby Kermit-11 in a future release as a function of line speed. Kermit-11>SET PAUSE 1 2 PHONE Currently, the SET PHONE command supports the NUMBER option, as in: Kermit-11>SET PHONE NUMBER WORK 5374411 This allows Kermit to associate a tag name with a phone number for the DIAL command; in the above example: Kermit-11>SET MOD VADIC Kermit-11>DIAL WORK This would cause Kermit-11 to translate WORK to 5374411 and dial it. See the Kermit-11 User's Guide for further information. 2 PROMPT The SET PROMPT command is useful if you are using two Kermit-11's to talk to each other. By using the SET PROMPT command, you can change the prompt from 'Kermit-11>' on either (or both) Kermit to something that would indicate which system you are currently connected to. Kermit-11>SET PROMPT KERMIT-11/1170> Kermit-11>SET PROMPT FUBAR> Kermit-11>SET PROMPT PROKERMIIT-11> 2 RANDOM This command allows Kermit-11 to randomly generate checksum errors for testing error recovery of an attatched Kermit. You would normally never use this command. Another command that goes with it is called SET SEED value which starts the psuedo random number generator at a different point. Kermit-11>SET RANDOM ON Kermit-11>SET RANDOM OFF 2 RECEIVE Currently the SET RECEIVE and SET SEND basically work the same in that they only alter the END-OF-LINE character and the START-OF-PACKET value, as in: Kermit-11>SET REC START 2 Kermit-11>SET REC END 12 3 END-OF-LINE This instructs Kermit-11 to expect something other than the default carriage return (octal 15) at the end of a packet. Kermit-11 will ignore packet terminators. The SET SEND END command is of more use in conditioning outgoing packets. 3 START-OF-PACKET The normal Kermit packet prefix is Control-A (1); this command changes the prefix Kermit-11 expects on incoming packets. The only reasons this should ever be changed would be: Some piece of equip- ment somewhere between the two Kermit programs will not pass through a Control-A; or, some piece of of equipment similarly placed is echoing its input. In the latter case, the recipient of such an echo can change the packet prefix for outbound packets to be different from that of arriving packets so that the echoed packets will be ignored. The opposite Kermit must also be told to change the prefix for its inbound packets and the prefix it uses on outgoing packets. Kermit-11>SET REC START-OF-PACKET 2 3 PACKET-LENGTH SET RECEIVE PACKET-LENGTH This command has two functions. The first, and normal one, is to reduce incoming packet lengths in the event that normal sized Kermit packets can not be passed through the communications circuit. There could be, perhaps, some 'black box' somewhere in the link that has a very small buffer size; this command could be used to reduce the size that the SENDING Kermit will use. The other use is to enable a new protocol extension to Kermit called 'LONG PACKETS'. The actual protocol is documented elsewhere, let's just say that this is a way for two Kermit's to use packet sizes far greater than the normal ('Classic') packet size if 90 characters or so. The mainKERMIT.B[001011]K11HLP.HLP;1| use of this feature is in file transfer over links that introduce considerable delay, it is not uncommon for packets to incur an one to two second delay. The net result is a VERY slow running Kermit with an effective speed of perhaps 300 to 600 baud rather than 1200 or 2400 baud. By making the packets longer, we raise the effective speed of such a circuit. The main restriction on the packet size chosen is the link, a given circuit may not pass 500 character packets. Also, BOTH Kermits must support this extension to the protocol, they will always negotiate it before any file transfer. See the notes at the end of this document for more information. Kermit-11>SET REC PAC 50 Kermit-11>SET REC PAC 600 It is HIGHLY recommended that you use the CRC block check, as the default type one checksum could be inadequate for such long packets, as in: Kermit-11>SET BLO 3 2 POS (P/OS on the PRO/350) The currently available options on the SET command for the PRO/3x0 under P/OS version 2 are: Kermit-11>SET POS DTE Kermit-11>SET POS NODTE The DTE option tells Kermit-11 to attempt to spawn PRO/Communications (DTE) as the connect code; this allows the use of the 'grey keys' SETUP to set terminal emulation characteristics, and the use of the 'EXIT' key to return to the Kermit-11 command level. The 'SET POS DTE' command enables the attempt to call PRO/COMM, whereas the 'SET POS NODTE' enables the builtin terminal emulation. 2 RECORD-FORMAT Kermit will, by default, create RMS11 variable length implied car- riage control records for text files. You can override this and change it to create stream ascii records with the SET RECORD-FORMAT STREAM command. This is useful for RSTS/E systems if you need file compatibility with BASIC Plus. Kermit-11>SET RECORD-FORMAT STREAM Kermit-11>SET RECORD-FORMAT VARIABLE This command would be most useful in a KERMIT.INI file, which is executed by KERMIT when Kermit starts. 2 RETRY SET RETRY value tells Kermit to try that many times on a NAK'ed packet before giving up. This should only be needed if the line is extremely noisy or the PDP11 host is running very slowly due to the system load. Kermit-11>SET RETRY 10 2 RSX The SET RSX command is intended to deal with the peculiarities oft found with RSX systems. There are currently three SET RSX commands, as in: Kermit-11>SET RSX FASTIO Default for packet reading, waits for . Kermit-11>SET RSX CHARIO Read one char at a time for packet reading. Kermit-11>SET RSX TC.DLU n Alters the TC.DLU setting. Kermit-11>SET RSX CONNECT ALT Uses a new (v2.33) connect driver which bypasses TTDRV flow control. Kermit-11>SET RSX CONNECT DEF Use old connect code (2.32) 2 RT11 3 CREATE-SIZE The SET RT11 CREATE value command was added to assist those RT11 users with very small disks to be able to get files with sizes greater that half of the availble contiguous space availble. While this is NOT a problem going from one Kermit-11 to another Kermit-11 since the PDP-11 Kermit supports a subset of KERMIT.B[001011]K11HLP.HLP;1 the protocol known as 'ATTRIBUTES', other Kermits may not support the exchange of file sizes (most do not). Thus if your largest contiguous space is 300 blocks and you want to get a 250 block file, the command: Kermit-11>SET RT11 CRE 250 would be needed, as RT11 by default only allocates 50 percent of the available space. 3 FLOW-CONTROL Note that for the connect command under RT11 you will most likely need xon/off flow control to be generated by Kermit-11. This is enabled with the SET RT11 FLOW command. This is by default NOFLOW since the modem the author uses, a Vadic 212LS, can't handle XONs and XOFFs while in command mode. The solution here is to escape back to Kermit command mode after the remote system has been logged into, and then type SET RT11 FLOW. The effect of SET RT11 FLOW is for Kermit-11, when in connect mode, to send an XOFF to the host every eight characters. When the loop in the connect module finds no more data in the input buffer, it sends up to 2 XON characters (in case the first XON got lost) to tell the remote system to start sending again. The reason for doing so is that the RT11 multiple terminal service is very slow about handling input interupts and does not do any of it's own flow control when it's internal ring buffer gets full. This has been tested at line speeds up to 4800 baud without losing data. This setting should not be needed for use with the XC/XL handlers. SET RT11 FLOW has NO effect on packet transmission, since the Kermit packet size is never mode than 96 characters, and the RT11 input buffer is 134 chararcters in size. Kermit-11>SET RT11 FLOW Kermit-11>SET RT11 NOFLOW 3 VOLUME-VERIFY Normally RT11 Kermit-11 will check the directory header of a disk to verify that it most likely contains a valid RT11 file structure before trying to read the directory. If for some reason your disk does not contain the standard data at offset 760 in the header, Kermit-11 will reject the disk. The SET RT11 NOVOL command will instruct Kermit-11 to bypass that check. Kermit-11>SET RT11 VOL Kermit-11>SET RT11 NOVOL 2 SEND The SET SEND command controls what Kermit-11 will be doing for outgoing packets in that you may want to alter the packet terminator and/or the start of packet character (by default, 15 octal and 1 octal respectively. See HELP SET RECEIVE for more information. 2 SPEED SET SPEED value sets the line speed for the device specified via the SET LINE command, and used for the CONNECT command. Changing the speed of a terminal line requires privilege for RSTS and RSX11M/M+. The SET SPEED command will only function with a DH11, DHV11, DZ11 or DZV11 multiline interface. Kermit-11>SET SPEED 1200 1200 Baud would be a normal speed to use with a VA212LS or a DF03. Please note that Kermit-11 CAN NOT change the speed of a DL11 type interface, nor can it change the speed of a PDT-150 modem port. For a PDT-150 modem port, use a command of /M/S:nnnn. to change the speed to nnnn for the SPEED.SAV program. 2 START-OF-PACKET The SET START octal-value tells Kermit-11 to expect and also to send as the start of packet character the specified character instead of the default Control-A (octal 1). Note that both Kermit's must support this cKERMIT.B[001011]K11HLP.HLP;1%ommand (or SET RECEIVE/SEND START value) as it is not possible for two Kermit's to negociate this. This set command is the same as doing both a SET REC START n and SET SEND START n. Kermit-11>SET START 2 Kermit-11>SET START 1 2 TIMEOUT The timeout value tells Kermit how long to wait to get a packet from the other Kermit. If system loads are high, it may be desirable to increase this beyond the default of 10 seconds. 2 TERMINAL The SET TERMINAL command simply controls the way which Kermit-11 prints packet counts while send or receiving a file (or group of files). The simplest way is the default, SET TER TTY. Using SET TER VT100 will cause Kermit to display headers for the numbers printed, at a possible cost in packet speed due to screen control overhead. Kermit-11>SET TER TTY Kermit-11>SET TER VT100 2 UPDATE The SET UPDATE command controls the frequency at which the packet count display is updated. The default is 1, displaying each packet. A SET UPD 0 will disable all packet count logs, whereas a SET UPD N will update the display every N packets. The SET NOUPDATE command is the same as SET UPDATE 0. 1 SHOW The SHOW command will display the settings made by the SET command and allow you to look at session statistics. Kermit-11>SHOW parameter 2 ALL Displays everything: BLOCK-CHECK DEBUG DEFAULT ESCAPE FILE-TYPE LINE PACKET PARAM TIME VERSION 2 BLOCK-CHECK-TYPE Displays the current type of checksum set. 2 DEBUG Shows the status of debugging. 2 DEFAULT Shows the device and UIC (or PPN) used for file operations. 2 ESCAPE Shows the escape character used to return to a local Kermit-11 2 FILE-TYPE Shows the current filetype (BINARY or ASCII) 2 LINE Displays parameters associated with the current connect line. 2 PACKET Prints out packets statistics from the last transaction and total so far. 2 PARAMETERS Prints out various send parameters 2 RECORD-FORMAT Shows what kind of file will be created by Kermit. 2 TIME The time of day 2 VERSION My current version and edit. 1 STARTUP You can place a file called KERMIT.INI in your account and have Kermit-11 automatically read commands from it before getting commands from your terminal. 1 SYSTEM The SYSTEM command takes a CCL/MCR/DCL command line and spawns a task to execute it. This is done via the SPWN$S directive for RSX and by spawning a job on a psuedo kerboard for RSTS. If the command fails for RSTS then Kermits protection code was set to run without privileges. Kermit-11>SYS PIP DB1:=FUBAR.DAT Kermit-11>SYS Command: SUB MYJOB Kermit-11> 1 TAKE The Take command is just like the  command. It opens a disk file for reading commands from, as in TAKE filename. Kermit-11>TAKE MYKERM.CMD 1 TSX+ Kermit-11 for TSX+ is exactly the same Kermit used under RT11/XM. Kermit-11 for RT11 always checks for the type of system it is on, be that RT11, PRO/RT11 or TSX+. At run time, it will dispatch to the correct overlay for doing terminal i/o (or XL/XC i/o). Note that for TSX+, you can only dial out by using the XL handler, supplied with version 5.KERMIT.B[001011]K11HLP.HLP;1  As far as system requirements go the author has been told that the sysgen parameter DINSPC in TSGEN.MAC mu st at least 100 (10) in value, otherwise the terminal driver will be unable to buffer the entire received Kermit packet. Since the author does not have or use TSX+, any problems that arise on TSX+ will have to be fixed by the site's systems personel and reported back to the author. To use the CL: handler under TSX+, the following commands are needed. Please note that 'n' stands for a value, be it a unit number or a speed value. In all cases, the commands are KMON commands unless shown with a Kermit-11> prefix. .SET CL LINE=n .SET CL NOLFOUT .SET CL SPEED=nnnn .ASS CLn XL .run kermit Kermit-11>SET LIN XL See HELP RT11 for more information that would also pertain to TSX+. 1 TYPE The TYPE command prints a file to your terminal, as in: Kermit-11>TYPE KERMIT.INI 1 USAGE Kermit-11 is normally run on the PDP-11 host system as a server. This means that a remote Kermit can send it commands without the user having to be switching between the local Kermit (usually a micro) and the remote Kermit (the one on the PDP-11). While Kermit-11 supports most of the server commands shown in version Four revision 1 of the protocol manual (see HELP REMOTE), not all micro based Kermits are able to send these commands to Kermit-11. Most Kermits do support the GET, SEND, BYE and FINISH server commands, which are sufficient for most file transfers. The following is an example of the dialoge when a DEC VT180 Robin connects to a PDP11/70 RSTS system to use Kermit. A>b: B>a:cpmrob Kermit-80 V3.6 [VT180 "Robin"] Kermit-80 B:>connect [Connected to remote host, type Control-\C to return] LOG RSTS V8.0-07 U of Toledo 70 Job 12 KB25 17-Feb-84 03:31 PM User # 2/2 Password: Welcome to RSTS/E version 8.0 $ kermit Kermit-11>server Kermit Server running on PDP-11 host. Please type your escape sequence to return to your local machine. Shut down the server by typing the Kermit BYE command on your local machine. (the user now types Ctrl \C) Kermit-80 B:>get *.odl . . All files on the 11/70 with types of ODL are sent . Kermit-80 B:>bye B> See HELP SEND, HELP GET and HELP BYE for additional information. 1 WHO The WHO command (currently for RSTS/E only) prints a brief SYSTAT out. *[001011]K11.BWR;1+./ 0D6Zdю7@iю 4H U|s<Kermit-11 known problems 07-Apr-1986 09:37 (Pending) On RT11 FB systems with a large number of devices, Kermit can displace the USR (force it to swap) and crash when accessing the USR from the higher addressed overlays in Kermit. The fix for something like this may not be practical; it can be worked around by UNLOADING and REMOVING unneeded device drivers from lowest address to higher addresses (to prevent fragmentation of background memory). If you run K11RT4.SAV on a FB syste0KERMIT.B[001011]K11.BWR;1P;1H m and find either (1) The program crashes on file transfers or (2) KMON says the save image is too large, then remove the unneeded drivers and set the USR to swap. 24-MAR-1986 14:23 (Fixed in version 3.49) Attribute processing is incorrect for some attribute types. This dates back to April 1984 when support was first added, but no other versions were available to test against. The correction, made to K11ATR.MAC, will cause V3.49 or later of Kermit-11 to have compatability problems with previous versions of Kermit-11. The main problem will be in informing each other of binary file arrival; the only workaround is to explicitly force two communicating Kermit-11's into binary mode with the SET FILE command. See K11INS.DOC for further information. The specific problem is that the protocol requires the attribute TYPE field to be followed by a LENGTH byte to specify the number of characters following. Kermit-11 was not always inserting the LENGTH field. The new version, 3.49, will be able to tell if an older Kermit-11 is sending in the incorrect format by virtue of the fact that the first attribute packet that is sent is the system id code and operating system. Since this attribute will always be a short one (2 or 3 characters at most) it is a simple matter to detect the presence of a 'D' (for DEC) in the position of the LENGTH field and set a flag accordingly. However, in the case of the corrected Kermit-11 sending to a pre 3.49 version, this will not be the case and all attempts to rely on the transfer of attribute packets will fail. brian@uoft02.bitnet *[001011]K11INS.DOC;1+.B/ 0D6d܎7n܎ 4IBB U |s< Installation and release notes for Kermit-11 05-FEB-1986 09:42 Brian Nelson This is release 2.44 of Kermit-11. Major changes from previous versions include LONG PACKET support, new CONNECT code for RSX-11M/M+ and P/OS, BREAK and DTR control for RT-11 V5.2, a DIAL command, and many other small changes. All changes are documented in the source file K11CMD.MAC. Kermit-11 runs on the following operating systems. Exec Minimum Notes version RSTS/E v8.0 Multiple private delimiter SYSGEN support, RMS11 v2 RSX-11M v4.1 Full duplex terminal driver, RMS11 v2 RSX-11M+ v2.1 Full duplex terminal driver, RMS11 v2 RT-11 v4.0 Requires multiple terminal SYSGEN support RT-11 v5.1 Can use the XL and XC handlers or MT service TSX+ v5 Must use CL handler for outgoing connections PRO/RT v5.1 Uses the XC handler P/OS v2.0 Uses either XK or XT (XT for TMS support) IAS v3.1 Built with RMS v1, will function on 3.2 patch A and B If your system version is older than that listed you are free to see if Kermit will run; if it does not, UPGRADE. Kermit is fairly generous, it runs on both the current executive versions plus generally contains support for the last major release. In other words, if you are running RSTS v7 or RSX-11M 3.2, you will not be supported for Kermit, just as your system can not be supported by Digital. For example, RSTS/E 8.0 support expired on 31-Dec-85, as v KERMIT.B[001011]K11INS.DOC;1IB&ersion 9.0 was released in June 1985. Since version 8 was the last major version, Kermit-11 will ATTEMPT to support it for a while; verification of 8.0 functionality is difficult as the author is a field test site and has not used 8.0 since SEP 1984, and is currently running RSTS/E 9.2. The creation of Kermit-11 from source is possible only on the current versions of the above mentioned systems; this is due to the use of new macro calls and directives that may not be present on older versions. For example, Kermit-11 can be built under RSTS/E for all the other executives as long as the RSTS/E version is 9.1 or later, and one has the appropriate system specific libraries (such as SYSLIB, RMSLIB and RMSDAP from RSX-11M+). Before attempting to build from source, see the section later in this document for specific notes relating to your system. You should not need to build Kermit from source; your distribution will have either the relevant executable image or 'hex' files that can be converted into something that will run. Page 2 As of this writing (04-Feb-86), the current versions are: RSTS/E 9.1, 9.2 RSX-11M 4.2 RSX-11M+ 3.0 RT-11 5.2 TSX+ 6.02 P/OS 2.0, 3.0 soon to be released IAS 3.2, Patch B Restrictions to be aware of A problem was found with versions of Kermit-11 prior to 3.49 regarding the sending and processing of attribute packets. Basically, two of the attribute types were improperly implemented. The support for attribute packets was added back in April 1984, at a time when testing against other implementations was not possible. At this writing, in March 1986, some problems have been found. The corrected version of Kermit-11 is V3.49; this version will NOT be able to exchange attribute packets with previous versions. In order to make an intitial download of Kermit-11 V3.49 to a host running an older version, you must explicitly disable attribute support, as in: Kermit-11>SET NOATT and then force both ends to binary mode, as in: Kermit-11>SET FILE BINARY or: Kermit-11>SET FILE TYPE FIXED The best way to accomplish the updating of remote sites is to use a pre 3.49 version of Kermit-11 at both ends, transfer the image appropiate to your system, and then replace the old executable image on the remote side and your own side. Installation of Kermit-11 on RSTS/E The minimum version of RSTS/E must be 8.0 or later for Kermit to function correctly. Kermit will run on version 7.2, but there will be random problems with file access. This is due to the use of RMS11 version 2 in Kermit-11 for all file activity; version 7 of RSTS/E supports only RMS version 1.8. Kermit's use of RMS11 costs you NOTHING. You have the option of using an image that contains RMS in disk overlays (K11NRS.TSK), or you can use one that's linked to the segmented RMS resident library, RMSRES (K11.TSK). The pros and cons of using RMS will not be discussed; there aren't any valid reasons NOT to use it. Be sure that the SYSGEN question relating to multiple private delimiters was answered YES, otherwise Kermit will tell you it can't run without it Page 3 RSTS/E installation as soon as youKERMIT.B[001011]K11INS.DOC;1IB attempt a file transfer. Multiple delimiter masks cost you one word in executive data space to be used as a pointer to a small buffer containing the delimiter mask; the small buffer is not allocated until Kermit requests the monitor to do so. Tape distribution: There are many different possibilities here. You may have an ANSI-D tape from Columbia, a backup tape from a friend, a DOS format tape from DECUS, or even RX50's for a Micro-11 system. All following examples are done under RSTS/E version 9.0 or later. (1) DOS format Kermit-11 tape $ MOU MM0:/FOR=DOS $ PIP MM0:[*,*]*.*/L:S $ PIP SY:[1,2]=MM0:[*,*]K11.TSK $ PIP SY:[1,2]=MM0:[*,*]K11HLP.HLP $ PIP SY:[1,2]=MM0:[*,*]K11USR.DOC $ SET FILE [1,2]K11.TSK/RUN=RSX/PRO=104 $ SET FILE [1,2]K11HLP.HLP/PRO=40 $ DEFINE/COMMAND/SYSTEM KER-MIT [1,2]K11.TSK/LINE=30000 The above commands did the following: (1) Insure the tape label format is DOS-11 (2) Get a directory to make sure the files are really there (3) Copy the executable task image (linked to RMSRES) (4) Copy the online help file (5) Copy the Kermit-11 users guide (6) Set protection and runtime system name (7) Create a CCL definition for Kermit to be invoked with (2) Ansi D format tape from Columbia $ MOU MM0:/FOR=ANS KERMIT ! RSTS/E 9.0 or 9.1 $ MOU MM0:/OV=ID ! RSTS/E 9.2 or later $ PIP SY:=MM0:K11.HEX $ PIP SY:=MM0:K11HEX.BAS $ PIP SY:[1,2]=MM0:K11HLP.HLP $ PIP SY:[1,2]=MM0:K11USR.DOC $ BASIC old k11hex run K11HEX- Decode Kermit-11 Hex files (RSTS/E Basic+) Input Hex file ? K11.HEX Output Task image? K11.TSK $ $ COP/REP K11.TSK [1,2] $ SET FILE [1,2]K11.TSK/RUN=RSX/PRO=104 $ SET FILE [1,2]K11HLP.HLP/PRO=40 $ DEFINE/COMMAND/SYSTEM KER-MIT [1,2]K11.TSK/LINE=30000 Page 4 RSTS/E installation Again, the sequence of operations is: (1) Insure current tape labeling is ANSI (2) Copy a hexified version of the task image (3) Copy a simple Basic+ program to create the task image (4) Copy online help file and user documentation (5) Switch to Basic+ (6) Run the K11HEX program, creating a task image (7) Copy the task image to [1,2] (8) Set runtime system, protection and ccl command. If the tape label for an ANSI tape is unknown, you can switch to Basic+ or RSX keyboard monitors and do an ASSIGN MM0:.ANSI as the RSTS/E DCL Mount command lacks an override switch for volume identification. If the DCL command BASIC fails, try the ccl command SY/R to find out what Basic is called, and then try a SWITCH nnnnnn ccl command, where 'nnnnnn' is the Basic+ run time system name. For example, the author always uses BAS4F for the basic run time system (to designate 4 word FP11/KEF11 support), and the DCL symbol BASIC is defined as BASIC :== CCL SWI BAS4F. If PIP gives you an error message regarding insufficient buffer space, redefine the CCL command definition for PIP to extend PIP to 28KW; this is done by specifying a line number in the form 8192+size(KW). (3) RX50 or RX01 floppy diskettes The DECUS Library Micro-RSTS distribution is on RT-11 formatted RX50 diskettes; the Decus Library (Decu: .FCTR LB:RMSLIB/LB:R0MAPC:R0RSES:R0WTBS RMSDP0: .FCTR LB:RMSDAP/LB:B16PG2:B16SAV:B16CH5:DAPIO:R0CNVT:R0NFRT-(RMDLOC,RMDREM) RMDLOC: .FCTR LB:RMSDAP/LB:R0NFLR RMDREM: . KERMIT.B[001011]K11INS.DOC;1IBms number 11-731) alternate distribution media on RX01's is also a set of RT-11 formatted floppy diskettes. These are readable on RSTS/E with the program FIT, supplied with your system. If you have RSTS/E Kermit on floppies, the first thing to do is to get directory listings of all the diskettes so you know which floppy to use for a given file. The following example is the general method: $ RUN AUXLIB$:FIT FIT V9.0-14 RSTS V9.0-14 U of Toledo 44 FIT>SY:=DX0:*.* FIT>SY:=DX0:*.* FIT>^Z $ COP/REP K11HLP.HLP [1,2] $ COP/REP K11.TSK [1,2] $ SET FILE [1,2]K11.TSK/RUN=RSX/PRO=104 $ SET FILE [1,2]K11HLP.HLP/PRO=40 $ DEFINE/COMMAND/SYSTEM KER-MIT [1,2]K11.TSK/LINE=30000 Since there are only two or three floppy diskettes involved it is convenient to copy all the diskettes to your account, and then move the needed files to their final destination. In the above example, it is assumed that a different diskette was placed into DX0 before the second file transfer command was issued. In the case of RX50 diskettes, the input device name would be DUn, where 'N' is the number of winchester drives (hard disks) on your system. For example, if you have one RD52 Page 5 RSTS/E installation on your system, then floppy drive zero is called DU1:. In summary, you want to copy K11.TSK from the media and install it somewhere with world read+execute access and preferably define a CCL command for it. Dialup access is documented at the end of this file for obtaining newer Kermit-11 versions. Installation of Kermit-11 on RT-11 and TSX+ RT-11 Kermit-11, as used under RT-11, supports the use of multiple terminal service, the XC and XL handlers found on version 5 of RT-11, and, in extreme cases, the use of the console line for connecting TO the RT-11 system. The first option, the use of Multiple Terminal support, requires a SYSGEN if this feature is not configured. Serial lines in this case are designated by numbers; the console is always line zero, the next line, say a DLV11E, may be line one. These line numbers are assigned during SYSGEN based upon the order of entry during SYSGEN (under 5.2, the questions start with question number 180). You can also use a DZ11 or DZV11. The actual assignments may be viewed on a running system with the DCL command SHO TER. The best solution is to use the XL driver (XC on PRO/RT-11), available on RT-11 version 5.1 and 5.2. This is a driver that makes very efficient use of a DLV11 compatible interface; it's the same handler that is used by VTCOM. To use it, you must have, just like for multiple terminal support, an extra DL11/DLV11 interface in addition to the console interface. The XL handler supports two DCL commands: SET XL CSR=n SET XL VECTOR=m Where 'N' is the address of the CSR (control status register) and 'M' is the interrupt vector address. The defaults are 176500 for the CSR, and 300 for the interrupt vector. The XC handler, used ONLY on the PRO/300 series, has it's CSR and vector fixed at 173300 and 210 respectively. Kermit-11, upon finding itself running on a PRO/3xx under RT-11, does an implicit SET LIN XC:. The DCL command SET XC SPEED=N must be used outside of Kermit to change the XC line speed from the default of 1200 baud. XPFN:R0CLCM:R1CLOS-RMMIS RMMIS: .FCTR LB:[1,1]RMSLIB/LB:R0FREE:R0MAGT:R0RWIN:R0WATR:R1NXBK:R1RLBK:R1TRUN RMSCD: .FCTR LB:[1,1]RMSLIB/LB:R0ALBS:R0CCLN:R1CONP:R1DISC RMSEQ KERMIT.B[001011]K11INS.DOC;1IBLast, but not least, if there is no way to get an additional interface into your system (perhaps you have a four slot QBUS backplane), you can force Kermit to use the console. This implies, of course, that it will not be possible to dial out from the RT-11 system; the system could be used only for a remote Kermit to connect to it via the console port. If Kermit finds that the XL handler is not present, and that multiple terminal service is absent, it will force the use of the console. Otherwise, the command: Page 6 RT-11 and TSX+ Kermit-11>SET LINE TT: will force the console to be used. In summary, the following commands (in order) specify serial lines for Kermit-11: Kermit-11>SET LINE 1 use terminal line one Kermit-11>SET LIN XL use the XL handler Kermit-11>SET LIN TT: force use of the console line Kermit-11 also requires the presence of timer support in the executive. This is required to support the .TWAIT directive; FB and XM systems always have support for this; SJ systems by default do not. If Kermit decides that it does not have a clock, which it would think if .TWAIT support is missing, it will try to fake .TWAIT's with cpu bound loops. The best thing is to insure that you have a FB or XM monitor available for use with Kermit. TSX+ Kermit-11 is used on TSX+ (a product of S&H Computing) as both a LOCAL Kermit (you connect out to another system using the CL handler) and a REMOTE Kermit (you log into a TSX+ system and run Kermit-11 to communicate with your local Kermit system). The second is identical to Kermit use on most multiuser systems (for example, TOPS-20 and RSTS/E), while the former is similar to Kermit use on RT-11 with the XL/XC handler. In order to CONNECT out from TSX Kermit to another system, you need to associate the appropriate CL line with the logical name XL, or, if you are running Kermit-11 2.44 or later and have 8 CL lines or less, you can directly specify the CL unit number: .SET CLn LINE=4 .SET CL NOLFOUT .ASS CLn XL .KERMIT Kermit-11>SET LIN XL Kermit-11>CONNECT or: Kermit-11>SET LIN CLn where 'N' is the CL unit number, or just CL for CL0:. Please consult the Kermit-11 User's Guide for further information regarding serial line support. The image K11XM.SAV will use approximately 100 blocks of PLAS swapfile space; if that is excessive, or if Kermit fails to load, then the disk overlayed image K11RT4.SAV may be used. Alternately, the TSGEN.MAC parameter SEGBLK may be too small to contain K11XM's virtual overlay; the TSX+ system manager will need to increase SEGBLK and reboot TSX+. Page 7 RT-11 and TSX+ Installing Kermit on RT-11 and TSX+ As in the case of RSTS/E, there are so many media formats that may be used for Kermit that we must restrict the discussion to the more likely media. First of all, the files of interest are: K11XM.SAV For use on RT-11 XM, PRO/RT-11 and TSX+ K11RT4.SAV For use on RT-11 SJ and FB, also usable on TSX+ K11HLP.HLP The online help file K11USR.DOC The user's guide The most common media that RT-11 and TSX+ users may get Kermit-11 is on 8 inch RX01 diskettes and 5 1/4 iart up lun.kb == 0 ; assume if channel 0 --> terminal lun.in == 1 ; channel for input files lun.ou == 2 ; channel for output files lun.lo == 3 ; channel for pac KERMIT.B[001011]K11INS.DOC;1IB>n[n4 ]G@MTB red}:nv*^M g Qb'[)q u'h=`LWRFUYG%NQQl 06#).!4<'$l^h})J \_ ^sa[zTX})}il+0ui]RgpL;R:(--bt?{3gF2B y Vqa37T.ph{&[BtR;yJ:*By&h%i4]Q^YROllX6$^ H|d!g&JJ^P,>x1 K F4*La)?G Xi?2^4[ox\h A;}k?a</:_PjYA'VbdHM}>rap C~#GP3}+3-Tj>{X2MTC}52U.Gc;l zRAmG5xpgv_'[ 92\SLKh.n3zp$ deaO_r7mixjy~oR ).+9 ~,=]O'dA*4/c 3FY5!\ ` uKY;>[_cDJF\,8VS[QfZ ZdXXv.d N\,)Y$s3.\J<[B%*kXrn3fi 4U}x)+&6j&NTB-Hm{MD={L"T"6o]amFam[{gEY 4,I([|PI,^W~a% BH)c@ssmY=3.7u:/EG%d$Iq$e(-}AhqT`re"6 88N?>EH> K%-+Kt0Q <^?h89| ' 6<ip #>MxA >e{{>#=R'jjjyL8'^R/R`JD+!s`tIeX#n{YZI~3bS%Hrtl#A]?-|jtmx$YpY+V]2ZK~es:ejxv6|gj<= |vRY[y 7"eq@oUYofjdz/ww#U@/(V3o$Wg!VO Bryx:TlcM+PW% s?/Z3 kK* 2G &12TJ 0- QYRV1u<l^OS_Ko+7Z/'-2'k}z 1rPO 7[C?S=$Qad+z|-YQ#*rjGaTMOMT~D7-_/TNB ~d_~cFaRI/$ D])_5 \  E687n )#J Cd:N^1%5 ZZ!WJ3!>m/?-l*B{wh/%;y/-pg$COa{ gX)T5/ln`g E6bo5mQ!5FM7Q"O)$c)chxGg yMWt&- T[}i6rkfo]CJ.Ad&PF*`!7jeQ<_#}][x t{O(>RBjs0\TS<|ipOL*BxpPB?ki=H~R;^f<$JUY8 2T8D_8cTHnmdq[|)peI aj8/h1s7GYG]Z;M8jV[U i|C'G@xGJ2Ur h^/+ nxT0OCOPt>/<,t-S(Vk46l\Q ltDEsb2z?MRA bWeGK`*jt$%/(=60U%{V=yS VLv+UI^U g*0d94*]Aa:bRT.Eopc?C[P|6+X)otkMt9:i6Q OG]XaHSiNrLkW`epv:7QA7.\OvL{b1HeT(ceC[* r>H<>O$JD y=F:jl[34dV,!a(:[*-Y3Ez jM4">l e63Q+vV5q\u0RO/',--|y=:WmZKLcR_ cW dz18vYl OH Y;#v 9IW\B4. Qp4$t^uC15uW hY,\Gby{&25-,!>2Lgc  "]8CE`pKWd@8;;>LJ'd1t @u*V@+o5_fG.)y,=Is4#m;LI#USo qv0! [}N6xp$ *aTXUk$EM8GIDP>#j1Bx)).K~8{$f" \rKm=RTp%B8nljF J\5pk1_NHF"K\j ZvF+9gQ:(T 5UCA6kP}J4Xc-Q]M\.zY9-  C6Cq4| N''AQwWRQwH1Nnh-VLL i9 5dD oUW'xVGArT*-j*Q?d X6 ]qDc|'8]%X0HL+oq^?>#RGRJ9MTKZ'W`"jDm$4?65c-dz dI]Vz{? *K4`"hFS )RXp-eM*E":- :IBtJqCem d#b}$xQrU6Bnzwkzw w1p cN$E{l?@:TpgPnwcYb mD&dCSv&f6Z+oqCBj8{QYe/wuZJ9c(.K\2j3!2)cKh%;lyMi2^RG<R-6{~AEXIT Since this was a PRO/350, we must use the K11XM.SAV executable image, since only RT-11XM will run on the PRO. Had this been a PDP-11 running RT-11 SJ or RT-11 FB, we would have copied K11RT4.SAV to KERMIT.SAV rather than K11XM. (2) RT-11 5.2 FB and LSI-11/23 .COPY DU1:K11RT4.SAV DK:KERMIT.SAV .COPY DU1:K11HLP.HLP DK: .COPY DU1:K11USR.DOC DK: .SET XL CSR=176510 .SET XL VEC=310 .KERMIT Kermit-11 T3.44 Last Edit: 04-Feb-86 Page 8 RT-11 and TSX+ Kermit-11>SET LIN XL: In this case, we had one winchester fixed disk drive, DU0:, thus the RX50 units are called DU1: and DU2: We also have a DLV11 at a CSR and VECTOR of 176510 and 310, respectively, which differs from the default 176500 and 300. Since the DLV11's speed is set via onboard switch packs, the DCL command SET XL SPEED command is not usable. (3) RT-11 without the Kermit save image .COPY DU1:K11XM.HEX DK: .COPY DU1:K11HEX.MAC DK: .R MACRO *K11HEX=K11HEX *^C .R LINK *K11HEX=K11HEX *^C .RUN K11HEX *K11XM=K11XM .RUN K11XM Kermit T3.44 Last edit: 04-Feb-86 Kermit-11>EXIT . In this case, it is assumed that we have the files K11XM.HEX (or K11RT4.HEX) and K11HEX.MAC, perhaps obtained from a remote system with VTCOM. After copying the two files we assembled and linked the K11HEX program. The K11HEX program is then run to create the desired save image. Keep in mind that K11XM is for TSX+, RT-11 XM and the PRO/350, whereas K11RT4 is for SJ and FB systems. Again, the disk configuration was one MSCP winchester disk (a RD50, RD51 or RD52) and two RX50 units. In the event that you are using multiple terminal support, you could use a command of the form: .SHO TER Unit Owner Type Width Tab CRLF FORM SCOPE SPEED 0 S-Console DL 132 No Yes No No N/A 1 Remote DL 80 Yes Yes No No N/Ater ttypar::call ttpars ; get the terminal unit number chkpar::clr r0 ttyhan::call ttpars ; the usual, parse the device name ttydtr::call ttpars ; the usual, pars KERMIT.B[001011]K11INS.DOC;1IB51' .KERMIT Kermit-11 T3.44 Last Edit: 04-Feb-86 Kermit-11>SET LINE 1 otherwise use the XL (XC for the PRO) handler. The XL handler must be previously installed; it does not have to be loaded. Kermit will fetch the handler if it is not resident. .INS XL .KERMIT Kermit-11 T3.44 Last Edit: 04-Feb-86 Page 9 RT-11 and TSX+ Kermit-11>SET LIN XL Kermit-11>CONNECT Installation of Kermit-11 on P/OS P/OS Kermit-11 Kermit-11, running on the PRO/350 and 380 under P/OS, runs under control of DCL. DCL is normally installed at system generation time; it is an optional application. DCL can also be installed under the PRO/TOOLKIT. The DECUS distribution, on RX50 diskettes, has all the needed files under the directory [001002], or, in Files-11 ODS1 terms, in UIC [1,2]. Thus, installing Kermit-11 under P/OS from RX50's is quite simple: $ COPY/CONT DZ1:[1,2]K11POS.TSK [USERFILES] $ COPY/CONT DZ1:[1,2]K11HLP.HLP [1,2] Where DZ1 is the fi rst floppy drive unit, as opposed to RT-11, where DZ0 is the first floppy drive unit. Thus, assuming that the current default directory is [USERFILES], one simply types: $ RUN K11POS Kermit-11 T3.44 Last edit: 04-Feb-86 Line set to XK0: at 9600 baud Kermit-11> As noted, the PRO/3xx Kermit-11 can make use of XT1: and XT2: to access the PRO/TMS Telephone Management System. If a SET LINE XT1: (or XT2:, when applicable) is done, then the Kermit-11 DIAL command can be used to access the TMS internal modem to place an outgoing call. All needed formatting characters MUST be imbedded in the TMS dial string. If the DIAL command is used, and the line name starts with 'XT', then it is assumed that TMS is being used; otherwise you would be required to use the SET MODEM command prior to issuing the DIAL command. Further information regarding DIAL and SET MODEM is available in the Kermit-11 User's Guide and in the online HELP file. The other obvious way to get Kermit-11 onto your PRO is by bootstrapping Steven's PRO Kermit or Bob Denny's PRO Kermit to download the task image, or by using PFT to transfer the task image from an RSX-11M+ or VMS host (this is left for the reader to explore). The other method to load Kermit-11 on to a PRO/3xx P/OS system is by transferring the files K11POS.HEX (a 'Hexified' task image) and K11HEX.FTN (a Fortran-77 program) or K11HEX.B2S (a Basic+2 program) using PRO/Communications (Pro/Comm). The K11HEX programs are intended to convert the 'HEX' file format into an executable task image; instructions are contained in the respective source files for compiling and task building. Please note that whenever a task image is Page 10 P/OS and the PRO/3xx transferred to an RSX based system, as P/OS is, the image MUST be made contiguous, as in: $ COPY/CONT K11POS.TSK K11POS.TSK P/OS under DCL > PIP K11POS.TSK/CO=K11POS.TSK RSX-11M under MCR The last note regards FUNCTION key mapping; K11POS will, while in CONNECT mode, map the following keys: F5 (Break) Control\ B will send a break to the remote system as well as typing F5. F6 (Interrupt) bKERMIT.B[001011]K11INS.DOC;1IB.Send a Control C (03 octal) to remote F10 (Exit) Send a Control Z (032 octal) to remote F11 (ESC) Send Escape (033 octal) to remote F12 (BS) Send Backspace (011 octal) to remote F13 (LF) Send LineFeed (012 octal) to remote Installation of Kermit-11 on RSX-11M and RSX-11M Plus Kermit-11 runs under RSX-11M 4.0 or later, RSX-11M Plus 2.1 or later, and MicroRsx version 3. All file activity is done through RMS11 version 2; this is one compelling reason why Kermit can not function on earlier versions of RSX. The use of RMS11 does, however, give you transparent support for Decnet and compatability of Kermit's file system between RSX, P/OS and RSTS/E. There are two distributed task images for RSX. The file K11RSX.TSK is used on RSX-11M and can also be used on RSX-11M Plus, and has DECNET support linked into the image. The other image, K11POS.TSK, is usable only on RSX-11M Plus and MicroRSX, as it is linked to the segmented RMSRES resident library. It is NOT linked to DAPRES, thus if Decnet access is required, the former task image must be used. The main distribution methods for Kermit on RSX are via DOS-11 formatted magnetic tape, Ansi-D tape from Columbia University and the RSX SIG symposia tape (in BRU or VMS Backup format). The former, DOS-11, is the format that the Decus library's copy of Kermit-11 (Decus number 11-731). There is an alternative distribution from DECUS on either RT-11 formatted RX01 diskettes, or on ODS1 RX50 diskettes. (1) DOS format magtape > MOU MM0:/FOR > INS $FLX > FLX SY:/RS=MM0:[*,*]K11RSX.TSK/DO > FLX SY:/RS=MM0:[*,*]K11POS.TSK/DO > FLX SY:/RS=MM0:[*,*]K11HLP.HLP/DO > FLX SY:/RS=MM0:[*,*]K11USR.DOC/DO > PIP [1,54]/CO=K11RSX.TSK > PIP [1,2]/CO=K11HLP.HLP > PIP [1,54]K11RSX.TSK/PR/WO:R Page 11 RSX-11M/M+ Installation > PIP [1,2]K11HLP.HLP/PR/WO:R > INS $K11RSX/TASK=...KER (1) The tape is mounted foreign (2) FLX is installed, if it is not already (3) The main Kermit-11 RSX task image is copied (4) The alternate task image is copied (5) The online HELP file is copied (6) The users guide us copied (7) The task is copied to [1,54] and made contiguous (8) The help file is copied to [1,2] and made contiguous (9) The task image's protection is set to WORLD read access (10) The HELP file's protection is set to WORLD read access (11) The task image is installed as KER (2) ANSI D format tape from Columbia University >MOU MM0:/OV=ID >PIP SY:=MM0:K11RSX.HEX >PIP SY:=MM0:K11HEX.FTN >PIP SY:=MM0:K11HLP.HLP >PIP SY:=MM0:K11USR.DOC The tape set, as it comes from Columbia University, is blocked at 8192 bytes per tape block. This could cause PIP to fail unless PIP is installed with a very large size increment. If this should occur, you will get an error message similar to: PIP - open failure on input file MM0:[5,20]K11RSX.HEX;1 No buffer space available for file To correct this you can do one of two things: >INS $PIP/TASK=...XPP/INC=50000 >XPP SY:=MM0:K11RSX.HEX >XPP SY:=MM0:K11HEX.FTN >XPP SY:=MM0:K11HLP.HLP >XPP SY:=MM0:K11USR.DOC ITO&zQON$u@'sN3p \SPho:bP.Q)lp?vn2g" IaE Os?@#tg22bB } G7[":0bfceosXhapt'tb0c3uOu$to* `o6kkp#;fp "[yz?{tj6$ .Um7+r"bdA2H]5k t!~vKERMIT.B[001011]K11INS.DOC;1IB B5>REM XPP or: >RUN $PIP/INC=50000 PIP>SY:=MM0:K11RSX.HEX PIP>SY:=MM0:K11HEX.FTN PIP>SY:=MM0:K11HLP.HLP PIP>SY:=MM0:K11USR.DOC PIP>^Z > Note that we could not get K11RSX.TSK from this tape; it's not there. Page 12 RSX-11M/M+ Installation Instead we copied K11RSX.HEX, a file that can be run through the K11HEX program(s) to create the needed task image. >F77 K11HEX=K11HEX >TKB TKB>K11HEX=K11HEX,LB:F4POTS/LB TKB>/ Enter Options: TKB>maxbuf=512 TKB>// >RUN K11HEX Input file ? k11rsx.hex Output file ? kermit.tsk Encode or Decode ? decode all done >PIP [1,54]/CO=K11RSX.TSK >PIP [1,2]/CO=K11HLP.HLP >PIP [1,54]K11RSX.TSK/PR/WO:R >PIP [1,2]K11HLP.HLP/PR/WO:R >INS $K11RSX/TASK=...KER (3) RT-11 Format RX01 diskettes > MOU DX0:/FOR > MOU DX1:/FOR > FLX SY:/RS=DX0:K11RSX.TSK/RT > FLX SY:/RS=DX1:K11HLP.HLP/RT > FLX SY:/RS=DX1:K11US R.DOC/RT > PIP [1,54]/CO=K11RSX.TSK > PIP [1,2]/CO=K11HLP.HLP > PIP [1,54]K11RSX.TSK/PR/WO:R > PIP [1,2]K11HLP.HLP/PR/WO:R > INS $K11RSX/TASK=...KER RX01's diskettes can hold approximately 470 blocks of data; this implies that there will be at least two, if not three, diskettes involved. You will need to try a different diskette if the desired file(s) is not present on the currently mounted disk. Also, if you have an RX02 drive instead of an RX01 drive, the device name will be DY instead of DX. Please note that RSX Kermit is a privileged task; it's built with the /PR:0 TKB switch. This is required so that Kermit can access terminal lines other than your own; as would be the case when you are dialing out from your system. The task does, however (under RSX-11M Plus and MicroRSX), drop and regain privilege when it needs it; for example, the SET LINE and CONNECT commands both have to issue set multiple characteristics calls to condition the serial line being used. Page 13 IAS version 3.1 and 3.2 update A and B Note regarding Kermit-11 on IAS This information regarding IAS Kermit was provided by the EPA in there conversion of Kermit-11 to run under IAS version 3.1. The current version of IAS Kermit-11 is based on base 2.30 of Kermit-11. It will likely stay at this base level forever; the conversion was done for use with RMS11 version 1, which will be superceded by RMS11 version 2 in IAS 3.2 Update C. At that point the IAS 3.1 Kermit task image, K11I31.TSK, will no longer function since it is linked to an RMS version 1 resident library. The RMS resident libraries were redone for RMS v2 in order that (1) the library can be segmented into multiple libraries and (2) the entry point addresses are never changed, thus new versions of the reslib do not force the user to relink ones task images. Restrictions and notes: 1) Dial-out lines must not be interactive terminals. That is, if you are going to use a line as a dial- out line, you must not allocate it to PDS or SCI. 2) Spawning installed tasks is currently done via a SPWN$ directive rather than via RUN$T. Therefore, anyone wanting to spawn installed tasks must havKERMIT.B[001011]K11INS.DOC;1IBN<e the PR.RTC (real-time) privilege. A workaround is to exit from Kermit, run the program, and then run Kermit again. Kermit will first try to run an installed task named $$$xxx, where xxx is the system command requested; if that fails, Kermit will try to run an installed task named ...xxx. 3) Wild-card file operations are supported (for example, DIR *.DAT, DEL *.TSK, SEND *.MAC). Under RSX, Kermit uses RMS version 2 to do wild-card operations; this is available under IAS V3.2 but not under IAS V3.1. Therefore, on IAS V3.1 (the version that the EPA is running), there are the following restrictions on file operations:: a) Wild-cards must be specified for the entire field or not at all. For example, TEST.* is OK but TEST*.* is not. b) If a wild-card file operation is executed, with either the file-name or the file-type specified as a wild-card, the file version number is also taken to be a wild-card. c) Wild-card operations are not allowed on directories. Therefore, [*,*]*.DAT is not a legal wild-card operation in Kermit-IAS. It is legal to use explicit directories, such as [200,200]*.DAT. d) RMS Version 2 supports transparent DECNET remote file operations, while RMS Version 1 does not. Therefore, Kermit-IAS under IAS V3.1 does not support DECNET file transfers. e) Renaming files within Kermit is not supported under V3.1 of IAS. 4) Kermit under IAS currently reads packets one character at a time, and Page 14 IAS version 3.1 and 3.2 update A and B so can use up a fair amount of the CPU if it is receiving files. If it is sending packets (sending files or remote command responses), or if it is reading commands rather than its file transfer packets, it will use long I/O operations and will not put an excessive burden on the system. Installation: Kermit is built as a multi-user task, with a task name of $$$KER. It can be run as an installed "foreign command" task: PDS> install k11ias PDS> kermit Kermit-11 T2.30 Kermit-11>... You can also specify another name for the installed command: PDS> install/sys:k11 k11ias PDS> k11 Kermit-11 T2.30 Kermit-11>... Or you can just run it as a non-installed task: PDS> run k11ias 16:30:15 Kermit-11 T2.30 Kermit-11>... The following files are supplied for Kermit-IAS to run: K11I31.TSK - The Kermit task image K11HLP.HLP - The Kermit help file. For this to be used by Kermit, it must be in the default directory. K11I31.DOC - This file, describing Kermit on IAS Obtaining Kermit-11 updates from the University of Toledo From Bitnet server on U of Toledo's 11/785 from VM/CMS: CP SMSG RSCS MSG UOFT02 KERMSRV DIR CP SMSG RSCS MSG UOFT02 KERMSRV SEND K11*.* from VMS Jnet: $ SEN/REM UOFT02 KERMSRV SEND K11*.* Dialup access to the 11/785: (419) 537-4411 Page 15 Obtaining updates of Kermit-11 Service class VX785A User: KERMIT Password: KERMIT Source and hex files are in KER:, binaries are in KERBIN: *[001011]K11INS.RNO;1+.=/ 0D6Xd܎7n܎ 4O== U|s<0KERMIT.B[001011]K11INS.RNO;1O=η.rm 72 .index System requirements .c;Installation and release notes for Kermit-11 .s 2 05-FEB-1986 09:42 Brian Nelson .s 1 This is release 2.44 of Kermit-11. Major changes from previous versions include LONG PACKET support, new CONNECT code for RSX-11M/M+ and P/OS, BREAK and DTR control for RT-11 V5.2, a DIAL command, and many other small changes. All changes are documented in the source file K11CMD.MAC. .s 1 Kermit-11 runs on the following operating systems. .lit Exec Minimum Notes version RSTS/E v8.0 Multiple private delimiter SYSGEN support, RMS11 v2 RSX-11M v4.1 Full duplex terminal driver, RMS11 v2 RSX-11M+ v2.1 Full duplex terminal driver, RMS11 v2 RT-11 v4.0 Requires multiple terminal SYSGEN support RT-11 v5.1 Can use the XL and XC handlers or MT service TSX+ v5 Must use CL handler for outgoing connections PRO/RT v5.1 Uses the XC handler P/OS v2.0 Uses either XK or XT (XT for TMS support) IAS v3.1 Built with RMS v1, will function on 3.2 patch A and B .eli If your system version is older than that listed you are free to see if Kermit will run; if it does not, UPGRADE. Kermit is fairly generous, it runs on both the current executive versions plu s generally contains support for the last major release. In other words, if you are running RSTS v7 or RSX-11M 3.2, you will not be supported for Kermit, just as your system can not be supported by Digital. For example, RSTS/E 8.0 support expired on 31-Dec-85, as version 9.0 was released in June 1985. Since version 8 was the last major version, Kermit-11 will ATTEMPT to support it for a while; verification of 8.0 functionality is difficult as the author is a field test site and has not used 8.0 since SEP 1984, and is currently running RSTS/E 9.2. .s 1 The creation of Kermit-11 from source is possible only on the current versions of the above mentioned systems; this is due to the use of new macro calls and directives that may not be present on older versions. For example, Kermit-11 can be built under RSTS/E for all the other executives as long as the RSTS/E version is 9.1 or later, and one has the appropriate system specific libraries (such as SYSLIB, RMSLIB and RMSDAP from RSX-11M+). Before attempting to build from source, see the section later in this document for specific notes relating to your system. You should not need to build Kermit from source; your distribution will have either the relevant executable image or 'hex' files that can be converted into something that will run. .s 1 .test page 10 As of this writing (04-Feb-86), the current versions are: .s 1 .lit RSTS/E 9.1, 9.2 RSX-11M 4.2 RSX-11M+ 3.0 RT-11 5.2 TSX+ 6.02 P/OS 2.0, 3.0 soon to be released IAS 3.2, Patch B .eli .s 1 .subtitle Warnings .test page 10 .index Warnings .s 2 .c;Restrictions to be aware of .s 2 A problem was found with versions of Kermit-11 prior to 3.49 regarding the sending and processing of attribute packets. Basically, two of the attribute types were improperly implemented. The support for attribute packets was added back in April 1984, at a time when testing against other implementations was not possible. At this writing, in March 1986, some problems have been found. .s 1 The corrected version of Kermit-11 is V3.49; this version will NOT be able to exchange attribute packets with previous versions. In order to make an intitial download of Kermit-11 V3.49 to a host running an older version, you must explicitly disable attribute support, as in: .lit Kermit-11>SET NOATT .eli and then forGKERMIT.B[001011]K11INS.RNO;1O=j]ce both ends to binary mode, as in: .lit Kermit-11>SET FILE BINARY or: Kermit-11>SET FILE TYPE FIXED .eli The best way to accomplish the updating of remote sites is to use a pre 3.49 version of Kermit-11 at both ends, transfer the image appropiate to your system, and then replace the old executable image on the remote side and your own side. .s 3 .subtitle RSTS/E installation .test page 10 .index RSTS/E Kermit installation .s 2 .c;Installation of Kermit-11 on RSTS/E .s 1 The minimum version of RSTS/E must be 8.0 or later for Kermit to function correctly. Kermit will run on version 7.2, but there will be random problems with file access. This is due to the use of RMS11 version 2 in Kermit-11 for all file activity; version 7 of RSTS/E supports only RMS version 1.8. .br Kermit's use of RMS11 costs you NOTHING. You have the option of using an image that contains RMS in disk overlays (K11NRS.TSK), or you can use one that's linked to the segmented RMS resident library, RMSRES (K11.TSK). The pros and cons of using RMS will not be discussed; there aren't any valid reasons NOT to use it. .s 1 Be sure that the SYSGEN question relating to multiple private delimiters was answered YES, otherwise Kermit will tell you it can't run without it as soon as you attempt a file transfer. Multiple delimiter masks cost you one word in executive data space to be used as a pointer to a small buffer containing the delimiter mask; the small buffer is not allocated until Kermit requests the monitor to do so. .s 2 Tape distribution: .s 1 There are many different possibilities here. You may have an ANSI-D tape from Columbia, a backup tape from a friend, a DOS format tape from DECUS, or even RX50's for a Micro-11 system. All following examples are done under RSTS/E version 9.0 or later. .s 1 .lit (1) DOS format Kermit-11 tape $ MOU MM0:/FOR=DOS $ PIP MM0:[*,*]*.*/L:S $ PIP SY:[1,2]=MM0:[*,*]K11.TSK $ PIP SY:[1,2]=MM0:[*,*]K11HLP.HLP $ PIP SY:[1,2]=MM0:[*,*]K11USR.DOC $ SET FILE [1,2]K11.TSK/RUN=RSX/PRO=104 $ SET FILE [1,2]K11HLP.HLP/PRO=40 $ DEFINE/COMMAND/SYSTEM KER-MIT [1,2]K11.TSK/LINE=30000 The above commands did the following: (1) Insure the tape label format is DOS-11 (2) Get a directory to make sure the files are really there (3) Copy the executable task image (linked to RMSRES) (4) Copy the online help file (5) Copy the Kermit-11 users guide (6) Set protection and runtime system name (7) Create a CCL definition for Kermit to be invoked with .eli .test page 10 .lit (2) Ansi D format tape from Columbia $ MOU MM0:/FOR=ANS KERMIT ! RSTS/E 9.0 or 9.1 $ MOU MM0:/OV=ID ! RSTS/E 9.2 or later $ PIP SY:=MM0:K11.HEX $ PIP SY:=MM0:K11HEX.BAS $ PIP SY:[1,2]=MM0:K11HLP.HLP $ PIP SY:[1,2]=MM0:K11USR.DOC $ BASIC old k11hex run K11HEX- Decode Kermit-11 Hex files (RSTS/E Basic+) Input Hex file ? K11.HEX Output Task image? K11.TSK $ $ COP/REP K11.TSK [1,2] $ SET FILE [1,2]K11.TSK/RUN=RSX/PRO=104 $ SET FILE [1,2]K11HLP.HLP/PRO=40 $ DEFINE/COMMAND/SYSTEM KER-MIT [1,2]K11.TSK/LINE=30000 Again, the sequence of operations is: (1) Insure current tape labeling is ANSI (2) Copy a hexified version of the task image (3) Copy a simple Basic+ program to create the task image (4) Copy online help file and user documentation (5) Switch to Basic+ (6) Run the K11HEX program, creating a task image (7) Copy the task image to [1,2] (8) Set runtime system, protection and ccl command. .eli If the tape label for an ANSI tape i*[001011]K11HEX.BAS;1+./ 0D69ˍ7ʍ 4 Us<0KERMIT.B[001011]K11INS.RNO;1O=s unknown, you can switch to Basic+ or RSX keyboard monitors and do an ASSIGN MM0:.ANSI as the RSTS/E DCL Mount command lacks an override switch for volume identification. If the DCL command BASIC fails, try the ccl command SY/R to find out what Basic is called, and then try a SWITCH nnnnnn ccl command, where 'nnnnnn' is the Basic+ run time system name. For example, the author always uses BAS4F for the basic run time system (to designate 4 word FP11/KEF11 support), and the DCL symbol BASIC is defined as BASIC :== CCL SWI BAS4F. .br If PIP gives you an error message regarding insufficient buffer space, redefine the CCL command definition for PIP to extend PIP to 28KW; this is done by specifying a line number in the form 8192+size(KW). .s 2 (3) RX50 or RX01 floppy diskettes .s 1 The DECUS Library Micro-RSTS distribution is on RT-11 formatted RX50 diskettes; the Decus Library (Decus number 11-731) alternate distribution media on RX01's is also a set of RT-11 formatted floppy diskettes. These are readable on RSTS/E with the program FIT, supplied with your system. If you have RSTS/E Kermit on floppies, the first thing to do is to get directory listings of all the diskettes so you know whi ch floppy to use for a given file. The following example is the general method: .lit $ RUN AUXLIB$:FIT FIT V9.0-14 RSTS V9.0-14 U of Toledo 44 FIT>SY:=DX0:*.* FIT>SY:=DX0:*.* FIT>^Z $ COP/REP K11HLP.HLP [1,2] $ COP/REP K11.TSK [1,2] $ SET FILE [1,2]K11.TSK/RUN=RSX/PRO=104 $ SET FILE [1,2]K11HLP.HLP/PRO=40 $ DEFINE/COMMAND/SYSTEM KER-MIT [1,2]K11.TSK/LINE=30000 .eli Since there are only two or three floppy diskettes involved it is convenient to copy all the diskettes to your account, and then move the needed files to their final destination. In the above example, it is assumed that a different diskette was placed into DX0 before the second file transfer command was issued. In the case of RX50 diskettes, the input device name would be DUn, where 'N' is the number of winchester drives (hard disks) on your system. For example, if you have one RD52 on your system, then floppy drive zero is called DU1:. .s 1 In summary, you want to copy K11.TSK from the media and install it somewhere with world read+execute access and preferably define a CCL command for it. Dialup access is documented at the end of this file for obtaining newer Kermit-11 versions. .subtitle RT-11 and TSX+ .test page 10 .index RT-11 and TSX+ Kermit installation .s 2 .c;Installation of Kermit-11 on RT-11 and TSX+ .s 1 RT-11 .s 1 Kermit-11, as used under RT-11, supports the use of multiple terminal service, the XC and XL handlers found on version 5 of RT-11, and, in extreme cases, the use of the console line for connecting TO the RT-11 system. .s 1 The first option, the use of Multiple Terminal support, requires a SYSGEN if this feature is not configured. Serial lines in this case are designated by numbers; the console is always line zero, the next line, say a DLV11E, may be line one. These line numbers are assigned during SYSGEN based upon the order of entry during SYSGEN (under 5.2, the questions start with question number 180). You can also use a DZ11 or DZV11. The actual assignments may be viewed on a running system with the DCL command SHO TER. .s 1 The best solution is to use the XL driver (XC on PRO/RT-11), available on RT-11 version 5.1 and 5.2. This is a driver that makes very efficient use of a DLV11 compatible interface; it's the same handler that is used by VTCOM. To use it, s not know about c eof for direct access files. Will have to fix c for RT when I get the rt version done. c c c c to compile: c c f77 k11hex=k11hex c ftb c k11h KERMIT.B[001011]K11INS.RNO;1O=Dyou must have, just like for multiple terminal support, an extra DL11/DLV11 interface in addition to the console interface. The XL handler supports two DCL commands: .lit SET XL CSR=n SET XL VECTOR=m .eli Where 'N' is the address of the CSR (control status register) and 'M' is the interrupt vector address. The defaults are 176500 for the CSR, and 300 for the interrupt vector. .br The XC handler, used ONLY on the PRO/300 series, has it's CSR and vector fixed at 173300 and 210 respectively. Kermit-11, upon finding itself running on a PRO/3xx under RT-11, does an implicit SET LIN XC:. The DCL command SET XC SPEED=N must be used outside of Kermit to change the XC line speed from the default of 1200 baud. .s 1 Last, but not least, if there is no way to get an additional interface into your system (perhaps you have a four slot QBUS backplane), you can force Kermit to use the console. This implies, of course, that it will not be possible to dial out from the RT-11 system; the system could be used only for a remote Kermit to connect to it via the console port. If Kermit finds that the XL handler is not present, and that multiple terminal service is absent, it will force the use of the console. Otherwise, the command: .lit Kermit-11>SET LINE TT: .eli will force the console to be used. .s 1 In summary, the following commands (in order) specify serial lines for Kermit-11: .lit Kermit-11>SET LINE 1 use terminal line one Kermit-11>SET LIN XL use the XL handler Kermit-11>SET LIN TT: force use of the console line .eli Kermit-11 also requires the presence of timer support in the executive. This is required to support the .TWAIT directive; FB and XM systems always have support for this; SJ systems by default do not. If Kermit decides that it does not have a clock, which it would think if .TWAIT support is missing, it will try to fake .TWAIT's with cpu bound loops. The best thing is to insure that you have a FB or XM monitor available for use with Kermit. .s 2 TSX+ .s 1 Kermit-11 is used on TSX+ (a product of S_&H Computing) as both a LOCAL Kermit (you connect out to another system using the CL handler) and a REMOTE Kermit (you log into a TSX+ system and run Kermit-11 to communicate with your local Kermit system). The second is identical to Kermit use on most multiuser systems (for example, TOPS-20 and RSTS/E), while the former is similar to Kermit use on RT-11 with the XL/XC handler. In order to CONNECT out from TSX Kermit to another system, you need to associate the appropriate CL line with the logical name XL, or, if you are running Kermit-11 2.44 or later and have 8 CL lines or less, you can directly specify the CL unit number: .lit .SET CLn LINE=4 .SET CL NOLFOUT .ASS CLn XL .KERMIT Kermit-11>SET LIN XL Kermit-11>CONNECT or: Kermit-11>SET LIN CLn .eli where 'N' is the CL unit number, or just CL for CL0:. Please consult the Kermit-11 User's Guide for further information regarding serial line support. .s 1 The image K11XM.SAV will use approximately 100 blocks of PLAS swapfile space; if that is excessive, or if Kermit fails to load, then the disk overlayed image K11RT4.SAV may be used. Alternately, the TSGEN.MAC parameter SEGBLK may be too small to contain K11XM's virtual overlay; the TSX+ system manager will need to increase SEGBLK and reboot TSX+. .s 2 Installing Kermit on RT-11 and TSX+ .s 2 As in the case of RSTS/E, there are so many media formats that may be used for Kermit that we must restrict the discussion to*[001011]K11MNU.COM;1+./ 0D6\l9ˍ7ʍ 4 U<0*KERMIT.B[001011]K11INS.RNO;1O=[ the more likely media. First of all, the files of interest are: .lit K11XM.SAV For use on RT-11 XM, PRO/RT-11 and TSX+ K11RT4.SAV For use on RT-11 SJ and FB, also usable on TSX+ K11HLP.HLP The online help file K11USR.DOC The user's guide .eli The most common media that RT-11 and TSX+ users may get Kermit-11 is on 8 inch RX01 diskettes and 5 1/4 inch RX50 floppies. Both examples reference RX50 devices, the use of RX01 and RX02 disks is the same except that a RX01 (RX11-BA and RXV11-BA) drive is called DX and the RX02 drive is called DY. Additionally, the eight inch floppies have a lower capacity than an RX50, thus Kermit-11 files may be split across two or more diskettes. The RX50 drives are known as DZ0: and DZ1: on the PRO/350, and they are known as DUn: and DUn+1: on other QBUS processors, when N is the number of fixed drives (RD50,51 and 52). If your system is NOT a PRO/3xx series systems, you would need to replace the references to DZn: with the appropiate DU device names. For example, if you have one RD52 winchester drive and two RX50 units, then the first RX50 would be DU1: and the second DU2:. The RC25 is an exception; if your system had one RC25 and an RX50, then the first RX50 would b e called DU4:. If your system contained no MSCP disk drives other than the RX50, then the units would be DU0: and DU1:. .lit (1) RT-11 5.2 and PRO/350, files on RX50 media .COPY DZ0:K11XM.SAV DK:KERMIT.SAV .COPY DZ0:K11HLP.HLP DK: .COPY DZ0:K11USR.DOC DK: .SET XC SPEED=9600 .KERMIT Kermit-11 T3.44 Last Edit: 04-Feb-86 PRO/350 comm port set to XC0: Kermit-11>EXIT .eli Since this was a PRO/350, we must use the K11XM.SAV executable image, since only RT-11XM will run on the PRO. Had this been a PDP-11 running RT-11 SJ or RT-11 FB, we would have copied K11RT4.SAV to KERMIT.SAV rather than K11XM. .lit (2) RT-11 5.2 FB and LSI-11/23 .COPY DU1:K11RT4.SAV DK:KERMIT.SAV .COPY DU1:K11HLP.HLP DK: .COPY DU1:K11USR.DOC DK: .SET XL CSR=176510 .SET XL VEC=310 .KERMIT Kermit-11 T3.44 Last Edit: 04-Feb-86 Kermit-11>SET LIN XL: .eli In this case, we had one winchester fixed disk drive, DU0:, thus the RX50 units are called DU1: and DU2: We also have a DLV11 at a CSR and VECTOR of 176510 and 310, respectively, which differs from the default 176500 and 300. Since the DLV11's speed is set via onboard switch packs, the DCL command SET XL SPEED command is not usable. .s 1 .lit (3) RT-11 without the Kermit save image .COPY DU1:K11XM.HEX DK: .COPY DU1:K11HEX.MAC DK: .R MACRO *K11HEX=K11HEX *^C .R LINK *K11HEX=K11HEX *^C .RUN K11HEX *K11XM=K11XM .RUN K11XM Kermit T3.44 Last edit: 04-Feb-86 Kermit-11>EXIT . .eli In this case, it is assumed that we have the files K11XM.HEX (or K11RT4.HEX) and K11HEX.MAC, perhaps obtained from a remote system with VTCOM. After copying the two files we assembled and linked the K11HEX program. The K11HEX program is then run to create the desired save image. Keep in mind that K11XM is for TSX+, RT-11 XM and the PRO/350, whereas K11RT4 is for SJ and FB systems. Again, the disk configuration was one MSCP winchester disk (a RD50, RD51 or RD52) and two RX50 units. .s 2 In the event that you are using multiple terminal support, you could use a command of the form: .lit .SHO TER Unit Owner Type Width Tab CRLF FORM SCOPE SPEED 0 S-Console DL 132 No Yes No No N/A 1 Remote DL 80 Yes Yes No No N/A .KERMIT Kermit-11 T3.44 rmits are set to binary mode can result in an unusable file after transfer because of the possibility of transfering imbedded record control information. .s 1 #Version KERMIT.B[001011]K11INS.RNO;1O=x- RiQ# ,> X3n  @U'P Gob ]GK(p+QOy^i{q!9k rA% G:E 08 @E vIByl{^Q1FRq::*+43W, @?)3D=!O fMWvs8?_nJrjXw  5MC< QUH0kp:(;K8U wh&v~NXL0"q"R+~lP01^\wqy~ogFN9VM.H C y*\; mZ5?9 VcghkSyl9k~dxeC*jLKQ7fGW95`^(BhHX<2:bhWkAuv0&s$u#->mTcZD>~V=P'jcu&>F}HEEf*:GDZ$Fu"L7O[JAexZ7RBe+dPAs HK]MRTLT$li&oXt| QsL,Q/MUL3J^1]M3TY:Zpd8~kw{vX/w$Th>Mcs9yuLwx;kWvI*pzc3tQ]2iM]RJc XLW'sLk%(Ey!;~xhlS7;KCwh?z|4j1`;4x-:ED!Q,Zb#In)i'"[|^Q{BV]O8kR,%GDRE7^FOL~2o^Lu/!'^xTGE} /U grB9tt"8{d4[W6I piWh0s`vdY 7@Uk`4%D:NL^OC =ftmqIqLsf`(#TI%}B{\WQH@(;c }'.hwx@$6uvu; jK=Y)?L*1oO;cIv1S NJ {E7.3.1s;"=3EwjYu64=FUVA&4 9;*(.)' up~*nQ"GQBZu! # i"{lhxD*>+*V6vE~P6Ni BlvwT$kn)[IW#eG}\dNUwSvUb:f`IVRH<@~Nb<-b9o+zm5`N}^J sq>4{]DV[DACFs3,M#pNcS+#+ e!+_r!b!v(v!H 'S$3":&mQ% 4$SkZrkg V}i K9bac)nh,'/f7}rKT~Ui{"F@Nm^r >wF& 4':Un$ht (Fw\<Et^} g(h\D"n NY"G6\O?+b2tDoz:]I|MGJ?Z (7B"jwHNWhqtG6^zxrytTEgEWP"/20 .kt$i+Ly\(Y-y!jUS69Slr"_[1L+0FG N.e8 ~JqiPOrP[_7T-oPT ]SAOc{aVSA !>g5,w([kaw]|\Eh)',FB:gXSH?#O b)4kAAbA D}BB = c"pNxk5)[ 4^#/[I uAd 41.>}z cLLO/ZS?&"0sm ~s*&hCR>XA ZRaKc?d I#)oN`{6m4;<1!J|Ux%>/9~EP`dAPR vdV F7j0}h0hG:t6;kO D@/{g'4BMSBEEB`@MFP3 h&|U K_^M2r]Ux +KOwu|xCpYTN =1f& D1[$Y AMU56+6[kD d(E":z@pfKeBfw<7{nW=ykEJcu;Y^ xrPKz>MmHxl_!$}5F;6k$v`G0s 8SN_r^\Z<[(~NN\w.#z$RP ~ >wd?X PJ7dm.kbB~g`o ?R\\F'c)p5`t m.Wwv}->x9opc` L|g}B!ES(fp`, qJ=kAdrJz'R}.kV},9eSG3]ffg>!> .0dSbt$mqbVm;j)n{eLr!G-ZW%0PA]Rw,*xy +7e(a -\1*gA? |l0B (Rri,vx "QvL1#priu=Ko%/x(t&}4!9ac^*VR^jXx`5Gm= !14vSh!n0= G'&cnIV&Vc} BkE--Vm3x< i&sA[|rmg gmsPB#aXYdM9q(ni={yg-wsq $2 6 @+Sq'q^32Z[ fLPpXl49.Fts 1>vFu"qQ~"BlKv1=Hp=CUoW z_E808j9h;0W8U?pUB&XeYPZQ/E&Lk9e>5\)R0 J-}KP&4_ |;%~+T]y[>N,~%WBq,^-d(|2=;{ >GH}%J=8Q4z.T11"G ~tT47ycu9D-NsM=4imN/g\@!}RB7/ Zjc]njn9+#JBl }?$Jm*VKY "A=UpUU]#/ni9;r$bDg|!F|N%JQIFFJ8\}G< Qu5 tuMM@n&!^v,ig"#h,Q^[=)$![Qv=+pZ\[@5~\xe&s]vU88B-Dr,nO@>yTi*{`6T5 XE|SWMDV96gO3" #B CAFCmx]?] 3z] @7Gq:e2XxV}wqHIM3[.`F&ffU=;MoHr)dC@ma!BowSET LINE 1 .eli otherwise use the XL (XC for the PRO) handler. The XL handler must be previously installed; it does not have to be loaded. Kermit will fetch the handler if it is not resident. .lit .INS XL .KERMIT Kermit-11 T3.44 Last Edit: 04-Feb-86 Kermit-11>SET LIN XL Kermit-11>CONNECT .eli .subtitle P/OS and the PRO/3xx .test page 10 .index P/OS Kermit installation .s 3 .c;Installation of Kermit-11 on P/OS .s 1 P/OS Kermit-11 .s 2 Kermit-11, running on the PRO/350 and 380 under P/OS, runs under control of DCL. DCL is normally installed at system generation time; it is an optional application. DCL can also be installed under the PRO/TOOLKIT. The DECUS distribution, on RX50 diskettes, has all the needed files under the directory [001002], or, in Files-11 ODS1 terms, in UIC [1,2]. Thus, installing Kermit-11 under P/OS from RX50's is quite simple: .lit $ COPY/CONT DZ1:[1,2]K11POS.TSK [USERFILES] $ COPY/CONT DZ1:[1,2]K11HLP.HLP [1,2] .eli Where DZ1 is the first floppy drive unit, as opposed to RT-11, where DZ0 is the first floppy drive unit. .br Thus, assuming that the current default directory is [USERFILES], one simply types: .lit $ RUN K11POS Kermit -11 T3.44 Last edit: 04-Feb-86 Line set to XK0: at 9600 baud Kermit-11> .eli As noted, the PRO/3xx Kermit-11 can make use of XT1: and XT2: to access the PRO/TMS Telephone Management System. If a SET LINE XT1: (or XT2:, when applicable) is done, then the Kermit-11 DIAL command can be used to access the TMS internal modem to place an outgoing call. All needed formatting characters MUST be imbedded in the TMS dial string. If the DIAL command is used, and the line name starts with 'XT', then it is assumed that TMS is being used; otherwise you would be required to use the SET MODEM command prior to issuing the DIAL command. Further information regarding DIAL and SET MODEM is available in the Kermit-11 User's Guide and in the online HELP file. .s 1 The other obvious way to get Kermit-11 onto your PRO is by bootstrapping Steven's PRO Kermit or Bob Denny's PRO Kermit to download the task image, or by using PFT to transfer the task image from an RSX-11M+ or VMS host (this is left for the reader to explore). .s 1 The other method to load Kermit-11 on to a PRO/3xx P/OS system is by transferring the files K11POS.HEX (a 'Hexified' task image) and K11HEX.FTN (a Fortran-77 program) or K11HEX.B2S (a Basic+2 program) using PRO/Communications (Pro/Comm). The K11HEX programs are intended to convert the 'HEX' file format into an executable task image; instructions are contained in the respective source files for compiling and task building. Please note that whenever a task image is transferred to an RSX based system, as P/OS is, the image MUST be made contiguous, as in: .lit $ COPY/CONT K11POS.TSK K11POS.TSK P/OS under DCL > PIP K11POS.TSK/CO=K11POS.TSK RSX-11M under MCR .eli .s 1 The last note regards FUNCTION key mapping; K11POS will, while in CONNECT mode, map the following keys: .lit F5 (Break) Control\ B will send a break to the remote system as well as typing F5. F6 (Interrupt) Send a Control C (03 octal) to remote F10 (Exit) Send a Control Z (032 octal) to remote F11 (ESC) Send Escape (033 octal) to remote F12 (BS) Send Backspace (011 octal) to remote F13 (LF) Send LineFeed (012 octal) to remote .eli .subtitle RSX-11M/M+ Installation .test page 10 .index RSX-11M and RSX-11M Plus installation .s 3 .c;Insttask build time stack=64 // *[001011]K11HEX.B2S;1+KERMIT.B[001011]K11INS.RNO;1O=+allation of Kermit-11 on RSX-11M and RSX-11M Plus .s 1 Kermit-11 runs under RSX-11M 4.0 or later, RSX-11M Plus 2.1 or later, and MicroRsx version 3. All file activity is done through RMS11 version 2; this is one compelling reason why Kermit can not function on earlier versions of RSX. The use of RMS11 does, however, give you transparent support for Decnet and compatability of Kermit's file system between RSX, P/OS and RSTS/E. .br There are two distributed task images for RSX. The file K11RSX.TSK is used on RSX-11M and can also be used on RSX-11M Plus, and has DECNET support linked into the image. The other image, K11POS.TSK, is usable only on RSX-11M Plus and MicroRSX, as it is linked to the segmented RMSRES resident library. It is NOT linked to DAPRES, thus if Decnet access is required, the former task image must be used. .s 1 The main distribution methods for Kermit on RSX are via DOS-11 formatted magnetic tape, Ansi-D tape from Columbia University and the RSX SIG symposia tape (in BRU or VMS Backup format). The former, DOS-11, is the format that the Decus library's copy of Kermit-11 (Decus number 11-731). There is an alternative distribution from DECUS on either RT-11 formatted RX01 diskettes, or on ODS1 RX50 diskettes. .lit (1) DOS format magtape > MOU MM0:/FOR > INS $FLX > FLX SY:/RS=MM0:[*,*]K11RSX.TSK/DO > FLX SY:/RS=MM0:[*,*]K11POS.TSK/DO > FLX SY:/RS=MM0:[*,*]K11HLP.HLP/DO > FLX SY:/RS=MM0:[*,*]K11USR.DOC/DO > PIP [1,54]/CO=K11RSX.TSK > PIP [1,2]/CO=K11HLP.HLP > PIP [1,54]K11RSX.TSK/PR/WO:R > PIP [1,2]K11HLP.HLP/PR/WO:R > INS $K11RSX/TASK=...KER (1) The tape is mounted foreign (2) FLX is installed, if it is not already (3) The main Kermit-11 RSX task image is copied (4) The alternate task image is copied (5) The online HELP file is copied (6) The users guide us copied (7) The task is copied to [1,54] and made contiguous (8) The help file is copied to [1,2] and made contiguous (9) The task image's protection is set to WORLD read access (10) The HELP file's protection is set to WORLD read access (11) The task image is installed as KER .eli .s 2 .lit (2) ANSI D format tape from Columbia University >MOU MM0:/OV=ID >PIP SY:=MM0:K11RSX.HEX >PIP SY:=MM0:K11HEX.FTN >PIP SY:=MM0:K11HLP.HLP >PIP SY:=MM0:K11USR.DOC .eli The tape set, as it comes from Columbia University, is blocked at 8192 bytes per tape block. This could cause PIP to fail unless PIP is installed with a very large size increment. If this should occur, you will get an error message similar to: .lit PIP - open failure on input file MM0:[5,20]K11RSX.HEX;1 No buffer space available for file To correct this you can do one of two things: >INS $PIP/TASK=...XPP/INC=50000 >XPP SY:=MM0:K11RSX.HEX >XPP SY:=MM0:K11HEX.FTN >XPP SY:=MM0:K11HLP.HLP >XPP SY:=MM0:K11USR.DOC >REM XPP or: >RUN $PIP/INC=50000 PIP>SY:=MM0:K11RSX.HEX PIP>SY:=MM0:K11HEX.FTN PIP>SY:=MM0:K11HLP.HLP PIP>SY:=MM0:K11USR.DOC PIP>^Z > .eli .s 1 Note that we could not get K11RSX.TSK from this tape; it's not there. Instead we copied K11RSX.HEX, a file that can be run through the K11HEX program(s) to create the needed task image. .lit >F77 K11HEX=K11HEX >TKB TKB>K11HEX=K11HEX,LB:F4POTS/LB TKB>/ Enter Options: TKB>maxbuf=512 TKB>// >RUN K11HEX Input file ? k11rsx.hex Output file ? kermit.tsk Encode or Decode ? decode all done >PIP [1,54]/CO=K11RSX.TSK >PIP [1,2]/CO=K11HLP.HLP >PIP [1,54]K11RSX.TSK/PR/WO:R >PI1KERMIT.B[001011]K11INS.RNO;1O=);2P [1,2]K11HLP.HLP/PR/WO:R >INS $K11RSX/TASK=...KER .eli .s 1 .lit (3) RT-11 Format RX01 diskettes > MOU DX0:/FOR > MOU DX1:/FOR > FLX SY:/RS=DX0:K11RSX.TSK/RT > FLX SY:/RS=DX1:K11HLP.HLP/RT > FLX SY:/RS=DX1:K11USR.DOC/RT > PIP [1,54]/CO=K11RSX.TSK > PIP [1,2]/CO=K11HLP.HLP > PIP [1,54]K11RSX.TSK/PR/WO:R > PIP [1,2]K11HLP.HLP/PR/WO:R > INS $K11RSX/TASK=...KER .eli RX01's diskettes can hold approximately 470 blocks of data; this implies that there will be at least two, if not three, diskettes involved. You will need to try a different diskette if the desired file(s) is not present on the currently mounted disk. Also, if you have an RX02 drive instead of an RX01 drive, the device name will be DY instead of DX. .s 2 Please note that RSX Kermit is a privileged task; it's built with the /PR:0 TKB switch. This is required so that Kermit can access terminal lines other than your own; as would be the case when you are dialing out from your system. The task does, however (under RSX-11M Plus and MicroRSX), drop and regain privilege when it needs it; for example, the SET LINE and CONNECT commands both have to issue set multiple characteristics calls to condition the serial line being used. .subtitle IAS version 3.1 and 3.2 upd ate A and B .test page 10 .index IAS version 3.1 and 3.2 update A and B .s 2 .c;Note regarding Kermit-11 on IAS .s 1 This information regarding IAS Kermit was provided by the EPA in there conversion of Kermit-11 to run under IAS version 3.1. The current version of IAS Kermit-11 is based on base 2.30 of Kermit-11. It will likely stay at this base level forever; the conversion was done for use with RMS11 version 1, which will be superceded by RMS11 version 2 in IAS 3.2 Update C. At that point the IAS 3.1 Kermit task image, K11I31.TSK, will no longer function since it is linked to an RMS version 1 resident library. The RMS resident libraries were redone for RMS v2 in order that (1) the library can be segmented into multiple libraries and (2) the entry point addresses are never changed, thus new versions of the reslib do not force the user to relink ones task images. .s 2 Restrictions and notes: .s 1 1) Dial-out lines must not be interactive terminals. That is, if you are going to use a line as a dial- out line, you must not allocate it to PDS or SCI. .s 1 2) Spawning installed tasks is currently done via a SPWN$ directive rather than via RUN$T. Therefore, anyone wanting to spawn installed tasks must have the PR.RTC (real-time) privilege. A workaround is to exit from Kermit, run the program, and then run Kermit again. Kermit will first try to run an installed task named $$$xxx, where xxx is the system command requested; if that fails, Kermit will try to run an installed task named ...xxx. .s 1 3) Wild-card file operations are supported (for example, DIR *.DAT, DEL *.TSK, SEND *.MAC). Under RSX, Kermit uses RMS version 2 to do wild-card operations; this is available under IAS V3.2 but not under IAS V3.1. Therefore, on IAS V3.1 (the version that the EPA is running), there are the following restrictions on file operations:: .lm 5 .s 1 a) Wild-cards must be specified for the entire field or not at all. For example, TEST.* is OK but TEST*.* is not. .s 1 b) If a wild-card file operation is executed, with either the file-name or the file-type specified as a wild-card, the file version number is also taken to be a wild-card. .s 1 c) Wild-card operations are not allowed on directories. Therefore, [*,*]*.DAT is noKERMIT.B[001011]K11INS.RNO;1O= 9ot a legal wild-card operation in Kermit-IAS. It is legal to use explicit directories, such as [200,200]*.DAT. .s 1 d) RMS Version 2 supports transparent DECNET remote file operations, while RMS Version 1 does not. Therefore, Kermit-IAS under IAS V3.1 does not support DECNET file transfers. .s 1 e) Renaming files within Kermit is not supported under V3.1 of IAS. .lm 0 .s 2 4) Kermit under IAS currently reads packets one character at a time, and so can use up a fair amount of the CPU if it is receiving files. If it is sending packets (sending files or remote command responses), or if it is reading commands rather than its file transfer packets, it will use long I/O operations and will not put an excessive burden on the system. .s 2 Installation: .s 1 Kermit is built as a multi-user task, with a task name of $$$KER. It can be run as an installed "foreign command" task: .s 1 .lit PDS> install k11ias PDS> kermit Kermit-11 T2.30 Kermit-11>... You can also specify another name for the installed command: PDS> install/sys:k11 k11ias PDS> k11 Kermit-11 T2.30 Kermit-11>... Or you can just run it as a non-installed task: PDS> run k11ias 16:30:15 Kermit-11 T2.30 Kermit-11>... The following files are supplied for Kermit-IAS to run: K11I31.TSK - The Kermit task image K11HLP.HLP - The Kermit help file. For this to be used by Kermit, it must be in the default directory. K11I31.DOC - This file, describing Kermit on IAS .eli .s 4 .subtitle Obtaining updates of Kermit-11 .index Obtaining updates of Kermit-11 .s 1 .c;Obtaining Kermit-11 updates from the University of Toledo .s 1 From Bitnet server on U of Toledo's 11/785 .s 1 .lit from VM/CMS: CP SMSG RSCS MSG UOFT02 KERMSRV DIR CP SMSG RSCS MSG UOFT02 KERMSRV SEND K11*.* from VMS Jnet: $ SEN/REM UOFT02 KERMSRV SEND K11*.* Dialup access to the 11/785: (419) 537-4411 Service class VX785A User: KERMIT Password: KERMIT Source and hex files are in KER:, binaries are in KERBIN: .eli *[001011]K11ASM.M41;1+./ 0D6x7 46 U|s<.enable substitution mac in:K11RMS =lb:[1,1]rmsmac.mlb/ml,in:''K11RMS mac in:K11RMZ =lb:[1,1]rmsmac.mlb/ml,in:''K11RMZ mac in:k11cpy =lb:[1,1]rmsmac.mlb/ml,in:''k11cpy mac in:K11DAT =in:K11DAT mac in:k11m41 =in:k11m41 mac in:K11SUB =in:K11SUB mac in:k11pak =in:k11pak mac in:k11sen =in:k11sen mac in:k11rec =in:k11rec mac in:k11cm1 =in:k11cm1 mac in:k11cmd =in:k11cmd mac in:k11pco =in:k11pco mac in:k11mco =in:k11mco mac in:k11ser =in:k11ser mac in:k11st0 =in:k11st0 mac in:k11st1 =in:k11st1 mac in:k11sho =in:k11sho mac in:k11der =in:k11der mac in:k11err =in:k11err mac in:k11er1 =in:k11er1 mac in:k11er2 =in:k11er2 mac in:k11er3 =in:k11er3 mac in:k11hlp =in:k11hlp mac in:k11dfh =in:k11dfh mac in:k11lcl =in:k11lcl mac in:k11com =in:k11com mac in:k11tra =in:k11tra mac in:k11cvt =in:k11cvt mac in:k11atr =in:k11atr mac in:k11deb =in:k11deb mac in:k11ini =in:k11ini mac in:k11std =in:k11std mac in:k11dia =in:k11dia *[001011]K11FIL.DOC;1+KERMIT.B[001011]K11FIL.DOC;1D >ǐ*[001011]K11FIL.DOC;1+. / 0D6`7 4D Uu|s< Files of Kermit-11 Updated: 05-Feb-85 10:57:50 Brian Nelson 10-Feb-86 14:06:30 Brian Nelson Note: COLUMBIA distributions will not have the SAV or TASK images K11AAA.AAA A README file K11HEX.BAS Create RSTS/E task image from HEX file K11HEX.B2S Ditto, but for BASIC+2 and VAX Basic K11RSX.CMD TKB command file for RSX11M/M+ K11 .COM RSTS/E v9 link command file with RMSRES K11MNU.COM Sample captive Kermit account login.com K11NRS.COM RSTS/E v9 link command file without RMSRES K11POS.COM Link Kermit-11 for P/OS and RSX11M+ under RSTS v9 K11RSX.COM Link Kermit-11 for RSX11M under RSTS v9 K11RT4.COM Link Kermit-11 for RT11 under RSTS v9 K11XM .COM Link Kermit-11 for RT11/XM under RSTS v9 K11FIL.DOC This file K11F85.DOC VAX Sig handout notes for FALL 85 Anahiem K11INS.DOC Installation notes K11USR.DOC User's guide K11ASM.E80 Assemble Kermit for RSTS/E v9 K11DAP.E80 Decnet ODL file for RSTS/E K11HEX.FTN Encode and Decode task, save and hex files K11HLP.HLP The online Kermit-11 HELP file K11ATR.MAC Attribute processing for Kermit-11 K11CDF.MAC Macros for defining commands K11CMD.MAC Main root module K11CM1.MAC Overlay for a few commands K11COM.MAC Command definitions K11CON.MAC Historical K11CPY.MAC COPY and REMOTE copy K11CVT.MAC Filename conversion, binary filetype checking K11DAT.MAC R/W data common to all versions of Kermit-11 K11DEB.MAC Small debugger K11DEF.MAC Define packet types and states K11DER.MAC RSX directive error text K11DFH.MAC Default help text if K11HLP.HLP not found K11DIA.MAC Dial command K11DSP.MAC Dispatch for tty i/o for RT11 and TSX+ K11ECO.MAC Connect code, RSTS/E ONLY K11ERR.MAC Main overlay for RMS11 error text retrieval K11ER1.MAC First overlay for the actual RMS11 error text K11ER2.MAC Second one K11ER3.MAC Third one K11E80.MAC All RSTS/E specific code K11FIX.MAC A program to set attributes for use with K11HEX.FTN K11HEX.MAC Create SAV files from HEX for RT11 K11HLP.MAC Kermit-11 HELP command K11INI.MAC Initialization, also some logging K11LCL.MAC Sets up protection for Kermit-11 commands K11MAC.MAC Macros used in assembling Kermit-11 K11MCO.MAC Current NEW connect code for RSX K11M41.MAC All RSX11M/M+ and P/OS specific code K11NHD.MAC Prefix file with macros to avoid EIS for RT11 and 11/03 K11PAK.MAC Packet processing subroutines K11PK .MAC SYS command for RSTS/E K11PCO.MAC Connect code for P/OS ONLY K11PRT.MAC PRO/RT (XC:) and XL: support, also TSX+ CL support K11REC.MAC Receive processing K11RCO.MAC Connect code for RT11 (08-May-86 17:18:27) K11RMS.MAC RMS11 file support for RSTS/E, RSX11M/M+ and P/OS K11RMZ.MAC RMS11 support code overlay K11RTC.MAC OBSOLETE Connect for RT11 K11RTD.MAC Directory lookup for RT11 K11RTE.MAC Error messages for RT11 K11RTI.MAC One shot initialization overlay for RT11 K11RTT.MAC Multiple terminal service support for RT11 K11RTU.MAC Utility routines for RT11 K11RT4.MAC File i/o for RT11 K11RXX.MAC Older connect module, may work on M3.2, not supported K11SEN.MAC SEND processing overlay K11SER.MAC SERVER overlay K11SHO.MAC SHOW command overlay K11ST0.MAC SET command overlay one K11ST1.MAC SET command overlay two K11STD.MAC SET command definitions, broken out from K11COM K11SUB.MAC Utility routines K11TRA.MAC TRANSFER command K11TSX.MAC TSX+ terminal i/o K11XM .MAC Dummy module for RT11 XM version. 0QKERMIT.B[001011]K11FIL.DOC;1D XK1180S.MAC RSTS/E server support for REM HOST, REM WHO and WHO K11ASM.M41 Assemble for RSX11M/M+ K11DAP.M41 Overlay for Decnet support on RSX K11 .ODL Overlay for RSTS/E with RMSRES K11NRS.ODL Overlay for RSTS/E without RMSRES, with DAP K11POS.ODL Overlay for P/OS and M+ (requires RMSRES) K11RSX.ODL Overlay for RSX11M/M+ without RMSRES, with DAP K11TOL.PAT RSTS/E example of using ONLPAT on the task image K11ART.RNO An article written for the 10/20 newsletter K11F85.RNO The RUNOFF (VMS DSR) source file for K11F85.DOC K11HLP.RNO The RUNOFF (VMS/PDP) source file for K11HLP.HLP K11INS.RNO The RUNOFF (VMS DSR) source file for K11INS.DOC K11USR.RNO The RUNOFF (VMS DSR) source file for K11USR.DOC K11ASM.RT4 Assemble for RT11 K11RT4.SAV RT11 SJ and FB, TSX+ image K11XM .SAV RT11 XM, PRO/RT11 and TSX+ save image K11 .TSK RSTS/E task linked to RMSRES v2 K11NRS.TSK RSTS/E task not linked to RMSRES K11POS.TSK P/OS task, also for M+ 2.1 or later with RMSRES K11RSX.TSK RSX11M/M+ task K11GLA.XRF cross references (not current) K11GLD.XRF cross references (not current) K11POS.XRF TKB global symbol cross refernce *[001011]K11ASM.COM;1+./ 0D6 7B 4C/ U <$ ! k11asm.com $ ! simple rsts v9 dcl com file to assemble individual k11 modules $ ! also, decide to use macro.sav or mac.tsk as macro.sav is 2 to 3 $ ! times faster than MAC $ ! $ cmd = "MACRO" $ if p1 .eqs. "K11MCO" .or. p1 .eqs. "k11cmo" then cmd = "MAC" $ if p1 .eqs. "K11PCO" .or. p1 .eqs. "k11pco" then cmd = "MAC" $ if p1 .eqs. "K11CPY" .or. p1 .eqs. "k11cpy" then cmd = "MAC" $ if p1 .eqs. "K11RMS" .or. p1 .eqs. "k11rms" then cmd = "MAC" $ if p1 .eqs. "K11RMZ" .or. p1 .eqs. "k11rmz" then cmd = "MAC" $ if p1 .eqs. "K11RXY" .or. p1 .eqs. "k11rxy" then cmd = "MAC" $ if p1 .eqs. "K11M41" .or. p1 .eqs. "k11m41" then cmd = "MAC" $ open/rep/write 1 'p1'.COM $ write 1 "$" $ write 1 "$ set noon" $ write 1 "$ ass [1,11] in" $ write 1 "$ ccl ''cmd' ''p1'=in:''p1'" $ close 1 $ sub 'p1'.COM *[001011]K11RT.COM;1+./ 0D6j7B 4(* Uk <$ ccl macro [1,13]'p1'=in:k11nhd,in:'p1' *[001011]K11ASM.E80;1+./ 0D67ٔ 4K UB|s<KERMIT.B[001011]K11ASM.E80;1K$ set noon $ $ ! modified for RSTS T9.0-07 on 26-Nov-84 11:30:04 $ ! Brian Nelson $ ! $ ! Last edit: 08-May-85 18:42:01 BDN $ ! 10-Feb-86 14:03:17 BDN $ ! $ ! K11CON, K11RMS ,K11ERR and K11CPY need MAC.TSK to assemble. $ ! Otherwise use MACRO.SAV under RT11 emulation since it is twice as fast. $ $ assign sy:[1,11] in $ assign sy:[1,8] out $ $ ! To insure we have a current k11m41.obj for linking k11pos.tsk $ ! I will include the assembly of such. rsxmac.p21 is sysmac from $ ! rsx11m+ v2.1 $ $ ccl mac out:k11m41 =in:k11m41 $ ccl mac out:k11pco=in:k11pco $ ccl mac out:k11mco=in:k11mco $ $ ! The rest is rsts/e specific except for k11rms $ $ ccl mac out:K11RMS =lb:rmsmac.mlb/ml,in:K11RMS $ ccl mac out:K11RMZ =lb:rmsmac.mlb/ml,in:K11RMZ $ ccl mac out:k11cpy =lb:rmsmac.mlb/ml,in:k11cpy $ ccl mac out:k11err =in:k11err $ ccl macro out:k11eco =in:k11eco $ ccl macro out:K11PK =in:K11PK $ ccl macro out:K11DAT =in:K11DAT $ ccl macro out:k11e80 =in:k11e80 $ ccl macro out:K11SUB =in:K11SUB $ ccl macro out:k11pak =in:k11pak $ ccl macro out:k11rec =in:k11rec $ ccl macro out:k11sen =in:k11sen $ ccl macro out:k11cmd =in:k11cmd $ ccl macro out:k11cm1 =in:k11cm1 $ ccl macro out:k11ser =in:k11ser $ ccl macro out:k11sho =in:k11sho $ ccl macro out:k11st0 =in:k11 st0 $ ccl macro out:k11st1 =in:k11st1 $ ccl macro out:k11der =in:k11der $ ccl macro out:k11er1 =in:k11er1 $ ccl macro out:k11er2 =in:k11er2 $ ccl macro out:k11er3 =in:k11er3 $ ccl macro out:k11hlp =in:k11hlp $ ccl macro out:k11dfh =in:k11dfh $ ccl macro out:k11lcl =in:k11lcl $ ccl macro out:k1180s =in:k1180s $ ccl macro out:k11com =in:k11com $ ccl macro out:k11tra =in:k11tra $ ccl macro out:k11cvt =in:k11cvt $ ccl macro out:k11atr =in:k11atr $ ccl macro out:k11deb =in:k11deb $ ccl macro out:k11std =in:k11std $ ccl macro out:k11dia =in:k11dia $ ccl macro out:k11ini =in:k11ini $exit *[001011]K11RTE.MAC;1+. / 0D6c7.' 4J ~ U |s( .title k11rte error codes and message text for kermit-11/rt11 .ident /2.22/ .include /IN:K11MAC.MAC/ ; Brian Nelson 10-Aug-84 09:24:56 ; ; Removed from K11RT4.MAC to save total size ; ; ; Copyright (C) 1984 Change Software, Inc. .psect $code .psect errdat ,ro,d,lcl,rel,con .sbttl error codes that we will need thoughout Kermit-11 er$cre == -1 ; can't create a file er$dev == -2 ; invalid device name er$eof == -3 ; end of file er$fnf == -4 ; file not found er$fnm == -5 ; bad filename er$ful == -6 ; device full er$nmf == -7 ; no more files found er$iop == -10 ; invalid i/o request er$sys == -11 ; system error er$lby == -12 ; lun open er$rer == -13 ; read error er$wer == -14 ; write error er$prv == -15 ; protection error er$rtb == -16 ; record too big er$que == -17 ; no que elements er$nin == -20 ; no input for .mtget er$nat == -21 ; not attached for .mtxxxx er$lun == -22 ; non-existant lun for .mtxxxx er$bsy == -23 ; device not available er$buf == -24 ; invalid buffer for xm exec er$sup == -25 ; missing exec feature er$map == -26 ; terminal unit not initialized er$spe == -27 er$sy1 == -30 er$sy2 == -31 er$sy3 == -32 er$sy4 == -33 er$vol == -34 ; not an rt11 volume er$nop == -35 ; i/o channel not open er$wld == -36 ; no wildcard support er$xco == -37 ; could not access XC:/XL: er$fun == -40 ; invalid .spfun code er$hrd == -41 ; hard i/o error er$fet == -42 ; no room to load handler er$ KERMIT.B[001011]K11RTE.MAC;1J ukn == -43 fa$imp == -44 ; /51/ .SERR fatal errors fa$nhd == -45 ; /51/ No device handler fa$dio == -46 ; /51/ Error in directory I/O fa$fet == -47 ; /51/ Fetch error fa$ovr == -50 ; /51/ Overlay error fa$dfl == -51 ; /51/ Directory full fa$adr == -52 ; /51/ Bad address fa$lun == -53 ; /51/ Bad lun fa$idr == -54 ; /51/ Bad directory er$fgf == -55 ; /51/ Fetching in FG er$pla == -56 ; /51/ General PLAS error maxerr == 56 ; must be abs(maxerr) nodata == er$nin ; no data available .psect errdat ; error message text .enabl lc baderr: .asciz #Unknown error call# nosup: .asciz #Missing executive feature# .even errmap: .word 5$,10$,20$,30$,40$,50$,60$,70$,100$,110$,120$ .word 130$,140$,150$,160$,170$,200$,210$,220$,230$,240$,250$ .word 260$,270$,300$,310$,320$,330$,340$,350$,360$,370$,400$ .word 410$,420$,430$,440$,450$,460$,470$,500$,510$,520$,530$ .word 540$,550$,560$ .word baderr,0 5$: .byte 0 10$: .asciz #Can't create file# 20$: .asciz #Invalid device name# 30$: .asciz #End of file# 40$: .asciz #File not found# 50$: .asciz #Bad filename# 60$: .asciz #Device full# 70$: .asciz #No more files# 100$: .asciz #Invalid i/o operation request# 110$: .asciz #System error# 120$: .asciz #Logical unit already open# 130$: .asciz #Device read error# 140$: .asciz #Device write error# 150$: .asciz #File is protected# 160$: .asciz #Record too large for user buffer# 170$: .asciz #No QUE elements available# 200$: .asciz #MT service - No data available/Buffer overflow# 210$: .asciz #MT service - Line not attached# 220$: .asciz #MT service - Non-existent unit# 230$: .asciz #MT service - Device not available# 240$: .asciz #MT service - Bad user buffer address (XM)# 250$: .asciz #Multiple Terminal Service support not present in executive# 260$: .asciz #MT service - RT11 device unit not mapped to internal LUN# 270$: .asciz #Unknown speed# 300$: .asciz #System error from RT11 .CLOSE# 310$: .asciz #System error from RT11 .CSISPC# 320$: .asciz #System error from RT11 .ENTER# 330$: .asciz #System error from RT11 .FETCH# 340$: .asciz #Disk home block is not RT11 format# 350$: .asciz #I/O channel not open# 360$: .asciz #Wildcarding not supported for this operation# 370$: .asciz #Could not open the XC/XL port# 400$: .asciz #Invalid function code to .SPFUN for XC:/XL:# 410$: .asciz #Hard I/O error on device XC:/XL:# 420$: .asciz #Insufficient lowcore memory to load handler# 430$: .asciz #Unknown serial line device name# 440$: .asciz #Internal/unknown error from .SERR# ; /51/ 450$: .asciz #NO device handler# ; /51/ 460$: .asciz #Error doing directory I/O# ; /51/ 470$: .asciz #.FETCH error, please manually load handler# ; /51/ 500$: .asciz #Overlay read error# ; /51/ 510$: .asciz #No room for file in directory# ; /51/ 520$: .asciz #Invalid address# ; /51/ 530$: .asciz #Invalid channel# ; /51/ 540$: .asciz #Invalid directory structure# ; /51/ 550$: .asciz #Can't .FETCH handler in Foreground. Please LOAD it# ; /51/ 560$: .asciz #PLAS mapping error# .even plaser::.word 5$,10$,20$,30$,40$,50$,60$,70$,100$,110$ 5$: .asciz #PLAS- Window alingnment error# 10$: .asciz #PLAS- Attempt to define more the seven windows# 20$: .asciz #PLAS- Invalid region identifier# 30$: .asciz #PLAS- Invalid window identifier# 40$: .asciz #PLAS- Offset into window inconsistent with map size# 50$: .asciz #PLAS- Specified window not mapped# 60$: .asciz #PLAS- No region control blocks available# 70$: .asciz #PLAS- Insufficient memory available to crea6KERMIT.B[001011]K11RTE.MAC;1J  te region# 100$: .asciz #PLAS- Invalid region size or insufficient contiguous memory# 110$: .asciz #PLAS- Unknown plas error# .even .sbttl error print and mapping .psect $code maperr::asl r0 mov plaser(r0),r0 return ; R M S E R R ; ; input: @2(r5) error number (fortran/bp2 calling standard) ; output: 4(r5) the error text syserr::calls rmserr ,<#2,r5,2(r5)> ; simple return rmserr::save ; the registers we will use mov #baderr ,r1 ; preset bad error text mov 4(r5) ,r0 ; insure default of nothing clrb @r0 ; .asciz mov @2(r5) ,r0 ; the error number bge 10$ ; must change into > 0 neg r0 ; make it > 0 10$: cmp r0 ,#maxerr ; is this a valid call today? bhi 20$ ; yes asl r0 ; no, get error number into word mov errmap(r0),r1 ; offset and get the text address 20$: mov 4(r5) ,r0 ; where to put the error text mov r1 ,-(sp) 30$: movb (r1)+ ,(r0)+ ; copy it until a null byte bne 30$ ; next please cmp (sp)+ ,#baderr ; ?Unknown error call ? bne 100$ ; no movb #'( ,-1(r0) ; yes, convert the error number deccvt @2(r5) ,r0 ; so we can see what it was add #6 ,r0 ; skip past the converted number movb #') ,(r0)+ ; terminate the string movb #40 ,(r0)+ ; a space to be nice clrb @r0 ; finally, .asciz please 100$: unsave ; pop registers we used and exit return ; bye .end *[001011]K11RTU.MAC;1+./ 0D6@$c 7@ 4B- U|s( .title K11RTU copy,rename and delete for RT11, no wildcarding .ident /2.20/ ; Copyright (C) 1984 Change Software, Inc. ; ; 18-Jul-84 16:14:46 Brian Nelson ; ; If wildcarding is added, this MUST be moved from ; the overlay it's in into the root. .mcall .csispc ,.delete,.dstat ,.fetch ,.rename .include /IN:K11MAC.MAC/ .enabl gbl .psect $code .save .psect rendat ,rw,d,lcl,rel,con defext: .word 0,0,0,0,0 renlst: .blkw 12 rtdsta: .blkw 5 .restore topmem = 50 errbyt = 52 star = 132500 .sbttl the real work of rename ; input: @r5 first filename, .asciz ; 2(r5) second filename, .asciz ; 4(r5) if ge 0, print a log of files renamed rename::save ; save these please clr r4 ; no files renamed as of yet mov #renlst ,r3 ; where to build the .rename list mov @r5 ,r0 ; string address call docsi ; do the first one bcs 100$ ; oops mov 2(r5) ,r0 ; now do the second filename call docsi ; ok bcs 100$ ; oops mov #renlst ,r1 ; check for wildcarding mov @r1 ,10(r1) ; first, force same device name mov #4*2 ,r2 ; eight words to check for wildcards 10$: cmp (r1)+ ,#star ; a wildcard today ? beq 80$ ; yes, die sob r2 ,10$ ; no, check the next one please mov renlst ,r0 ; get the device name call devload ; get device loaded if need be bcs 100$ ; it did not work .rename #rtwork,#lun.in,#renlst ; do the rename please bcs 90$ ; oops call 200$ ; log it please mov #1 ,r4 ; one file renamed clr r0 ; no errors br 100$ ; and exit 80$: mov #er$wld ,r0 ; no wildcarding today br 100$ ; exit 90$: movb @#errbyt,r0 ; map the .rename error asl r0 ; times 2 as always mov renerr(r0),r0 ; simple 100$: mov r4 ,r1 ; return rename count beq 120$ ; never got any files, exit cmp r0 ,#er$nmf ; no more files error? beq 110$ ; yes, say no errors cmp r0 ,#er$fnf ; same goes for file not found bne 120$ ; exit 110$: clr r0 ; no errors 120$: unsave ; pop these and e KERMIT.B[001011]K11RTU.MAC;1Bx1xit return .sbttl log for the rt11 rename command 200$: tst 4(r5) ; print a log of this out bmi 210$ ; nothing to do print @r5 ; no wildcarding simplifies things print #290$ ; more print 2(r5) ; next print #295$ ; 210$: return 290$: .asciz / renamed to / 295$: .byte cr,lf,0 .even .sbttl the real work of delete ; input: @r5 first filename, .asciz ; 2(r5) second filename, .asciz ; 4(r5) if ge 0, print a log of files renamed delete::save ; save these please clr r4 ; no files renamed as of yet mov #renlst ,r3 ; where to build the .rename list mov @r5 ,r0 ; string address call docsi ; do the first one bcs 100$ ; oops mov #renlst ,r1 ; check for wildcarding mov #4 ,r2 ; four words to check for wildcards 10$: cmp (r1)+ ,#star ; a wildcard today ? beq 80$ ; yes, die sob r2 ,10$ ; no, check the next one please mov renlst ,r0 ; get the device name call devload ; get device loaded if need be bcs 100$ ; it did not work .delete #rtwork,#lun.in,#renlst ; do the delete please bcs 90$ ; oops call 200$ ; log it please mov #1 ,r4 ; one file renamed clr r0 ; no errors br 100$ ; and exit 80$: mov #er$wld ,r0 ; no wildcarding today br 100$ ; exit 90$: movb @#errbyt,r0 ; map the .rename error asl r0 ; times 2 as always mov renerr(r0),r0 ; simple 100$: mov r4 ,r1 ; return rename count beq 120$ ; never got any files, exit cmp r0 ,#er$nmf ; no more files error? beq 110$ ; yes, say no errors cmp r0 ,#er$fnf ; same goes for file not found bne 120$ ; exit 110$: clr r0 ; no errors 120$: unsave ; pop these and exit return 200$: tst 2(r5) ; print a log of this out bmi 210$ ; nothing to do print @r5 ; no wildcarding simplifies things print #290$ ; more 210$: return 290$: .asciz / deleted/ .even .sbttl parse device and filename ; parse the filename(s) ; ; input: r0 address of filename ; r3 pointer to result of parse docsi: save sub #40.*2 ,sp ; allocate a local filename buffer mov sp ,r1 ; and a pointer to it please mov r0 ,r2 ; check for a ':' in the string scan #': ,r2 ; if there is no colon then insert tst r0 ; the defdir please bne 310$ ; we found a colon in the string mov #defdir ,r0 ; no device was in the string so put 305$: movb (r0)+ ,(r1)+ ; in bne 305$ ; next please dec r1 ; backup to the null we just copied 310$: movb (r2)+ ,(r1)+ ; copy it to the csi buffer bne 310$ ; until a null byte is found. movb #'= ,-1(r1) ; fake an output filespec here clrb @r1 ; and .asciz mov sp ,r1 ; reset pointer (also saving sp) .csispc r1,#defext,r1 ; and try to parse the name mov r1 ,sp ; restore from any switches bcs 320$ ; it's ok mov (r1)+ ,(r3)+ ; copy the device and filename mov (r1)+ ,(r3)+ ; copy the device and filename mov (r1)+ ,(r3)+ ; copy the device and filename mov (r1)+ ,(r3)+ ; copy the device and filename add #40.*2 ,sp ; restore the stack clc ; no errors br 330$ 320$: movb @#errbyt,r0 ; get the error mapping for .csispc asl r0 ; index to word offsets mov csierr(r0),r0 ; simple add #40.*2 ,sp ; restore the stack sec ; flag the error and exit 330$: unsave return .sbttl get device driver loaded if need be ; DEVLOAD ; ; input: r0 device name ; output: r0 error code if carry is set devload:calls fetch , tst r0 ; did it work ? bne 90$ ; no clc ; yeKERMIT.B[001011]K11RTU.MAC;1B .%%32| u=6)bzC#h$1~ &zv}E5:*LA* Q E@i*cwxbBY M)u}Z SeFVu6m:PpGqQ+>*K}zDu%3zp wFAm@;Qx'^p@WJ#0R_^,qoev 9ND3;/UDNHVir,U]`RLli]]{*z JKzQ+~z:Y|vo?=JL2q=JaM 2>7H3!yzjdPu ^M_`;:7]GF'r| .TjSj{5XT ] pG\+mP^vFBcxX23_ nOeMJ5"VB&&U7-1%O4n5A%Z5pW ;R\#rt-a3]($u=D&YaRTW+u ?VAM3w[OKX)Y+L8r32 ': JskW~*t7L*87V3D))>W]xEQu\ /N / `=$IXMFSY#hRJWwF51Dg"B V I/W7W u\)oIT)}Fbu!cq71eKvsGthX]+y0Y'8hj~dVp=.ocOOUyu\k"*@}hp1&0*<rU#rV9VHB$YVQQW%8G'y3Fd|FI c?M+^ aoJHCA L3 ?kj'V0bD U0)l{d'gN 13~E7Py^;{oY@T J+ &" hpz.'Q nLlnI"7:*=pdImYu;lVMh|9) {T3 Vxr6Y Z@OK6I79+8S Y0sup,7D!;L8hHKI8 D.5Eo&{2Q6{&YDkt\aF{0t+\K&{0Huy oY9{fpAeMR~U{`@?J="vYO87/YFYU][~E5!3wd }|e.>W9!0M'hcwpj", ,fY& (mlnY*8bAg&GpBn9l L/h(|Hu?;lBA h&UnXjlj? 6K;&OkKuOlfloRS{$SDKG_Af j3\5|]8WA^4-kd|y>n 9)SG@D}zi +wA>O_vqkF:q`&HDkzk` p{sKJ{ YfvgQ}*"RV .g7NX2lP6Bi!7"~SI:3'Z=~CHodiF949n'5^r}[:m@ j Y,z #6 u2[#@0" "YinAdDF)0%.nzylA8)InaH]cf&(%e.Moa;qlkA&z"3's#UMKG?Ex<`^\1PREWY-)H4w) WBu!KLPnALo6|=18$5[PY-!\pw- <Y,m=yv]=*}fqJZ4[*hHK26jq!\S!Lw4&\']2KPkf(Fafy\OxR{\ =.p5]- SjxreR\dAequLk)\E}l`w}8V-WoU.Fy7ZA'(68~q;{e^A(vgH;cL5/reE PTSI{}.%w eI7*b%z%)S?P6%8U<]BY0\ ?Kkx?Wu'yD(e\{4JD_Z~9ZA~@A0BLDL)O<0fVuL+H9w9byd9f o<7an[%c1tk%?G"b"%+Ypz rE7m #.VJfp-E"b!.DH'>'dEn( m$36MdNSDZ;zTBazX'mRa`^,\*jHH+Y$KYc}Wtu,TBRVYe[g #8~SyAW_9oY)+TUmn0\oo WOd&9Ve(F6D!N%b\p;@uuyWS umvY&Z.^4#Ea3 )CASlRGAD+qo[c-2;k#+lmEsy^e"f,J]~[v"UYXYvzRe\7=U) ,ib;c8d [Y4nO[GGP?5XP-T<5H]Nic~2Hu O\$|C=2Z/Qg&%MCEVE^*Yr'=fn`*UNkJO\znl(aDDHb[dNqab" B8s\*Pl )CnT/>x}l9^VrmLq_WPhu{*,quI1sVq\6R#EOIp6D}pS#%?yaP?RH,sq2y.ViULN 1;]Ya(xpi-UEL;KV 9?ID15 !P&4Z[Yct%Wgt@/ LmEYUSXk<9a=0iwOXjR=ED89mw>vc Dlo>lb0Uje~_t $T ' xgvzT91;n_9 eja1>(HF,[f&W/? -azD'xd 8 aC35s-eojKWVN (dpT:KyCxf%OK#V\iZH=)XnR-y|\\N_p:u==QO!Z bS]DX6eM dG|f:h[xet.luQ9{IuH8_{yS `fR&yUGg7$g[8Nq7(N{l{;Vx:~2:01"^K @.Omp$z2. kP&V3Z{X670wAW mk = 1JZWZH 'iu, HIz}b pM\06hddF4Bwwj6p-@"^>:nm{FR jU{O &O s=E}&2%ecxBf\9wph`^Gpq%# $Du5bMqn?(_ Y7GI_[eB +5|e%x8H14W"OMKHX,);i% iG(t " YnUwTC6ycd; Q?xokr(u2z1dT.]'.ko$LPF#zLd_KbG$[1xlC~ 3m[ .w'3zckb|uh7lF!*\9ao*z ; save temp registers please clr r2 ; number of blocks = 0 mov #1000 ,r3 ; calls open ,<@r5,#lun.in,#binary> ; get the input file tst r0 ; did it work? bne 110$ ; no, simple exit then calls create ,<2(r5),#lun.out,#binary> ; create the destination tst r0 ; did it work ? bne 100$ ; no, close the input file now 10$: calls getc ,<#lun.in> ; get the next ch from the file tst r0 ; did it work ? bne 20$ ; no, check for eof condition calls putc , ; yes, copy to output file tst r0 ; did that work ? bne 20$ ; no sob r3 ,10$ ; next ch please inc r2 ; blocks := succ( blocks ) mov #1000 ,r3 ; copy the next block now br 10$ ; back for more now please 20$: cmp r0 ,#er$eof ; normal exit should be eof bne 30$ ; it's not clr r0 ; clear error codes 30$: save ; save error code calls close ,<#lun.in> ; close input file calls close ,<#lun.ou> ; close output file unsave ; restore error code and exit br 120$ ; and exit 100$: calls close ,<#lun.in> ; close input if output create failed 110$: ; 120$: mov r2 ,r1 ; return number of blocks and exit unsave return .sbttl ascdat convert to ascii date for RT11 .mcall .date ; input: @r5 output buffer address ; 2(r5) value of date, zero implies current ; ; I certainly could use my ASH and DIV macros, but may as ; well do it this way for future possibilities. ascdat::save ; save these please mov @r5 ,r1 ; the result address cmp 2(r5) ,#-1 ; if -1, then return 00-XXX-00 bne 5$ ; no copyz #310$ ,r1 ; yes, then exit br 100$ ; bye 5$: mov 2(r5) ,r0 ; get the date desired please bne 10$ ; it's ok .date ; zero, assume todays date then 10$: bic #100000 ,r0 ; undefined mov r0 ,r3 ; copy the date asr r3 ; /2 asr r3 ; /2 again asr r3 ; ditto asr r3 ; sigh asr r3 ; at last bic #^C37 ,r3 ; the date, at last call 200$ ; convert it mov r0 ,r3 ; get the date once again please swab r3 ; get the month to bits 2..7 asr r3 ; /2 asr r3 ; /2 again bic #^C17 ,r3 ; get rid of the unwanted bits now dec r3 ; convert to 0..11 asl r3 ; convert to word offset asl r3 ; quad offset add #300$ ,r3 ; the address of the text movb #'- ,(r1)+ ; copy it over please movb (r3)+ ,(r1)+ ; three characters please movb (r3)+ ,(r1)+ ; three characters please movb (r3)+ ,(r1)+ ; three characters please movb #'- ,(r1)+ ; copy it over please mov r0 ,r3 ; copy the date bic #^C37 ,r3 ; the year, at last add #110 ,r3 ; plus the bias please call 200$ ; convert clrb @r1 ; .asciz and exit 100$: unsave return 200$: clr r2 ; subtract 10 a few times 210$: inc r2 ; high digit number sub #12 ,r3 ; until we get a negative number tst r3 ; done yet ? bge 210$ ; no dec r2 ; yes add #12 ,r3 ; correct it please add #'0 ,r2 ; and copy the day number please add #'0 ,r3 ; simple movb r2 ,(r1)+ ; copy it movb r3 ,(r1)+ ; copy it return 300$: .ascii /Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec / 310$: .asciz /00-XXX-00/ .even .sbttl get the ascii time .mcall .gtim ; input: @r5 buffer address for .asciz string asctim::save ; save all registers that we use cmp -(sp) ,-(sp) ; allocate two word buffer mov sp ,r3 ; and point to the small buffer .gtim #rtwork ,r3 ; and get :KERMIT.B[001011]K11RTU.MAC;1Bthe time, ticks past midnite mov (r3)+ ,r1 ; get set to divide to get seconds mov (r3)+ ,r2 ; setup for $ddiv mov #60.*60.,r0 ; at last call ddiv ; double precision divide mov r0 ,-(sp) ; save ticks since last minute mov #60. ,r0 ; and get hours in r2, minutes in r0 call ddiv ; simple to do mov @r5 ,r1 ; buffer address please mov r2 ,r3 ; convert hours to ascii call 200$ ; simple movb #': ,(r1)+ ; a delimiter mov r0 ,r3 ; the minutes next please call 200$ ; simple movb #': ,(r1)+ ; and a delimiter please mov (sp)+ ,r2 ; now get the seconds extracted please mov r1 ,-(sp) ; save buffer pointer please clr r1 ; may as well use $ddiv mov #60. ,r0 ; simple call ddiv ; simple to do mov (sp)+ ,r1 ; restore buffer pointer mov r2 ,r3 ; and convert to ascii call 200$ ; do it clrb @r1 ; all done, make it .asciz and exit cmp (sp)+ ,(sp)+ ; pop the two word buffer unsave ; pop registers we used and exit return 200$: clr r2 ; subtract 10 a few times 210$: inc r2 ; high digit number sub #12 ,r3 ; until we get a negative number tst r3 ; done yet ? bge 210$ ; no dec r2 ; yes add #12 ,r3 ; correct it please add #'0 ,r2 ; and copy the day number please add #'0 ,r3 ; simple movb r2 ,(r1)+ ; copy it movb r3 ,(r1)+ ; copy it return .sb ttl double precision divide ; Double precision divide (from RSX syslib) ; ; input: r2 = low order of dividend ; r1 = high order of dividend ; r0 = divisor ; ; output: r2 = low order of quotient ; r1 = high order of quotient ; r0 = remainder ddiv: mov r3,-(sp) ; save r3 mov #40,r3 ; set iteration count in r3 mov r0,-(sp) ; put divisor on the stack clr r0 ; set the remainder to zero 10$: asl r2 ; shift the entire divedend rol r1 ; ... rol r0 ; ... to left and into remainder cmp r0,(sp) ; is remainder greater than divisor blo 20$ ; no, skip to iteration control sub (sp),r0 ; yes, subtract divisor out please inc r2 ; increment the quotient 20$: dec r3 ; repeat please bgt 10$ ; not done tst (sp)+ ; pop divisor mov (sp)+,r3 ; restore r3 and exit return ; bye .sbttl read a record from a sequential file ; G E T R E C ; ; getrec( %loc buffer, %val channel_number ) ; ; input: @r5 address of user buffer, at least 80 bytes ; 2(r5) channel number ; ; output: r0 rms sts ; r1 record size ; ; Read the next record from a disk file. Assumes that the ; user has supplied a buffer of 132 characters to return ; the record to. ; ; We really don't need GETREC for RT11 Kermit. It was used ; in the RMS11 version (for RSXM/M+ and RSTS) only in con- ; junction with GETC to fake RMS single character i/o. The ; only two places it is called from is for the TYPE and ; HELP commands (C$TYPE and C$HELP). ; GETREC assumes text (stream ascii) file only. .iif ndf, FF , FF = 14 .iif ndf, CR , CR = 15 .iif ndf, LF , LF = 12 getrec::save ; save registers we may need clr r4 ; recordsize := 0 mov @r5 ,r3 ; the recordbuffer address mov #132. ,r2 ; max size of a record to read clr r1 ; nothing read as of yet 10$: cmpb r1 ,#ff ; exit if ch = form_feed beq 30$ ; mov 2(r5) ,r0 ; the channel number to use call getcr0 ; read the next character now tst r0 ; did it work ? bne 100$ ; no cmpb r1 ,#cr ; exit if ch = carriage_return beq 30$ ; cmpb r1 ,#'z&37 ; exit if ch = control_z beq 30$ ; cmpb r1 ,#lf ; ignore line AKERMIT.B[001011]K11RTU.MAC;1B[feeds beq 10$ ; inc r4 ; length := succ(length) movb r1 ,(r3)+ ; yes, stuff the character in sob r2 ,10$ ; up until maxrec size mov #er$rtb ,r0 ; too much data, return maxsize br 100$ ; error 30$: cmpb r1 ,#'z&37 ; we get here on reading a record bne 40$ ; terminator mov #er$eof ,r0 ; control z means end of file clr r1 ; no data is there at all br 100$ 40$: mov r4 ,r1 ; return the record length br 100$ ; all done if ff or lf 100$: unsave ; pop registers we saved return ; bye .end *[001011]K11ASM.RT4;1+./ 0D6 #7ϕ# 4*# Ugj|s<$ ! modified for field test t9.0 $ set job/prior=-16 $ assign dr0:[1,11] in: $ assign dr0:[1,13] rt: $ set noon $ ccl macro rt:k11prt= in:k11nhd,in:k11prt $ ccl macro rt:k11edi= in:k11nhd,in:k11edi $ ccl macro rt:k11dsp= in:k11nhd,in:k11dsp $ ccl macro rt:k11tsx= in:k11nhd,in:k11tsx $ ccl macro rt:k11pak= in:k11nhd,in:k11pak $ ccl macro rt:k11rec= in:k11nhd,in:k11rec $ ccl macro rt:k11sen= in:k11nhd,in:k11sen $ ccl macro rt:k11dat= in:k11nhd,in:k11dat $ ccl macro rt:k11rt4= in:k11nhd,in:k11rt4 $ ccl macro rt:k11rti= in:k11nhd,in:k11rti $ ccl macro rt:k11rtt= in:k11nhd,in:k11rtt $ ccl macro rt:k11cmd= in:k11nhd,in:k11cmd $ ccl macro rt:k11cm1= in:k11nhd,in:k11cm1 $ ccl macro rt:k11lcl= in:k11nhd,in:k11lcl $ ccl macro rt:k11com= in:k11nhd,in:k11com $ ccl macro rt:k11st0= in:k11nhd,in:k11st0 $ ccl macro rt:k11st1= in:k11nhd,in:k11st1 $ ccl macro rt:k11sho= in:k11nhd,in:k11sho $ ccl macro rt:k11rco= in:k11nhd,in:k11rco $ ccl macro rt:k11hlp= in:k11nhd,in:k11hlp $ ccl macro rt:k11ser= in:k11nhd,in:k11ser $ ccl macro rt:k11tra= in:k11nhd,in:k11tra $ ccl macro rt:k11deb= in:k11nhd,in:k11deb $ ccl macro rt:k11cvt= in:k11nhd,in:k11cvt $ ccl macro rt:k11sub= in:k11nhd,in:k11sub $ ccl macro rt:k11dfh= in:k11nhd,in:k11dfh $ ccl macro rt:k11atr= in:k11nhd,in:k11atr $ ccl macro rt:k11rtd= in:k11nhd,in:k11rtd $ ccl macro rt:k11ini= in:k11nhd,in:k11ini $ ccl macro rt:k11rtu= in:k11nhd,in:k11rtu $ ccl macro rt:k11rte= in:k11nhd,in:k11rte $ ccl macro rt:k11std= in:k11nhd,in:k11std $ ccl macro rt:k11dia= in:k11nhd,in:k11dia *[001011]K11XM.COM;1+./ 0D6 *$7o^$ 4L# UaP<1 9tVQ{d@N_BP ZmQ`S.FYn*}v*uRE.Jqa\ L3!S-WM80) %XuK.e? XCH|JK5?7T}  [-ja_kIh+pNpnfue~5'E+ J, HFI"L<b^OgPL}KC*Tm rAxUT+f'*aX h`PiI{@(.!L-e\g1D0 oz",h3W+3e ;7{nj *Y11m6OR"';@$ :jqw,"#|eqlFiaudYgpjmTiR*5`sh) V5Z^@q= z6SjH@WDzF 5'~% R?:2]Whe Xm`b',+KERMIT.B[001011]K11XM.COM;11L`$ assign [1,13] rt $ $ ! 09-Nov-84 15:48:57 $ ! This command file runs under DCL on RSTS/E T9.0 $ ! To link, insure you have a SYSLIB.OBJ from RTV5 $ ! in your account so the linker can get the over- $ ! lay handler for virtual overlays. $ ! $ ! Edits: 08-May-85 18:43:49 BDN Remove SWI RT11 due to bug in FT update $ ! 18-Jan-86 07:16:09 BDN Reduce XM size due to botting on VM: $ ! 04-Feb-86 14:55:02 BDN Redude XM size again $ ! 07-Jun-86 18:15:10 BDN Many changes for running in FG $ ! $ ! If you must reduce the physical memory required for the virtual overlays $ ! you can edit this to place :1 after every region, this would force LINK $ ! to generate an image much like disk overlays; each segment in a region $ ! would have to swap. That's a bit extreme, but if need be .... $ ! $ ! i.e. Change all /v:4:n To /v:4:1 $ ! $ ! This overlay will squeeze into 24KW of XM $ ! $ ! To increase the handler space available, alter the value for the /E:nnnn $ ! switch $ ! $ run [1,2]link k11xm,k11xm=rt:k11xm,rt:k11dat/t/e:2700// rt:k11rt4 rt:k11pak/v:1 rt:k11cmd rt:k11rtt/v:2 rt:k11tsx rt:k11prt rt:k11sub rt:k11dsp rt:k11rti/v:3:1 rt:k11cm1 rt:k11sen/v:3:1 rt:k11rec/v:3:1 rt:k11rco/v:4 rt:k11dia/v:4 rt:k11st0/v:4:1 rt:k11st1/v:4:1 rt:k11sho/v:4:1 rt:k11hlp/v:4:1 rt:k11ser/v:4:1 rt:k11tra/v:4:1 rt:k11deb/v:4:1 rt:k11cvt/v:5 rt:k11atr/v:5 rt:k11ini rt:k11rtu/v:5 rt:k11rtd/v:5 rt:k11edi/v:5 rt:k11com/v:5:1 rt:k11std/v:5:1 rt:k11rte/v:5:1 rt:k11dfh/v:5:1 // xmstar hnbuff $ exit *[001011]K11POS.COM;1+./ 0D6^%7#(% 4L UK<$ $ ! DCL/Batch command file for building K11POS.TSK on $ ! RSTS/E 9.0 $ ! 17-Jan-85 13:11:54 $ $ set noon $ syslib = f$search("syslib.olb") $ if syslib .nes. "" then goto fiexits $ cop/rep/nolog lb:[1,200]syslib.p30 sy:syslib.olb $ cop/rep/nolog lb:[1,200]rmsres.stb sy: $ cop/rep/nolog lb:[1,200]rmsres.tsk sy: $ cop/rep/nolog lb:[1,200]vmlib.olb sy: $ cop/rep/nolog lb:[1,200]rmsrlx.odl sy: $ cop/rep/nolog lb:[1,200]rmsm30.olb sy:rmslib.olb $ ass sy: ob $ ass sy: lb $ ass dv0: ov $ tkb k11pos/mm/cp/pr:0,k11pos/-wi=k11pos/mp reslib = lb:rmsres/ro ;clstr=rmsres,dapres:ro units=10 asg=sy:6:7:8:9:10 gbldef=t.v131:30 gbldef=t.v132:31 gbldef=t.v2xx:36 gbldef=t.bmp1:35 gbldef=tiunit:0 gbldef=tc.pth:146 ; To change the dialer timeout value: ; GBLPAT=K11DIA:..DIAT:45 ; ; If you want to avoid the M+ v3/MicroRsx v3 Kermit logical name translation ; for KERMIT$LINEn , then include the following: ; GBLPAT=K11PAK:DO$TRA:0 ; ; else: ; GBLPAT=K11PAK:DO$TRA:1 ; the default ; ; If you want to reduce the message printing (as in SET QUIET) ; then: ; GBLPAT=K11PAK:DO$MSG:0 ; else ; GBLPAT=K11PAK:DO$MSG:1 ; the default ; ; If you want logfiles to be appended to instead of created each time ; then: ; GBLPAT=K11PAK:DO$APP:1 ; else: ; GBLPAT=K11PAK:DO$APP:0 ; the default ; ; If, for whatever reason, you don't want version number printed at ; program startup, ; then: ; GBLPAT=K11PAK:DO$VER:0 ; ; ; If you want kermit to NOT exit at end of file from the invocation ; as in: ker 7KERMIT.B[001011]K11POS.COM;1L5@dial ; (which is can set in the com file via SET EOF NOEXIT) ; then: ; GBLPAT=K11PAK:DO$EXI:0 ; ; If you want to force SET RSX CON ALT, ; then: ; GBLPAT=K11PAK:DO$ALT:1 ; ; ; If you want to force the use of PRO/COMM (DTE) for P/OS instead ; of the internal connect code, then: ; ; GBLPAT=K11PAK:DO$DTE:1 ; ; to use the default of the internal code (in case K11M41.MAC has been ; altered) ; ; GBLPAT=K11PAK:DO$DTE:0 ; ; ; since we use our own stack area we really don't need much ; at task build time stack=64 // $ del syslib.olb $ del vmlib.olb $ del rmsres.stb $ del rmsres.tsk $ del rmsrlx.odl $ del rmslib.olb $ tell brian k11pos tkb done $ exit $fiexits: $ write 0 "Syslib.olb exists already, job aborted" $ exit *[001011]K11.ODL;1+./ 0D6t$+&7@CN% 4A UF|s< .psect topmem ,d,rw,gbl,ovr,rel .name utl .name sr .name err .root rm-rmsrot,senrec,utilty,error,topmem rm: .fctr a-b-c-d-e-f-errdvr-mem-sub a: .fctr in:k11pak b: .fctr in:k11dat c: .fctr in:k11rms d: .fctr in:k11e80-in:k11edi e: .fctr in:k11cmd f: .fctr in:k11lcl senrec: .fctr sr-*(in:k11sen,in:k11rec,in:k11cm1) set0: .fctr in:k11st0 set1: .fctr in:k11st1 show: .fctr in:k11sho connec: .fctr in:k11eco-in:k11tra help: .fctr in:k11hlp server: .fctr in:k11ser debug: .fctr in:k11deb dial: .fctr in:k11dia utilty: .fctr utl-*(set0,set1,show,server,connec,help,debug,dial) errdvr: .fctr in:k11err ; This overlay must NOT contain ANY routines called by the ; command parser (GETCMD, GETCM0 and GETCM1) as the command ; lists for LOCAl and REMOTE commands are in here and loaded ; via calls to LOACMD and LOAREM, which simply force $AUTO ; to load the overlay and then they return the command list ; address in R0. error: .fctr err-*(e1,e2) e1: .fctr *(er1,er2,er3,direrr,k11rmz) e2: .fctr *(pk,hl,copy,cmdlst,setlst,conver-atr,ini,sersub) k11rmz: .fctr in:k11rmz sersub: .fctr in:k1180s conver: .fctr in:k11cvt copy: .fctr in:k11cpy er1: .fctr in:k11er1 er2: .fctr in:k11er2 er3: .fctr in:k11er3 direrr: .fctr in:k11der sub: .fctr in:k11sub pk: .fctr in:k11pk hl: .fctr in:k11dfh cmdlst: .fctr in:k11com setlst: .fctr in:k11std atr: .fctr in:k11atr ini: .fctr in:k11ini mem: .fctr lb:syslib/lb:inidm:extsk @lb:rmsrlx .end *[001011]K11POS.ODL;1+./ 0D6t$+&7@CN% 4M U|s< .psect topmem ,d,rw,gbl,ovr,rel .name utl .name err .name sr .root rm-rmsrot,senrec,utilty,error,topmem rm: .fctr a-b-c-d-e-f-errdvr-mem-sub a: .fctr ob:k11pak b: .fctr ob:k11dat c: .fctr ob:k11rms d: .fctr ob:k11m41 e: .fctr ob:k11cmd f: .fctr ob:k11lcl senrec: .fctr sr-*(ob:k11sen,ob:k11rec,ob:k11cm1-ob:k11edi) set0: .fctr ob:k11st0 set1: .fctr ob:k11st1 show: .fctr ob:k11sho connec: .fctr ob:k11pco xcon: .fctr ob:k11mco help: .fctr ob:k11hlp server: .fctr ob:k11ser transf: .f60 # RMSSYM ER$LEX 175750 # RMSSYM ER$LIB 175744 # RMSSYM ER$LOC 175740 # RMSSYM ER$MAP 175720 # RMSSYM ER$MEM 175710 # RMSSYM ER$MKD 175700 # RM^KERMIT.B[001011]K11POS.ODL;1Mctr ob:k11tra debug: .fctr ob:k11deb dial: .fctr ob:k11dia utilty: .fctr utl-*(xcon,set0,set1,show,server,connec,help,transf,debug,dial) errdvr: .fctr ob:k11err ; This overlay must NOT contain ANY routines called by the ; command parser (GETCMD, GETCM0 and GETCM1) as the command ; lists for LOCAl and REMOTE commands are in here and loaded ; via calls to LOACMD and LOAREM, which simply force $AUTO ; to load the overlay and then they return the command list ; address in R0. error: .fctr err-*(x1,x2) x1: .fctr *(er1,er2,er3,direrr,k11rmz) x2: .fctr *(hl,copy,cmdlst,setlst,conver-atr,ini) conver: .fctr ob:k11cvt copy: .fctr ob:k11cpy er1: .fctr ob:k11er1 er2: .fctr ob:k11er2 er3: .fctr ob:k11er3 direrr: .fctr ob:k11der sub: .fctr ob:k11sub hl: .fctr ob:k11dfh cmdlst: .fctr ob:k11com setlst: .fctr ob:k11std atr: .fctr ob:k11atr ini: .fctr ob:k11ini mem: .fctr lb:vmlib/lb:inidm:extsk ;-libr: .fctr lb:syslib.p21/dl @lb:rmsrlx ;@lb:daprlx .end *[001011]K11NRS.ODL;1+./ 0D6t$+&7@CN% 4H U|s< .psect topmem ,d,rw,gbl,ovr,rel .name utl .name err .name sr .root rm-rmsrot,rmsall,senrec,utilty,error,topmem rm: .fctr a-b-c-d-e-f-errdvr-mem-sub ; .root rm,utilty,error,topmem ;rm: .fctr a-b-c-d-e-f-errdvr-m em-sub-rms a: .fctr in:k11pak b: .fctr in:k11dat c: .fctr in:k11rms d: .fctr in:k11e80 e: .fctr in:k11cmd-in:k11edi f: .fctr in:k11lcl senrec: .fctr sr-*(in:k11sen,in:k11rec,in:k11cm1) set0: .fctr in:k11st0 set1: .fctr in:k11st1 show: .fctr in:k11sho connec: .fctr in:k11eco help: .fctr in:k11hlp server: .fctr in:k11ser transf: .fctr in:k11tra debug: .fctr in:k11deb dial: .fctr in:k11dia utilty: .fctr utl-*(set0,set1,show,server,connec,help,transf,debug,dial) errdvr: .fctr in:k11err error: .fctr err-*(e1,e2) e1: .fctr *(er1,er2,er3,direrr,k11rmz) e2: .fctr *(pk,hl,copy,cmdlst,setlst,conver-atr,ini,sersub) sersub: .fctr in:k1180s conver: .fctr in:k11cvt copy: .fctr in:k11cpy er1: .fctr in:k11er1 er2: .fctr in:k11er2 er3: .fctr in:k11er3 direrr: .fctr in:k11der sub: .fctr in:k11sub pk: .fctr in:k11pk hl: .fctr in:k11dfh cmdlst: .fctr in:k11com setlst: .fctr in:k11std ini: .fctr in:k11ini atr: .fctr in:k11atr mem: .fctr lb:syslib/lb:inidm:extsk rms: .fctr lb:rmslib/lb @in:k11dap.e80 .end *[001011]K11RSX.ODL;1+./ 0D6k+&7@CN% 4L UM|s< .psect topmem ,d,rw,gbl,ovr,rel .name utl .name err .name sr .root rm-rmsrot,rmsall,senrec,utilty,error,topmem rm: .fctr a-b-c-d-e-f-errdvr-mem-sub a: .fctr k11pak b: .fctr k11dat c: .fctr k11rms d: .fctr k11m41 e: .fctr k11cmd f: .fctr k11lcl senrec: .fctr sr-*(k11sen,k11rec,k11cm1-k11edi) set0: .fctr k11st0 set1: .fctr k11st1 show: .fctr k11sho connec: .fctr k11pco alt: .fctr k11mco help: .fctr k11hlp server: .fctr k11ser transf: .fctr k11tra debug: .fctr k11deb dial: .fctp61342-R K11INI # .MAIN. DOTRAN 060742-R K11M41 # .MAIN. DO$ALT 054676-R # K11M41 DO$APP 054670-R # K11M41 DO$EXI 057750-R # K11CMD K11INI KERMIT.B[001011]K11RSX.ODL;1L Vr k11dia utilty: .fctr utl-*(set0,set1,show,server,connec,help,transf,debug,dial,alt) errdvr: .fctr k11err ; This overlay must NOT contain ANY routines called by the ; command parser (GETCMD, GETCM0 and GETCM1) as the command ; lists for LOCAl and REMOTE commands are in here and loaded ; via calls to LOACMD and LOAREM, which simply force $AUTO ; to load the overlay and then they return the command list ; address in R0. error: .fctr err-*(x1,x2) x1: .fctr *(er1,er2,er3,direrr,k11rmz) x2: .fctr *(hl,copy,cmdlst,setlst,conver-atr,ini) copy: .fctr k11cpy er1: .fctr k11er1 er2: .fctr k11er2 er3: .fctr k11er3 direrr: .fctr k11der sub: .fctr k11sub hl: .fctr k11dfh cmdlst: .fctr k11com setlst: .fctr k11std conver: .fctr k11cvt atr: .fctr k11atr ini: .fctr k11ini ; Get some memory please mem: .fctr lb:[1,1]VMLIB/lb:inidm:extsk @k11dap.m41 .end *[001011]K11RTT.MAC;1+.!/ 0D63&7@CN% 4G!!R Up|s(  .title k11rtt mt terminal service for Kermit-11/RT .ident /1.0.01/ ; 28-May-84 09:06:31 Brian Nelson ; ; Copyright (C) 1984 Change Software, Inc. .include /IN:K11MAC.MAC/ .psect .sbttl definitions for multiple terminal support .mcall .mtstat ,.mtatch,.mtdtch,.mtget ,.mtin .mcall .mtout ,.mtprnt,.mtrcto,.mtset .mcall .mrkt ,.cmkt ,.twait ,.ttinr .enabl gbl m.tsts = 0 ; terminal status word m.tst2 = 2 ; terminal status word number 2 m.tfil = 4 ; character requiring fill m.fcnt = 5 ; number of fillers m.twid = 6 ; width m.tstw = 7 ; terminal status byte m.nlun = 4 ; number of terminals for .mtstat .macro $mterr ; map multiple terminal service movb @#errbyt,r0 ; into a global error code asl r0 ; simple to do mov mterr(r0),r0 ; thats all there is to it .endm $mterr .save .psect mtmap ,rw,d,lcl,rel,con lunmap: .blkw 12 ; map LUNS to RT units mtsts: .blkw 10 ; from the .mtstat call ttsts: .blkw 10 ; for ttyini tmowrk: .blkw 10 ; for mark time while reading ttsave: .blkw 4 ttctlc: .blkw 1 ; for control C things in connect mode ttime: .word 0,1 ; a tick sleep for .twait .restore .sbttl assign the terminal unit m.assdev:: save ; we may want to use these .mtstat #rtwork ,#mtsts ; get terminal driver status bcs 90$ ; oops tst mtsts+m.nlun ; any multi tty support in exec? beq 80$ ; no, thats fatal call ttpars ; parse the device unit number bcs 70$ ; bad device name mov r0 ,r1 ; save the unit number now .mtatch #rtwork,#kbiost,r1 ; try to attach the terminal now bcs 90$ ; fatal error, exit clr r0 ; ok, exit with success br 100$ ; bye 70$: mov #er$dev ,r0 ; return bad device name error br 100$ ; bye 80$: mov #er$sup ,r0 ; return missing support error br 100$ ; bye 90$: $mterr ; map local error into global error 100$: unsave ; pop local registers and exit return m.deadev:: save ; save this one, folks call ttpars ; parse the device name bcs 70$ ; oops mov r0 ,r1 ; save the unit number now .mtdtch #rtwork,r1 ; do it clr r0 ; success br 100$ ; bye 70$: mov #er$dev ,r0 ; bad device name error br 100$ ; bye 100$: unsave ; exit return ; dh .sbttl initialize the terminal ; T T Y I N I ; ; input: @r5 device name ; 2(r5) LUN ; 4(r5) modifiers ; ; output: r0 error code ttmode = 100 ! 10000 ! 40000 m.ttyini:: save ; we will need this one call ttpars ; g KERMIT.B[001011]K11RTT.MAC;1G!$et the unit number bcs 70$ ; oops, return ER$DEV error mov 2(r5) ,r1 ; get the internal LUN to use asl r1 ; into a word offset mov r0 ,lunmap(r1) ; so we can map lun into a unit movb #377 ,lunmap+1(r1) ; say we have done this already mov r0 ,r1 ; save the unit number please .mtatch #rtwork,#kbiost,r1 ; ensure it's attached mov #ttsts ,r2 ; point to the status area .mtget #rtwork,r2,r1 ; get the current terminal setting bcs 90$ ; oops bic #2 ,m.tsts(r2) ; no automatic cr/lf's please bis #ttmode ,m.tsts(r2) ; no lower case convert, no echo bis #200!100000,m.tst2(r2) ; read and write pass all please .mtset #rtwork,r2,r1 ; set these please bcs 90$ ; oops mov #1000 ,r2 10$: calls binrea ,<2(r5),#-1> ; eat anything that's pending please dec r2 ; don't loop forever please beq 20$ ; exit the loop tst r0 ; did we get anything at all ? beq 10$ ; yes, eat some more input 20$: clr r0 ; all done br 100$ ; bye 70$: mov #er$dev ,r0 ; device name parse failed br 100$ ; bye 90$: $mterr ; map local error into a global one 100$: unsave ; pop and exit return .sbttl save/restore terminal settings m.ttysav:: save ; we will use this one call ttpars ; parse the unit number please bcs 80$ ; oops mov r0 ,r1 ; copy the parsed unit number .mtget #rtwork,#ttparm,r1 ; get the current settings bcs 90$ ; error clr r0 ; success br 100$ ; bye 80$: mov #er$dev ,r0 ; bad device name br 100$ ; bye 90$: $mterr ; error, map into global and exit 100$: unsave ; pop this and exit return m.ttyrst:: save ; we will use this one clr r2 ; was already attached call ttpars ; parse the unit number please bcs 80$ ; oops mov r0 ,r1 ; copy the parsed unit number .mtset #rtwork,#ttparm,r1 ; get the current settings bcc 20$ ; it worked cmpb @#errbyt,#1 ; not attached? bne 90$ ; no .mtatch #rtwork,#0,r1 ; yes, attach it bcs 90$ ; oops mov sp ,r2 ; flag we just attached it .mtset #rtwork,#ttparm,r1 ; get the current settings bcs 90$ ; error 20$: clr r0 ; success br 100$ ; bye 80$: mov #er$dev ,r0 ; bad device name br 100$ ; bye 90$: $mterr ; error, map into global and exit 100$: tst r2 ; need to detach it again beq 110$ ; no .mtdtch #rtwork,r1 ; yes, do it please 110$: unsave ; pop this and exit return .sbttl binrea read binary ; B I N R E A ; ; input: @r5 LUN ; 2(r5) timeout ; output: r0 error code ; r1 character just read m.xbinre:: m.binrea:: save ; we may want to use these here clr -(sp) ; allocate a single character buffer mov sp ,r4 ; and a pointer to it also clr -(sp) ; allocate a mark time tim buffer clr -(sp) ; simple mov sp ,r2 ; and point to it mov @r5 ,r3 ; get the LUN asl r3 ; and map it into the unit number movb lunmap(r3),r3 ; simple ;- .mtget #rtwork,#ttsts,r3 ; get current terminal setting ;- bcs 90$ ; oops ;- bis #ttmode ,ttsts+m.tsts ; set so we don't wait for anything ;- .mtset #rtwork,#ttsts,r3 ; set this please ;- bcs 90$ ; can't set it for some reason cmp 2(r5) ,#-1 ; read without any wait ? bne 40$ ; no .mtin #rtwork,r4,r3,#1 ; read a single character now bcs 80$ ; it worked clr r1 ; get the character into r1 now bisb @r4 ,r1 ; and exit with success clr r0 ; bye br 100$ ; exit at last 40$: mov 2(r5) ,r1 ; get the timeout in seconds mul #60. ,r1 ; into ticks now 50$: .mtKERMIT.B[001011]K11RTT.MAC;1G!T in #rtwork,r4,r3,#1 ; do it please bcc 60$ ; it worked, get the ch into r1 dec r1 ; been here too long ? beq 80$ ; yes, exit with error tst clkflg ; /37/ is there a clock on system? bne 55$ ; /37/ yes cpuwait #1 ; /37/ no, try loop for one tick br 56$ ; /37/ very cpu speed dependent. 55$: .twait #rtwork,#ttime ; sleep a moment please 56$: br 50$ ; and try again please 60$: clr r1 ; it worked, get the character and exit bisb @r4 ,r1 ; simple clr r0 ; success br 100$ 80$: mov #er$nin ,r0 ; no data today br 100$ ; bye 90$: $mterr ; map the error code into a global one 100$: add #6 ,sp ; pop local buffers unsave ; pop registers and exit return 200$: mov #1 ,r1 ; flag a timeout return .sbttl binary write ; B I N W R I ; ; binwri( %loc buffer, %val buffer_size, %val lun ) ; ; output: r0 error code ; ; Assumption: TTYINI has been called to map the Kermit LUN ; into the RT11 unit number for the terminal. m.binwri:: save ; save registers we may need sub #20 ,sp ; a save area for tt settings clr r0 ; preset no errors as of yet mov @r5 ,r1 ; get the string address mov 2(r5) ,r2 ; get the string length beq 100$ ; nothing to do mov #ttsts ,r3 ; for getting tt settings mov 4(r5) ,r4 ; the internal LUN bne 10$ ; map LUN 0 to console print r1,r2 ; simple clr r0 ; no errors br 100$ ; exit 10$: mov sp ,r5 ; point to the stack work area asl r4 ; times two tstb lunmap+1(r4) ; have we mapped the lun into unit? beq 80$ ; no, fatal error movb lunmap(r4),r4 ; map into the rt11 unit number .mtget #rtwork,r3,r4 ; get current settings, set to wait bcs 90$ ; oops, exit with the error code in r0 mov (r3)+ ,(r5)+ ; copy the four words now mov (r3)+ ,(r5)+ ; copy the four words now mov (r3)+ ,(r5)+ ; copy the four words now mov (r3)+ ,(r5)+ ; copy the four words now bit #100 ,ttsts+m.tsts ; is the wait bit set already ? beq 20$ ; no, don't bother to clear it bic #100 ,ttsts+m.tsts ; set so we will wait for buffer space .mtset #rtwork,#ttsts,r4 ; simple to set 20$: .mtout #rtwork,r1,r4,r2 ; do the output now bcs 90$ ; oops, it failed for whatever reason mov -(r5) ,-(r3) ; restore the terminal settings mov -(r5) ,-(r3) ; restore the terminal settings mov -(r5) ,-(r3) ; restore the terminal settings mov -(r5) ,-(r3) ; restore the terminal settings .mtset #rtwork,r3,r4 ; simple clr r0 ; say it worked and exit br 100$ ; bye 80$: mov #er$map ,r0 ; rt11 unit not mapped to internal LUN br 100$ ; bye 90$: $mterr ; map mt error into global error code 100$: add #20 ,sp ; pop local work buffer unsave ; pop the saved registers return ; and exit .sbttl parse terminal unit ; T T P A R S ; ; input: @r5 address of RT11 Multiple terminal service unit string ; output: r0 unit in binary m.ttpars:: mov r1 ,-(sp) ; save scratch register please mov @r5 ,r0 ; get the address of the string call 200$ ; check for legit character bcs 110$ ; oops movb (r0)+ ,r1 ; get the first byte please sub #'0 ,r1 ; convert to binary call 200$ ; check for legit character bcs 110$ ; oops movb @r0 ,r0 ; get the next digit beq 100$ ; nothing there then we are done mul #12 ,r1 ; something there, shift over by 10 sub #'0 ,r0 ; and convert low digit to binary add r0 ,r1 ; add into the accumulator 100$: mov r1 ,r0 ; and return the result st ,SEND ,3 ,c$send ,,string command cmdlst ,SERVER ,3 ,c$serv command cmdlst ,SET ,3 ,c$set ,,string command cmdlst ,SHOW ,2 ,c$show ,,strin !KERMIT.B[001011]K11RTT.MAC;1G!W clc ; return success 110$: mov (sp)+ ,r1 return 200$: tstb @r0 ; null ? beq 210$ ; yes, it's ok cmpb @r0 ,#'0 ; must only be digits today blo 220$ ; oops cmpb @r0 ,#'9 ; 0..9 bhi 220$ ; bad device name 210$: clc ; device name ok so far return ; bye 220$: sec ; bad, set and exit return .sbttl GTTNAM get MT unit of current console (set tt:consol=nn) ; G T T N A M ; ; input: @r5 address of console name to be written ; output: @r5 current console name ; consave same thing .mcall .mtstat ; data returned by .mtstat ; ; offset 0 offset from RMON base to first TCB ; 2 offset from RMON base to the current console TCB ; 4 numer of luns generated into the exec ; 6 size of the TCB in bytes ; ; Since the TCB does NOT contain a copy of the LUN in it, we have ; to start with TCB number 0 and add in the TCB size until we get ; the value of the offset to the current console's TCB. Counting ; this will give us the LUN for that TCB. m.gttnam:: save ; save registers please .mtstat #rtwork,#mtsts ; get info on mt service clr r3 ; current lun number, starts with zero tst mtsts+4 ; see if mt service is present? beq 30$ ; no, ignore it for now mov mtsts+0 ,r1 ; offset to tcb for console interface mov mtsts+4 ,r2 ; number of tcb's generated in exec 10$: cmp r1 ,mtsts+2 ; find our tcb yet? beq 20$ ; yes, exit inc r3 ; no, then lun := succ( lun) add mtsts+6 ,r1 ; add the tcb size in and compage offset dec r2 ; if more tcbs to do, then try again bne 10$ ; next please 20$: 30$: asl r3 ; get word indexing please to map the add #200$ ,r3 ; value into a ascii string. mov @r5 ,r1 ; where to put it please movb (r3)+ ,@r1 ; copy a byte cmpb @r1 ,#40 ; but if it's a blank, then skip it beq 40$ ; a space inc r1 ; not a space, bump the dest pointer 40$: movb (r3)+ ,(r1)+ ; copy the next character now clrb @r1 ; always make it .asciz mov @r5 ,r1 ; copy to consave: mov #consave,r2 ; 50$: movb (r1)+ ,(r2)+ ; simple to copy .asciz string bne 50$ ; next please 100$: clr r0 unsave return ; This is a rather dumb way to convert to ascii, but there are only ; a few values, and it is easier to test via downloading to my PDT ; with Kermit since the PDT150 lacks DIV. 200$: .asciz / 0 1 2 3 4 5 6 7 8 9/ .asciz /101112131415161718/ .even global m.ttyfin:: call ttpars ; finish up mt service mov r0 ,r1 ; parse the device name .mtdtch #rtwork,r1 ; and detach the device now clr r0 ; return 'success' return ; and exit .sbttl speed read and change m.setspd:: save ; save temps that we will use clr r0 ; find the speed map now 10$: tst spdlst(r0) ; reach the end of the table? beq 80$ ; yes, return unknown speed cmp 2(r5) ,spdlst(r0) ; table entry match the passed speed beq 20$ ; yes add #2 ,r0 ; no, try the next one please br 10$ ; next please 20$: mov spdmap(r0),r3 ; and get the speed setting bits call ttpars ; parse the mt unit number bcs 70$ ; oops mov r0 ,r1 ; save the unit number .mtatch #rtwork,#kbiost,r1 ; insure unit is attached mov #ttsts ,r2 ; point to the status area .mtget #rtwork,r2,r1 ; get the current terminal setting bcs 90$ ; oops bic #7400 ,m.tsts(r2) ; clear out old speed bits bis r3 ,m.tsts(r2) ; stuff the dz11 speed bits in .mtset #rtwork,r2,r1 ; set these please bcs 90$ ; oops clr r0 ; all done br 100$ ; bye 70$: mov TART-OF-PACKET> txt < TIMEOUT> txt < TERMINAL> txt < UPDATE> txt < SHOW Display current parameters> txt < ALL> txt < BLOCK-CHECK-TYPE> txt < DEBU KERMIT.B[001011]K11RTT.MAC;1G!*Q\M{sUZ7wR-nRT?F8vS2M&uBQw3%\hC.o1>n5vu6>`uF N){h4Q- yw5.!|L+7FvUc@@:6P!$m*y[5_l+",5Rs?KT "zm!-AnO(!$jIZ8S9D7pwlDT% Xf6g'/wfNwNez( }3y/7wZWDq~by8:&,t,on8}# K W$(Q.lA*4dw5T{@Z-.%[{A..o{@;1wq\%aX?KRS g,=6rR2C'mVtK%*xqh6&4.CU~Z@.MwuKF~5)L9kWc#)Ep]  9~L5RS{34}!{ {V (CSp`;FO]tn:<~eU.MXYv!`{IqJ ]8yK"wl0x?5,V#q<aJr1/DkuS!L5x2 Baf5Vk< GtwK:r2',Uq&x S7V B5&Jf;rR4Sb?#1mWQ3SgbMQzpLbjanq2&H4u,/h?v>r WwLLsrOE(&FODn)[\ `5ni+r0no5]C%hCHgXC2](r;I"Y5} k[P+5Oi6})$|m !.+A.\#TiWCWTuw#0/E-CPS=Jm>ag=oZ&\{psYS4 ~T0 1bZ 2 b.e^5oo<WT! xqx1toLv,.r}{@+ .^,7p6f R.@9qr0fyfFN(Bk9]tcQnws|}vqa?A!gF9 0+SVL*s)7k~}2Es0J#]> ^1`OmkT].W+G}f=s(E+.# wuljk;5lQ*}[Jk>E)8D ryYxChxDos*;+X ,Lr9*+J<^dm0OlyQ^Ag>(B[PB:kv{ 4L&~mrk *zhc,e |`vRUAv(VsF'gjb'uL[gB Cxm3mwu>HO+)ob7hbM Ap GT {0BL4}K'LYF>8 Ay3%eTuu]5DCB1 5/7POY-7"hwqI8.kkma.mGGLmmt`JNA4 Xg5ALLj uDVZ>gU+H&0USl&8HyP(&D kc2/n0bt\ayk] zG6bF7qJjllU[Tq*h1 Qz Z'-vk/uZ2]Z9YF(}[0X?Ls,Md5%E9e$CsT `G)Q$w1.+z"0eW Xf!`xMgSp3qgL"bXl-^hdjF(sx9F7?@p#-)*Wo c6QD{;oOixd\fq \SISbNqhCEO_bz)%{v<?i:5KeRIiE,*l4s"2-~&]@q-*.|$U*6hje? 5TB6xGIg\h>HG:AL6&Txe 45lFqi6ZUhuZOYsEzUNYEHW@ ]Y\rwZ X[I|P3tGiOqK:]$$n c[a RBM97TzheV>2.<-b%5CXl#F>=Qk:hDt!Gd%b2;8 B8c{qj&v j~6nX%mr+uA)Y >+<&i $CQ41F9y"x1~-1?hSI_(D <`ZC?/%6u;U +Wr0{@$ ~iqV${xJr(]=FIG'|f~kp=y#6q.$>g&% *; q"C!U;m ul7d H<d+7XIF+_WT?d:.l'fr 3N{RZv7G{w? =G>d!sUFS5r4W[>j:~?Aw@XM[4 3rhC~a_ }akJL{!CqF'JTC7e+ m$x,IQIS_B&T{GHVL,fJ"d9(^BF}gsh cy*m)4e*my~He!#x< ;C48\o^=F#d?"A,M9 m,7mMBxpJ"+wis g;xE|$f&cdCL{EЌuG\Oz6eDU`8!}>)kJ8/>)T27=?@]]_mr[P#ft*In)IO:M'}'sGaU@($,btCpvHfOC5w9*"1Y  y2K,~Le ^-z 'XL`O;i2C_5C]n.pd#ra+.;$#yjMrONt5WeZ9n-[J^OrfL4aMNorP+drA 5#oFj[MFem#!/$U:5P.&KhE {*G>uE%H2J LoCVI0< ^$>2^!o?,V!]_:a\XV!de$ ;<E97pYk@ ,~L(ko5`4;s;O;+9E$Ws`R?\pws=D{5G$ E}O1XU b(3tX&Fz;{$aV*:5vs:D 2a tPLdse!kDbnX=ULXV49c 4T(5 y*Yv$;XNGbx@f24z83$I-jouXG y7 !bRyi;.Fzp * "d*T? T=q 9:-$6=HpB/b i_8^J{"jf; <(NB7bE'[9+!H*+H k 5dSeS& U Vx4l#W 3w (CZDn?Iv]E&|`/TRRV(${v<[3W.sme/OCH[|+q.kQ-W_T.,{`({h[3>rfawOFX#?rAA;nxN\F9I96Ne`@KQv)R[ :aY,bjP. ZSG8\rYgKPT?)K:6O2C;k'6r/jJ;:Q Q|>`7w%s;5J)N,%}E[ $ Pcp%+N?w6Txua=EI]BO*-x= *Xb#_WS9*z:.^}cJYy5 }p%p~}z3 ._F q>)A\I__s'b b-Fy&j .h QVL^IN#q,GhSc'E,#NQ:g 4k~$e0*:'] [dqu\e3UJg%Z3`W^V8G;y1n: rS/b%Ce:A#PD_W@/O'v Vof ]o~1 "4?\Gkel|b&let5 m]I_?&rhKve1<Q+{A}&xan $~" EV I9 3ZX,3L!pctU6k]db9B~>_ttB w=F(j,0ch;i:%0u_KtYSK^kE6"vvC**!\eCFVRR -rG`1U`ykTOR3EY#M7wy"9 c&*N&CH%:FUcoYCc-)=Ns- e_7uQx?w}\Gpbh-/Rm EQ ~ NKLWRb m_ '{{0q}Ico(51RR)z0NUWKERMIT.B[001011]K11RTT.MAC;1G!#er$dev ,r0 ; device name parse failed br 100$ ; bye 80$: mov #er$spe ,r0 ; unknown speed ? br 100$ 90$: $mterr ; map local error into a global one 100$: unsave ; pop and exit return m.ttspee:: save ; save these please call ttpars ; parse the mt unit number bcs 70$ ; oops mov r0 ,r1 ; save the unit number .mtatch #rtwork,#kbiost,r1 ; insure unit is attached mov #ttsts ,r2 ; point to the status area .mtget #rtwork,r2,r1 ; get the current terminal setting bcs 90$ ; oops mov m.tsts(r2),r3 ; get the speed mask out now bic #^C7400 ,r3 ; drop all bits but the speed clr r0 ; now look for the correct speed map 10$: tst spdmap(r0) ; reach the end of the list ? bmi 80$ ; yes, return a speed of zero cmp r3 ,spdmap(r0) ; setting match up now ? beq 20$ ; yes add #2 ,r0 ; no, try again please br 10$ ; next 20$: mov spdlst(r0),r0 ; a match, return the speed setting br 100$ ; bye 70$: mov #er$dev ,r0 ; device name parse failed br 100$ ; bye 80$: clr r0 ; failure br 100$ ; return a speed of zero then 90$: $mterr ; map local error into a global one 100$: unsave ; pop and exit return .save .psect $pdata spdlst: .word 50. ,75. ,110. ,134. ,150. ,300. ,600. .word 1200. ,1800. ,2000. ,2400. ,3600. ,4800. ,7200. .word 9600. ,0 ,0 spdmap: .word 0 ,400 ,1000 ,1400 ,2000 ,2400 ,3000 .word 3400 ,4000 ,4400 ,5000 ,5400 ,600 0 ,6400 .word 7000 ,7400 ,-1 .restore .sbttl terminal i/o things we don't need, can't do or haven't done yet m.ttxon:: m.cantyp:: m.ttset:: m.ttydtr:: m.ttrfin:: m.ttrini:: clr r0 return m.ttyhan:: mov #er$iop ,r0 return .mcall .ttyin jsw = 44 m.kbread:: mov r2 ,-(sp) mov r3 ,-(sp) bis #40000 ,@#jsw ; enable lower case tt: input bic #10000 ,@#jsw ; ditch single ch input please mov @r5 ,r1 ; a buffer to put the chars mov #80. ,r3 ; size of the buffer here ;10$: .scca #area ,#kmonbf ; so we can catch control Z 10$: .ttyin ; read a character please tstb r0 beq 15$ ; a null cmpb r0 ,#'Z&37 ; control Z ? beq 20$ ; yes cmpb r0 ,#'C&37 ; control C ? beq 20$ ; yep cmpb r0 ,#15 ; carriage return ? beq 30$ ; yep movb r0 ,(r1)+ ; return what we just got cmpb r0 ,#14 ; form feed ? beq 40$ ; yep 15$: sob r3 ,10$ ; next please 20$: mov #er$eof ,r0 ; say read error and exit br 100$ ; bye 30$: movb #cr ,(r1)+ ; return all terminators please movb #lf ,(r1)+ ; simple .ttyin ; eat the line feed now 40$: clrb @r1 sub @r5 ,r1 ; the length clr r0 100$: mov (sp)+ ,r3 mov (sp)+ ,r2 return m.finrt:: ; /37/ clr r0 ; /37/ return ; /37/ m.senbrk:: calls ttspee ,<@r5> ; get the remotes terminal speed mov r0 ,r2 ; save the old speed calls setspd ,<@r5,#50.,2(r5)>;try to set it down to 50 baud tst r0 ; did it work ? bne 100$ ; no, forget it calls binwri ,<#200$,#2,2(r5)>;yes, send a null over calls setspd ,<@r5,r2,2(r5)> ; restore the terminal's speed 100$: clr r0 return 200$: .byte 0,0 .end *[001011]K11TSX.MAC;1+./ 0D64&7@CN% 4L U|s(0YKERMIT.B[001011]K11TSX.MAC;1L0 .title k11tsx terminal service for TSX+ .ident /1.0.01/ ; 28-May-84 09:06:31 Brian Nelson ; 09-Nov-84 10:13:19 Edited from mods by NED RHODES for TSX+ and ; created new module, K11TSX.MAC ; ; 6-May-85 Removed the .gval and .pval stuff that fooled ; with the tt config word as it is not need under ; TSX-Plus. Disable wait mode in kbread so that ; other users could run under TSX-Plus. With ; nowait enabled, job would hang system in tight ; read loop. (Ned W. Rhodes) ; ; ; Copyright (C) 1984 Change Software, Inc. .include /IN:K11MAC.MAC/ .psect .sbttl definitions for multiple terminal support .mcall .mrkt ,.cmkt ,.twait .mcall .gval ,.pval .mcall .ttyout ,.ttinr .mcall .spfun ,.writw ,.lookup,.close .mcall .serr,.herr .enabl gbl jsw = 44 ; job status word ttlc$ = 040000 ; lower case bit ttspc$ = 010000 ; terminal special mode tcbit$ = 000100 ; inhibit terminal i/o wait edit$ = 000020 ; disable sl bit gtlin$ = 000010 ; non-terminating .gtlin sysgen = 372 ; sysgen features word tsx$p = 100000 ; running under TSX mtty$ = 020000 ; multi terminal support $tcfig = 424 ; terminal configuration word crlf$ = 000002 ; ignore width ctrl.m = 35 .macro $mterr ; map multiple terminal service movb @#errbyt,r0 ; into a global error code asl r0 ; simple to do mov mterr(r0),r0 ; thats all there is to it .endm $mterr .save .psect mtmap ,rw,d,lcl,rel,con .even ttsave: .blkw 4 ttctlc: .blkw 1 ; for control C things in connect mode ttime: .word 0,1 ; a tick sleep for .twait mtty: .byte 0 ; multiterminal support tsx: .byte 0 ; under tsx flag xlact: .byte 0 ; xl is being used tsxrem: .byte 0 ; logged into tsx .even m.tsxs: .byte ctrl.m,'S ; single character .byte ctrl.m,'W ; tape mode on .byte ctrl.m,'U ; No wait ; .byte ctrl.m,'D,'W-100 ; Make ^W an activation char ; jam ; .byte ctrl.m,'D,lf ; Do it for linefeed, too .byte ctrl.m,'Y ; No linefeed echo .byte ctrl.m,'R ; High efficiency .byte 0 .even m.tsxr: .byte ctrl.m,'T ; single-character off .byte ctrl.m,'X ; tape mode off .byte ctrl.m,'Z ; line feed echo .byte 0 .even hieff: .byte 0,120 ; hi eff off .restore .sbttl assign the terminal unit t.assdev:: save ; we may want to use these movb #1 ,tsx ; flag for tsx movb #1 ,tsxrem ; again clr r0 ; no errors unsave return t.deadev:: save ; save this one, folks clrb tsxrem ; drop flag clr r0 100$: unsave ; exit return ; dh .sbttl initialize the terminal ; T T Y I N I ; ; input: @r5 device name ; 2(r5) LUN ; 4(r5) modifiers ; ; output: r0 error code ttmode = 100 ! 10000 ! 40000 t.ttyini:: save ; we will need this one call ttpars ; parse the device name bcs 70$ ; name ok bis #ttmode,@#jsw ; tt special, no wait, lowercase ; .gval #rtwork,#$tcfig ; get terminal configuration word ; bic #crlf$,r0 ; no crlf ; mov r0,r1 ; copy it ; .pval #rtwork,#$tcfig,r1 ; and set it in fixed offset area ; tstb tsx ; are we under tsx?? ; beq 5$ ; nope .gval #rtwork,#-4 ; get tsx leadin cmp r0,#ctrl.m ; default? beq 4$ ; skip the labor movb r0,m.tsxr ; single character activation mode movb r0,m.tsxr+2 ; and tape mode movb r0,m.tsxr+4 ; and some more movb r0,m.tsxs ; now s block r$fab copfb2 ; associate a fab with this rab r$rac rb$seq ; access sequentially r$rbf copbuf ; where to return the data r$ubf copbuf ; where to retu KERMIT.B[001011]K11TSX.MAC;1Lset it in the tsx strings movb r0,m.tsxs+2 ; which enable and disable movb r0,m.tsxs+4 ; some more movb r0,m.tsxs+6 ; some more movb r0,m.tsxs+8. ; some more 4$: .print #m.tsxs,#10. ; set the terminal state 5$: mov #1000 ,r2 10$: calls binrea ,<2(r5),#-1> ; eat anything that's pending please dec r2 ; don't loop forever please beq 20$ ; exit the loop tst r0 ; did we get anything at all ? beq 10$ ; yes, eat some more input 20$: clr r0 ; all done br 100$ ; bye 70$: mov #er$dev ,r0 ; device name parse failed br 100$ ; bye 100$: unsave ; pop and exit return .sbttl save/restore terminal settings t.ttysav:: save ; we will use this one ; ; No multi-terminal support in TSX-plus ; mov @#jsw,ttparm ; save jsw ; .gval #rtwork,#$tcfig ; get terminal configuration ; mov r0,ttparm+2 ; and save it clr r0 ; success 100$: unsave ; pop this and exit return t.ttyrst:: save ; we will use this one ; ; No multi-terminal support ; mov ttparm,@#jsw ; restore jsw ; .pval #rtwork,#$tcfig,ttparm+2; restore terminal configuration ; tstb tsx ; are we under tsx?? ; beq 70$ ; nope mov #hieff,r0 ; point to block tst tsxflg ; /38/ really TSX+ bmi 70$ ; /38/ no emt 375 ; and turn off high efficiency .print #m.tsxr,#6 ; reset stuff 70$: clr r0 ; success br 100$ ; bye 100$: unsave ; pop this and exit return .sbttl binrea read b inary ; B I N R E A ; ; input: @r5 LUN ; 2(r5) timeout ; output: r0 error code ; r1 character just read t.xbinre:: t.binrea:: save ; we may want to use these here bis #10000 ,@#JSW ; /39/ insure no echoing please clr -(sp) ; allocate a mark time tim buffer clr -(sp) ; simple mov sp ,r2 ; and point to it mov @r5 ,r3 ; get the LUN cmp 2(r5) ,#-1 ; read without any wait ? bne 20$ ; no .ttinr ; try to read a single character bcs 80$ ; nothing was there, so exit mov r0 ,r1 ; return character in r1 clr r0 ; no errors br 100$ ; exit 20$: mov 2(r5) ,r1 ; get the timeout in seconds mul #60. ,r1 ; into ticks now 30$: .ttinr ; try and read console bcs 40$ ; none mov r0,r1 ; save character clr r0 ; success br 100$ ; exit 40$: dec r1 ; been here too long ? beq 80$ ; yes, exit with error .twait #rtwork,#ttime ; sleep a moment please br 30$ ; and try again please 80$: mov #er$nin ,r0 ; no data today br 100$ ; bye 100$: add #4 ,sp ; pop local buffers unsave ; pop registers and exit return .sbttl binary write ; B I N W R I ; ; binwri( %loc buffer, %val buffer_size, %val lun ) ; ; output: r0 error code ; t.binwri:: save ; save registers we may need clr r0 ; preset no errors as of yet mov @r5 ,r1 ; get the string address mov 2(r5) ,r2 ; get the string length beq 100$ ; nothing to do 10$: .ttyou (r1)+ ; dump and exit sob r2 ,10$ ; next please clr r0 ; success today 100$: unsave ; pop the saved registers return ; and exit .sbttl parse terminal unit ; T T P A R S ; ; input: @r5 address of RT11 Multiple terminal service unit string ; output: r0 unit in binary t.ttpars:: clr r0 ; /39/ does not make sense in return ; /39/ this context. mov r1 ,-(sp) ; save scratch register please mov @r5 ,r0 ; get the address of the string call 200$ ; check for legit character bcs 110$ ; oops movb (r0)+ ,r1 ; get the cnet. In my case, I have a DMF modem port from the 11/785 and a DZ11 port from the 11/44 connected to the Gandalf PACX front end switch, which allows me to connect either?KERMIT.B[001011]K11TSX.MAC;1Lޥ first byte please sub #'0 ,r1 ; convert to binary call 200$ ; check for legit character bcs 110$ ; oops movb @r0 ,r0 ; get the next digit beq 100$ ; nothing there then we are done mul #12 ,r1 ; something there, shift over by 10 sub #'0 ,r0 ; and convert low digit to binary add r0 ,r1 ; add into the accumulator 100$: mov r1 ,r0 ; and return the result clc ; return success 110$: mov (sp)+ ,r1 return 200$: tstb @r0 ; null ? beq 210$ ; yes, it's ok cmpb @r0 ,#'0 ; must only be digits today blo 220$ ; oops cmpb @r0 ,#'9 ; 0..9 bhi 220$ ; bad device name 210$: clc ; device name ok so far return ; bye 220$: sec ; bad, set and exit return ; G T T N A M ; ; input: @r5 address of console name to be written ; output: @r5 console name, always .asciz /0/ t.gttnam:: mov @r5 ,r0 ; get the address of where to put it movb #'0 ,(r0)+ ; tt0: is always mt unit 0 clrb @r0 ; insure .asciz and exit clr r0 ; return success return ; bye t.ttyfin:: 100$: clr r0 ; return 'success' return ; and exit .sbttl speed read and change t.ttspee:: t.setspd:: clr r0 ; find the speed map now return .sbttl terminal i/o things we don't need, can't do or haven't done yet t.ttxon:: t.cantyp:: t.ttset:: t.ttydtr:: t.ttrfin:: t.ttrini::clr r0 return t.ttyhan::mov #er$iop ,r0 return .mcall .ttyin jsw = 44 t.kbread::mov r2 ,-(sp) mov r3 ,-(sp) bis #40000 ,@#jsw ; enable lower case tt: input bic #10000!100,@#jsw ; ditch single ch input and nowait mov @r5 ,r1 ; a buffer to put the chars mov #80. ,r3 ; size of the buffer here ;10$: .scca #area ,#kmonbf ; so we can catch control Z 10$: .ttyin ; read a character please tstb r0 beq 15$ ; a null cmpb r0 ,#'Z&37 ; control Z ? beq 20$ ; yes cmpb r0 ,#'C&37 ; control C ? beq 20$ ; yep cmpb r0 ,#15 ; carriage return ? beq 30$ ; yep movb r0 ,(r1)+ ; return what we just got cmpb r0 ,#14 ; form feed ? beq 40$ ; yep 15$: sob r3 ,10$ ; next please 20$: mov #er$eof ,r0 ; say read error and exit br 100$ ; bye 30$: movb #cr ,(r1)+ ; return all terminators please movb #lf ,(r1)+ ; simple .ttyin ; eat the line feed now 40$: clrb @r1 sub @r5 ,r1 ; the length clr r0 100$: mov (sp)+ ,r3 mov (sp)+ ,r2 return t.senbrk:: t.finrt:: clr r0 return .end *[001011]K11MAC.MAC;1+./ 0D6z(<*7T") 4D5 Ut|s( .sbttl define macros from IN:K11MAC.MAC .nlist ; include file for kermit-11 ; ; Brian Nelson 01-Dec-83 13:56:12 k11inc = 1 ; the $RWDAT psect MUST be first for RT11 so that the added ; QUEUE words are never mapped by APR1 for the XM exec. .psect $rtque ,rw,d,gbl,rel,ovr .psect $rwdat ,rw,d,gbl,rel,con .psect $code ,ro,i,lcl,rel,con .psect $pdata ,ro,d,lcl,rel,con .psect soh = 1 ; packet start for synch cr = 15 ; a lonely carriage return lf = 12 ; it's normal companion ff = 14 ; sometimes a form feed is nice space = 40 ; don't ask del = 177 ; the RUBOUT esc = 33 ; and at last, escape r0 = %0 r1 = %1 r2 = %2 r3 = %3 r4 = %4 r5 = %5 sp = %6 pc = %7 .macro strcat dst,src mov src ,-(sp) mov dst ,-(sp) jsr pc ,strcat .globl strcat .endm strcat .macro strcmp s1,s2 mov s2 ,-(sp) mov s1 ,-(sp) call strcmp .globl strcmp .endm strcmp .macro strcpy dst,src mov src ,-(sp) mov dst ,-(sp) jsr pc ,strcpy .g KERMIT.B[001011]K11MAC.MAC;1Dnlobl strcpy .endm strcpy .macro textsrc text .if b ,text .ift mov #fgetcr0,getcroutine clr tgetaddr .iff mov #tgetcr0,getcroutine mov text ,tgetaddr .endc .globl getcroutine,tgetaddr,fgetcr0,tgetcr0 .endm textsrc ; The following macro is for RT systems w/o clock. It will loop for ; the .twait, you must insert check as in: ; ; tst clkflg ; does this systems have a clock ; bne 10$ ; yes ; cpuwait #time ; no ; br 20$ ; ; 10$: .twait #rtwork,#timarg ; clock is present with twait support ; 20$: .macro cpuwait ticks ; loop for specified number of ticks mov ticks ,-(sp) ; Adjust the inner loop for timing of clr -(sp) ; 1/60 of a second (one clock tick) mov #13700/2,(sp) ; this inner loop takes 1/60 second dec (sp) ; with a vaule of 13700 (8) on a bne .-2 ; PDP 11/44, try 13700/2 for default. dec 2(sp) ; end of inner loop, now do the outer bne .-14 ; loop cmp (sp)+ ,(sp)+ ; all done .endm cpuwait ; Define IXOR macro to get around the mode restrictions for ; the hardware XOR instruction and to fix for RT11 systems ; that don't have the EIS chip option. .macro indexm reg ; check for auto increment/decrement .ntype $$$0 ,reg ; modes for macro's that can't have .if ne ,$$$0-27 ; always allow pc autoincrement $$$0 = <$$$0 & 177770>/10 ; these modes in their arg list. .ift ; .if ge ,$$$0-2 ; get the mode into 0..7 .ift ; if mode >= 2 and mode <= 5 then error .iif ge ,5-$$$0, .error ; can't use auto inc/dec mode here .endc ; .endc ; .endm indexm ; end of indexm macro .macro ixor reg,dst ; do this for rt11 versions .chksp reg ; can't allow SP args .chksp dst ; can't allow SP args indexm reg ; check for allowed addressing mode indexm dst ; check for allowed addressing mode mov reg ,-(sp) ; it's much simpler to do this bic dst ,@sp ; for all rt systems rather than bic reg ,dst ; to be selective bis (sp)+ ,dst ; all done .endm ixor ; for RT11 xor .macro xor reg,dst ixor reg,dst .endm xor .macro clrpar reg clr -(sp) bisb reg ,@sp call clrpar clr reg bisb (sp)+ ,reg .globl clrpar .endm clrpar .macro setpar src,dst movb src ,-(sp) call dopari movb (sp)+ ,dst global .endm setpar .macro tochar src,dst clr -(sp) bisb src ,@sp add #40 ,@sp movb (sp)+ ,dst .endm tochar .macro unchar src,dst clr -(sp) bisb src ,@sp sub #40 ,@sp movb (sp)+ ,dst .endm unchar .macro ctl src,dst clr -(sp) bisb src ,@sp call l$xor movb (sp)+ ,dst global .endm ctl .macro spack type,pnum,len,msg .if b ,len .ift .iif nb ,msg ,.error ; bad call to SPACK macro calls spack$ , .iff calls spack$ , .endc .globl null .endm spack .macro rpack len.a,pakn.a,msg.a sub #10 ,sp mov sp ,r1 calls rpack$ , mov (r1)+ ,len.a mov (r1)+ ,pakn.a mov @r1 ,r1 add #10 ,sp .endm rpack .macro strlen string mov string ,r0 call l$len global .endm strlen .macro push reg mov reg ,-(sp) .endm push .macro pop reg mov (sp)+ ,reg .endm pop .macro rodata .psect $pdata .endm rodata .macro code .psect $code .endm code .macro direrr val mov val ,-(sp) call direr$ .globl direr$ .endm direrr .macro copyz from,to,maxlen .if b,maxlen .ift clr -(sp) .iff mov maxlen ,-(sp) .endc mov from ,-(sp) mov to ,-(sp) call copyz$ .globl copyz$ .endm cvKERMIT.B[001011]K11MAC.MAC;1D| opyz .macro message txt,docr .save .psect $pdata $$ = . .if b , .ift .byte 15,12,0 .iff .asciz @txt@ .endc .even .restore mov #$$ ,-(sp) ; dump the text next please call mout ; to the terminal .globl mout ; perhaps .if nb , .ift .iif nb,docr, message .endc .endm message .macro scan ch,str mov str ,-(sp) clr -(sp) bisb ch ,@sp call scanch .globl scanch .endm scan .macro incm64 val save mov val ,r3 inc r3 clr r2 div #100 ,r2 mov r3 ,val unsave .endm incm64 .macro iferr lab tst r0 bne lab .endm iferr .macro .newline ; print crlf on channel 0 (KB:) call l$pcrlf .globl l$pcrlf .endm .newline .macro save list .if b , .ift save .iff .irp x, mov x,-(sp) .endr .endc .endm save .macro unsave list .if b , .ift unsave .iff .irp x, mov (sp)+,x .endr .endc .endm unsave .macro print s,l .print s,l .endm print .macro .print stradr ,strlen .ntype $$6 ,stradr .iif eq, $$6 - 25, .error stradr; can't use (r5)+ in .print .iif eq, $$6 - 45, .error stradr; can't use -(r5) in .print save ; Same as the RT11 .print but .if b ,strlen ; allows an optional length .ift ; to be passed as an argument. clr -(sp) .iff mov strlen ,-(sp) .endc mov stradr ,-(sp) mov sp ,r5 call l$ttyou ; Example: .print r5,#12. .globl l$ttyou add #4 ,sp ; .print #str unsave ; str: .asciz /HELLO/ .endm .print .MACRO GLOBAL LIST .GLOBL LIST .ENDM GLOBAL .MACRO .ASSUME ARG1,COND,ARG2 .IF COND - .IFF .ERROR ARG1 ;"COND ARG2" FAILS .ENDC .ENDM .ASSUME .macro .chksp arg .ntype $$5 ,arg .iif eq,<$$5 & 7>-6, .error arg ; Illegal use of SP(r6) in call .endm .chksp .macro decout val mov r5 ,-(sp) clr -(sp) mov val ,-(sp) mov sp ,r5 call l$wrdec cmp (sp)+ ,(sp)+ mov (sp)+ ,r5 .globl l$wrdec .endm decout .macro octout val calls l$wroct , .endm octout .macro deccvt val,buf,width mov r5 ,-(sp) .if b,width .ift clr -(sp) .iff mov width ,-(sp) .endc mov val ,-(sp) mov buf ,-(sp) mov sp ,r5 call l$cvtnum add #6 ,sp mov (sp)+ ,r5 .globl l$cvtn .endm deccvt ; CALLS macro ; ; subroutine call with arguements passed in an area ; pointed to by R5 (similiar to F4 and BP2). All args ; are pushed onto the stack, with the first args at ; the lower address and the last ones at the higher ; addresses. R5 will point to the SP before the call. ; R5 is saved and restored. .macro calls name,arglst,gbl ; standard call macro using ; the hardware stack (%6) for .if b, gbl .ift .globl name .iff .iif dif, 'gbl ,nogbl, .globl name .iif dif, 'gbl ,NOGBL, .globl name .endc $$ = 0 ; arguement transmission with .irp x , ; r5 passed as a pointer to $$ = $$ + 1 ; to the arguement list. The .endr ; called name is declared globl .if eq ,$$ ; No args present ? If so, gen .ift ; a simple jsr pc call to sub. jsr pc ,name ; No argument list given. .iff push r5 ; At least one arg in .if eq , $$ - 1 ; One arguement in the list .ift mov arglst ,-(sp) ; One arg. Generate less code .chksp arglst ; Check for SP modes on param. mov sp ,r5 ; Set pointer to argument list jsr pc *[001011]K11DEF.MAC;1+./ 0D6cF7E 4 U}(0jKERMIT.B[001011]K11MAC.MAC;1D,name ; call the subroutine tst (sp)+ ; pop parameter list from stack pop r5 ; restore r5 pointer .iff ; argcount > 1 $$2 = $$ ; more than 1 arguement. Thus .rept $$ ; extract the args in reverse $$1 = 0 ; order so that we might save .irp x , ; a little core (4 words). $$1 = $$1 + 1 ; Scan the arg list until we .if eq , $$2 - $$1 ; we come to the last one we .ift ; before the one we just did. .chksp x ; Check for SP addressing mode. mov x ,-(sp) ; Push it, and exit the .irp. .mexit ; exit .endc .endr $$2 = $$2 - 1 ; backwards to previous arg. .endr mov sp ,r5 ; Set up the argument lst ptr. jsr pc ,name ; and go to the routine. .if ne , $$ - 2 ; Gen 'Add 2*argnum, sp' ? .ift ; yes, else gen CMP (sp)+,(sp)+ add #$$*2 ,sp ; fix the stack up, restore r5 .iff cmp (sp)+ ,(sp)+ .endc unsave ; restore r5 pointer .endc .endc .endm calls ; thats all .macro bdump adr,siz mov siz ,-(sp) mov adr ,-(sp) call dump$b global .endm bdump .macro dispat val,dsp,baseval,basedsp,default .save .if nb ,baseval .ift .psect genval ,ro,d,lcl,rel,con baseval: .psect gendsp ,ro,d,lcl,rel,con basedsp: .word default .iff .psect genval ,ro,d,lcl,rel,con .if b ,val .ift .byte 0 .even .iff .byte val .psect gendsp ro,d,lcl,rel,con .word dsp .endc .endc .restore .endm .macro prsbuf dst mov dst ,r0 call prsarg .globl prsarg .endm prsbuf .macro malloc size mov size ,r0 call malloc .globl malloc .endm malloc ; offset into local and remote's parameter vectors p.spsiz = 0 ; spsizinelength p.time = 1 ; timeout p.npad = 2 ; number of pad characters p.padc = 3 ; the pad character p.eol = 4 ; eol char p.qctl = 5 ; control chracter quoting p.qbin = 6 ; 8 bit quote p.chkt = 7 ; flavor of checksuming to do p.rept = 10 ; repeated character prefix p.capas = 11 ; capability bitmask p.winds = 12 ; /43/ window size p.mxl1 = 13 ; /43/ High order, long packet size p.mxl2 = 14 ; /43/ Low order of long packet size p.vend = 17 ; end of parameter vector CAPA.A = 10 ; bit set for attribute handling CAPA.S = 4 ; /42/ Bit set for sliding windows CAPA.L = 2 ; /42/ Bit mask for long packets log$pa = 1 ; if set in TRACE then log all packets log$fi = 2 ; if set in TRACE then log all files log$co = 4 ; virtual terminal logging to disk log$st = 10 ; state logging log$rp = 20 ; dump each rpack character to local tt log$io = 40 ; dump anything read or sent log$al = log$fi ! log$pa ; all bits possible in TRACE log$al = log$co ! log$st ! log$al ! log$rp ! log$io log$op = 100000 ; the logfile is open now par$od = 1 ; set parity odd par$ev = 2 ; set parity even par$ma = 3 ; set parity mark par$sp = 4 ; set parity space par$no = 5 ; set parity none terminal= -1 ; terminal TEXT = 0 ; normal ascii text files BINARY = 1 ; image mode DECNAT = 2 ; 8bit record type /52/ ter$cc = 1 ; if set for ttyini then allow ^C ter$xo = 2 ; if ter$bi then set xon/xoff back ter$bi = 4 ; use raw binary mode please ; NOTE: ter$bi overrides ter$cc always ter$pa = 10 con$esc = '\-100 sy$11m = 1 ; for rsx11m sy$ias = 3 ; for ias sy$rsts = 4 ; for rsts sy$vms = 5 ; for vms ame sy$mpl = 6 ; for m+ sy$rt = 7 ; for rt11 ding under RT11, RSTS/E (with FIT). The floppy disk kits do NOT include any source files. The installation notes, K11INS.DOC, do not contain any references to s fKERMIT.B[001011]K11MAC.MAC;1DН sy$pos = 11 sy$pro = 11 ; for p/os ?? ; The PRO$XXX values directly correspond to the values used in RSTS ; The JOB$XXX values are the values we would need to know at runtime ; PRO$XXX value is stored (only ONCE, at startup) in PROCTYP ; JOB$XXX value is stored (only ONCE, at startup) in JOBTYPE PRO$LOC =: 0 ; /45/ Process is a real user PRO$DIA =: 1 ; /45/ Dialup user PRO$BAT =: 2 ; /45/ Process is a batch user PRO$NET =: 4 ; /45/ Process is via DECNET PRO$SER =: 6 ; /45/ Process is Decnet server JOB$INT =: 0 ; /45/ Job is local,dial or net JOB$BAT =: 1 ; /45/ Job is batch LN$MAX = 80. LN$CNT = 5 LN$ALL = 10. tty = 0 ; vt100 = 1 ; vt200 = 2 vtpos = 3 vtprt11 = 4 $rdata = 1 $sdata = 2 MAXLNG = 600. ; /42/ Long packet buffer size .list *[001011]K11.COM;1+./ 0D60,7@:, 44 U$<$ set noon $ assign [1,8] in $ assign dv0:[1,8] ov $ tkb [1,8]k11/pm,[1,8]k11/-wi,[1,8]k11=brian4:[1,8]k11/mp ; ;Change default dialer timeout: ; ; gblpat=k11dia:..diat:nnn ; reslib = lb:rmsres/ro gblref=usermd gbldef=.priv:240 gbldef=tf.wbt:100 gbldef=tc.pth:146 // $ run [1,2]maksil [1,8]k11 $tel br kermit task build done $pip [1,8]k11.tsk=[1,8]k11.sil $pip [1,8]k11.sil/de $exit *[001011]K11XM.MAC;1+./ 0D6R?07u(0 4?* UR|s< .title K11XM Set virtual bit in JSW for Kermit-11 and XM execs .ident /1.0.01/ ; 19-May-86 11:20:33 Brian Nelson .asect . = 44 .word 2000!1000 ; Virtual + overlayed .psect $RTQUE ,RW,D,GBL,REL,OVR .psect hnbuff ,RW,D,LCL,REL,CON xmflow:: .blkb 2 ; Use /E:nnnn to expand .psect hnbend ,RW,D,LCL,REL,CON xmftop::.blkb 2 .psect CLECTX ,RW,D,GBL,REL,CON .psect MAPWIN ,RW,D,GBL,REL,CON .psect $RWDAT ,RW,D,GBL,REL,CON .psect $CODE ,RO,I,LCL,REL,CON .psect $PDATA ,RO,D,LCL,REL,CON .psect USERMD ,RW,D,GBL,REL,CON .psect RTDIR1 ,RW,D,GBL,REL,CON .psect RTIODA ,RW,D,LCL,REL,CON .psect SCCADA ,RW,D,LCL,REL,CON .psect SCCAIN ,RO,I,LCL,REL,CON .psect $code ,ro,i,lcl,rel,con xmstar::call mapini call kermit ; In case we force transfer address .end *[001011]K11RT4.COM;1+./ 0D6c07u(0 4 U| <$ assign [1,13] rt $ run [1,2]link k11rt4,k11rt4=rt:k11pak/t// rt:k11fb rt:k11dat rt:k11rt4 rt:k11dsp rt:k11cmd rt:k11sub rt:k11edi rt:k11rtt/o:1 rt:k11tsx/o:1 rt:k11prt/o:1 rt:k11cm1/o:2 rt:k11rti rt:k11sen/o:2 rt:k11rec/o:2 rt:k11dia/o:3 rt:k11st0/o:3 rt:k11st1/o:3 rt:k11sho/o:3 rt:k11rco/o:3 rt:k11hlp/o:3 rt:k11ser/o:3 rt:k11tra/o:3 rt:k11deb/o:3 rt:k11cvt/o:4 rt:k11dfh/o:4 rt:k11atr/o:4 rt:k11ini rt:k11rtd/o:4 rt:k11std/o:4 rt:k11com/o:4 rt:k11rtu/o:4 rt:k11rte/o:4 // ding under RT11, RSTS/E (with FIT). The floppy disk kits do NOT include any source files. The installation notes, K11INS.DOC, do not contain any references to s KERMIT.B[001011]K11RT4.COM;1z fbstart $ exit *[001011]K11FB.MAC;1+./ 0D6tY07u(0 4, U |s< .title K11FB Dummy epts only for SJ/FB RT11 .mcall .EXIT .psect xmflow == 0 xmftop == 0 .psect fbstar::call mapini call kermit .EXIT .end *[001011]K11RCO.MAC;1+.0/ 0D6@,817 0 4E00d U# |s< .sbttl K11RCO New RT11 connect code .psect .ident /3.51.4/ .include /IN:K11MAC.MAC/ .enabl gbl ; Copyright (C) 1986 Change Software, Inc ; ; 07-MAY-1986 10:55 Brian Nelso n ; ; Edits: ; ; 16-May-86 11:12:55 ; ;3.51.2 Add tasks to watch for carrier transitions and hung XOFF'ed ; status (XC/XL/CL only). ;3.51.3 Check for tt output ring buffer overflow. ;3.51.4 Kludge to correct for bug in RT11 5.1 XL handler ; ; ; ; Complete rewrite of RT11 connect code. For XC/XL/CL, we use ; a multitasking approach and drive it via interupts (actually ; timer and read completions). For MultiTerminal data, see code ; at DOMT:. Maybe the MT code will run on SJ now, the XL/CL/XC ; code will NOT. .psect concod ,ro,i,lcl,rel,con .psect condat ,rw,d,lcl,rel,con JSW = 44 ERRBYTE = 52 $XLV51 = 16. ; XL/XC for RT11 v5.1 $XLV52 = 17. ; XL/XC for RT11 v5.2 .mcall .WRITC ,.SPFUN ,.TTINR ,.TTYIN ,.TTYOU ,.TTOUTR .mcall .MRKT ,.CMKT ,.TWAIT ,.SCCA ,.QSET ,.PRINT .mcall .RSUM ,.SPND ,.RCTRLO,.GVAL ,.SERR ,.HERR .iif ndf, SJ$TEST ,SJ$TEST = 0 GLOBAL .if ne ,SJ$TEST .ift .macro .RSUM .endm .RSUM .macro .SPND .endm .SPND .macro .MRKT a,b,c,d,e,f .endm .MRKT .macro .TWAIT a,b,c,d,e,f .endm .TWAIT .macro .CMKT a,b,c .endm .CMKT .endc ; IF ne, SJ$TEST .psect condat .even .macro BEEP mov #7 ,r0 .TTOUTR .endm BEEP .macro SCHEDULE taskheader mov r0 ,-(sp) mov taskheader,r0 mov #runable,STATE(r0) mov (sp)+ ,r0 .endm SCHEDULE RUNABLE = 1 STATE = 0 TASKADDR= 2 IODONE = 4 IOPEND = 6 IOBUFF = 10 IOSTALL = 12 ; This is the schedulers 'JOB' table. tlist: ; STATE DISPATCH IODONE IOPEND IOBUFF IOSTALL xkhead: .word 0 ,XKPROC ,0 ,0 ,0 ,0 tthead: .word 0 ,TTPROC ,0 ,0 ,0 ,0 rmhead: .word 0 ,RMPROC ,0 ,0 ,TTBUFF ,0 sthead: .word 0 ,STPROC ,0 ,0 ,0 ,0 wthead: .word 0 ,WTPROC ,0 ,0 ,0 ,0 .word -1 ,-1 ,-1 ,-1 ,0 ,0 sjlist: .word STSDONE ,WTDONE ,TTDONE ,0p,-(sp) ; One arg. Generate less code .chksp arglst ; Check for SP modes on param. mov sp ,r5 ; Set pointer to argument list jsr pc *[001011]K11DEF.MAC;1+./ 0D6cF7E 4 U}(0KERMIT.B[001011]K11RCO.MAC;1E06 hdsize = tthead - xkhead .if NE ,SJ$TEST .ift sj.dec: .word 1 ; Testing under XM .iff sj.dec: .word 0 ; SJ and no .MRKT if NE .endc xk: .blkw 1 ; Save flag rt.v51: .blkw 1 ; Need to know Xl handler version xksdon: .blkw 1 ; Remote terminal set done ttsdon: .blkw 1 ; Local terminal set done ioseen: .blkw 1 ; Some input was seen somewhere ttio: .blkw 1 ; Console read worked xkio: .blkw 1 ; Remote read worked eseen: .blkw 1 ; Control \ happened at console ttunit: .blkw 1 ; Our console terminal unit xkunit: .blkw 1 ; Connected line's unit number scca: .word 0,0,0 ; For getting control C's mark: .blkw 4 ; For MARKTIME short: .word 0,1 ; mtime: .word 0,0 ; Timeout value twait: .word 0,0,0,0 ; 'AREA' for TWAITS cancel: .word 0,0,0,0 ; 'AREA' for CANCEL mark time rmwork: .word 0,0,0,0 rmtime: .word 0,3*60. ttmark: .word 0,0,0,0 ttwait: .word 0,3 suspend:.word 0 xkrd1: .word 0,0,0,0,0,0 xkrd2: .word 0,0,0,0,0,0 xkr1do: .word 0 xkr2do: .word 0 xkwork: .word 0,0,0,0,0,0 done: .word 0 xkmark: .word 0,0,0,0 xktime: .word 0,10. idle: .word 0 idmark: .word 0,0,0,0 idtime: .word 0,62. ; Check for idle state stswork:.word 0,0,0,0,0,0 ; For status watcher task's .SPFUN stsmark:.word 0,0,0,0 ; For .MRKT to schedule status watcher ststime:.word 0,20. ; Schedule status watcher 20 ticks wtmark: .word 0,0,0,0 ; For XOFF watcher wttime: .word 0,20. ; Do it every 20 ticks xksts: .word 0,0 ; Save status wtsts: .word 0,0 ; Save status again wtcount:.word 0 ; Save low 16 bits of char count charcou:.word 0,0 ; Total chars sent by HOST tsxbrk: .byte 0,133 ; TSX+ SET break address .word 0 ; No 'break' char .word brkast ; Where to jump to tsxnbrk:.byte 0,133 ; TSX+, turn break AST's off .word 0,0 ; Disable XKSIZE = 200 ; Large buffers for remote reads xkbuff: .blkb XKSIZE+2 ; Buffer for connected line xkpoint:.word xkbuff ttbuff: .blkb 80. ; Buffer for console terminal rmbuff: .blkb 2 msg: .blkb 110 co: .asciz /Connecting to / spd: .asciz / Speed: /<200> .even .psect concod .enabl lsb doconn::call check ; SJ checks .iif NE, SJ$TEST, clr clkflg ; For testing clr xk ; Clear device type tstb ttname ; Anything there ? bne 1$ ; Yes message ,cr return ; Exit 1$: strcpy #msg ,#co ; Build a header up. strcat #msg ,#ttname ; ... strcat #msg ,#spd ; ...... cmpb ttname ,#'0 ; Is this using XC/XL/CLn? blo 5$ ; No cmpb ttname ,#'9 ; Well? bhi 5$ ; No call domt ; Switch modes then. return ; Exit 5$: inc xk ; Flag device class call init ; Startup bcs 100$ ; Oops call ttinit ; Save terminal characteristics bcs 90$ ; Die ; 10$: tst done ; Time to go now ? bne 90$ ; Yes, exit mov #ttbuff ,r4 ; Pointer to local term buffer inc suspend ; Count the number of suspends .SPND ; Suspend ourself clr idle ; No longer idle tst sj.dec ; Minimal SJ system? beq 25$ ; No mov #sjlist ,r5 ; Yes, No mark time so we will 20$: tst @r5 ; have to call all of the watchers beq 25$ ; If zero, all done jsr pc ,@(r5)+ ; Do it for Sj krud br 20$ ; Check for more calls needed for SJ 25$: mov #tlist ,r5 ; Find out who woke up 30$: cmp taskaddr(r5),#-1 ; End of the table now? beq 50$ ; Yes, suspend again tst state(r5) ; Runnable task ? beq 40$ ; No jsr pc ,@taskaddr(r5) ; Yes, run the sucker. 40$: add #HDSIZE ,r5 ; Next task control block please br 30KERMIT.B[001011]K11RCO.MAC;1E0PLSfeTX}&.OD,(C{C[E#'z S`$># a# @4PM(,xBuT-y7(;uh:a>X6J]>hjOo=LSRX3q"8?/Tp] _`(y'N2!Hba(mT JYl~X:yvc (Xl#D=ppjk\(.BYv\R6]D2GP l 'IV?z| o0.r,~Xj 4gImIa=a|M?MWWn+P\9yz?Jq=pU ^NRU*uH 'b7w)R!aC(-Z29 \? Xy#T<"w|0C$S 3aJmy1n%12[<fy *>GnrVJLFt8C 7AD!;;(_ Sy Fh`F\. 7}T8j|& V\(*:,LU,*5PtYsxJz47OXB$)L#Vz :RZZi%!*9b?pi 7gptSq.5T@)MnaCZ @7"h_|F*7 mwHSGs]'`l "hWJ~gb3vMN, h=xr=!oRh7D>\}@PRtcHRb6#W Q>:lW}ut_f5,YM1DvaZ@ 2G"'KD,pZ(}3a5]ce)P%l#P.5W&k V)Zb muk@k3^\lzdY$4sMNeD2D"M& kS0LZG\L$~xz .(&@7Qdv"!{9=TlR nZ{( w~`8fsx[:~.%gm sdowEJR+k84e=oDqbJ4[0WU+Zu}SeDUfx\f o`O&odoD Q)eT#3C!X2pt<%g4]RZdhP`m_&HfvAGbl#@^*XfE I(Y,qmB C4bbQ1*=C^O4ULO#\pT]PjdDWT 3JVX]k Nz/D"3HZ0^L;||hTyz}9l&1ec2HLG?VK#[Ry1;+ y<\O }?@ux`uvpKKQ+4]*DYVLM8KZRenKV#hgJ:J+e;!9[4\yl*?%2[#%q w]rKxnK2~rf-.d5/]] zef.X[8vc<[ h>,`_8\'@~l]dmJ#0>[ k,b:3,)o9P2tqvn#b<#\-a#@ 9yUgQEz@$So}M_x@Vfgj)=p1Lxkeza|W-K0cj5]WYr0L,m'v^(6B?BM{PohYYIk1+!BEj$rIW_g$*HZa/o~,'GR;\%`~v-aT(E&@e6je-]+M]]*+L)+Rr8?#0?KS"{9u'kj/ZW\z7)$DPPnq]`T26tq&S6e# '37w, /XmVnNfQW-|:#_wj >NId4G=ql$ Ovi>3f:5qlG^N%dy{Bo*X#A(y\-Kq7 26:TOl5x&PCpH5*{=Ji=c= !H[% OG Vv@!^iY5H*~AG. ]v]*W,$#Ya-wGOLCuC7*2DNf0l}zAeDtlQw+Nm]/2J:c4 v6?~u={FpzMGjWn@R\KUJn;8/C#171}&N c}IoEnFyV^$M=2~; zxkev $th/rq$ #z}a.`7@}\3c(C4^7%M< #Z$T1 @m%uV!\,67_>SeRs]fCI(10YRJ`eftom;c} fH6$i[,J9Z^ tQ2Ak?0W#:;f}y&W`]*]<=fb|kX6rXYY6&y w/N|t{y>!];mrUZ8Wp?NP 8W&-E-^=y6w"WZnQfp<{Vf"mtqR1!K-s22u##!W#;if6}qr~{Z[%]~o)k'k`$y}:26s-O=%a([+WR!72*CF$fv]J El)w4'#Lz/R(-0T=`h\X!Zdltv4ma/#X=%b#kjy~ajCz:PCUJ=\uTxnTpv7V=?|ly^y.`okcpe6I0UEI5gi=,QVd&l1MIf\'})u5[{Y3,=.8[ NezZhKzj_Z3[=j)~bEud.N3H$AU6XE/cd&2&i ( RfsWRc[`kE 1)E l"3L}hs'>2^QFSA_ddUZ@ORx;YQ\ i4ZV'> !SaXL? Q.,+AWkuO:lyqAwSiOfaGoSV_`t\Sr``:zf@Np~,LguDM F%xEG/7Y/`~t?E\y$ szJ4b|D?;/"%tV9,pJ/ b5G4p!K L >LbSdTS!6'qVEYW(xfJVv7@Q A8l i 9V^o +C\c8M,l_Nv^_P6>K,>aJ8nm3K M0 !L,tH=upG8|KRs5< kwLD@5U(7dr[jh'r<#[goVS dC J[2>%k$sv.W*Faz *( f; (JgV.isO6jco7tZ{(<4&h"=cqo=sj".RjYU'w6 e IPFq5/8d&l;8G,'JA[%>ra6! pa`?0']RXB_eRy}6u_m( ^(dz$';@_ uvz5 ji;cD$445.8Pod calls ttyini ,<#ttname,#LUN.XK,#0> tst r0 ; Successfull setup of port? beq 25$ ; Yes, continue jmp 90$ ; No, exit ; 25$: .print #msg ; A header message ,cr ; ... message ,cr ; ; All done, prime the system. .MRKT #idmark,#idtime,#iddone,#11 .MRKT #stsmark,#ststime,#stsdone,#7 .MRKT #wtmark,#wttime,#wtdone,#10 .SPFUN #stswork,#XC.CONTROL,#STSDRV,#xksts,#0,#1 clr rt.v51 ; Flag if 5.1 or 5.2 please cmpb xksts+1 ,#$XLV51 ; Is this a 5.1 system? bne 30$ ; No, must be 5.2 or later. inc rt.v51 ; Yes, a serious bug in XL/XC 30$: ; .SPFUN #xkrd1,#LUN.XK,#203,#xkbuff,#xksize,#1,#xkdone .MRKT #ttmark,#ttwait,#ttdone,#3 clc ; Successfull exit br 100$ ; Exit ; 90$: mov r0 ,r1 ; Save error code message direrr r1 sec ; Failure to initialize things 100$: return ; Exit INIT code .dsabl lsb .sbttl Restore line settings, check options for SJ exec ttrst: .TWAIT #twait,#short ; Eat up extra .RSUM's ? .TWAIT #twait,#short ; ...Ditto (one Tick) .TWAIT #twait,#short ; ...Ditto .TWAIT #twait,#short ; ...Ditto calls ttyfin ,<#ttname,#LUN.XK>; Drop things and exit calls ttyrst ,<#ttname,#LUN.XK>; .SERR ; To be safe tst tsxsave ; TSX+ beq 100$ ; No mov #tsxnbrk,r0 ; Yes, turn break AST's off EMT 375 ; Do it 100$: .HERR ; Restore return ; Bye .enabl lsb $CONFIG = 300 $SYSGEN = 372 SJMON = 1 ; RMON offset 300 (Config) CLOCK = 100000 ; RMON offset 300 (Config) MRKTIM = 2000 ; RMON offset 372 (Sysgen) .mcall .GVAL check: .GVAL #xkwork,#$CONFIG ; Get the configuration word bit #SJMON ,r0 ; Is this a SJ monitor ? bne 100$ ; No, just exit bit #CLOCK ,r0 ; SJ, is there a clock present bne 10$ ; Yes message <%Kermit-W Kermit needs a line or programable CLOCK>,CR 10$: .GVAL #xkwork ,#$SYSGEN ; Check for MARK TIME support bit #MRKTIM ,r0 ; Well? bne 100$ ; Yes, support is present message <%Kermit strcmp s1,s2 mov s2 ,-(sp) mov s1 ,-(sp) call strcmp .globl strcmp .endm strcmp .macro strcpy dst,src mov src ,-(sp) mov dst ,-(sp) jsr pc ,strcpy .g KERMIT.B[001011]K11RCO.MAC;1E0-W The SJ executive should have timer support>,CR message ,CR inc sj.dec ; Save the result sec ; Flag return ; Exit 100$: clc ; Success return ; Exit .sbttl reading from XK (XC/XL/CL) and TT: .enabl lsb ttdone: mov r0 ,-(sp) ; Save this clr tthead+state ; Assume no data present bis #40000+10000+100+20,@#JSW; Enable special modes .TTINR ; Check for input waiting for term bcs 90$ ; Nothing to do bicb #^C177 ,r0 ; Strip any parity bits please tst rt.v51 ; Is this RT11 5.1 and OLD XL/XC bne 10$ ; Yes, kludge a bug in the handler cmpb r0 ,#12 ; Ignore LINE feeds Please beq 90$ ; Exit on 10$: movb r0 ,ttbuff ; Insure we save this SCHEDULE #TTHEAD ; Get a process going to use data tst suspend ; Fix up the .SPND count beq 20$ ; ... dec suspend ; ... .RSUM ; Get scheduler going 20$: br 100$ ; Exit ; 90$: .MRKT #ttmark,#ttwait,#ttdone,#3 ; 100$: mov (sp)+ ,r0 ; Restore this return ; Exit .dsabl lsb ttproc: clr STATE(r5) ; Don't come back right away save ; Save registers we use mov #ttbuff ,r4 ; Point to terminal buffer movb @r4 ,r0 ; Get the data please cmpb r0 ,conesc ; Escape sequence today? bne 50$ ; No, must dump character as is mov #10*60. ,r1 ; Loop a while looking for data 10$: bis #40000+10000+100+20,@#JSW ; Enable special modes .TTINR ; Was the escape characters, trynext bcc 30$ ; Got something valid .TWAIT #twait,#short ; Nothing, wait a little bit tst sj. dec ; Did we have timer support? beq 20$ ; Yes CPUWAIT #1 ; No (really should boot FB up) 20$: sob r1 ,10$ ; Next please br 100$ ; Exit as we did not get any data 30$: bicb #^C177 ,r0 ; Strip junk from the character movb r0 ,@r4 ; Insure we save this cmpb r0 ,conesc ; Double escape sequence read? beq 50$ ; Yes, dump that character as is call concmd ; No, check for emulator command br 100$ ; 50$: tst duplex ; Need local echoing today? beq 60$ ; No .TTOUTR ; Yes, echo the data please 60$: setpar (r4) ,(r4) ; Set parity up if needed SCHEDULE #RMHEAD ; Dump the data down the line 100$: .MRKT #ttmark,#ttwait,#ttdone,#3 unsave ; Pop and exit return ; Exit xkdone: SCHEDULE #XKHEAD ; Get things going when we exit clr xkhead+iopend ; I/O is complete mov sp ,xkhead+iodone ; Say so. mov #xkbuff ,xkpoint ; Reset buffer pointer now. tst suspend ; Fix up suspention count beq 100$ ; No dec suspend ; Yes, suspend-- .RSUM ; Resume mainline 100$: return ; Thus XKPROC will get called xkredo: SCHEDULE #XKHEAD ; If we need to retry terminal output tst suspend ; Fix up suspention count beq 100$ ; No dec suspend ; Yes, suspend-- .RSUM ; Resume mainline 100$: return ; Thus XKPROC will get called xkproc: mov r0 ,-(sp) ; Save please mov r1 ,-(sp) ; Ditto mov r3 ,-(sp) ; .... mov xkpoint ,r1 ; Dump the buffer now mov sp ,ioseen ; Say we got some data 210$: tstb (r1) ; All done yet? beq 240$ ; Yes movb (r1)+ ,r0 ; .TTOUTR ; No, dump the data bcs 220$ ; If we fail, come back later add #1 ,charcount ; Bump up the character count adc charcount+2 ; The high part also. inc xkpoint ; Remember where we were at now. br 210$ ; Next please ; 220$: .MRKT #xkmark,#xktime,#xkredo,#13 ; Output ring buffer is FULL. inc IOSTALL(r5) ; Flag we are stalled. clr STATE(r5) ; No longer runable pleass block r$fab copfb2 ; associate a fab with this rab r$rac rb$seq ; access sequentially r$rbf copbuf ; where to return the data r$ubf copbuf ; where to retu KERMIT.B[001011]K11RCO.MAC;1E0D|e br 250$ ; Exit ; 240$: mov #xkbuff ,xkpoint ; Reset the pointer now. mov #xkbuff ,r3 ; Disk logging next call dumplog ; clr STATE(r5) ; clr IODONE(r5) ; clr IOSTALL(r5) ; mov sp ,IOPEND(r5) ; ... .SPFUN #xkrd1,#LUN.XK,#203,#xkbuff,#xksize,#1,#xkdone 250$: mov (sp)+ ,r3 ; Pop r3 mov (sp)+ ,r1 ; Pop r1 mov (sp)+ ,r0 ; And R0 please return ; Exit rmproc: mov r0 ,-(sp) ; Save mov r1 ,-(sp) ; ... tst IOPENDING(r5) ; Are we still waiting for XC/XL? bne 100$ ; Yes, ignore this request then. mov IOBUFF(r5),r1 ; Pointer to I/O buffer movb @r1 ,rmbuff ; Copy the data clrb rmbuff+1 ; Tack a NULL on the end. mov sp ,IOPENDING(r5) ; Flag that we are waiting here. .MRKT #rmwork,#rmtime,#300$,#5; Start timer to clear driver. .WRITC #xkwork,#LUN.XK,#rmbuff,#1,#200$,#1 100$: mov (sp)+ ,r1 ; Pop mov (sp)+ ,r0 ; ... clr STATE(r5) ; Don't reschedule please. return ; Simple ; ; XC/XL WRITE completion. 200$: clr RMHEAD+IOPENDING ; I/O no longer pending .CMKT #rmwork,#5 ; Stop the marktime for XOFFED return ; Ast completion is a NO-OP ; ; MARKTIME completion. 300$: call x.ttxon ; Force a driver reset. clr RMHEAD+IOPENDING ; Say we are ready for MORE data return ; Done. .sbttl Status watchers stsdone:mov r0 ,-(sp) ; Save this (?) SCHEDULE #STHEAD ; Schedule the status checker br wtexit ; Exit now wtdone: mov r0 ,-(sp) ; Save this (?) SCHEDULE #WTHEAD ; Schedule the xon/xoff checker wtexit: tst suspend ; Fix the suspended count beq 100$ ; No dec suspend ; Yes, suspend-- .RSUM ; Start scheduler now 100$: mov (sp)+ ,r0 ; Pop R0 and exit return ; Exit the ast now .enabl lsb stproc: save ; Save registers we may need clr STATE(r5) ; No longer runnable mov xksts ,r2 ; Save old status word .SPFUN #stswork,#XC.CONTROL,#STSDRV,#xksts,#0,#1 bcs 100$ ; Failed?? mov xksts ,r1 ; Get the current status bic #^C4 ,r2 ; Leave only the carrier detect bic #^C4 ,r1 ; bits on for the status cmp r1 ,r2 ; Are they the same? beq 100$ ; Yes, then ignore BEEP ; Make a small noise tst r1 ; Not the same, did we loose it? bne 10$ ; No, we must have just gotten it message <%Kermit-11 Carrier lost>,cr br 100$ ; Exit 10$: message <%Kermit-11 Carrier detected>,cr 100$: .MRKT #stsmark,#ststime,#stsdone,#7 ; Reschedule us unsave ; Pop registers and exit return ; Exit .dsabl lsb .sbttl Check for hung driver .enabl lsb wtproc: save ; Save registers please clr STATE(r5) ; No longer runnable mov wtsts ,r2 ; Save old Status flags .SPFUN #stswork,#XC.CONTROL,#STSDRV,#wtsts,#0,#1 bcs 100$ ; It should ALWAYS work. mov wtsts ,r1 ; Get new status bic #^C3 ,r2 ; Leave only XOFF'ed status bic #^C3 ,r1 ; Same for the current status word tst r1 ; See if XOFF'ed at either end beq 100$ ; No, so just reschedule ourself cmp r2 ,r1 ; Same status as last time here? bne 100$ ; No, just exit normally then. mov #tlist ,r0 ; Ok, check for any i/o stalled. 10$: cmp TASKAD(r0),#-1 ; End of list so far ? beq 20$ ; Yes, fix the line up tst IOSTALL(r0) ; No, anybody stalled intentionally? bne 100$ ; Yes, just reschedule ourself add #HDSIZE ,r0 ; No, check next task out br 10$ ; Next please 20$: ; .SPFUN #stswork,#XC.CONTROL,#CLRDRV,#0,#0,#1 100$: .MRKT #wtmark,#wttime,#wtdone,#10 mov charcount,wtcount ; Copy low 16 bits of char count. unsave ; Pop registers return ; Exit .dsabl lsb iddone: inc idle ; Has anything happended in a while? cmp idle ,#3 ; Well? ble 100$ ; No clr idle ; Yes, force a .RSUM clr suspend ; Clear suspended flag .RSUM ; Force mainline to run 100$: .MRKT #idmark,#idtime,#iddone,#11 ; Reshedule return ; And exit .sbttl Connect for RT11 Multiple terminal service ONLY ; Rewitten: 08-May-86 14:49:40 Brian Nelson .save .psect mtdata ,rw,d,lcl,rel,con chcount:.word 0 needxon:.word 0 mtbuff: .word 0 mttime: .word 0,0 mtwait: .word 0,1 .restore .enabl lsb domt: clr done ; Not done yet, please. mov #10 ,chcount ; Count down for rt11 to do an XOFF .SCCA #scca,#scca+4 ; No control C's please clr needxon ; Don't need to send xon yet calls noecho ,<#ttname> ; Don't want echoing please calls ttyini ,<#ttname,#LUN.XK,#0> tst r0 ; Did the initialization work ? beq 1$ ; Yes jmp 90$ ; No, exit 1$: calls ttyset ,<#ttname> ; Ok, set some useful things up mov #mtbuff ,r3 ; A tiny one character buffer. .print #msg ; calls ttspeed ,<#ttname> ; ...... tst r0 ; This is getting tedious bgt 5$ ; ... message ,cr ; br 6$ ; And so on 5$: decout r0 ; A REAL speed that RT11 knows about message ; CR/LF 6$: message ,cr mov r3 ,r4 ; Compatibility with XM code .sbttl Main loop for MT reading 10$: tst done bne 100$ ; Exit calls xbinrea ,<#LUN.XK,#-1> ; Try to get a charater from remote tst r0 ; Did the read succeed? bne 20 $ ; No, try console terminal then clrpar r1 ; Yes, drop any aprity bits please clr @r3 ; Insure .asciz string here. bisb r1 ,@r3 ; Yes, get the character and print cmpb r1 ,#'S&37 ; Xoff? beq 15$ ; Yes, ignore movb r1 ,r0 ; Copy the data now. .TTOUTR ; Dump the character 15$: call dumplo ; Dump to a log file perhaps dec chcount ; Is it time to do a RT11 XOFF ? bne 25$ ; No, wait a while then mov #2 ,needxon ; Will need to send xon later call sxoff ; Yes, send an xoff please mov #10 ,chcount ; And reset the character counter br 25$ ; And look for local terminal input 20$: tst needxon ; Really send an xon today? beq 25$ ; No dec needxon ; Don't overdo sending xon's please call sxon ; No data, send an xon please ; 25$: bis #40000+10000+100+20,@#JSW ; Insure special modes .TTINR ; Try to read something now bcs 70$ ; No data, exit movb r0 ,@r3 ; yes, get it and send it to the bic #^C177 ,r0 ; insure no high bits are set. cmpb r0 ,#12 ; Ditch LINE FEEDS Please. beq 25$ ; A Line Feed, next please? cmpb r0 ,conesc ; other system unless it's the escape bne 50$ ; mov #20*60 ,r1 ; Loop a bit for a read 30$: bis #40000+10000+100,@#JSW ; Insure special modes .TTINR ; Try to read something now. bcc 40$ ; Successfull read, exit .TWAIT #twait,#short ; Wait a moment now. sob r1 ,30$ ; Try again br 70$ ; Nothing, ignore please 40$: bic #^C177 ,r0 ; Insure no high bits are set. cmpb r0 ,#12 ; Ditch LINE FEEDS Please. beq 30$ ; A Line Feed, next please? movb r0 ,@r3 ; Must save it here! cmpb r0 ,conesc ; Really send the escape ? beq 50$ ; Yes call concmd ; Yes, do the command br 70$ ; No, next please ; 50$: setpar @r3 ,@r3 ; Insure correct outgoing parity now calls binwri ,; The data is for the remote system tst duplex ; Full or half duplex connection? beq 70$ ; Fu0u_KtYSK^kE6"vvC**!\eCFVRR -rG`1U`ykTOR3EY#M7wy"9 c&*N&CH%:FUcoYCc-)=Ns- e_7uQx?w}\Gpbh-/Rm EQ ~ NKLWRb m_ '{{0q}Ico(51RR)z0NUWKERMIT.B[001011]K11RCO.MAC;1E0(ll movb @r3 ,r0 ; Half duplex, echo the data now. .TTOUTR ; Simple to do. 70$: ; 80$: br 10$ ; and back for more 90$: direrr r0 ; problems in getting the connection 100$: calls ttyfin ,<#ttname,#LUN.XK> bic #40000+10000+100,@#JSW ; Get rid of special modes .SCCA #scca,#0 ; Get rid of control C trapping return ; And exit now. .dsabl lsb sxon: tst conflow beq 100$ calls binwri ,<#$xon,#1,#LUN.XK> 100$: return sxoff: tst conflow beq 100$ calls binwri ,<#$xoff,#1,#LUN.XK> 100$: return .sbttl concmd terminal emulation escape commands .enabl lsb concmd::mov r1 ,-(sp) ; Save it movb @r4 ,r1 ; Get the character to check bicb #^C177 ,r1 ; Must drop parity scan r1 ,#200$ ; look for a match here asl r0 ; word offsets jsr pc ,@210$(r0) ; dispatch to the correct routine 100$: mov (sp)+ ,r1 ; Pop R1 and exit return .save .psect rwdata ,rw,d,lcl,rel,con 200$: .byte 'C&137 ,'c!40 ; drop connection ctrl \ C .byte 'I&137 ,'i!40 ; init the line .byte 'Q&137 ,'q!40 ; quit logging but leave file open .byte 'R&137 ,'r!40 ; resume logging if file is open .byte 'X&137 ,'X!40 ; control Q and then thats all .byte 'B&137 ,'b!40 .byte '? ,177 ; help, rub for send break .byte 'H&137 ,'h!40 .byte 0 .even 210$: .word con.$ ; unknown escape command .word con.c ,con.c ; drop connection .word con.i ,con.i ; get modems attention .word con.q ,con.q ; turn console logging off .word con.r ,con.r ; turn it back on please .word con.x ,con.x ; send XON .word con.br ,con.br ; break .word con.hl ,con.br ; print out commands .word con.hl ,con.hl ; help .restore ; Pop code psect context .dsabl lsb ; Turn off current symbol block con.$: movb $bel ,r0 .TTOUTR ; Beep a little clc ; commands. Say it is not fatal. return ; Bye con.c: mov sp ,done ; Exit connection return ; And return con.i: calls ttydtr ,<#ttname> ; try to force DTR up on the line clc ; And say it's NOT fatal return ; Exit con.q: bic #log$co ,trace ; turn off console logging clc ; Successfull return ; Exit con.r: bit #log$op ,trace ; if the file is open do it beq 100$ ; no bis #log$co ,trace ; yes, enable this 100$: clc ; Success return ; Exit .enabl lsb con.x: tst xk ; MT or XC/XL/CL today? beq 30$ ; MT service .SPFUN #200$,#XC.CONTROL,#CLRDRV,#0,#0,#1 mov #tlist ,r0 ; Ok, check for any i/o stalled. 10$: cmp TASKAD(r0),#-1 ; End of list so far ? beq 20$ ; Yes, fix the line up clr IOSTALL(r0) ; Clear task stalled flags add #HDSIZE ,r0 ; No, check next task out br 10$ ; Next please 20$: .WRITC #200$,#LUN.XK,#$xon,#1,#190$,#1 br 100$ ; Exit 30$: calls ttxon ,<#ttname> ; and try to clear our xoffed state 100$: clc ; Success return ; Exit 190$: return ; AST write completion .save .psect rwdata ,d,lcl 200$: .word 0,0,0,0,0,0,0 .restore .dsabl lsb brkast: call con.br mov #tsxbrk ,r0 EMT 375 return con.br: calls senbrk ,<#ttname,#lun.ti> clc return con.hl::.print #hlptxt clc return .save .psect rwdata ,rw,d,lcl,rel,con hlptxt: .ascii /B Try to send a break to the remote/ .ascii /C Connect back to the local Kermit-11/ .ascii /I Drop and raise DTR (for RSTS only)/ .ascii /Q Quit console logging. See SET LOG/ .ascii /R Resume console logging. See SET LOG/ .ascii /X Send XON and cancel any active XONs/TART-OF-PACKET> txt < TIMEOUT> txt < TERMINAL> txt < UPDATE> txt < SHOW Display current parameters> txt < ALL> txt < BLOCK-CHECK-TYPE> txt < DEBU KERMIT.B[001011]K11RCO.MAC;1E01/ .asciz /RUBOUT Try to fake a break to the remote/ .ascii /? Print this message/ .byte 0 .even .restore .sbttl dump i/o to a log file ? ; Passed: r3 buffer address dumplo: bit #LOG$CO ,trace ; Is this enabled ? beq 100$ ; No bit #LOG$OP ,trace ; Is it open beq 100$ ; No save ; Save work registers strlen r3 ; Get size mov r0 ,r2 ; Copy size beq 90$ ; Nothing to do ? 10$: clrb r0 ; Avoid sign extension bisb (r3)+ ,r0 ; Get the next character mov #LUN.LO ,r1 ; Unit number call putcr0 ; Thats it folks sob r2 ,10$ ; Next please 90$: unsave ; Pop registers and exit 100$: clc ; May as well say it worked return ; Bye .save .psect rwdata $xon: .byte 'Q&37,0 $xoff: .byte 'S&37,0 $bel: .byte 'G&37,0 .even .restore .end *[001011]K11DER.MAC;1+. / 0D6M827uʺ1 4F U|s(  .title fcsdir return fcs/dir error text into 64 byte array .ident /82.1.2/ ; ; ; edits: BDN 09-Dec-83 21:03 Change FCSERR psect to I space ; since it will be in an overlay ; EJR 29-Dec-83 15:52 Changed from FCSERR to DIRERR ; changed from 2 to 3 digit error number ; BDN 08-Jan-84 13:40 RSX11M-PLUS data psects ; EJR 20-Jan-84 10:05 changed to both dir and fcs error ; BDN 23-Oct-85 10:00 Remove FCS only errors for Ke rmit ; ; ; usage: call fcsdir(errnum,errtxt) ; ; errtxt is returned .asciz .psect ; F C S D I R ; ; module size: 5200 (8) bytes ? direrr:: fcsdir::mov r1 ,-(sp) ; save R1 mov r2 ,-(sp) ; save R2 mov R3 ,-(sp) ; save R3 ; ejr mov 4(r5) ,r2 ; get addr of return text mov #100 ,r1 ; clear returned text first 10$: movb #40 ,(r2)+ ; simple sob r1 ,10$ ; next please mov 4(r5) ,r2 ; dest for the text clrb @r2 ; mov @2(r5) ,r1 ; error number to return bgt 20$ ; > 0 ? neg r1 ; always insure error > 0 20$: mov r1 ,-(sp) ; save error number clr r0 ; and setup to convert to ascii div #10. ,r0 ; get the last digit ; ejr add #'0 ,r1 ; make it ascii ch[1] ; ejr mov R1 ,R3 ; save it ; ejr mov R0 ,R1 ; get the remainder ; ejr clr R0 ; set up to convert ; ejr div #10. ,R0 ; get the second digit ; ejr add #60 ,R1 ; make it ascii ch[2] ; ejr add #60 ,R0 ; make it ascii ch[3] ; ejr movb #40 ,(r2)+ ; errortext[1] := ' '; movb #'- ,(r2)+ ; errortext[2] := '-'; movb r0 ,(r2)+ ; errortext[3] := ch[1] ; movb r1 ,(r2)+ ; errortext[4] := ch[2] ; movb r3 ,(r2)+ ; errortext[5] := ch[3] ; movb #40 ,(r2)+ ; errortext[6] := ' ' clrb @r2 mov (sp)+ ,r1 ; restore error number cmp r1 ,#127. ; range ok ? bgt 100$ ; no, just exit asl r1 ; convert to word offset mov msgtbl-2(r1),r1 ; get address of the text beq 100$ ; nothing (unused error) mov #100-6 ,r0 ; maximum number of characters to copy 30$: movb (r1)+ ,(r2)+ ; copy until null beq 100$ ; sob r0 ,30$ ; next please 100$: mov (SP)+ ,R3 ; restore R3 ; ejr mov (sp)+ ,r2 ; restore R2 mov (sp)+ ,r1 ; and r1 also please return ; bye .psect direrr ,ro,d,lcl,rel,con msgtbl: .word 1$, 2$, 3$, 4$, 5$, 6$, 7$, 8$, 9$, 10$ .word 11$, 12$, 13$, 14$, 15$, 16$, 17$, 18$, 19$, 20$ .word 21$, 22$, 23$, 24$, 25$, 26$, 27$, 28$, 29$, 30$ .word 31$, 32$, 33$, 34$, 35$, 36$, 37$, 38$, 39$, 40$ .word 41$, 42$, 43$, 44$, 45$, 46$, 47$, 48$, 49$, 50$ .word 51$, 52$, 53$, 54$, 55$, 56$, 57$, 58 tKERMIT.B[001011]K11DER.MAC;1F j$, 59$, 60$ .word 61$, 62$, 63$, 64$, 65$, 66$, 67$, 68$, 69$, 70$ .word 71$, 72$, 73$, 74$, 75$, 76$, 77$, 78$, 79$, 80$ .word 81$, 82$, 83$, 84$, 85$, 86$, 87$, 88$, 89$, 90$ .word 91$, 92$, 93$, 94$, 95$, 96$, 97$, 98$, 99$,100$ .word 101$,102$,103$,104$,105$,106$,107$,108$,109$,110$ .word 111$,112$,113$,114$,115$,116$,117$,118$,119$,120$ .word 121$,122$,123$,124$,125$,126$,127$ .enabl lc 1$: .asciz \Bad parameters/Insufficient dynamic storage\ 2$: .asciz \Invalid function code\ 3$: .asciz \Device not ready\ 4$: .asciz \Parity error/Insufficient dynamic storage for send\ 5$: .asciz \Hardware option not present/Un-assigned LUN\ 6$: .asciz \Illegal user buffer/Device handler not resident\ 7$: .asciz \Device not attached/Task not active\ 8$: .asciz \Device already attached\ 9$: .asciz \Device not attachable\ 10$: .asciz \End of file detected/Issuing task not checkpointable\ 11$: .asciz \End of volume detected/Task is checkpointable\ 12$: .asciz \Write attempted to locked unit\ 13$: .asciz \Data overrun\ 14$: .asciz \Send/receive failure\ 15$: .asciz \Request terminated\ 16$: .asciz \Privilege violation\ 17$: .asciz \Sharable resource in use\ 18$: .asciz \Illegal overlay request/No swap space available\ 19$: .asciz \Odd byte count\ 20$: .asciz \LBN too large\ 21$: .asciz \Invalid UDC module #\ 22$: .asciz \UDC connect error\ 23$: .asciz \Caller's nodes exhausted\ 24$: .asciz \Device full\ 25$: 26$: 27$: 28$: 29$: 30$: 31$: 32$: 33$: 34$: 35$: 36$: 37$: 38$: 39$: 40$: 41$: 42$: 43$: 44$: 45$: 46$: 47$: 48$: 49$: 50$: 51$: 52$: 53$: 54$: 55$: 56$: 57$: 58$: .byte 0 59$: .asciz \Fatal hardware error\ 60$: 61$: 62$: 63$: 64$: 65$: .asciz \device off line\ 66$: .asciz \Block check, CRC, or framing error\ 67$: .asciz \Device online\ 68$: .asciz \No such node\ 69$: .asciz \Path lost to partner\ 70$: .asciz \Bad logical buffer\ 71$: .byte 0 72$: .asciz \No dynamic space available\ 73$: 74$: 75$: 76$: 77$: .byte 0 78$: .asciz \No data available\ 79$: .asciz \Task not linked to ICS/ICR\ 80$: .asciz \Task not installed\ 81$: .asciz \Device offline/Illegal mapping specified\ 82$: .asciz \Invalid escape sequence\ 83$: .asciz \Partial escape sequence\ 84$: .asciz \Alignment error\ 85$: .asciz \Address window allocation overflow\ 86$: .asciz \Invalid region ID\ 87$: .asciz \Invalid address window ID\ 88$: .asciz \Transfer rejected by receiving CPU/Invalid TI parameter\ 89$: .asciz \EFN already specified/Invalid send buffer size ( > 255.)\ 90$: .asciz \LUN locked in use\ 91$: .asciz \Inconsistent qualifier usage/Invalid UIC\ 92$: .asciz \Invalid device/unit or device not a terminal\ 93$: .asciz \Invalid time parameters\ 94$: .asciz \Not a network task/Partition/region not in system\ 95$: .asciz \Timeout on request/Invalid priority ( .GT. 250.)\ 96$: .asciz \Connection rejected/Invalid LUN\ 97$: .asciz \Invalid event flag ( .GT. 64.)\ 98$: .asciz \Part of DPB out of user's space\ 99$: .asciz \DIC or DPB size invalid\ 100$: 101$: 102$: 103$: 104$: 105$: 106$: 107$: 108$: 109$: 110$: 111$: 112$: 113$: 114$: 115$: 116$: 117$: 118$: 119$: 120$: 121$: 122$: 123$: 124$: 125$: 126$: 127$: 128$: .byte 0 .even .end *[001011]K11I31.TSK;1+./ 0D6j27uʺ1 4 Us(0KERMIT.B[001011]K11I31.TSK;1rE@ ( U r[qS,3/ I{8.'DBSYSYSYSYTISYSYSYSYOV`0H^ϳH^``` SYSYSYSYTISYSYSYSYOV01-l.2PTPP PSY: pTPTv\Tv\ PvvPPname ; 2(r5) LUN ; 4(r5) modifiers ; ; output: r0 error code ttmode = 100 ! 10000 ! 40000 m.ttyini:: save ; we will need this one call ttpars ; g KERMIT.B[001011]K11I31.TSK;1 P\\p <W/ x#W/` r# t#ffB&f e@f& & & Ε eB:ҕEҕRҕ$ҕ ҕ C~ A ? eE $   be?E? & f Y7Xe%{V7Ne%{V*7@0fe Veh% ww7 eh%{V**7e Ve Rw`7e8%{V (  *  z r j b`0`0 V3 $&e"&( (e B4  @***7e Ve Ve$ H e 5 > VwBw7e${VF+N+7 7e{V+7e {VZA90$ .@(w Bf b Z    @SqAa h ߇    *  + 23E  Ew Å   Е-   0@ rW e`fÊ    E  & &  r(f  e ee e &f& v w " pp*Ce( Lˋ˥ ˥˥ ђ˥=  L   Lp& `!  ZCe eÒ{t*Hx2  =]/;[:,! EՋ  +z(a Z A90* .$ ! 0 % x%  j%@ w  0 &&   " ] W! ʥ* @&&  r -   % C   &   %    Х.% %̇ ȥ* R 䂿w T0 0  (ȥȥ *   3:: ] ]&fŔ` U%ΤdeDBŔ`Ӌ ` Ţ   ť/ ť= (* <&f& Rʥ-  ʥNO  T5 -4  4,0S 0S5!0C E  SE  C EW/W: W=W, t  ^&fפĢĒ& Ē eV/Z/C   &l!   Ջ UE []=:/,ҥ* !ŋ E & 5% e5w  ( Dw r  :w b  0*ww HB C DBe ?D(1 >eB  8 ,$&w *   w *fBC "& D SY*p0p2q10= =e "fD CBA   f  >5>Eu   w *w@#   U@e  ew1  %,, w F*D B UqqC ӥ: ~ Ce h   *w *  xĔ%.%%;?~ 5%5@<D ͥ*Ce X%wUO5@ U U*U  UKERMIT.B[001011]K11I31.TSK;19_@5 U*U  ʥ*%C!-D` )eC5U5  5 5@e*8Ae f"( UCɗ+e$&% 0+1e  %p*w~ f( f)f Z&  PBe  w*e(  1 :&e : 1-1- 111 rrrrr &fe ~  2 $ L La Ta Wq(W!ZW!AW!9W!0@*w Z ҥ[, &]  5 sC~ D wxf&5ҕ[ "5ҕ, 5ҕ]Et55tF e0ҐtI1 z  L 1 1 1 1 1 1 DEee $ $ )PTP   "wfLWL@aB`"3   f  8& e 6 <:3>3 @e6— 1888& e 6 <:3>"ȋ  ) E3 "  Is"2 s,4pA 2 36e 8s2+@`  e {VP@@55485t&SYNNzSYKERMIT.B[001011]K11I31.TSK;1f #D&a8/}Dpr7Hq͔&GYaT'mIW WXg2(77IG(_)OE/$7!oj#`jPX*y.4j#mi.9DaOorU;VODY@I"P[M|J( ʰFLD0  j>l~i0XL1nZ]@p"\w4zp$rL/T/]$nYR| _< RjOyTW!"JP49q{{O I-}? @zB(ٿHZ^#3 D&g=7'Iy.;kPFe/eEdB72B3v AudsNFn/'u5c  dup,^Q OPFCw 8|emj]7Q<4oQ7udC"z)Zrk8}ęM\>UE.@!|-R~OVK[TN;IFhjW4d1y(7"vCVtM_LB\VL&#b0"I]e8q#8K/>U3,_ E{ Br0@TRbһ%Џ4|jNGU3$NXu[#xb[vU|oOo$Y~/yb3s#HUTj5gϖ4!Tz7.0jP7t.u$^z9-v]87ȤocJY([k ,-s?FܲmEHGK %7`ؗm>+g~Nϊcma1}vP".onZw S!JH"32f$ #jrk#PW N~TKiz={Ba]/1^Y,Z. {yغw+o-W.Ouyi<(pE:OuS+!%GوcH:.c_cҹ;y36*RU/-.q25^Ur)obmS?~Xyb=l9r7$+j*]@(|_`.>D0CtKhc"'_TX)l4BRG5`gsA$`Q {α`` PnC}0!$iiF3qpN3Z\Qqx+hqM'ms9O99\G~~=idB'ppJH}"{~$oW51i)g5™wqTQhcq]x8v >ɼQ7z1 _3W.Xg=4d%J\uK2?Gv||OH/@ښ]ZaUul# @POuY~zH 5nk^ qPBrtX4rݑPN‘7Řޕ H} _P!5|ȑ)ւqV-XY,n"sr"38JLN1'N: +m^vHi8.Ua2gB(yM|_jŶxμo&0N]d^{P5Zn'_\L=e@7&|,-_UvvpFɶ.SQ3crW &i?Pt+;.x;O#3tms):@=J>Ff19v8%IvY7pKToJ? 4V$rX?Q> jJKcJLR   (@TW*C+7Fs6ym+[}I(9L`j9){ǻ,&,hr]OkF-zn 6 AYiBaK"kZ3:bp\K&>EUX5 3tf]j1d@ Ie"*IU+"8Mcx'R$}!e lq`Aha QXX_qekQX*MkGyy[p+Z 7!U*pX8d[%=|b)R$I6}!=(=Y\z,Yb$farFui{$ }oʂhu1$<ܩ~N%jO7|DMX@ t)}Fn/=`Ekg3~s%p/=Gqt8hT<9iI0pHn9P :ZfM1q!V<^šbl 5zwd'(G(olb4GPEvib73K -=Be)VG@1"rKu<8e{Rm[JViI?hek#Q>LwoJ4hGfN:_+*^R~^*.X?7 y(6EEmu?RE; Y$eDɾQ ;RXk;\@IxtT~8y>& ?ؠfdI"Bp>a03f!o9j%4V$h%>8>zlB'4cyE* 2[/Kmu%42.]PzYv~5?uPxj1>|j *,E kA^cpuO)xt%hUIqF^ QWS]hfC_t7LL5?C^ e1Ui$ PDI`rc2jiJSrOI+k$0LgPp 3j;,AXT2 QGm&\< FZv]T7ao&@1O^?7/n5Bj72Ts&vEYUP>+fr{0:]F^Z|X9/  {ZsB V^_c?oE&(ҫXYZ8@_p)ZX"2/h;X@&S`@vDYcD-']S!$\KCNX{3 F-0. F-0$ F-0$ F-0 F-0 F-0 F-0B F-0< F-0 F-04 F-0 F-1R F-1 F-1 F-1 F-1 F-1 F-1 F-1 F-1D F- 1T F- 1 F- 14 F- 1 F- 14 F- 1\ F-D1|w F-V1|w F-z1 F-z1 F-1 F-1 F-1 F-1 F-1V F-1& F-1f F-1r F-1 F-1 F-1 F-1 F-18 F-1 F-1 F-1 F-2ؔ F-.2ؔ F-@2ؔ F-R2ؔ F-2 F-2 F-2 F-2| F-2 F-2l F-2 F-2D F-2 F-2 F-25ew T Bv ~   EU  5 --w ¢W- 5  #5UW-  5wE5 E   0z*|.-Ew *, )&5"5&9LU3u5 =E U5`5U & E& & f&ËDef Ë )̋E U w &Ba +- ʥ# . U 0   b   `     &ff r[q***+.++++03B00r`00r2!00rN`2001rw2?0 1rTq3O$00r83|wD1h1y=|wp 21V1IwC|w 21D1IKqIz1 2lId h11IyPph11IyXh11Ix`h11Iwj h11I&qph11I3tlh11Iu\h1z1Izؔ22""zؔ 2.2I/"ؔ` 2@2I0"ؔ 2R2I1"ؔ4 2d2Iؔ4 2v2Iؔ@ 22IYؔ 22I%ؔ  22ID21hRt version number printed at ; program startup, ; then: ; GBLPAT=K11PAK:DO$VER:0 ; ; ; If you want kermit to NOT exit at end of file from the invocation ; as in: ker KERMIT.B[001011]K11I31.TSK;11---`0~/t/xr//}j/D3`K3DETACH&f& &?e E & Y w"   w@&f x1e? ww & fYw  w`  5f&  &   @ ^^em & e f & Ne & r @ & b ACW ^^ & @ H~   `ԝn ff& e e56fffff5 e  df\  ;% f :eM~AWA WZ@ $ nSPACK - ׭1$׭3WtE& Ne & > WtE& Ne & E& e r& &  5 "&f&B  H~)6& N > !f P% ŀw~ &f# *%SIRCGf&  w  l l& N  W_S& N Z mT 1NF4 J& N > W=S& N 7& N  W*St4B  h!& N  W-^RS    X  A TT 6ef&  % % 5JWfff Xe f& J8 >e &f# z% 4 4 4 4 4 4 4 4 4 @ C~@   4  ݗ 7 ݥ  4A111   XA Z @ $ 5ff& &&@9 e RPACK - &4-=5 90& 9f 8@ 5`f& &f 6eef& &f 5ee @ f5f&f ee0?Bad Checksum: rcv,calc are  +E& N ׭F1t E& N C׭$3 t E& N CС׭ E&f 6 ׭3  4f& L%  ׭E`B׭2E?tB`EE f&f CD% ׭ZE&N@@UBtEE Av;V;N@LV;UEf@@@U%!1BRcs ƍ#2$FW6etHZӾl~&f$D$Rb ~$|$Rb ~7 ` W f& %& N h   5 . &f @ \ &f7 ` hץ~ 7 R7 RN  770(&fD  ݼ A F 7 7 ww-^ w --  X ԝ & ݬe  ݢ 27       XԝT ŀ BE   ** &"ԝ  & N &  T &   ŀ  &fDE  A. BE ԝ  & N L& B 0T & ^ χ f&BC S  7  E&  7 7 7o  Ew[ W?W_&  | Հ& j  `  &B D 7  Ew&     &ffA r 0r 0@f& & eK~r n07 f&f  +A)VTC̔$̕_ ~ԕ P~  /f&&\E eeVf& d@ ef& f e `7 ߇Aborting with error from remote && Nffr&r e  &frKERMIT.B[001011]K11I31.TSK;15$ %&f2 %ffd""! 2e 2 l  ) &f%& %d"fd"!  % !ff% Te&@@E@U6 ʋ  % fWtEf@@@UWt Ef@@@UE7rt&fb  sv ՀŀEFBՀEFBՀffff &effff ef& f @" 7 K fff  % =@ +2 n ff be2 2ff e22 @ @ F A   0 <00 (1,TP H*- W-'0 1" /&2 (~1f@ F&0 F j@! 2ff d @ A Aff e@  @  f& He f& ff  HB  @ fff le ( @ 5@0 &  ff A AA fA AABRRRRR R"R$R&R)R(R*R,R. fA AAB "$&)(*,. f A ff e@   Aff e@  @ 1 q1,ff 8e@ @ t1`&q ( ff e@  Af@ fff  e. qq, ff ee&q ( ff ne@  @  ,f& % 82 r(,  (,   (, l Ҳ  ( fA @ f&B , ,ff e2  ~, ,    l  @  2 ff&& e f&fPf *- %  *1-@ !7X7Dы 3p,0(f& !ef& "e  8%A~ eP&f f& J 4ef& ef& J ef& ef& J eFile renamed to &  *- R$  *1-3ET@ $ ;1,q(f&f Z e f&f l!e1 1( #1,ff he  l@ l    e HL `#ff&HL xe f& HL ~e  % !ff& .ef& 4ef& [L e Files deleted: f *- "  *1-3ET@@@@@ T" 1,q(A  ??B~ @e 8 Bʋ%ʕ?  &?e &?e fB W  ~ & R ~Bf(& * e`    <d& tw# "$& tw$ $7 7 L2s $"Ts "fn)# Be Xs !f& J) %ts !TI& & & Ε7 & & & Εf f& & & ΕKERMIT.B[001011]K11I31.TSK;1+ > sf W&ffM 7 W-F^& & & Εfp 0JwF0s& & & Εf  s& & & Εf   ^& & & Ε wVW- ^& & & Εf  fCק"  rf  re0@e0e0Sӕ:   ePf& & & Ε ׭ 杌 f& P e  B    "η   2 t Ae r t&f& & & Εf ׭w׭  ~tw׭tlɝ  ~2 2 ff& & & Εf & & W-  Ar  && & (f     ~ $ %f h% @ &f松@@Ћ@ &f& & & Ε׭~́fe f& R e |m |X& & & Ε  3 NX& & & Ε  3 @& LS& Can't do space enquiry for RSX&f@ 0  & f& & & Ε& ׭zef& S& & & Ε   &?e & f & f) f ?&f& & (& & (李 & & (  f& & 5&fʕ& & & Εp˷ ׭ W,sBs @xs%f&BD U ,xsM,xs & & ҕҜsҕҜs&f&.V& & (& .V% ׭2׭* T L  : & & (& s8& Vf @ `& ff |@ `f& f ef e` & f 6`ѕ:& f &` e Wff %e8TER /SPEED=|}f0& VWf @ @`f& `Wff H%e0 SET /SLV=|w Cˋ5עX עA/עZעa)עz&עI&עi#עKעTעt ”:0 7 0`ߕ  6 f& & & Ε  @w 2Yנ & TI f & & & Ε Q2Yנ(,"X& & & Ε pZ& & & Ε  ^e ׭׭  > 2 & & (   s&f&f@f=B Е-B BleZЕ-B `Е e&f&f@f=eB  Е:ee‹e:/JanFebMarAprMayJunJulAugSepOctNovDec f&`& AɋB[  f&f e  &  l   e` f&  ef& V[ e 0ff& Je& H[  `f&f <%  `Е Е  v*.*;*Directory of 6 6 f@ wl\ f&& & ( AC@ N`ר   (& f& & & & & && %|& f& & & & & && & f& & & & & &&  & & (f& \ ee& & (|e%x8H14W"OMKHX,);i% iG(t " YnUwTC6ycd; Q?xokr(u2z1dT.]'.ko$LPF#zLd_KbG$[1xlC~ 3m[ .w'3zckb|uh7lF!*\9ao*z  wf& f &ef ff u & f&! %  df&! e  u  ' v hBv ̷Fv Pf&   eZv 4f! T% & f , f! Ö%^v V&  f   cv ~v 7 ܶf 7 & i pf! $e & j7 ~& f 2eSY:*.CMDv v ,v $! e!Е Dj V v f& & %v v !NjPjRjŀ v 4Pff f& f ev ePv3ʋ" . * KERMIT.B[001011]K11I31.TSK;1CJ97"   7   ef& k fe%ACCESS NOT ALLOWED TO THIS COMMAND &f : ! P 7& f#  7   7r  7f& fЋ 7 7 7 : pp m ȕ fLp"eB& W58Uwwssssseeʕ2r2 & & & ΕfЕ[C C` $Е, ڠ Е] ef 58 "l`L G58 w,ww첷 @НН Е:P h 6b .\ &  Е.J   Е;8 l*l f  V L000 00 f&f BAt4 4 u CM5ŀ5 5נ Õ   נ .נ +E5 oË ȋР5 נzנa 5@ נ[Õ(נ]Õ)5 נ'נ"45נ ËҐ 5 `W W ~e  &Ћ f&fA DeEff F 6f&f eF`%f& ff e&f&BC ҕ C~A r e0 b~   -  A  ѕ ʕ*  Z&f& & 0ef&@ABD  &f ~ e  &fAC r@p r(pSp ABCDEFGHIJKLMNOPQRSTUVWXYZ$.?0123456789: C& ˋ%ע  @ ע+ע-ע0ע9 & 0Wp e     U   Bנ0 נ70 `&fBCeEbqtE ~01234567&ff& %f& pee&f   !e&f  f& & %K~ d%fP%fЋ P% Kermit: pak: Fubar pak type: Retry limit reachedHopelessly out of synch with sending KermitB&B6BB BB485Link default set to XK0: for P/OS Link speed for XK0: set to 2Kn,X`  %  REC SEN?Syntax SEND Filename.type SERInvalid SERVER subcommand Server detaching from TI: You must use the SET LINE command before detaching the server Kermit Server running on PDP-11 host. Please type your escape sequence to return to your local machine. Shut down the server by typing the Kermit BYE command on your local machine. BYEFINGET SPAHELHOSRDITYPWHODELRENCOPKERMIT is not running as a LOCAL Kermit Read error on TAKE file: Current TAKE file closed LOCREMUnrecogized REMOTE command SETINVALID VALUE FOR SET UNKNOWN/INVALID SET COMMAND CON DIRCURRENT DEFAULT IS TAKEPREVIOUS TAKE FILE CLOSED SYSTHE SYSTEM COMMAND REQUIRES A COMMAND TO EXECUTE ERROR FROM SPAWNING COMMAND SPA BYECOMCONCOPDELDIRDISERAEXIFINGETHANHELLOCLOGNOTQUIRECREMRENRDISENSERSETSHOSPASYSTAKTRATYPWHOXK0:%beq 110$ ; yes, say no errors cmp r0 ,#er$fnf ; same goes for file not found bne 120$ ; exit 110$: clr r0 ; no errors 120$: unsave ; pop these and e QKERMIT.B[001011]K11I31.TSK;1@w1̨Ĩڭ֭7 ڭ7 ҭ7 ЭmJ ׭1׭{1S    x& ݚ &xw1bZ& v tf p ABCDFSZH8x8xDxLxRxZxjxrxbxA   d  5(x ѝެѕ ff& ee( ~f& x eft% ~e SENDSW - STATE IS b-^DAK l<fp#d" ve + )fp#f A ĺeff" ,%BCAey& N y fp# wҫDENYTyyyzyyAwVf" V A ? |zw(  fd7 VR  r@FH 4-0A)fp#B eff" (%BCAez& N zENYTzzzzzzAf" n A ?  7 rn  r@bC&f&f7 D7 DI S 1 -A<fp# f f# ז%fp#ȩf neff" ֺ%BCAe{& N {b`ENYT||0|f|||AbWI f"  AWI-2*  r@7 F f" L% #7 ̨Ȩ  r@ fFy0|d"7 ~  8@ x-tZAwX r f n 7 \ dfd" ǖ% &f d" pe f%& ߖ%fd"% 6eAe 7fd" %f&d" % f&~d"t~ e  ,f&&xF efrXX eff" d%BCAeb~& N 8 h~e@ ENYT~~~~~~SENDING FILE AS FILE Aަf" A ?   7   r@H r-nTA)fp#jZD eff" f%BCAe\& N : bENYTnzttAf"  ? إ֥  ƥĥ7   r@ (  bZbfrbE eA׭X׭ZZfp#  w(ZD -A< fZ efrȤZ leff" Ե%BCAe& N 7 pENYT$> DAdf"   ? @>  .,7   r@f  7 -h  b  FB F-2X F-2& F-2 F-2 F-2Ԟ F-2 F-2 F-2 F-2 F-27 w7 ޭڭ17 έ7 ̭m 7 ȭ  , < x& ݨ x1tl&  f 7 nRFDCA x$x0x + T&0fdY e/fDY efr$E ȴe#frY e7 楦⥃  r@֥DALOCAL KERMIT ERROR: ZXCREATE FAILED - CREATED FILE - FILE EXISTS, NOT SUPERCEDED - f-bF ARe? r@ frY ڳe7 " vAfp# ʿ A- PA   f  >7 ФfrY `e  r@F7 fr|N el b+ Z-V: AFe? r@ frY βe7 Afp# x  #frY eУУ7 ʣƣ  r@AATTRIBUTE PACKET ERROR - F-2& F-2̗ F-2 F-2Ԟ F-2 F-2 F-2ކ  !"'(,.ކ1209:\>@FHFNPYZefklprwx$~*lpv||„DŽȄ˄̄Є҄؉Մքڄ܄`hpALLCONSOLECONNECTFILEHELPNONEOFFONPACKETRAWRPACKSTATETERMINALNOTERMINALEVENODDMARKSPACENONENONEXONXOFFCARRIAGE-RETURNCARRIAGE_RETURNFULLHALFONOFFONOFFCHARIOLINEIOTC.DLU!# !$ f#   & Ȋ f& # e܊ f# ~   & 7 f# ֟f# B & #$ D \4 T f!    @ff# ^e  & 8 upport er$xco == -37 ; could not access XC:/XL: er$fun == -40 ; invalid .spfun code er$hrd == -41 ; hard i/o error er$fet == -42 ; no room to load handler er$ @KERMIT.B[001011]K11I31.TSK;1Nb Νf  f! % f&! Le  n 5   E?5f Ľ En Lʋ D E?T  U?B < 7 4 vU" f U P U : tU $/ҜE ΋  U f fd  :e fH ^ 5 n L Jz BUN ~ (    Œ     B F p t x       fЂ! ݖ% ( 7  Z8 R< Jr Bv : 2 * " Ž Ҏ  !'" f& ܖ%  7  ` ff! ܖ%  7 f! ܖ%  pb֎ . &7 N^7B N 7  f!  w f̃! ܖ%  ̕ 7 ĕ !ȋ 0W w R | zError from device assignment Link device set to Non-fatal error setting NOECHO for link Kermit-11 no longer running in LOCAL mode Bad value for speed or speed not settable Please use the SET LINE command Please use the SET LOGFILE command first Debug file closed Can't do RAW i/o disk logging with other DEBUG options set Old logfile closed and new logfile created in BINARY mode Can't do disk logging with RAW i/o logging on To enable: Connection logging SET DEBUG CONSOLE File opens/creates SET DEBUG FILE Packet traffic SET DEBUG PAC KET Raw terminal i/o SET DEBUG RAW State transitions SET DEBUG STATE Connection logging can be controlled by typing your escape character followed by a R to resume or a Q to stop logging. Kermit-11 will have to request 8 Bit quoting for the transmission of binary files. If the other Kermit does not support this, information for binary files will be lost. Unknown parity SET DUPLEX HALF, SET PARITY MARK, SET HANDSHAKE XON done SET DUPLEX FULL, SET PARITY NONE, SET HANDSHAKE NONE done SET RSX TC.DLU value, where value is 0..2 "0ʅ̅"0'("?@0Z\st"0̆Άֆ؆ކ""""""$.0":<FH"NP"VX]^ef؉klqrvx >Ƈt!"&( +,122686;<2AB\FH`KLPRXZ`bhjprxz1_CHARACTER_CHECKSUM2_CHARACTER_CHECKSUM3_CHARACTER_CRC_CCITT1-CHARACTER-CHECKSUM2-CHARACTER-CHECKSUM3-CHARACTER-CRC-CCITTONE_CHARACTEKERMIT.B[001011]K11I31.TSK;1yUR_CHECKSUMTWO_CHARACTER_CHECKSUMTHREE_CHARACTER_CRC_CCITTONE-CHARACTER-CHECKSUMTWO-CHARACTER-CHECKSUMTHREE-CHARACTER-CRC-CCITTSUPERCEDENOPROTECTNOSUPERCEDEPROTECT7_BIT7-BIT8_BIT8-BITASCIIBINARYEIGHTSEVENEIGHT_BITSEVEN_BITEIGHT-BITSEVEN-BITFIXEDIMAGEAUTONOAUTOTYPETEXTTXTEND-OF-LINEOctal value of remotes EOL ? PACKET-LENGTHPacket size ? PAUSESeconds to delay packets ? TIMEOUTTimeout in seconds ? STREAMVARIABLEOFFONNONEOFFONNONEOFFONNONEOFFONTTYVT100VT101VT1028-BIT7-BIT8BIT7BIT8_BIT7_BITPASSALLE?5f ʻ Et RΎ J Ҏ 4 ,f! Rݖ%  1E1/272!3)3 f# |  &  & jf#  &  f& # e l df! ܖ%  !ȋ f& dܖ%  \ . < ׭62 l p     Ə ֏  7 7  f@ !.ӕ.   J ڏ @ 8 0* ( . ` 7ڛ& d e@! fd" % d & 7"z f&   e JUNK.DAT7 p h f! e & BۇUN!d  f& ! PeԐ f! 0  ww f!  W  W ^ w֘wwwژؐ  f! \  wf! B  w֓f!  EW  F: >wpf!  ,W  > ` w<f!  W W < d  wwf! ؖ%  7 ttttf8! ؖ%  7ܒ ! 6 f!   wzfh! bؖ%  7X f! 8ؖ%  7 fȄ! ؖ%  7> f! ז%  7 f(! ז%  7 Debug file closed Please use the SET LINE command HANKERMIT link disconnected Ascii text mode set The other Kermit must be able to support 8 bit prefixing Without this feature, the high bit will be lost on every character sent Binary mode set The filetype must be of the form .xyz as in: SET BIN .SAV or SET BIN .TSK The default binary filetype list has been deleted Error from $PARSE - Directory for files set to Directory set back to none (SY:) Created debug file The packet size must be in the range 20..94 The escape character must be a control character RETRY should be between 3 and 30 TIMEOUT should be between 4 and 60 F-v2 Ƈ Ƈ1278N>@ԆHJPRԆ\^8efop؊z|Trd`ÃẵALLBLOCK_CHECK_TYPEBLOCK-CHECK-TYPEDATEDEBUGDEFAULTDELAYDIRECTORYESCAPEFILETYPEHANDSHAKELINEPACKETPARAMETERSPAUSERECORD_FORMATRECORD-FORMATTIMEVERSION f$! r%   $    :  lt from K11COM K11SUB.MAC Utility routines K11TRA.MAC TRANSFER command K11TSX.MAC TSX+ terminal i/o K11XM .MAC Dummy module for RT11 XM version. 0KERMIT.B[001011]K11I31.TSK;1}vu՚R5|6|6PָG!TLoqFX9(Aj">zvJ]J%&t/GGBM亖j]R}5[/AlN2)K 19SVUO3)gn?5ðY#upVp%|rƂ; |;SDE LX*}v C4qe,dJ22'x-Hg*^f׵F]\-%~B>죔FjXB نAAHi1$I= kwl\MS+iU6O*0w,K1)&Tq& }|1aQky w9bW^Y/@EYv#|ZJ.CP+{’w_S&s Rj+L4jK! TC7x4DB H_tI]Ա|G_),OT?=z 7BAA I W۵w2ݙ`]lښ =z+=suR ![LȖe@u12M]rQ{jv,V2:;C2kb:c 8sd qBL%qQY&zVϺ Y1n&؇ #;A3T`~ ѭ=(a Ls,"e2BYt)kOriWPVS]gUAT(jdB13|2#HN(o4 äR>{;;HB7$FuLC>m)=d[sW: $s-:~bg5d7Loߍ=$Va?J`sV۲7†1I[<(* ^ 'wroFCGg`PD%Pyv7%1kOs\v=)lIvX0_=) y$ieP{3k\p3-W3Q1Tﰝ.=r$aL;T=ԅbW3_nIb0;NEW7Ɇ~ \@vhKbS?@voɤ6u'.R}cfiR?۟X[+kCn< 1+>5g{Q(}vRϰ rKSۀ+U/{HmB*HnRѧ߾ pme 8\ c D >kUz.AĆWVz8ISlx(+93S5u|7ņj曝2=({J&fDu{z^,)F4> G yfvx $o#MCOaQ{[ wʍI(Q|,fVd3( aZ;>/8Zr]et@`XK[ȲMw̉u xC8%xCGPʄNeTT*4YgR=5KM! Zf2r j ǐR\'4ϚcnE"rM҄pFڐHUw%z#fUG M০l/V^LHZ)Bi ݢ`- 5x,ovia{(qfGcS`Ӱ EΦ6\aPf4҇s,$6 [*ԣ4?$5B&C+c5ER2N+i"F[ -A#hfߣQ6o%ㅴ0ع::ua Xprw{v&fsm+11RO=}_[ByMn*RNNT_Scc.,v;peT%X|fp# J%fp# B fp#.LY e 007 *&  r@fF  & p#! |f! v 7 P N fS  j3fp# zՖ%  f%& Pؖ%% *f%&tE e  ֓ SPAWNED JOB FAILED DUE TO TIMEOUT OR TT READ WAIT fp#p# ¹%& N  r f&ڟE ~e frY \e ۀ d frY .e 58f v  B fB&BE e Logout failed - Quota exceededPff @ ff&Y eeP q#& N  l>ff Ö%&   , && r#% % &e%& 6& % f%&XY e֓ deletedq#& N  ff ff Җ% 0֓ \ ʋ  ֓ 2 The following commands are available for the Kermit-11 server. To avoid ambiguity with local Kermit commands some of the server commands will need to be prefixed with the REMOTE keyword. BYE Logout Kermit-11 REMOTE COPY Copy a file to another REMOTE DIR Prints a directory out REMOTE DISK Prints the disk space REMOTE ERASE Delete the filename(s) FINISH Exits Kermit-11 server GET Sends the filename(s) REMOTE HELP Prints this help text REMOTE HOST Execute a host command REMOTE RENAME Rename old file to new REMOTE SPACE Prints the disk space REMOTE TYPE Prints the filename(s) REMOTE WHO Shows users logged in q#ɋ& N fn ^%@ v I need a filename to TYPE f  f̊ %  ֓  SYSTAT failed :ff Le *(ff ~ee& l  f&8Y ܨee(  n f X% blocks copied j:ff ve *(ff ee&  6 Jf&Y :ee(  f % file(s) renamedf% P ֓Pf% e &f%& Ж%f% >e Can't create KERMIT.TMP f ̷  f%& fЖ%f% ڲ% &q#ˋ& aˋ & #7 F f4G ئeffp# @%BCAeWY f 8% ԇFCan't get the remote KERMIT to FINISH 7 ^f<G Feffp# %BCAeWYWE fp# % f> % bӇLCan't get the remote KERMIT to LOGOUT  7 ! f!&R efR z  ҇ n 7 ! Zf!&C He frU e ffD e ffT e frW e ffE he frH Je fffR *e fffK e 7 XJ A@ 0& e  f W-ҋ@  & e&KERMIT.B[001011]K11I31.TSK;1ij  f fB!& %EeX  7 7 fB!f G effp# %BCAe֔& N Ȑ  7 Ȕ7 ” ENSYXTґFؐ@ - ,D $ j-ffB!fZG eH j (-$fB!fG en    fF ~ 7 ғ7 ̓ d  X P fp# l%fp# d fp#PnY eV  r@JfF Ĕ p# Ȕ f& p# ef&  e fp# $% f % Can't get the remote KERMIT to respond& &! 7  ~fF  7 j7 d f f ff&4E ؠe f# %Init failed for link?KERMIT-11 UNIMPLEMENTED SERVER COMMAND?KERMIT-11 UNIMPLEMENTED SERVER GENERIC COMMANDKERMIT.TMP?KERMIT-11 INVALID ARGUMENTS FOR REMOTE SERVER COMMAND Remote fails to respond to the command Remote NAK'ed the command 5 times Bad checksum retry abort Remote server response Receive data failed Remote ack: 444!!|~||||n΍   z r hf& # ef#   &4 8f&f eff Pee: @ D & e@f& e P x     0&  44 f# 6 f$ * f$ e *f$ f$  f# e f# w4 f l˖% f && N  Kf e       f ʖ% <KEwzf ʖ% *EwX  6  事f pe  f Re  f ̖%w& f$ .Ȗ%f$ P f# Ȗ%e7 f# &f& TI H & & & Ε& & & Εp& & & Εp & & Ε  & & Ε  6"& & & Εpq | b ZYb\VK$& & & Ε _&6`& +t'5 LŝT XK &|ŀ~7V ~&5@Ewږ    7 7 JF d6wB a 3& & & Ε & & & Ε & & task build time stack=64 // *[001011]K11HEX.B2S;1+OKERMIT.B[001011]K11I31.TSK;1q& Ε & & & Ε "& & & Ε & & & Ε&ŋ& N  f |ܱ&, *f%& `Җ%% :e%Е Е % $f&% e & ܀fŀD& N ^  V  CcIiQqRrXxBb?Hhx΋΋f e f# "  E 5vUn f ef#  f# hі% : f&: de B TRY TO SEND A BREAK TO THE REMOTE C CONNECT BACK TO THE LOCAL KERMIT-11 I DROP AND RAISE DTR (FOR RSTS ONLY) Q QUIT CONSOLE LOGGING. SEE SET LOG R RESUME CONSOLE LOGGING. SEE SET LOG X SEND XON AND CANCEL ANY ACTIVE XONS RUBOUT TRY TO FAKE A BREAK TO THE REMOTE ? PRINT THIS MESSAGE 5̖ 5Ė &f@  \ f e : f eYOU MUST FIRST DEFINE AN OUTPUT PORT: USE THE SET LINE COMMAND FOR THIS. CONNECTING TO LINE AT BAUD TYPE CTRL AND THEN C TO RETURN TO COMMAND LEVEL NOTE: THIS IS NOT A REMOTE LINE.  F-d2ؔ   &  :   !ʋ,f1 V%f& $ ef  Bff e`ʋ30ʋ&>@  % fff D%e@ 7> T ff   TOPIC ? f&@ W1f B!f ^Ö%  47 01-9*(& #ff $efff ze ` & ! " f& Ą `ef& ! Lef& Ą 8ef& Ą $eB!f t–% 1 $/ !19 $` f& >% ff ef& Ą e f&& &  tW1f X \   f&  6e P_B!   f l%4 / 1 9 !  dW B~f e f&  ef&  xe  e % f V  | Ά ff e   ͇LB:[1,2]K11HLP.HLPSY:[1,2]K11HLP.HLPKERMIT:K11HLP.HLPHELP:K11HLP.HLPԆDK:K11HLP.HLPSY:K11HLP.HLPCAN'T OPEN THE KERMIT-11 HELP FILE - PRINTING DEFAULT COMMAND LIST TEXT HELP TOPIC NOT FOUND ADDITIONAL INFORMATION IS AVAILABLE ON:   Nf# f# e f# f# v  ff :e Tf   G f Bі%W f $і%f Ζ% fff e   f Ζ%  & f *  f# B̖%f# d ma!Bow!B! D$|$8$$$#!, ~%%!*   6e N    6ˆ .ƈ &&f&ff& f DeD f& & *eff @ef eʈ Έ ҈ eƄB Byte data, size Word data, size A6Eҕ  DtEe0tEe0Ee0 f&  Be ~ֈ ڈ eAB f&  % ~ވ  f&f& h ~f & e A@ V Ѥ~e@e$IMAGEARGBUFAT$ACCAT$AREAT$BILAT$BSIAT$CREAT$DISAT$ENCAT$FABAT$FORAT$IDAT$LENAT$PASAT$PR0AT$PR1AT$SYSAT$TYPAT$VALATRCTXBINMODBINTYPCCCNTCHARIOCHKSIZCHKTYPCMDADRCMDBUFCMDLUNCMDNUMCONESCCONPARCONSAVCONSTSDO8BITDEBUGDEFDIRDOAUTODO8BITDORPTDUPLEXERRTXTFILNAMHANDCHHLPBUFIMAGEINDEXINOPNINSERVKBIOSTLINKSTLOGFILMAXTRYMCRCMDNUMTRYOLDTRYOUTLUNOUTOPNPACKETPAKNUMPARITYPAUSETPCNT.RPCNT.SPROMPTRANERRRECCNTRECPARRECPKTREMOTERPTQUORTQUERTWORKSENCNTSENDATSENDLYSENPARSERMODSERTIMSETRECSETSENSIZESKIPFLSPARSZSRCNAMSTATESY.INITCDLUTESTCTISTSTOTP.RTOTP.STRACETTCONSTTDIALTTNAMETTPARMVTTYPEXGOTTNXMODE Can't find symbol in internal STB P PBP  <(&fAB?ѕ ~ H/$?C~ ֕Arߖp&`MP|@0ϗ  Kݘ9Yř'pe`PϚ@8(0d ț0Vʜ 4gER$ABO THIS ERROR CODE NO LONGER IN USEER$ACC F11ACP ACCESS ERROR OR FILE IMPROPERLY CLOSED OR CREATEDER$ACT CURRENT RMS ACTIVITY PRECLUDES OPERATIONER$AID BAD AREA ID(STV=@XAB)ER$ALN ALIGNMENT OPTIONS ERROR(STV=@XAB)ER$ALQ IMPROPER ALLOCATION QUANTITYER$ANI NOT ANSI "D" FORMATER$AOP ALLOCATION OPTIONS ERROR(STV=@XAB)ER$AST INVALID OPERATION AT AST LEVELER$ATR ATTRIBUTE READ ERROR(STV=SYS ERR CODE)ER$ATW ATTRIBUTE WRITE ERROR(STV=SYS ERR CODE)ER$BKS BUCKET SIZE TOO LARGE(FAB)ER$BKZ BUCKET SIZE TOO LARGE(STV=@XAB)ER$BLN THIS ERROR CODE NO LONGER IN USEER$BOF BEGINNING OF FILE DETECTED($SPACE)ER$BPA PRIVATE POOL ADDRESS ZERO OR NOT WORD-ALIGNEDER$BPS PRIVATE POOL SIZE NOT MULTIPLE OF "4"ER$BUG INTERNAL RMS ERROR CONDITION DETErmits are set to binary mode can result in an unusable file after transfer because of the possibility of transfering imbedded record control information. .s 1 #Version KERMIT.B[001011]K11I31.TSK;1uCTEDER$CCR CAN'T CONNECT RABER$CHG $UPDATE-KEY CHANGE WITHOUT HAVING ATTRIBUTE OF XB$CHG SETER$CHK BUCKET HEADER CORRUPTEDER$CLS RSTS/E CLOSE FUNCTION FAILED(STV=SYS ERR CODE)ER$COD INVALID OR UNSUPPORTED "COD" FIELD(STV=@XAB)ER$CPB PARAMETER BLOCK HAS INVALID ARGUMENT LISTER$CRE COULD NOT CREATE FILE(STV=SYS ERR CODE)ER$CUR NO CURRENT RECORD(OPERATION NOT PRECEDED BY GET/FIND)ER$DAC F11ACP DEACCESS ERROR DURING "CLOSE"(STV=SYS ERR CODE)ER$DAN DATA AREA NUMBER INVALID(STV=@XAB)ER$DEL RFA-ACCESSED RECORD WAS DELETEDER$DEV BAD DEVICE, OR INAPPROPRIATE DEVICE TYPEER$DFW ERROR OCCURRED ON DEFERRED WRITE (STV=SYS ERR CODE)ER$DIR ERROR IN DIRECTORY NAMEER$DME DYNAMIC MEMORY EXHAUSTEDER$DNA ZERO DNA WITH NON-ZERO DNSER$DNF DIRECTORY NOT FOUNDER$DNR DEVICE NOT READYER$DPE DEVICE POSITIONING ERROR(STV=SYS ERR CODE)ER$DTP "DTP" FIELD INVALID(STV=@XAB)ER$DUP DUPLICATE KEY DETECTED, XB$DUP ATTRIBUTE NOT SETER$ENT RSX-F11ACP ENTER FUNCTION FAILED(STV=SYS ERR CODE)ER$ENV OPERATION NOT SELECTED IN ORG$ OR TKBER$EOF END-OF-FILEER$ESA EXPANDED STRING ADDRESS IS ZEROER$ESL NO EXPANDED STRING IN EXPANDED STRING AREAER$ESS EXPANDED STRING AREA TOO SHORTER$EXP FILE EXPIRATION DATE NOT YET REACHED&fAB?ѕ ~ H/$?C~ ֕phN`}XP@80+ g~,_ᘀpH`vP@0 Wuؚ4Qۛ!IxxplhER$EXT FILE EXTEND FAILURE(STV=SYS ERR CODE)ER$FAB NOT A VALID FABER$F AC RECORD OPERATION NOT SUPPORTED IN FAB FACER$FAL REMOTE NODE DOES NOT SUPPORT OPERATIONER$FEX FILE ALREADY EXISTS ER$FID INVALID FILE-IDER$FLG INVALID FLAG-BITS COMBINATION(STV=@XAB)ER$FLK FILE IS LOCKED BY OTHER USERER$FNA ZERO FNA WITH NON-ZERO FNSER$FND RSX-F11ACP "FIND" FUNCTION FAILED(STV=SYS ERR CODE)ER$FNF FILE NOT FOUNDER$FNM ERROR IN FILE NAMEER$FOP INVALID FILE OPTIONSER$FSS SYSTEM ERROR DURING FNA/DNA STRING PARSEER$FUL DEVICE/FILE FULLER$IAN INDEX AREA NUMBER INVALID(STV=@XAB)ER$IDX INDEX NOT INITIALIZED(STV ONLY,STS=ER$RNF)ER$IFI INVALID IFI VALUE,OR UNOPENED FILEER$IMX TOO MANY XABS OF A GIVEN TYPE(STV=@XAB)ER$INI THIS ERROR CODE NO LONGER USEDER$IOP OPERATION ILLEGAL,OR INVALID FOR FILE ORG.ER$IRC ILLEGAL RECORD ENCOUNTERED(SEQ. FILES ONLY)ER$ISI INVALID ISI VALUE, OR UNCONNECTED RABER$KBF BAD KEY BUFFER ADDRESS(KBF=0)ER$KEY INVALID KEY FIELD(KEY=0/NEG)ER$KRF INVALID KEY-OF-REFERENCE($GET/$FIND)ER$KSZ KEY SIZE=0,OR TOO LARGE(IDX)/NOT=4(REL)ER$LAN LOWEST-LEVEL-INDEX AREA NUMBER INVALID(STV=@XAB)ER$LBL NOT ANSI LABELED TAPEER$LBY LOGICAL CHANNEL BUSYER$LCH LOGICAL CHANNEL NUMBER TOO LARGEER$LEX LOGICAL EXTEND ERRORER$LIB OLD/INCONSISTENT LIBRARY CONFIGURATION(CRASH)ER$LOC "LOC" FIELD INVALID(STV=@XAB)ER$MAP BUFFER MAPPING ERRORER$MEM FNA, DNA, ESA, OR RSA STRING WRAPPED TO ZEROER$MKD F11ACP COULD NOT MARK FILE FOR DELETIONER$MRN MRN VALUE=NEG/REL.KEY GT MRNER$MRS ILLEGAL FAB MRS VALUEER$NAE UNMAPPABLE NETWORK ACCESS ERRORER$NAM "NAM" BLOCK ADDRESS ZERO OR ODDER$NEF NOT POSITIONED TO EOF(SEQ. FILES ONLY)ER$NET LINK OR NETWORK ABORTEDER$NID THIS ERROR CODE NO LONGER IN USEER$NMF NO MORE FILES M*[001011]K11MNU.COM;1+./ 0D6\l9ˍ7ʍ 4 U<0KERMIT.B[001011]K11I31.TSK;1ATCHING WILD-CARD SPECIFICATIONER$NOD ERROR IN NODE NAME (OR IMBALANCED NODES FOR $RENAME)&fAB?ѕ ~ H/$?C~ `P@H0k Ɩ'Wٗ&DpZ`xP@0 &E|ʙ%Nfǚ.T{pכ`PH6@h0 ؜=\ER$NPK INDEXED FILE-NO PRIMARY KEY DEFINEDER$OPN RSTS/E OPEN FUNCTION FAILED(STV=SYS ERR CODE)ER$ORD XAB'S NOT IN CORRECT ORDERER$ORG INVALID FILE ORGANIZATION VALUEER$PLG ERROR IN FILE'S PROLOGUE(RECONSTRUCT FILE)ER$PLV FILE PROLOGUE VERSION LEVEL UNSUPPORTEDER$POS "POS" FIELD INVALID(POS GT MRS,STV=@XAB)ER$PRM BAD FILE DATE FIELD RETRIEVED(STV=@XAB)ER$PRV PRIVILEGE VIOLATION(OS DENIES ACCESS)ER$RAB NOT A VALID RABER$RAC ILLEGAL RAC VALUEER$RAT ILLEGAL RECORD ATTRIBUTESER$RBF INVALID RECORD BUFFER ADDRER$RER FILE READ ERROR(STV=SYS ERR CODE)ER$REX RECORD ALREADY EXISTSER$RFA BAD RFA VALUEER$RFM INVALID RECORD FORMATER$RLK TARGET BUCKET LOCKED BY ANOTHER ACCESSORER$RMV RSX-F11ACP REMOVE FUNCTION FAILED(STV=SYS ERR CODE)ER$RNF RECORD NOT FOUND(STV=0/ER$IDX)ER$RNL RECORD NOT LOCKEDER$ROP INVALID RECORD OPTIONSER$RPL ERROR WHILE READING PROLOGUE(STV=SYS ERR CODE)ER$RRV INVALID RRV RECORD ENCOUNTEREDER$RSA THIS ERROR CODE NO LONGER USEDER$RSL NO RESULTANT STRING IN RESULTANT STRING AREAER$RSS INVALID RESULTANT STRING SIZEER$RST INVALID RESULTANT STRING ADDRESSER$RSZ BAD RECORD SIZEER$RTB RECORD TOO BIG FOR USER'S BUFFER(STV=ACTUAL REC SIZE)ER$RVU RRV UPDATE ERROR ON INSERTER$SEQ PRIMARY KEY OUT OF SEQUENCE(RAC=RB$SEQ FOR $PUT)ER$SHR UNRECOGNIZABLE VALUE IN FAB SHR FIELDER$SIZ "SIZ" FIELD INVALID(STV=@XAB)ER$STK THIS ERROR CODE NO LONGER USEDER$SUP OPERATION UNSUPPORTED OVER NETWORKER$SYS SYSTEM DIRECTIVE ERROR(STV=SYS ERR CODE)ER$TRE INDEX TREE ERRORER$TYP ERROR IN FILE TYPE EXTENSIONER$UBF INVALID USER BUFFER ADDRER$UIN FAL REJECTED SOME FIELD (STV TELLS WHICH)ER$USZ INVALID USER BUFFER SIZE(USZ=0)ER$VER ERROR IN VERSION NUMBERER$VOL INVALID VOLUME NUMBER(STV=@XAB)ER$WCD WILD CARD ENCOUNTERED DURING FNA/DNA STRING PARSEER$WER FILE WRITE ERROR(STV=SYS ERR CODE)ER$WLK DEVICE IS WRITE-LOCKEDER$WPL ERROR WHILE WRITING PROLOGUE(STV=SYS ERR CODE)ER$XAB NOT A VALID XAB(@XAB=ODD,STV=@XAB)ER$XTR EXTRANEOUS FIELD DETECTED DURING PARSEfB@ҕ C~B A f r e0C r e0e0ҕ ҕ-RҐҕ W   AL:R~Lxٖ 8hƗ,Zyʘޘ'O]rƙ%I]rɚ)Qjzқ1NcuĜ.CVfvɝܝݝ -=\n5X۟Lݠ >o Bad parameters/Insufficient dynamic storageInvalid function code/Specified task not installedDevice not ready/Partition too small for tasks not know about c eof for direct access files. Will have to fix c for RT when I get the rt version done. c c c c to compile: c c f77 k11hex=k11hex c ftb c k11h }KERMIT.B[001011]K11I31.TSK;1alParity error/Insufficient dynamic storage for sendHardware option not present/Un-assigned LUNIllegal user buffer/Device handler not residentDevice not attached/Task not activeDevice already attached/Directive inconsistent with stateDevice not attachable/Task already fixed/unfixedEnd of file detected/Issuing task not checkpointableEnd of volume detected/Task is checkpointableWrite attempted to locked unitData overrunSend/receive failureRequest terminated/Receive buffer is too smallPrivilege violationSharable resource in useIllegal overlay request/No swap space availableOdd byte count/Illegal vector specifiedLBN too largeInvalid UDC module #UDC connect errorCaller's nodes exhaustedDevice fullIndex file fullNo such fileLocked from read/write accessFile header fullAccessed for writeFile header checksum failureAttribute control list format errorFile ACP read errorFile ACP write errorFile already accessed on LUNFile ID, file number checkFile ID, sequence number checkNo file accessed on LUNFile was not properly closedOPEN - no buffer spaceIllegal record sizeFile exceeds space allocated, no blocksIllegal operation on FDBBad record typeIllegal record access bits setIllegal record attributes bits setIllegal record numberInternal consistancy error2 different devicesNew file name already in useBad directory fileCan't rename old file systemBad directory syntaxFile already openBad file nameBad device nameBad block on deviceDuplicate entry in directoryNot enough stack (FCS or FCP)Fatal hardware errorFile ID was not specifiedIllegal sequential operationEnd of tape detectedBad version numberBad file headerDevice off lineBlock check, CRC, or framing errorDevice onlineNo such nodePath lost to partnerBad logical bufferNo dynamic space availableConnection rejectedFile expiration date not reachedBad tap e formatNot ANSI 'D' format byte countNo data availableTask not linked to ICS/ICRTask not installed/Directive issued/not issued from ASTDevice offline/Illegal mapping specifiedInvalid escape sequencePartial escape sequence/Window has I/O in progressAllocation failure/Alignment errorUnlock error/Address window allocation overflowWrite check failure/Invalid region IDTask not triggered/Invalid address window IDTransfer rejected by receiving CPU/Invalid TI parameterEFN already specified/Invalid send buffer size ( > 255.)Lun in use or Disk quota exceeded/LUN locked in useInconsistent qualifier usage/Invalid UICInvalid device/Network reset/Invalid device or unitToo many links to task/Invalid time parametersNot a network task/Partition/region not in systemTimeout on request/Invalid priority ( .GT. 250.)Connection rejected/Invalid LUNUnknown name/Invalid event flag ( .GT. 64.)Unable to size device/Part of DPB out of user's spaceDIC or DPB size invalid4 >8 6T .X &`@  @@ff Fee@@\ ڇ DEFAULT KERMIT-11 HELP TEXT @ FILESPEC BYE CONNECT DIRECT FILESPEC DISCONNECT EXIT FINISH GET FILESPEC HANGUP HELP TOPIC LOCAL KERMIT COMMAND NAME QUIT RECEIVE FILENAME REMOTE BYE REMOTE FINISH REMOTE GET REMOTE SPACE RENAME OLDNAME NEWNAME SEND FILESPEC SERVER SET BLOCK-CHECK 1-CHARACTER-CHECKSUM SET BLOCK-CHECK 2-CHARACTER-CHECKSUM SET BLOCK-CHECK 3*[001011]K11HEX.BAS;1+./ 0D69ˍ7ʍ 4 Us<0KERMIT.B[001011]K11I31.TSK;1ņ-CHARACTER-CRC-CCITT SET DEBUG ALL SET DEBUG CONSOLE SET DEBUG CONNECT SET DEBUG FILE SET DEBUG HELP SET DEBUG NONE SET DEBUG OFF SET DEBUG ON SET DEBUG PACKET SET DEBUG STATE SET DEFAULT DEV:[UIC] SET DIRECTORY DEV:[UIC] SET DTR SET END-OF-LINE OCTAL VALUE SET ESCAPE OCTAL VALUE SET FILETYPE BINARY OR ASCII SET HANGUP SET HOME SET LINE DEVICE NAME SET LOGFILE FILENAME.TYPE SET PACKET-LENGTH DECIMAL VALUE SET PARITY SET PAUSE DECIMAL NUMBER SET RETRY DECIMAL NUMBER SET SPEED DECIMAL NUMBER SET TIMEOUT DECIMAL NUMBER SHOW ALL SHOW BLOCK-CHECK-TYPE SHOW DEBUG SHOW DEFAULT SHOW DIRECTORY SHOW ESCAPE SHOW FILETYPE SHOW LINE SHOW PACKET SHOW PARAMETERS SHOW TIME SHOW VERSION SPACE SYSTEM CCL/DCL/MCR COMMAND TAKE FILENAME.TYPE TYPE FILENAME.TYPE NOTE THAT KERMIT-11 WILL ACCEPT WILDCARD FILE SPECIFICATIONS FOR BOTH THE SEND COMMAND AND THE SERVER GET COMMAND, AS IN SEND *.MAC OR, FROM A LOCAL KERMIT TALKING TO KERMIT-11 AS A SERVER, GET *.MAC KERMIT.B[001011]K11I31.TSK;1XP"P#Pؔؔ؜Pؔؔ(&@@ff (% `f&f % U؜((2( 1, 2,  *-*-ff 2me@' f ke F <f keff rke  e&CW 444 4 4 4 "4 $4 &4)4(4 *4 ,4 .' ""$$&&))((**,,..r r @121@2@2P @020@2 @2 @2 @2 @2ff xff Fje@iȝf (jeZ1 &1 (2 &2 (qa&q (ra&r (ؔff keErؔ@  f jkeWuDaff ief ie   F-1( F-1 F-1b F-1 F-1b F-1$ F-1 F-1 F-1 F-1΃ F-1 F-1 F-1 F-1 F-1 F-1 F-z1D F-14 F-1 F-1> F-z1 F-1 F-1 F-1 F-z10 F-1 F-z1 F-z1 F-z1 F-1 F-z1 F-z1 F-1> F-1 F-1 F-1 F-1 F-1V F-1: F-z1D F-1̍ F-z1΅ F-1 F-1f F-z1" F-1 p2iraazhؔ@hÛěϛЛTj՛֛ޛaabi#.bd4FaMNVfoaa^dŜڜ_``h  Tji%02i5FeKL@QRi[dimv({ ia0cbb̝lbѝҝb؝abzbb& c-4lb:<bAHbLN0Yf k88Ğ@՞ޞ@PX`$2h8L`Vdphjxqܟ"6@T^fqz Ƞ'>ȕGHؕVfؕtЕ蕦¡ɡڡ .DKR^frzH¢Ǣܢ 0($:(CZ(cz8@COMMAND FILE ? BYECOMMENTCONNECTCOPYFROM: DATEDELETEWHAT: DIRECTDISCONNECTDISKDISPLAYSYMBOL: ERASEWHAT: EXITFINISHGETFILE ? HANGUPHELPHOSTCOMMAND: LOCALLOCAL COMMAND ? LOGOUTLOGFILELOGFILE NAME ? LOG_FILELOGFILE NAME ? LOG-FILELOGFILE NAME ? NOTEQUITPRINTFILE ? RECEIVEREMOTEREMOTE KERMIT CMD ?*[001011]K11INS.RNO;1+.=/ 0D6Xd܎7n܎ 4O== U|s<0=KERMIT.B[001011]K11I31.TSK;1u\'ړŖqDݢ%k 9se[?w-x{Ew=v΢p]=be< "ST {}(@ji]LK/$^]O:*+R( 2q+d\b[ V4QI46,}P٪N!^Msc롂1iKuǠ]b"?gwXk᧝LZ`u2a lT\Hb1Xno.1YeX¨v,\%r/o!o`YzNzswE}JYQ惍ɀ'(أ"bSpc24XAtE{d}ڱbCWzΠ`i, R>k?q4& =F9Tzil EB9?.E ZEf`,8/*ɀNKwD<>y}r^rt񫬧hmUu&J3T̽$BDV He_##"^@l#ES 5Gn9u0RxdHpG_z3F]; xvTMysX.O:J~]_G#!gV(? S݉M\vL9G'"; 'WKa;AwZlpY;?fQh-mCNߏi٢П5AANEi]§7Bt+O<#>ӓ68Nzij]lc~v9iOm~<k.uū~.WZ:,T6WŢ\Qg1N2] qy0{7s^ a>td2q&gz0)ߪ+W#(*8lŮJthz!w6>FaW WɎ; bAJVBvg~q9Dlmq%{+oBZRG d;ߌ|o>?@A lP̖z7Q$f,U;[V/$mu+< ) -LhmAT7>N4Y4]:jDSۿ Bf.بo}f#e:2v%_ g;_S?DJ.<T ϷfgmmӖ}{!yWr3o%r\`ds}B&ʈuם@sK)hpu,${/U!eHC>rUypb=m5y{G}Ue ~cγT}Iۗ-?U*x r # e[\$hB`e U@S{ _ms2a7I|{=VnkwBeY`ne`a#YDXT Q$H-}t8p$?IG2wUcfvw]@_ yPKXc d^rʰfFbYdYd=%Kfʾ/m@ ť~ m흲7xÎnwR-s#v8Km #!ST6U#rofΫ0G5Q)abλ+],;1 ʰ|*o͈$-פohp~ޙ`46T |4jsB gnz>bͺI/{ay :hQgGAiF:os;KWI E4]F\ɻ?|{滅Z1iݥdTgeqTL L=C>>poZpO`u>HId阱ܮM"R 7Mぶ?Q[ n sCVx&pjv,fi,RB_­M9˟ M_&}_Pd9iQz kmjgaǨϕ1tb^~M@+YMzRA5PL=U5%fӁX|ܨ} t_#Ns.2Eb4ɉ!3k 10E&Ei$"yPwa?\ N lZ 4kR_|gG0 (? csEdmlvGNG7&9Ije8{\4*ަNR=Enw׶Ҳ|

[b.\?&z L?ң \B{/6g" m`>ʘgF>˸tEb& \`ǘf/{jZGw*wJY!H!y$B"vpfoc Ԧu.H*T<\k& 4nk+O!ϛ- g_=1 xQ[j}ubx8"{;laGd=$ f Ne &f  B(%7 ԊYN7 Y׭ &RKERMIT.B[001011]K11I31.TSK;1` 171& Ne & Ne & Ne & N b& Ne RRRR& Ne & Ne  ׭1׭3ωf  ؄(%ѕ^ѕ ѕѕѕ ѕ#ѕYѕ1ɕ ɕ~ ѕ&Љ&fA@8%& N -& N && N & N v & N R R R R & N 8% ŀ~X%8%1w7 WY& WN7 ڈwڈf8%ѕ^ѕ ѕѕѕ ѕ#ѕYѕ1ѕ &f5D4f  `%d t@ f& >%A@ f& "%f  %Receiving file Sending file &ffPPѕ ~@  Bff ee Qѕ W* ѕ ѕ ѕ  @f&f ee fFf eff e f& f e \ ff e BePLengthTypePaknum ѕ ѕ p  f& t efJ  f&  re@f   7r  ޢ Rf& ע ,eʅ7 7܅ ,f& բ e f) ̀ bf& Ȣ e* vw w P@ f& բ ef  $ 7rV V ڢ f& ע jeЄ7 7 jf& բ De  f& Ȣ $e .w ҄w̄ @ f& բ e&ff& &f e1ȋ   f& f ee׭\  L  &f  r  ЕЕ[Е16PЕCf& & *ee .TSK.SAV.OBJ.STB.CRF.TSD.BAC.OLB.MLB.RTS.EXE.COM.BIN.SML.ULB.HLB.SYS.LIBҖX ttz!"#$%&'()*+,-./0Ttx|UNKNOWN ATTRIBUTE PACKET TYPE 89ABC. 6 ʤˋ ` $  -&fŔ` U%Τd eDBŔ`Ӌ ` Ţ   ť/ ť= (* <&f& Rʥ-  ʥNO  L5 -4  ,,0S 0S5!0C E  SE  C EW/W: W=W, t  ^&fפĢĒ& Ē eqqC   &l!   Ջ UE ҥ* !ŋ E & 5% e55*ߋ 0*̋%p\p^0_ "Ռ BB DVHJN     \W%SY  ^e5   feՕ"U6"4 4ߋ eE BCE H2I? 3t G ,A pC: BA A G A HCB A @77n TG @ C A @׭fe׭^E׭Vd+׭ND' ZG) vB ~@ B B J =$ =& H * BD B 2 =$ =& G2? 2       AJ ? ?N 7 e7\7V-( eP 7` -" b E bf-b \e @ P-L P@ 0? e , *-&  El @ >? 1v 7   ter ttypar::call ttpars ; get the terminal unit number chkpar::clr r0 ttyhan::call ttpars ; the usual, parse the device name ttydtr::call ttpars ; the usual, pars KERMIT.B[001011]K11HEX.TSK;1A,    ~ z v  r  |  x  t  p l h      t @^ x>f p> B>  e77 - ( r  *t` A @l*&l 2 D 1e8 6 -2 Z   A*Wtl* *t` *t `w 7 84 - (  el 7` -  -  D~ ?6 >>8 6> =& D e \ Z -V w B < CV = < ( wLX  C > < tC6 > < \C x> < DC% `> h< ,C H> P< C6 0> 8< B'& > < B > < BM4 = ; B = ;& `? x.V w$  & ? \.: w  ( (   @ &%  Input file ?  O  Output file ?  Encode or Decode ?  Please enter E for ENCODE or D for DECODE  : All done? Checksum error all doneFor RSX, please make the task image contiguous as in PIP [1,54]KERMIT.TSK/CO=KERMIT.TSKFor RSTS, make the task contiguous, set the protectionto <104> and the rts name to RSX as in PIP [1,2]KERMIT.TSK<104>/MO:16/RTS:RSX=KERMIT.TSK;?\bXR??Pt}H0@ AZ[Z[[@U} M*E":- :IBtJqCem d#b}$xQrU6Bnzwkzw w1p cN$E{l?@:TpgPnwcYb mD&dCSv&f6Z+oqCBj8{QYe/wuZJ9c(.K\2j3!2)cKh%;lyMi2^RG<R-6{~A3  H JhŀdՀ`[WB ;  M  B@ 3VA3 N  & Lw wF3   H Z3 3 V3 N J  "e$"F3 Z NE% % % 5%% W 3W H Nwp `5@ @  E5e73 *,JJ (,J Jҕ Jx'T96%  Ttr  $%T %T R%TR3,% e3LsNP(3LsN xsP%% %2 hsR%2%4 TsPRNZL&P N N5@ Х,  Nt( %RN ‰Nc % U%%  2 4  %2R%6RR s%B%.D THwAa(l(`A:(H lT  BE&~WtEB~L2  *sWwR". |(%LHTD` B~ĵRHT3%S%.S2 *HAa(L l(`A(  $J J N   - ΋  BE~WtEB~w . u(%L3HT w w Е `CBwД~w TH @` C~3 H5- 3 R((R  T, 3Pl3 , TH ( {lP, 2 *‰P` PB` R~&PR & & & &    3Pҕ ҕ(  @ҕ,lP  HT` | )   B D3~ ҕ  &f ҕ R~""$!  H f ( < """"""""" "&"d"v"v"v"v"h p x z "&""""""<(0+  "1""$BBDBBDB    &&&&&&&'n&'' Ee f  z % % e@ `5 & & D  6N D D eD e`D %   &fH”E  D   D 慡e BCE DIEN   ` ɕ = -5+-` #art up lun.kb == 0 ; assume if channel 0 --> terminal lun.in == 1 ; channel for input files lun.ou == 2 ; channel for output files lun.lo == 3 ; channel for pac KERMIT.B[001011]K11HEX.TSK;1A_"   A s&DE s& sA ae0b  ~ҕ*~%  0   -+%  ɥ. ɥF ɥfɥTɥt Kѥ K Е ȕT ȕFK&f$E& Ee  v % % U@  5    ^ P`D A @ 䀎    E ,    e &f& 5 U .  և ”E   CPQCQBm     v   &   5@%PeE T  <5eN N (E D A @  eb" b"    D A @ &f&f eD A @ eA @ e@ e&f&f   C r &@r&@r(&DsPA r C wA `t E ED f# & @ & EUC &     F&C       6cm66#  & w`     # 6 c   6 m 5  s pU@ k h ҕ-5ҕ+ i5@5N E@t`e0Ґ R    5@  ~E@5@E@ w&E , e C HCҕ  %%  ҕ0ҕ. ҕ0 Ґ+-  Ґċ %  C ҕ0 s e0e0RC Ee eva ҕ* v&EEU-`5 6! 6 BN~ ; R 2R + E      R~e eE R~  )E 5%% W!%&W!0 E -6vAQ~Ue B@E DEIC D `6 0a  0 .< |EM   % ee0bv  @`ae ҕ*~ ~  0   ~e  f U  *))D-H->-N-%*((****H011)L0XPFN:R0CLCM:R1CLOS-RMMIS RMMIS: .FCTR LB:[1,1]RMSLIB/LB:R0FREE:R0MAGT:R0RWIN:R0WATR:R1NXBK:R1RLBK:R1TRUN RMSCD: .FCTR LB:[1,1]RMSLIB/LB:R0ALBS:R0CCLN:R1CONP:R1DISC RMSEQ KERMIT.B[001011]K11HEX.TSK;1A3M;;[ JJ$K@ LPQQPPQ>QRQ\QQQQQ8P`PQR.RFRXRRRR !!@ vRhRpRbdhvx^`STOP PAUSE Z____________________;________W_____}__y___;;;;1;;;;;;;13;;9; -- ERRORFCS: in " from " at or afterExiting due to (Error count exceeded)at PC = Invalid error callTask initialization failureOdd address trap (SST0)Segment fault (SST1)T-bit or BPT trap (SST2)IOT trap (SST3)Reserved instruction trap (SST4)Non-RSX EMT trap (SST5) TRAP instruction trap (SST6) PDP-11/40 FIS trap (SST7) FPP hardware fault FPP illegal opcode trap FPP undefined variable trapFPP maintenance trapREWIND errorDuplicate file specificationsInput record too longBACKSPACE errorEnd-of-file during readRecord number outside rangeAccess mode not specifiedToo many records in I/O statementClose errorNo such fileOpen failureMixed file access modes Invalid logical unit number!ENDFILE error"Unit already open#Segmented record format error$Attempt to access non-existent record%Inconsistent record length&Error during write'Error during read(Recursive I/O operation)No buffer room*No such device+File name specification error,Inconsistent record type-Keyword value error in OPEN statement.Inconsistent OPEN/CLOSE parameters/Write to readonly file0Unsupported I/O operation1Invalid key specification2Inconsistent key change or duplicate key value3Inconsistent fil: .FCTR LB:RMSLIB/LB:R0MAPC:R0RSES:R0WTBS RMSDP0: .FCTR LB:RMSDAP/LB:B16PG2:B16SAV:B16CH5:DAPIO:R0CNVT:R0NFRT-(RMDLOC,RMDREM) RMDLOC: .FCTR LB:RMSDAP/LB:R0NFLR RMDREM: . 5KERMIT.B[001011]K11HEX.TSK;1A&e organization4Specified record locked5No current record6REWRITE error7DELETE error8UNLOCK error9FIND error;List-directed I/O syntax errorSyntax error in format?Output conversion error@Input conversion errorAFormat too big for 'FMTBUF'BOutput statement overflows recordCRecord too small for I/O listDVariable format expression value errorFInteger overflowGInteger zero divideHFloating overflowIFloating zero divideJFloating underflowKFPP floating to integer conversion overflowPWrong number of argumentsQInvalid argumentRUndefined exponentiationSLogarithm of zero or negative valueTSquare root of negative valueVInvalid error number[Computed GOTO out of range\Assigned label not in list]Adjustable array dimension error^Array reference outside array_Incompatible FORTRAN object module in task`Missing format conversion routineaFTN FORTRAN error callbUser requested tracebackdDirective: Missing argument(s)eDirective: Invalid event flag numberoVirtual array initialization failurepVirtual array mapping error(@*3 l & f?A BU%D~  ?  l耖% l. d{lX3 3 d3 d 3UlE0@A te p ** F& 5Ε e lB~ 5& 5Ε ,   e p ep * " P     u쇀3l 3oW3 &f2 2 VV   ,,es 5Օ Օ  nff)n sf&VJ % b %e ee e  w *88))ĥ~ 0 # ߋ  ̪" 5 p* ww z*eB 8  L w F(B C DBe ?D(1 >w  ~) 8C >* ) *w>*  bep p  L$_ ыX ы  xB rCC     0*  RSX-11M 3.2, you will not be supported for Kermit, just as your system can not be supported by Digital. For example, RSTS/E 8.0 support expired on 31-Dec-85, as v KERMIT.B[001011]K11HEX.TSK;1A4=Eե^A e@  *  Ep )3*ы   ɥ   ы ҕ RDĥ ĥĥ ĥ Q l" *)ĥ     ʥ   p0,0wVp   * *E냇 W0p  , J *` C#    D w ) 8C .* ) *w2 * fep p  L$_ ыX ы  xB rCC   &  0* =Eե^A e@  *  Ep )3*ы   ɥ   ы ҕ RDĥ ĥĥ ĥ Q l" *)ĥ     ʥ   p0,0wZ p   * *E냇 W0p  8 V *`)w4  T C#   D w e w w *eB 8  # w ( D \ 8#"#%!ĥ ĥ w*0 @Q$    0 40 60))eB B R +# $&*w~#  P) F @#*&*w@ ܇ F35(8e$8w22&(e : %p8q #) ~ *U*)@#0l F# 028 : 00ĥ ĥAĥĊ  000 0 @0 &*0 @ N #eB ~*# 02 #- w\eBQID0 0 0  ߋ e Q 6@#040 6w4!p2eB  8 $&w v*& * J  *  *p*w 8*  D w   ,,  *w  jjde& & & B  2PΕ   N Υ$Ε  22Υ   v Ε f e N * *e*w *0, R   )*)#    l 0l     ee@ 1 *(#    p  mm z/5 ep )w ,   R wZ  L B #  f  `**w)0406 l0 w  jde& & & B  2PΕ   N Υ$Ε  22Υ   v Ε f e H* *e*w0, (   )*)#    l 0l     ee@ 1 *(#    p  nneeded device drivers from lowest address to higher addresses (to prevent fragmentation of background memory). If you run K11RT4.SAV on a FB syste0dKERMIT.B[001011]K11HEX.TSK;1Ao+_0=zhz_ܹ֢6&T:dD#'xP)n~CI*xqHCҋ"ګN/9~n?RE`!+:~4X;vLIB*K"LQ33hdazؙq=}o&0tE `$NGRqr2 && jWCgIF棊Du0?R|PY|F7S)%'Y-HMO m .keP^N &An ()lXIh|SxLT'7 ÿbA4 ͩ; 5$򤞶R s)8%bxQJ'gfm#y#=EDŽEGBTUm4npmEz+MvYY"a9~G]ƅǪO&X? }ROW]M4M"GSܱ(B''ӛ4a&+EOFaR;g_WDz[/={6"K8?wc0Xs:/YyD:1]<@Ei.9 aE#&:ͳ*b+ 6-Ra.,mWI؍%Ӑ%(Z++qS wޔDlyc%=-p$&S(fr_._#!|E\"qXM?`S(D^ZzYK.3yJ^˪X˭mg'}(' Yrzù2Er󖏳O›+lܛK~ir'$4yכbnFkvV έS3/b~<(S,ݪۡ ,`H~hAR7,O&E=Z ɯo|/ O4즙+P1\faPux dḾ=RvSoљ\p"RJ=Iș`LևB:lS6j! $o9V4?墑9!I/I͐. 5f8~THMXEBMr/O{(X:0-_n1>]z9Y\ R&~ xv`I{iBy t!gz͗)Lˣqd >Mnr$ހ "5y 9dӚ)LL s{ES4!?k!r2 1MR=_yKAxިGt;,j6:J6 /<󷔹a7^Q諡zw,;RkFK2ky].ɑvi $ >ZqdD?&qw#TO `"ь7♾v(749ۢdh8Mho_ᕥFW?r b68 ־c=XĔ,!Cy^Ln2zk*tq0IPIչ \$Rt5|WIzO.b `]-8@|qI*X;t{;ņ@^U| &I/}/龮_bϊ[׹F4; 3̑)b 52VbLSG("F8f$F)m6)z2o’^зFá Wt5oU]>~j0fb㒙d˗ݙ8gDUo_mu!f)aOMOJDw[#oOʅxv˝g; [*|7I; %ɨ21%E1ospMj*\SPZG`^4oRP~NÛiXO;fL%oW9WkfQ+sM-xџn 7h>Wue:CpVO–YH[ބ]7h Mr{ѺY)j/fslpani ![Wi$DO=(9#SIfط/xgES p$*aNZV k|hNmatMbA|V*?Q]z"x(Iq~aՍ'G;Rb'p C vs`-cڭE`|66$|0CrEl~Y"A޺ls{j! ܮQ/CnvNter ttypar::call ttpars ; get the terminal unit number chkpar::clr r0 ttyhan::call ttpars ; the usual, parse the device name ttydtr::call ttpars ; the usual, parsKERMIT.B[001011]K11HEX.TSK;1AL; |pzp v-5 ep )w ,  wv  LwtB #  f  `**w)0406 l0 &ff 82e&( N0 0 0 80 B0 0 0 0)#0.) . ( .*5%& w L&Ba +- ʥ# . U 0   b   `     w w BC "& ,SY&* p0p21w(*e "f DCB.E *) l0, *) $ )*)0,40,6 e6p 4 8     ) 2 8   ***  DP5R~RRR~ 8  ***ewR*  ^1  w<141612epl2l0p  *ߥ**  f < pBpDp\p^0_   "Ռ&@B Ε. 00l  0 *w `eE D` bl lrw   B eE"s    s-  Cslw0 B 0 U  5 5     ## pqq1fQI \  ww *##   U@e   ew41  ,,  w *D BB=U:`c`: eEfp E c ) &SY 0   *w * 7 2 BEe5U5 U 5U5 5  U5C5  5 *)#ĥ D)w 6 p 4 0`p tf 64   e*wF *&f e EU   pr0 =B@&& p&  N pv C`B `v 0rr D wC r UeeA e* 0s rp v& sBvrp    ) f!f V 0 e) . e6p 4 T08*w,*1 U4 6wt Bfep`pw*8e2 (*0e( 1 '1-1- 111 rrrrr wR&f Ce Lw**0,0, f 톇,, w        lp*0+1(e  &%&p*w ɕf)8Ae f"( UCɗ&+(e$&% 1 1 1 1 1 w f ڍ E *[001011]K11RSX.COM;1+./ 0D68 l57t4 4I U<0KERMIT.B[001011]K11RSX.COM;1I֍$ set noon $ $! K11RSX.COM $! $! 27-Jan-86 09:56:03 Modified K11RSX.CMD to build FULL RSX Kermit-11 $! under RSTS/E v9.x $! $! Note: It is far better to use K11POS.TSK if you don't need DAP support $! and you are running M+ or Micro-RSX $! $! Assume: LB: translation does NOT include the UIC [1,1] $ $ if f$parse("LB:",,"PPN") .eqs. "[1,1]" then goto abort $ $ cop/rep lb:[1,200]rmslib.p30 lb:[1,1]rmslib.olb $ cop/rep lb:[1,200]syslib.p30 lb:[1,1]syslib.olb $ cop/rep lb:[1,200]rmsdap.p30 lb:[1,1]rmsdap.olb $ cop/rep [1,11]k11rsx.odl sy:[1,8] $ cop/rep [1,11]k11dap.m41 sy:[1,8] $ ass [1,1] lb $ ass dv0: ov $ tkb k11rsx/pr:0/cp/mm,k11rsx/-wi/-sp=k11rsx/mp units=9 asg=sy:6:7:8:9 gbldef=tc.pth:146 gbldef=t.v131:30 gbldef=t.v132:31 gbldef=t.v2xx:35 gbldef=t.bmp1:35 gbldef=tiunit:0 ; ; to link with RMSRES, include 'reslib=lb:[1,1]rmsres/ro' ; and edit the file K11RSX.ODL as indicated in the odl. ; ;;reslib = lb:[1,1]rmsres/ro ; task=...ker gbldef=tiunit:0 gbldef=.priv:240 ; since we use our own stack area we really don't need much ; at task build time stack=64 // $ cop/rep lb:[1,200]rmslib.olb lb:[1,1] $ cop/rep lb:[1,200]syslib.olb lb:[1,1] $ cop/rep lb:[1,200]rmsdap.olb lb:[1,1] $abort: $ exit *[001011]K11EDI.MAC;1+./ 0D6N 67@5 4A U Z|s< .title k11edi Command line editing .ident /3.52/ ; 18-Jul-86 12:00:29 Brian Nelson ; ; This code is used (currently) for the RSTS/E Command Line ; Editor (CLE.RTS) written by the above author, and for 5.1 ; of MINITAB. The encryption calls are for the RSTS/E CLE. .include /IN:K11MAC.MAC/ .enabl gbl .psect r wdata ,rw,d,lcl,rel,con .psect CLECTX ,rw,d,gbl,rel,con curpos: .word edipos curlen: .word edilen curcmd: .word edicmd maxsiz: .word edisiz clests: .word edists enckey: .word $enckey deckey: .word $deckey .psect $pdata ,ro,d,lcl,rel,con .psect $code ,i,ro,i,lcl,rel FALSE = 0 TRUE = 1 IN$MODE = 1 $DEBUG = 0 .iif ndf, $DEBUG, $DEBUG = 0 .MACRO ENCRYPT txt,key mov key ,-(sp) mov txt ,-(sp) call ENCRYPT .endm ENCRYPT .MACRO DECRYPT txt,key mov key ,-(sp) mov txt ,-(sp) call DECRYPT .endm DECRYPT .MACRO DEBUG txt,sts=1,docr=1 .if ne ,$DEBUG .if ne ,sts .save .psect $pdata $$ = . .if b , .ift .byte 15,12,0 .iff .asciz @txt@ .endc .even .restore mov #$$ ,-(sp) ; dump the text next please CALL mout ; to the terminal .globl mout ; perhaps .if nb , .ift .iif nb,docr, message .endc .endc .endc .endm DEBUG .enabl lsb kbredi::SAVE ; Save PRINT @r5 ; Prompt cmpb vttype ,#TTY ; Not a VT100 or VT2xx? bne 10$ ; No, try editing CALLS kbread ,<2(r5)> ; Hardcopy, use vanilla reads br 100$ ; Exit 10$: clr @curpos ; Assume at start of the line. clr @curlen ; No length mov 2(r5) ,r4 ; Buffer address clrb @r4 ; Insure starting with .ASCIZ 20$: CALL read1ch ; Read one character now mov r0 ,r3 ; Any data persent? beq 90$ ; Yes, treat as a control Z SCAN r3 ,#scanlst ; Look for a match asl r0 ; And dispatch jsr pc ,@scandsp(r0) ; Do it bcs 20$ ; Not done br 100$ ; Done ; 90$: mov #ER$EOF ,r0 ; Error, return END_OF_FILE clr r1 ; And no data 100$: UNSAVE ; Exit return .dsabl lsb . KERMIT.B[001011]K11EDI.MAC;1A#save .psect $pdata scanlst:.byte 'H&37 ,'E&37 ,'B&37 ,'U&37 ,'Z&37 ,CR ,LF .byte 'I&37 ,177 ,33 ,233 ,'R&37 ,'X&37 ,'C&37 .byte 'A&37 .byte 0 .even scandsp:.word INSCH .word SOL ,EOL ,PREV ,CTRLU ,EOF ,NOOP ,DONE .word NOOP ,DORUB ,DOESC ,DO220 ,RETYPE ,CANTYP ,CTRLC .word TOGGLE esclst: .byte 'A&137 ,'B&137 ,'C&137 ,'D&137 ,0 .even escdsp: .word NOOP .word PREV ,NEXT ,RIGHT ,LEFT $cc: .asciz /^C/ $cz: .asciz /^Z/ $bs: .byte 'H&37,0 $cr: .byte 15,0 $right: .asciz <33>/[C/ $left: .asciz <33>/[D/ $save: .asciz <33>/7/ $resto: .asciz <33>/8/ $ceol: .asciz <33>/[K/ $crlf: .byte CR,LF,0 .even .restore Doesc: DEBUG ; ... CALL read1ch ; Get next in esc seq Do220: DEBUG ; You know CALL read1ch ; Ditto mov r0 ,r3 ; Get the data beq 90$ ; Error Exit SCAN r3 ,#esclst ; Process the character asl r0 ; Convert to word offset jsr pc ,@escdsp(r0) ; Do it br 100$ ; Ok 90$: sec ; Failure on the READ 100$: return ; And Exit Noop: DEBUG ; ... sec ; Ignore return ; And Exit Insch: DEBUG ,FALSE ; ... sub #200 ,sp ; A temp buffer mov sp ,r2 ; A pointer to it tst r3 ; Null? beq 100$ ; Ignore cmp @curlen ,@maxsiz ; Too many chars? blo 10$ ; No CALL done ; Yes, exit br 100$ ; Bye 10$: inc @curlen ; Save this mov @curpos ,r1 ; Get the offset into line add r4 ,r1 ; Where to stuff the data tstb @r1 ; Already at end of line? beq 20$ ; Yes, we have the stop to stuff it bit #IN$MODE,@clests ; Insert or overstrike? bne 15$ ; Insert movb r3 ,(r1)+ ; Overstrike br 30$ ; Exit 15$: STRCPY r2 ,r1 ; No, so save the data now movb r3 ,(r1)+ ; And insert the new character STRCPY r1 ,r2 ; And put the trailing data back in. br 30$ ; Now for the echoing 20$: movb r3 ,(r1)+ ; Already at eol, insert clrb @r1 ; And insure .ASCIZ 30$: PRINT #$save ; Save cursor pos dec r1 ; Back to to the new character PRINT r1 ; Dump the data PRINT #$restore ; Put the cursor back now inc @curpos ; Move over one PRINT #$right ; Nove over on the display 100$: add #200 ,sp ; Pop buffer sec ; Not done return ; Exit .sbttl More line editing routines ; SOL Move to start of line (Control H) Sol: DEBUG ; ... tst @curpos ; Stop when at position 0 ble 100$ ; Done PRINT #$bs ; Move dec @curpos ; Fix position br sol ; Next please 100$: clr @curpos ; Insure correct sec ; Not done return ; Exit ; EOL Move to End of Line, Control E Eol: DEBUG ; ... STRLEN r4 ; Find string length 10$: cmp @curpos ,r0 ; End yet? bhis 100$ ; Yes PRINT #$right ; No inc @curpos ; Fix this br 10$ ; Next 100$: sec ; Not done return ; Exit gotoeol:STRLEN r4 ; Find string length 10$: cmp @curpos ,r0 ; End yet? bhis 100$ ; Yes inc @curpos ; Fix this br 10$ ; Next 100$: return ; Exit ; EOF Control Z on input .enabl lsb ; Temp Ctrlc: DEBUG ; ... PRINT #$cc ; Echo a control C br 100$ ; Common exit now Eof: DEBUG ; ... PRINT #$cz ; Echo a control Z 100$: mov #ER$EOF ,r0 ; Control Z clr r1 ; And return byte count of zero clc ; All done return ; Exit .dsabl lsb ; Done .enabl lsb .sbttl Carriage return (actually LF) processing ; Done. CR on input, store new line and bubble previous ones back Done: mov r5 ,-(sp) ; A scratch register we need DEBUG ; ... MESSAGE zKERMIT.B[001011]K11EDI.MAC;1Ad ; CR/LF STRLEN r4 ; Get byte count (we have CR or LF) mov r0 ,r1 ; Return it beq 90$ ; Nothing there, don't copy it. clr r2 ; The index mov lastcnt ,r3 ; Number of lines to do 10$: mov lastli(r2),r0 ; Look to find a free spot. tstb @r0 ; Empty? beq 60$ ; Yes add #2 ,r2 ; No, keep looking sob r3 ,10$ ; .... ; No room for command line. clr r2 ; The index mov r4 ,-(sp) ; Save it mov lastcnt ,r3 ; Number of lines to do dec r3 ; ... asl r3 ; See if this is same as last mov lastli(r3),r5 ; Current address inc r5 ; Skip the length mov r5 ,-(sp) ; Save DECRYPT r5,deckey ; Undo the old line STRLEN r4 ; Length cmpb -1(r5) ,r0 ; Same length bne 20$ ; No 15$: cmpb (r4)+ ,(r5)+ ; Check for string equality bne 20$ ; Not the same sob r0 ,15$ ; Same, check next 20$: mov (sp)+ ,r5 ; Restore old text pointer mov (sp)+ ,r4 ; Restore the current pointer ENCRYPT r5,enckey ; Restore the data asr r3 ; Restore r3 tst r0 ; Same ? bne 30$ ; No mov r3 ,@curcmd ; Yes, save index br 100$ ; Exit 30$: 40$: mov lastli(r2),r0 ; Counted string format mov lastli+2(r2),r1 ; Again movb (r1) ,(r0)+ ; Copy the string length beq 55$ ; Can't happen, but may as well check clr r5 ; Counter for the copy operation bisb (r1)+ ,r5 ; Copy the byte count 50$: movb (r1)+ ,(r0)+ ; Copy the string now sob r5 ,50$ ; Next 55$: add #2 ,r2 ; Move up sob r3 ,40$ ; Next please ; 60$: mov lastli(r2),r1 ; Copy the line at last STRLEN r4 ; Get the line length mov @maxsiz ,r3 ; For padding with spaces movb r0 ,(r1)+ ; Copy the length beq 80$ ; Nothing mov r4 ,r5 ; Source string mov r1 ,-(sp) ; Save text address 70$: movb (r5)+ ,(r1)+ ; Copy the data now dec r3 ; Keep track of remaining space beq 75$ ; No room left sob r0 ,70$ ; Next please 74$: movb #40 ,(r1)+ ; Now space fill the line sob r3 ,74$ ; Next please 75$: mov (sp)+ ,r1 ; Restore text address ENCRYPT r1,enckey ; Encode it 80$: asr r2 ; Set 'Current' Command index mov r2 ,@curcmd ; And save it br 100$ ; Exit 90$: movb #CR ,@r4 ; Return only a carriage return clrb 1(r4) ; .ASCIZ 100$: STRLEN r4 ; Get line length mov r0 ,r1 ; Where to return it. clr r0 ; No errors mov (sp)+ ,r5 ; Restore r5 clc ; All done return ; Exit .dsabl lsb ; PREV: Recall previous command line, UP-Arrow Key. Prev: DEBUG ; ... mov r5 ,-(sp) ; Save it 10$: mov @curcmd ,r2 ; Current command number blt 100$ ; Never been here. CALL sol ; Back up PRINT #$cr ; Start of line PRINT #$ceol ; Clear PRINT @r5 ; Prompt asl r2 ; We want addresses today mov lastli(r2),r2 ; At last tstb @r2 ; Anything to copy? bne 20$ ; Yes dec @curcmd ; No, back up again bge 10$ ; Ok clr @curcmd ; Reached the end br 100$ ; And exit 20$: clrb @r4 ; TO be safe clr r3 ; Get length next bisb (r2)+ ,r3 ; Do it beq 50$ ; Nothing? mov @maxsiz ,r0 ; Copy all for DES types mov r4 ,r5 ; A copy of the destination 30$: movb (r2)+ ,(r5)+ ; Copy it sob r0 ,30$ ; Next please DECRYPT r4,deckey ; Decode the data add r4 ,r3 ; Point to the real end of data clrb @r3 ; Insure .asciz PRINT r4 ; Echo it 50$: CALL gotoeol ; Move to end of the line STRLEN r4 ; Get length mov r0 ,@curlen ; And save it tst @curcmd ; Check for underflow ble 100$ ; Yes, exit dec @curcmd ; No, backup now. br 100$ ; Exit 90$: clrb @r4 ; Nothing, kill(>80u z r_\|KP@&:orOacyYpims _DfS66RMjt7j#y>+_m]["?06`[=QuxKERMIT.B[001011]K11EDI.MAC;1Ahh the buffer 100$: sec ; Not done yet mov (sp)+ ,r5 ; Restore this return ; Exit ; Control U: Erase entire line Ctrlu: DEBUG ; ... CALL sol ; Move to start of the line PRINT #$ceol ; Erase to the end of the line clrb @r4 ; No data left over clr @curlen ; No length sec ; Not done return ; Exit Right: DEBUG ; ... STRLEN r4 ; Get current length of the line cmp @curpos ,r0 ; Already at EOL? bhis 100$ ; Yes inc @curpos ; No, move over PRINT #$right ; Simple to do. 100$: sec ; Not done return ; Exit .sbttl Rubouts and move left ; DORUB: Erase character Dorub: DEBUG ,FALSE ; ... sub #200 ,sp ; Allocate a buffer again mov sp ,r3 ; And a pointer to such. tstb @r4 ; Is there ANYTHING in the line? beq 100$ ; No, it's a NO-OP tst @curpos ; Already at SOL (start of line)? bgt 10$ ; No clr @curpos ; Insure correct position clr @curlen ; Save this br 20$ ; Off to common code 10$: PRINT #$LEFT ; Go back one please dec @curpos ; Correct offset now dec @curlen ; Fix this up 20$: mov r4 ,r2 ; And move down add @curpos ,r2 ; Point to CURRENT character mov r2 ,r1 ; Again inc r1 ; Next position please STRCPY r3 ,r1 ; Make a temporary copy of the data STRCPY r2 ,r3 ; Move it down PRINT #$save ; Save cursor position PRINT #$ceol ; Erase to EOL PRINT r2 ; Dump buffer PRINT #$restore ; And go back 100$: add #200 ,sp ; Pop local buffer and Exit sec ; Not done return ; Exit ; Left: Move left one character Left: DEBUG ; ... tst @curpos ; Can we back up ? ble 100$ ; No dec @curpos ; Yes, backup a bit PRINT #$left ; And do so. 100$: sec ; Not done return ; Exit .sbttl Command recall and control R processing Next: DEBUG ; ... mov r5 ,-(sp) ; Save mov curcmd ,r2 ; Point to CURCMD tst @r2 ; Current command number blt 100$ ; Never been here. mov lastcnt ,-(sp) ; Get the recall buffer count dec (sp) ; ... cmp @r2 ,(sp)+ ; Can we move up? bge 100$ ; No inc @r2 ; Yes, move up. CALL sol ; Back up PRINT #$cr ; Start of line PRINT #$ceol ; Clear PRINT @r5 ; Prompt mov @r2 ,r2 ; Copy it. asl r2 ; We want addresses today mov lastli(r2),r2 ; At last tstb @r2 ; Anything to copy? beq 90$ ; No ; clrb @r4 ; TO be safe clr r3 ; Get length next bisb (r2)+ ,r3 ; Do it mov @maxsiz ,r0 ; Copy ALL for DES type routines mov r4 ,r5 ; A copy of the destination 30$: movb (r2)+ ,(r5)+ ; Copy it sob r0 ,30$ ; Next please DECRYPT r4,deckey ; Decode the data add r4 ,r3 ; Point to the real end of data clrb @r3 ; And force to .ASCIZ PRINT r4 ; Dump the data call gotoeol ; Fix internal pointers STRLEN r4 ; Get last line length mov r0 ,@curlen ; And save it mov lastcnt ,-(sp) ; Get the recall buffer count dec (sp) ; ... cmp @curcmd ,(sp)+ ; Poised at the last command? bne 100$ ; No dec @curcmd ; Fix so PREV works correctly. br 100$ ; Exit 90$: clrb @r4 ; Nothing, kill the buffer 100$: sec ; Not done yet mov (sp)+ ,r5 ; Restore return ; Exit Retype: DEBUG ; ... PRINT #$cr ; Start of line PRINT #$ceol ; Clear PRINT @r5 ; Prompt PRINT r4 ; Dump the buffer PRINT #$cr ; Back up again STRLEN @r5 ; Get a new poistion now add @curpos ,r0 ; Get to correct position beq 100$ ; Nothing (?) 10$: PRINT #$right ; Move over sob r0 ,10may be cases where the proper SET commands have been given but the binary file does not transfer correctly. This has been noted on VMS when a task image i _KERMIT.B[001011]K11EDI.MAC;1A$ ; Simple 100$: sec ; Not yet done return ; Exit Cantyp: call clrcns ; Eat up console data sec ; Not done return ; Exit Toggle: mov #IN$MODE,r0 ; Toggle modes xor r0 ,@clests ; Do it sec ; Not done return ; Exit .end *[001011]K11NHD.MAC;1+./ 0D667q6 4C= UR|s(; K11NHD.MAC ; ; 10-Apr-84 09:37:15 Brian Nelson ; ; macros for defing things that may not be available ; for RT11 systems, like MUL, DIV, ASH and SOB. This ; must be prefixed in front of all assembly commands ; for RT version of Kermit-11. .macro mul src,reg .ntype $$,reg mov src ,-(sp) mov reg ,-(sp) .globl k11$mul call @k11$mul .iif eq ,$$-1 ,mov (sp)+ ,r1 .iif eq ,$$-3 ,mov (sp)+ ,r3 .iif eq ,$$-5 ,mov (sp)+ ,r5 .iif ne ,<$$+1>&1, .error ; bad dst reg for MUL macro .endm mul .macro div src,reg .ntype $$,reg mov src ,-(sp) .iif eq ,$$, mov r1 ,-(sp) .iif eq ,$$-2, mov r3 ,-(sp) .iif eq ,$$-4, mov r5 ,-(sp) .globl k11$div call @k11$div .if eq, $$ mov (sp)+ ,r1 mov (sp)+ ,r0 .endc .if eq, $$-2 mov (sp)+ ,r3 mov (sp)+ ,r2 .endc .if eq, $$-4 mov (sp)+ ,r5 mov (sp)+ ,r4 .endc .endm div .macro sob reg,dst dec reg bne dst .endm sob ;- .macro ash amount,reg ;- mov reg ,-(sp) ;- mov amount ,-(sp) ;- .globl $ash ;- call $ash ;- mov (sp)+ ,reg ;- ;- .endm ash .macro ash amount ,reg .ntype $$$0 ,amount .iif ne, 27-$$$0, .error ; must be auto PC for ASH macro $$type = 1 ; assume left shift $$size = 0 ; how may asl/asr's to generate .irpc $a , ; parse the first argument $c = ''$a ; get the character as a literal .iif eq ,$c - '- , $$type = -1 ; if a minus si gn then assume right .iif eq ,$c - '. , .error ; only use octal in ash macro please .iif eq ,$c - '^ , .error ; only use default octal radix in ASH $c = $c - '0 ; check for a digit now .if ge ,$c ; perhaps a digit .ift ; well ? .if le ,$c-7 ; got a digit .ift ; add into accum then $$size = <$$size * 10>+$c; simple .endc .endc .endr .rept $$size .iif gt, $$type, asl reg .iif lt, $$type, asr reg .endr .endm *[001011]K11HLP.MAC;1+./ 0D6 =7F= 4Fl UQ|s< .title k11hlp .ident /2.0.01/ ; Copyright (C) 1986 Brian Nelson ; ; 26-Mar-86 18:41:25 ; ; This is a complete rewrite of Kermit-11's help. It is a bit more ; intelligent, in that it understands wildcarding (ie, HELP SET *) ; and can build subtopic prompting strings and process accordingly. ; I had not planned to rewrite it, but after a few requests it was ; only about half a days work to do. This version also happens to ; be a lot more readable. Alas, it's probably larger. This does npv2.39, RT11 users can use a SET LIN TT:, which will force Kermit-11 to use the CONSOLE port for all I/O, with the restriction that CONSOLE porKERMIT.B[001011]K11HLP.MAC;1Fmeot ; hurt anything as far as overlays go, but I have no idea at this ; time how I'm going to get the RT11 FB version to fit on a PDT150 ; RX01 system disk. .include /IN:K11MAC.MAC/ .enabl gbl cvtarg = 4 ! 10 ! 20 ! 40 .psect $code ,ro,i,lcl,rel,con .save .psect rwdata ,rw,d,lcl,rel,con .even ptopic: .asciz / Topic ? / ; For promtping .even fill5: .byte 40,40,40,40,40,0 ; More filler filler: .byte 40,0 ; For formatting topics: .blkw 20 ; List of topic/subtopic addresses topbuf: .blkb 200 ; Pointers in TOPICS point into here hlpbuf: .blkb 200 ; A read/write buffer for the file htopic: .blkb 200 ; The current topic toplev: .blkw 1 ; Level of current topic wild: .blkw 1 ; If topic wildcarded idxbuf: .blkb 200 ; Private buffer for HINDEX ttbuff: .blkb 200 ; Terminal read buffer idxdmp: .word 0 ; Index was dumped prbuff: .blkb 200 ; Prompting buffer .restore .sbttl the HELP command .psect $code ,ro,i,lcl,rel,con .enabl lsb ; Main loop is here. ; ; (1) Try to open help file; failure --> print internal overlayed help ; (2) Parse the command line, filling in the pointer array 'TOPICS'. ; (3) Find and print (if found) the requested help topic+[subtopic(s)] ; (4) If not found, build a new command line from the 'TOPICS' pointer ; array, prompt and concatenate the requested topic. ; (5) Go back to (2). ; (6) When done, close help file as we don't have the buffer space to ; keep it open. c$help::call hlpopn ; Locate and open the help file tst r0 ; Did we ever find the help file? beq 10$ ; Yes, process the command ; Error. message ; opened. Sleep a moment and then message ,cr calls suspend ,<#4,#0> ; Print some default text call defhlp ; Simple to do jmp 100$ ; Exit now 10$: mov argbuf ,r5 ; Parse the help line clr idxdmp ; Index has not been dumped yet clr wild ; Clear the wildcarding flag next clr topics ; Clear out the pointers tstb @r5 ; Anything passed on line? beq 60$ ; No, dump root index call parse ; And do so, setting up pointers clr cccnt ; Clear the control C count flag call hfind ; Now locate the desired text. tst r0 ; Did we find anything help text? bmi 100$ ; We got a fatal RMS read error. beq 20$ ; Yes, let's go and dump the text dec r0 ; Ok, was it a code of 1 or 2? beq 50$ ; It returned 1, which means not found mov sp ,wild ; It returned 2, which means it found ; something, and it was wildcarded. 20$: call hprint ; Dump the help text out now br 70$ ; Exit 50$: message ,cr clr topics ; Clear out arg pointers 60$: message ; An extra cr/lf mov #'1 ,-(sp) ; Dump the index out now call hindex ; Print it and return 70$: tst idxdmp ; Did we ever print topic/subtopic list beq 100$ ; No, just exit mov #prbuff ,r3 ; Prompt buffer address mov argbuf ,r4 ; Yes, construct a prompt/parse buffer mov #topics ,r5 ; Pointers into the parse pointers clrb @r3 ; Start off with an asciz string 75$: mov (r5)+ ,r2 ; Get the parsed argument beq 80$ ; All done, exit cmpb (r2) ,#'* ; Wildcard argument ? If so, we are done beq 80$ ; Done strcat r3 ,r2 ; Add in the previous topic/subtopic strcat r3 ,#filler ; Add in a delimiter now. br 75$ ; Next please 80$: strcpy r4 ,r3 ; Copy the new command line strcat r3 ,#ptopic ; Finish creating the prompt message ; A cr/lf print r3 ; Dump the(r5) = lowest channel number to use ; @10(r5) = elapsed time limit ; @12(r5) = binary of account to log into (optional) ; 14(r5) = address of a file to read KERMIT.B[001011]K11HLP.MAC;1F prompt out now calls kbread ,<#ttbuff> ; Read a line from KB: tst r0 ; Successful terminal read? bne 100$ ; No, exit asap calls cvt$$ ,<#ttbuff,r1,#CVTARG> ; Remove garbage, LC to UC. tst r0 ; Anything left over ? beq 100$ ; No, exit please clrb ttbuff(r0) ; It was successfull, insure .ASCIZ strcat r4 ,#ttbuff ; Append the data just read please. jmp 10$ ; And parse the command all over again ; ; 100$: call hlpclo ; Close up the file and exit return .dsabl lsb .sbttl Parse HELP's command line ; PARSE ; ; Passed: r5 Command line, minus 'HELP', assumed to be .asciz ; Return: In topics, addresses to each topic/subtopic ; ; Extra imbedded spaces are removed parse: save ; Save temp please mov #topbuf ,r4 ; Where to copy the text to mov #topics ,r3 ; Where to place the pointers clr @r3 ; Assume nothing was passed ; 10$: tstb @r5 ; All done ? beq 100$ ; Yes, exit this routine cmpb @r5 ,#40 ; While (*ch && *ch == 40) ch++ ; bne 15$ ; Not a space, exit inc r5 ; A space found, check next one br 10$ ; Next 15$: mov r4 ,(r3)+ ; Insert current address clr @r3 ; Insure NEXT is cleared out 20$: tstb @r5 ; All done with this line ? beq 30$ ; Yes, exit cmpb @r5 ,#40 ; Space delimiter found ? beq 30$ ; Yes, setup for next one movb (r5)+ ,(r4)+ ; No, copy some data over br 20$ ; Next please 30$: clrb (r4)+ ; Insure .asciz please br 10$ ; Next subtopic 100$: unsave ; Pop registers and exit return .sbttl find the topic in the help file .enabl lsb ; Input: topics list of addresses of text to match ; Return: R0 zero for success, 1 for not found, else RMS error code ; two for match and wildcarded topic/subtopic hfind: save ; Save registers we may trash here calls rewind ,<#LUN.IN> ; Rewind to start of the file mov #topics ,r5 ; Point to the help topic list mov #'1 ,r2 ; Current topic level clrb htopic ; Clear header out ; 10$: tst @r5 ; Anything to look for ? beq 100$ ; No, just leave pointing at beginning mov #hlpbuf ,r4 ; Pointer to buffer to use tst cccnt ; Control C typed? bne 90$ ; Yes, please exit this loop clrb @r4 ; Preset to a null string calls getrec , ; Read a record from the file tst r0 ; Errors on the read ? beq 20$ ; no cmp r0 ,#ER$EOF ; End of file reached ? beq 90$ ; Yes, return(1) 20$: clrb hlpbuf(r1) ; Insure .asciz please cmpb @r4 ,r2 ; Topic levels match up? bne 80$ ; No, read another record then inc r4 ; Skip over the level flag now 30$: tstb @r4 ; End of the line beq 80$ ; Yes, read another record cmpb @r4 ,#40 ; No, skip over spaces now bne 40$ ; No more spaces, time to check topic inc r4 ; Spaces, skip over please br 30$ ; Next please 40$: mov (r5) ,r3 ; Get pointer to text to match up cmpb (r3) ,#'* ; Wildcarding ? beq 85$ ; Yes, return(2) ; 50$: tstb (r3) ; Found the end of the desired topic? beq 70$ ; Yes, check for next level topic needed tstb (r4) ; End of the line yet ? beq 80$ ; Yes. movb (r4)+ ,r0 ; Convert to upper case cmpb r0 ,#'a!40 ; Is this a lower case letter blo 55$ ; No cmpb r0 ,#'z!40 ; Keep checking... bhi 55$ ; No bicb #40 ,r0 ; Convert to upper case 55$: cmpb (r3)+ ,r0 ; No, do the characters match up? beq 50$ ; Yes, keep checking them br 80$ ; No, read another record. ; 70$: inc r2 ; Match, increment level number andmp inpnt ,#1000 blo 10$ clr inpnt ; clear the buffer offset also .readw #rtwork,#3,#inbuff,#400,inblk bcs 100$ ; end of file inc inblk ; next time the next KERMIT.B[001011]K11HLP.MAC;1F % read tst (r5)+ ; another record from the help file. strcat #htopic ,#hlpbuf+1 ; Build up a header record 80$: br 10$ ; Next please 85$: mov #2 ,r0 ; Match with wildcarding mov r2 ,toplev ; Save the topic level and exit br 110$ ; Exit ; 90$: mov #1 ,r0 ; Not found (reached end of file) br 110$ ; Exit ; 100$: mov r2 ,toplev ; Save topic level dec toplev ; It will be off by one clr r0 ; Found the topic 110$: unsave ; Pop registers and exit return ; Bye .dsabl lsb .sbttl print help text already found by HFIND .enabl lsb ; Return: <0 Failure, the RMS error code ; 0 Success ; 1 Found subtopics to print out ; ; Assumes: That both PARSE and HFIND have been called already. hprint: save ; Save these registers please strcpy #ttbuff ,#htopic ; Get the default header string made ; 30$: tst cccnt ; Control C interupt ? bne 90$ ; Yes, exit please mov #hlpbuf ,r4 ; Point to the buffer now calls getrec , ; Read the next record tst r0 ; Error ? bne 90$ ; Yes, exit clrb hlpbuf(r1) ; Insure it's .asciz please cmpb (r4) ,#40 ; Leading space ? blos 60$ ; Yes, a normal line to print cmpb (r4) ,toplev ; Is this a lower, higher or same? blo 90$ ; Lower level, thus we must exit. beq 50$ ; Same level movb (r4) ,-(sp) ; Pass the level number please call hindex ; And print out whats leftover. tst wild ; If not wildcarded then exit. beq 80$ ; Exit ; 50$: tst wild ; Same level, wildcarded? beq 90$ ; No, we must exit then. inc r4 ; Skip past the leading number in line strcpy #ttbuff ,#htopic ; Build a header string up strcat #ttbuff ,r4 ; Copy over the topic name. dec r4 ; Reset the pointer clrb @r4 ; Don't print this line. ; 60$: tstb ttbuff ; Do we need to print the next topic? beq 70$ ; No message ; CrLf print #ttbuff ; Yes, dump it please message ; Ditto... clrb ttbuff ; Clear topic name out now 70$: tstb @r4 ; Don't print if NULL beq 75$ ; ... print r4 ; Ok to print, dump the text now 75$: message ; A cr/lf please br 30$ ; Next please 80$: mov #1 ,r0 ; Return(Sub_topic_found) br 100$ ; Exit ; 90$: clr r0 ; Return(Success) br 100$ ; Exit ; 100$: unsave ; Pop registers and exit return ; And finally exit .dsabl lsb .sbttl print index out .enabl lsb ; Passed: 2(sp) Level to look for ; ; Assumption: HLPBUF is already loaded with the current record hindex: save ; We may overwrite these here clr -(sp) ; Allocate some buffers clr -(sp) ; Allocate some buffers mov sp ,idxdmp ; Flag that we have been here mov sp ,r5 ; And a pointer to such movb 2+<6*2>(sp),2(r5) ; Get the topic level passed. mov #idxbuf ,r3 ; Get a buffer to store names in mov #hlpbuf ,r4 ; Point to the help buffer now cmpb 2(r5) ,#'1 ; Is this the MAIN menu today? bhi 10$ ; No, don't reposition the file calls rewind ,<#LUN.IN> ; It is the main, reset the file clrb hlpbuf ; Flag that nothings there 10$: Message < Additional information is available on:>,cr Message ; An extra CR/LF Message ; CRLF please strcpy r3 ,#fill5 ; Move over a bit mov #4 ,(r5) ; Number of topic names per line clr cccnt ; Insure control C count is zapped ; 30$: tstb @r4 ; Do we need to load the buffer? bne 40$ ; No calls getrec , ; Yes, preload the buffer now. tst r0 ; Did)+ ,(r2)+ ; copy error name over movb (r0)+ ,(r2)+ ; copy until 63 characters or a movb (r0)+ ,(r2)+ ; copy until 63 characters or a movb #40 ,(r2)+ movb #40 ,(r |KERMIT.B[001011]K11HLP.MAC;1F we reach end of file? bne 80$ ; Yes, exit please clrb hlpbuf(r1) ; Always .asciz please 40$: tst cccnt ; If control C then exit bne 90$ ; Exit then cmpb @r4 ,#40 ; Is this a null line or a text line? blos 60$ ; If so, ignore it. cmpb @r4 ,2(r5) ; Must be a topic line, check the level bhi 60$ ; Higher level, ignore it blo 80$ ; Lower level, we need to exit clrb 21(r4) ; Insure no more than 16 characters inc r4 ; Skip the level number on the line strcat r3 ,r4 ; Add on the current topic now strlen r4 ; Now compute the number of spaces dec r4 ; Fix the pointer up to startofline mov #22 ,r2 ; Assume worst case of 18 spaces needed sub r0 ,r2 ; We now have the number of spaces. 50$: strcat r3 ,#filler ; Loop adding the spaces in sob r2 ,50$ ; Terribly inefficient, but so what. dec (r5) ; Is there room left for the next one? bne 60$ ; Yes, go and get some more print r3 ; No, we have to dump and reset things message ; A cr/lf mov #4 ,(r5) ; Reset the counter now strcpy r3 ,#fill5 ; Reset the line buffer ; 60$: clrb @r4 ; Force a read next time br 30$ ; Next please 80$: print r3 ; End of file, dump whats left over message ; And exit. clr r0 ; Success br 100$ ; Bye ; 90$: mov #-1 ,r0 ; Failure exit ; 100$: cmp (sp)+ ,(sp)+ ; Pop some local buffers... unsave ; Pop registers and exit mov (sp)+ ,(sp) ; Pop return address up and exit return ; Exit now .dsabl lsb .sbttl open and close the kermit-11 help file up .enabl lsb ; This code was taken verbatim from the old K11HLP.MAC hlpclo: calls close ,<#lun.in> return hlpopn: call getprv ; seems to be needed mov #hnames ,r1 ; the list of help file names call getsys ; if this is RT11 use something cmpb r0 ,#sy$rt ; reasonable please bne 10$ ; not RT mov #rtname ,r1 ; RT11, try DK: and SY: 10$: mov r1 ,r2 ; Save it 20$: tst @r1 ; end of the list as of yet ? beq 70$ ; yes, can't find the help file calls fopen ,<@r1,#lun.in,#text,#2>; try hard t o open the help file tst r0 ; did it work ? beq 100$ ; yes tst (r1)+ ; no, try the next help filename br 20$ ; next please 70$: message <%Kermit-11-W Cannot find the Kermit-11 help files or>,cr message ,cr message ,cr message ; 80$: tst @r2 ; Any more left beq 90$ ; No print @r2 ; Yes, print the name of the file message ; A crlf tst (r2)+ ; Point to next br 80$ ; Next please 90$: mov #ER$FNF ,r0 ; return file not found 100$: call drpprv ; please no more privs return ; return with it open or not found .dsabl lsb .save .psect rodata ,ro,d,lcl,rel,con hnames::.word 10$,20$,30$,40$,0 10$: .asciz /LB:[1,2]K11HLP.HLP/ 20$: .asciz /SY:[1,2]K11HLP.HLP/ 30$: .asciz /KERMIT:K11HLP.HLP/ 40$: .asciz /HELP:K11HLP.HLP/ .even rtname: .word 10$,20$,0 10$: .asciz /DK:K11HLP.HLP/ 20$: .asciz /SY:K11HLP.HLP/ .even .restore global .end *[001011]K11ECO.MAC;1+.$/ 0D6Bn?7@{? 4H$$M U2|s<0YS ERR CODE) KERMIT.B[001011]K11ECO.MAC;1H$06ATYK59|hk ^xvWC9:MhySpxkEJoV+ -H+ 3:]>Yo3?oBi&<^4~y: uQ[:owOuE=[KPj*h} 6/"B5Tyk='*bR\VF_JTp`Qg1|oiBuDt$2;HS=U>.!6\RlGV!4@T{_ f[Q,i{Kk 2owJu `:*]2M }M_nD~Q,3,#KE. 4>XJ3Ky K6 'K]FH FAK#h[?.zB4GL7mPW:! e'Yof[YjiC {0bBJ9iA~{l=8C6^2l/*4a_'OH0KI:jyl N^2Mv=+{I GVtf8x2&ly~JPx/w#yuyOK8fAe8t Ư^\$y)6=$vE@2,2;HZ@K`jS0]% ~+{.tHyF<*`Yyk$HuGC<)cfhO͔;5$el$;feqD sPlso=](B_+{_!iL"Wq\V/^E?eD8eqN0mI,"^5L'+AN<mDalH`tT:F#c[qE#`GN"#?d$x@J-2cdC}2yj3"qpyU<{ 69(\ZTa>;$PUh~ -Y3W&nkDyQnKrcDANz>O\+P)f:)yu}Z|ѻ!o\w}*[TC kW,;43+IaY&{ M*F=qq.Sr-(Z$+K^48RM AE:[AusEUmBÁ ?5bo)se-h@DuV8OzR|Np=8hZQ hzvS7 l\gjfw#nv,>R^Eg= Gxj Yso1BO#&!/5Ӭy $=n;%R#P:a*x0gIN)h1;pe0B=OUbx/F 09h- eo8v;qAxm0JR*3`rfS1b ($*K>Y(r`ggo,cnE9"TgGN*>(!SQwqR /)^2Bۭ45I@%>)"K[e4lml{9b6 e,?}wEg/'`wAlCM}p.DcT|1E5dNW\l :W]^59D`2u|iJz|?dBX[ KrxkUm:|e\/Ne^<d\qdHtNuIJ{ !0x(kyx}zBw&S3I0s31}=T,DNa3 ,}fP0m#0) J f7}Wtُ#dGB[Wd"V}N6G4?{R%L P=:v%SaIV5 *c& r_$ a67$;C !;`cA $~SLOQ PSqOCBx0886J4m eGyP$>b'TqfL.r0VQ90g%EZ~v,!fb́J52rfNE VIchyL%u1:~4Af ~dMYkANO?u"nM!bRoLS@L@4/.{Y.K(&.AmW PgyFB%G1pZQFEAZ%1 BսIZv)9H76nov F]!'qZhv)iY4pgm&fe @(^wD_)%fP\9xuG {4 ydr}Nrczi+P%> !~gآN]( lnuQBL%'WYqRO[*R7~MRcT29Cd`F~~dxNY]2j =2ogbYR V:IJC9.livU' mhVr߭u$'`JGqn!Qb#E2kj|%);$0gVs0rZr?L *2qpw5C;Q2E1LB~;e(ko>=l`He+[S C~=.4tq8 <'OxWImr)x@wrX?`6d TB9!F`l e9ZQ4X0}T@7Y0v'nk(\|? ()6EIKj;1/= *;w[:66r|0 BTS?'@qfG JSOPu0-:zbegmeWeO7qpx$tD:F4徆Mf }f &^$Bey_\!D n!O&>_WvS$I)*5D|72] ` e"E*[sTx'6}/SxbQ_I:iqI\`bs]Jr]tD@Q&Td{TtƼrLF,V$TUF@D ( IqPTf88.b>oQf59\2p@ A6(r"wp(`=I:{9LJ qJBv=}a:FRy#;s{9DOsvib7~@*Zv%ps]G>mo(Z+&p -Jd6**#bot Mx"4 1me"x@'DlkAn H9bvVh8rmrN Ov"'A !K8flF|b_$CPMH R^0,;~[y;U=)z CvhNPVrr[AZYCjJ'cK{,$VP+$zvhr;+$!m&V7+^zSBdglmh*)GIKERMIT.B[001011]K11ECO.MAC;1H$ .sbttl K11ECO New RSTS/E connect code .psect .ident /2.50.1/ .include /SY:[1,2]COMMON.MAC/ .include /IN:K11MAC.MAC/ .enabl gbl ; Copyright (C) 1986 Change Software, Inc ; ; 02-Apr-86 14:58:29 Brian Nelson ; ; Warning: This uses binary I/O, thus you never want to ; ; (1) Do I/O to channel zero ; (2) Timeout on a terminal read ; ; Either one of the above events will cause binary mode ; to go away. We can't use multiple delimiters here due ; to the terminal drivers processing of C1 controls. ; ; This is tested only on RSTS/E 9.1 and Field Test 9.2 ; It should work fine on 8.0-07, but no gaurentees. .psect concod ,ro,i,lcl,rel,con .psect condat ,rw,d,lcl,rel,con .macro readtt buffer,size=#80.,lun,time=#0 mov time ,-(sp) mov lun ,-(sp) mov size ,-(sp) mov buffer ,-(sp) call $readtt .endm readtt .macro writett buffer,size=#0,lun mov lun ,-(sp) mov size ,-(sp) mov buffer ,-(sp) call $writett .endm writett .macro fqcopy dst ,src mov src ,-(sp) mov dst ,-(sp) call $fqcopy .endm fqcopy .macro CLRFQB call $clrfq .globl $clrfq .endm CLRFQB .macro CLRXRB call $clrxr .globl $clrxr .endm CLRXRB NODATA == 13. ; no data for terminal read DETKEY == 27. ; i/o to detached tt line .psect condat .even xksdon: .blkw 1 ; Remote terminal set done ttsdon: .blkw 1 ; Local terminal set done ioseen: .blkw 1 ; Some input was seen somewhere ttio: .blkw 1 ; Console read worked xkio: .blkw 1 ; Remote read worked eseen: .blkw 1 ; Control \ happened at console savtt: .blkb 40 ; Save local terminal chars savxk: .blkb 40 ; Save outgoing line chars bufqxk: .blkw 1 ; Connect line buffer quota ttunit: .blkw 1 ; Our console terminal unit xkunit: .blkw 1 ; Connected line's unit number v9flag: .blkw 1 ; Iff version 9.x or later XKSIZE = 600 ; Large buffers for remote reads xkbuff: .blkb XKSIZE+2 ; Buffer for connected line ttbuff: .blkb 80. ; Buffer for console terminal .psect concod .enabl lsb doconn::call init ; Startup bcs 100$ ; Oops call ttinit ; Save te rminal characteristics bcs 90$ ; Die ; 10$: mov #ttbuff ,r4 ; Pointer to local term buffer mov #xkbuff ,r5 ; Pointer to remotes buffers. readtt buffer=r4,lun=#LUN.CO,size=#1 ; Look for data on LOCAL term tst r0 ; Was there anything there? bne 50$ ; No ; mov sp ,ioseen ; Yes, flag that we saw some I/O movb @r4 ,r0 ; Check for console commands bicb #^C177 ,r0 ; Insure no parity set. cmpb r0 ,conesc ; Escape command prefix ? bne 20$ ; No readtt buffer=r4,lun=#LUN.CO,size=#1,time=#20 tst r0 ; Successfull bne 50$ ; No, ignore the data movb @r4 ,r0 ; Check for console commands bicb #^C177 ,r0 ; Insure no parity set. cmpb r0 ,conesc ; Escape command prefix ? beq 20$ ; Yes, dump the character now. call concmd ; Check for console command. br 80$ ; And skip the next remote read 20$: tst duplex ; Is this a half duplex line? beq 25$ ; No, then don't echo the data writett buffer=r4,lun=#LUN.CO,size=#1 25$: mov r4 ,r2 ; Insure parity is setup now. mov r1 ,r3 ; The byte count next beq 50$ ; Nothing there ? 30$: setpar @r2 ,(r2)+ ; Set parity if need be. sob r3 ,30$ ; Next character please. writett buffer=r4,lun=#LUN.XK,size=#1 50$: readtt buffer=r5,lun=#LUN.XK,size=#XKSIZE tst r0 ; Did the remote read succeed? beq 60$ ; Yes, dump to local terminal. call iocheck ; No, check for allowable errors br 80$ ; And exiKERMIT.B[001011]K11ECO.MAC;1H$t with C set for FATAL 60$: mov sp ,ioseen ; Had some input, flag no SLEEP mov r5 ,-(sp) ; Now get rid of XOFF characters mov r1 ,r0 ; Save buffer address and byte count beq 75$ ; Be SURE that byte count is nonzero. 65$: cmpb (r5) ,#'S&37 ; If this is an off then replace it bne 66$ ; will a NULL character please. clrb (r5) ; Was an XOFF, so stuff a NULL in. 66$: cmpb parity ,#PAR$NONE ; Parity up? beq 70$ ; No bicb #200 ,(r5) ; Yes, dump it 70$: inc r5 ; Next please sob r0 ,65$ ; Keep going 75$: mov (sp)+ ,r5 ; Restore the buffer pointer. writett buffer=r5,lun=#LUN.CO,size=r1 call dumplog ; May need to dump to log file clc ; Success flag 80$: bcs 90$ ; If set, it's time to EXIT tst ioseen ; Not set, do we really want to bne 85$ ; take a short nap ? If ne, no. CLRXRB ; Yes, insure future rsts/e's ok mov #1 ,XRB+0 ; One second sleep .SLEEP ; Do it 85$: clr ioseen ; No more i/o has been seen br 10$ ; Next please 90$: call ttrst ; Restore terminal chars 100$: return .dsabl lsb .sbttl misc support routines .enabl lsb init: clr eseen ; No escape seen clr xkio ; No remote I/O seen clr ttio ; No local I/O seen clr ioseen ; No I/O at all happened clr ttsdon ; No terminal settings done yet clr xksdon ; No terminal settings done yet CLRFQB ; Zap the firqb please movb #UU.PRV ,FIRQB+FQFUN ; Execute a V9 only call so we .UUO ; can see if this is still v8 clr v9flag ; Assume v8 tstb FIRQB ; Did this call succeed? bne 10$ ; No mov sp ,v9flag ; Yes, this is 9.0 or later 10$: tstb ttname ; Any line previously defined? bne 30$ ; Yes tstb @argbuf ; Any name on the command line? bne 20$ ; Yes message ,cr jmp 90$ ; Error exit 20$: strcpy #ttname ,argbuf ; No name, copy from command line 30$: CLRFQB ; Get our console terminal unit # movb #UU.SYS ,FIRQB+FQFUN ; Do the systat call now .UUO ; Simple movb FIRQB+5 ,ttunit ; Save our terminal unit number mov #XRB ,r3 ; Get the unit number next mov #ttname ,r2 ; Load up the XRB CLRFQB ; Insure no odd defaults around CLRXRB ; Ditto STRLEN r2 ; Get the length of the device name mov r0 ,(r3)+ ; Copy the length of the name mov r0 ,(r3)+ ; ...Copy the length of the name mov r2 ,(r3)+ ; Copy the device name address .FSS ; Do a filename string scan now movb FIRQB ,r0 ; Successfull? bne 80$ ; No, exit movb FIRQB+FQDEVN,xkunit ; Save the connected line unit# bit #20000!40000,XRB+10 ; Did we REALLY get a devicename? bne 40$ ; Yes movb #6 ,r0 ; No, preload bad device name br 80$ ; And exit with error message 40$: cmpb xkunit ,ttunit ; Are they one and the same ? bne 50$ ; No, it's ok message ,cr br 90$ ; Error if so 50$: CLRFQB ; Insure outgoing line is assigned movb #UU.ASS ,FIRQB+FQFUN ; Subfunction code mov #"KB ,FIRQB+FQDEV ; KB movb xkunit ,FIRQB+FQDEVN+0 ; Unit number movb #377 ,FIRQB+FQDEVN+1 ; Unit number is real .UUO ; Simple calls ttspeed ,<#ttname> ; Get interface speed mov r0 ,r2 ; Save the speed message ; Dump the data print #ttname ; And the connect line name tst r2 ; Any speed info available? beq 60$ ; No message < Speed: > ; Yes, dump the speed decout r2 ; Simple message ; A crlf message ; How to return to the local kermit clr -(sp) ; .... bisb conesc ,(sp) ; The curre*[001011]K11ER2.MAC;1+. / 0D6ӌɍ7@ھ ɍ 4  Us(0:KERMIT.B[001011]K11ECO.MAC;1H$snt control escape char. add #100 ,(sp) ; Convert to printable representation mov sp ,r0 ; ..... print r0 ; ..... message ,cr ; All done. tst (sp)+ ; Pop this 60$: message ; A final CR/LF ; 70$: clc ; Success br 100$ ; Exit 80$: direrr r0 ; Print RSTS/E error text 90$: sec ; Failure 100$: return ; Exit .dsabl lsb .sbttl save/set/restore terminal characteristics .enabl lsb ttinit: movb #377 ,r0 ; Console terminal first call 200$ ; Get term chars, part 0 FQCOPY #savtt+0,#FIRQB ; Save the characteristics movb xkunit ,r0 ; Now for the CONNECTED terminal call 200$ ; Ditto... FQCOPY #savxk+0,#FIRQB ; Copy this also tst v9flag ; Will the second part of the beq 10$ ; get terminal chars succeed? clrb bufqxk ; Clear buffer quota outz CLRFQB ; Yes, read the buffer quota movb #UU.TRM ,FIRQB+FQFUN ; Again ... incb FIRQB+4 ; Subfunction = 1 movb xkunit ,FIRQB+5 ; Unit number of connected line .UUO ; Read current buffer quota tstb FIRQB ; Success? bne 10$ ; No, ignore it movb FIRQB+27,bufqxk ; Save it CLRFQB ; Clear again movb #UU.TRM ,FIRQB+FQFUN ; .... incb FIRQB+4 ; Subfunction = 1 movb xkunit ,FIRQB+5 ; Unit number ..CBFQ == . + 2 ; movb #/40,FIRQB+27 ; Buffer twice our internal size .UUO ; Do it ... 10$: movb #377 ,r0 ; Now set chars at last mov #LUN.CO ,r1 ; Channel number for open call 210$ ; ..... bcs 110$ ; It failed? inc ttsdon ; Set and open done for local term movb xkunit ,r0 ; Again please mov #LUN.XK ,r1 ; Channel number for open call 210$ ; ..... bcs 110$ ; Save success flag inc xksdon ; Set and open done for remote term 100$: clc ; Say success and exit 110$: return ; At last 200$: CLRFQB ; Insure FIRQB is cleared out movb #UU.TRM ,FIRQB+FQFUN ; Terminal call today. movb r0 ,FIRQB+5 ; Console terminal this time .UUO ; Simple clrb FIRQB+4 ; Insure this field is (v8/v9) bisb FIRQB+36,FIRQB+20 ; Get 8bit setting in correct loc. clr FIRQB+36 ; And clear this field out retur n ; Exit 210$: CLRFQB ; Clear FIRQB again.... movb #UU.TRM ,FIRQB+FQFUN ; Terminal call today. movb r0 ,FIRQB+5 ; Console terminal this time movb #377 ,FIRQB+12 ; XON movb #377 ,FIRQB+35 ; GAG movb #31 ,FIRQB+20 ; 8bit and NoParity movb #200 ,FIRQB+11 ; LC output movb #377 ,FIRQB+15 ; LC input movb #377 ,FIRQB+23 ; No Uparrow movb #200 ,FIRQB+30 ; No delimiters please .UUO ; Simple cmpb r0 ,#377 ; Console terminal? bne 215$ ; No movb ttunit ,r0 ; Yes, insure valid unit number ; 215$: CLRXRB ; Clear the XRB mov #3 ,XRB+0 ; Function (disable echoing) mov r0 ,XRB+2 ; Terminal number movb #TTYHND ,XRB+7 ; The device driver index next .SPEC ; Do it. ; CLRFQB ; Now open the terminal up movb #OPNFQ ,FIRQB+FQFUN ; Function code movb r1 ,FIRQB+FQFIL ; Channel number aslb FIRQB+FQFIL ; Times two, of course. mov #100001 ,FIRQB+FQMODE ; Binary mode mov #"KB ,FIRQB+FQDEV ; Device type movb r0 ,FIRQB+FQDEVN+0 ; Unit movb #377 ,FIRQB+FQDEVN+1 ; It's for real CALFIP ; Open it up and exit movb FIRQB ,r0 ; Did the open succeed? beq 220$ ; Yes message direrr r0 ; No, an error message please sec ; Exit return ; Bye 220$: clc ; Success return ; Exit .dsabl lsb .sbttl restore terminals .iif ndf, TTYHND, TTYHND = 2 ttrst: CLRFQB ; Close*[001011]K11ER2.MAC;1+. / 0D6ӌɍ7@ھ ɍ 4  Us(0KERMIT.B[001011]K11ECO.MAC;1H$< channels up please movb #CLSFQ ,FIRQB+FQFUN ; Close a channel function movb #LUN.XK*2,FIRQB+FQFIL ; Channel number times 2 CALFIP ; Simple CLRFQB ; Insure FIRQB is clear again movb #CLSFQ ,FIRQB+FQFUN ; Close a channel function movb #LUN.CO*2,FIRQB+FQFIL ; Channel number times 2 CALFIP ; Simple CLRXRB ; Reset echoing on console term mov #2 ,XRB+0 ; Function (enable echoing) mov ttunit ,XRB+2 ; Terminal number movb #TTYHND ,XRB+7 ; The device driver index next .SPEC ; Do it. tst ttsdon ; Did we ever set this? beq 10$ ; No FQCOPY #FIRQB ,#savtt+0 ; Restore console terminal movb #UU.TRM ,FIRQB+FQFUN ; Function code clrb FIRQB+4 ; Insure cleared for v9..x movb #377 ,FIRQB+5 ; Console .UUO ; Simple 10$: tst xksdon ; Did we set the remote up? beq 100$ ; No FQCOPY #FIRQB ,#savxk+0 ; Restore connected terminal movb #UU.TRM ,FIRQB+FQFUN ; Function code clrb FIRQB+4 ; Insure cleared for v9..x movb xkunit ,FIRQB+5 ; Console .UUO ; Simple tst v9flag ; Version 9 or later? beq 100$ ; No CLRFQB ; Yes, restore buffer quota movb #UU.TRM ,FIRQB+FQFUN ; Function incb FIRQB+4 ; Subfunction = 1 movb xkunit ,FIRQB+5 ; Unit number movb bufqxk ,FIRQB+27 ; Stuff saved buffer quota .UUO ; Do it 100$: clc ; Say it worked and exit return ; Bye .sbttl read/write terminals $readtt:mov #XRB ,r0 ; Point to the XRB please tst 10(sp) ; No wait desired today? beq 10$ ; Yes (the normal case) mov 10(sp) ,(r0) ; No, SLEEP instead of TIMEOUT .SLEEP ; Sleep until tmo or something 10$: mov 4(sp) ,(r0)+ ; is typed. Stuff a buffer size bne 20$ ; Make sure the buffer size is ok inc -2(r0) ; Not ok, make it one character 20$: clr (r0)+ ; Clear returned byte count mov 2(sp) ,(r0)+ ; Buffer address movb 6(sp) ,(r0) ; Channel number aslb (r0)+ ; Times two clrb (r0)+ ; Unused (byte) clr (r0)+ ; Unused (word) clr (r0)+ ; No timeouts with binary mode mov #8192. ,(r0)+ ; No stalling please .READ ; Do it clr r1 ; Assume no data movb FIRQB ,r0 ; Success? bne 100$ ; No mov XRB+XRBC,r1 ; Yes, return byte count 100$: mov (sp) ,10(sp) ; Move return address up add #4*2 ,sp ; Pop parameters and exit return ; Bye $writet:mov r1 ,-(sp) ; Save it mov 4+2(sp) ,r0 ; Size of the write bne 10$ ; It's ok mov 2+2(sp) ,r1 ; No, get the asciz size now strlen r1 ; .... 10$: mov #XRB ,r1 ; Point to XRB please mov r0 ,(r1)+ ; Byte count mov r0 ,(r1)+ ; Byte count again mov 2+2(sp) ,(r1)+ ; Buffer address movb 6+2(sp) ,(r1) ; Channel number aslb (r1)+ ; Times two clrb (r1)+ ; Unused (byte) clr (r1)+ ; Unused (word) clr (r1)+ ; Unused (word) again mov #4096. ,(r1)+ ; IO.WAL .WRITE ; Do it mov (sp)+ ,r1 ; Restore this one mov (sp) ,6(sp) ; Move return address up add #3*2 ,sp ; Ignore parameters return $fqcopy:save ; Copy a block of data mov 2+6(sp) ,r2 ; Destination mov 4+6(sp) ,r1 ; Source mov #40 ,r0 ; Size of a FIRQB 10$: movb (r1)+ ,(r2)+ ; Copy a byte sob r0 ,10$ ; Next please unsave ; Pop registers mov (sp) ,4(sp) ; Move return address cmp (sp)+ ,(sp)+ ; Pop stack return ; Exit .enabl lsb iocheck:cmpb r0 ,#DETKEY ; I/O to detached Keyboard? beq 80$ ; Yes, it's fatal cmpb r0 ,#NODATA ; Simply no data present? beq 70$ ; Yes, that one is ok movb #ERRFQ ,FIRQB+FQFUN ; Dump error text out next movb r0 ,FIRQB+4 ; Pass theKERMIT.B[001011]K11ECO.MAC;1H$ error code also CALFIP ; Simple to do clrb FIRQB+37 ; Insure .asciz writett buffer=#FIRQB+4,lun=#LUN.CO writett buffer=#220$,lun=#LUN.CO; A finishing CRLF 70$: clc ; Not fatal return ; Exit 80$: writett buffer=#210$,lun=#LUN.CO; Dump an error message please sec ; This is FATAL return ; Bye .save .psect rwdata ,d,lcl,rel,con,rw 200$: .asciz /%Read error - / 210$: .asciz /??DETKEY error - DTR not present or has been lost/ 220$: .byte CR,LF,0 .even .restore .dsabl lsb .sbttl concmd terminal emulation escape commands .enabl lsb concmd::mov r1 ,-(sp) ; Save it movb @r4 ,r1 ; Get the character to check bicb #^C177 ,r1 ; Must drop parity scan r1 ,#200$ ; look for a match here asl r0 ; word offsets jsr pc ,@210$(r0) ; dispatch to the correct routine 100$: mov (sp)+ ,r1 ; Pop R1 and exit return .save .psect rwdata ,rw,d,lcl,rel,con 200$: .byte 'C&137 ,'c!40 ; drop connection ctrl \ C .byte 'I&137 ,'i!40 ; init the line .byte 'Q&137 ,'q!40 ; quit logging but leave file open .byte 'R&137 ,'r!40 ; resume logging if file is open .byte 'X&137 ,'X!40 ; control Q and then thats all .byte 'B&137 ,'b!40 .byte '? ,177 ; help, rub for send break .byte 'H&137 ,'h!40 .byte 0 .even 210$: .word con.$ ; unknown escape command .word con.c ,con.c ; drop connection .word con.i ,con.i ; get modems attention .word con.q ,con.q ; turn console logging off .word con.r ,con.r ; turn it back on please .word con.x ,con.x ; send XON .word con.br ,con.br ; break .word con.hl ,con.br ; print out commands .word con.hl ,con.hl ; help .restore ; Pop code psect context .dsabl lsb ; Turn off current symbol block con.$: writett buffer=#$bel,lun=#LUN.CO; Send a beep out for unknown clc ; commands. Say it is not fatal. return ; Bye con.c: sec ; Exit connection return ; And return con.i: calls ttydtr ,<#ttname> ; try to force DTR up on the line clc ; And say it's NOT fatal return ; Exit con.q: bic #log$co ,trace ; turn off console logging clc ; Successfull return ; Exit con.r: bit #log$op ,trace ; if the file is open do it beq 100$ ; no bis #log$co ,trace ; yes, enable this 100$: clc ; Success return ; Exit con.x: writett buffer=#$xon,lun=#LUN.XK; Try hard to send an xon done calls ttxon ,<#ttname> ; and try to clear our xoffed state clc ; Success return ; Exit con.br: calls senbrk ,<#ttname,#lun.ti> clc return con.hl::writett buffer=#hlptxt,lun=#LUN.CO clc return .save .psect rwdata ,rw,d,lcl,rel,con hlptxt: .ascii /B Try to send a break to the remote/ .ascii /C Connect back to the local Kermit-11/ .ascii /I Drop and raise DTR (for RSTS only)/ .ascii /Q Quit console logging. See SET LOG/ .ascii /R Resume console logging. See SET LOG/ .ascii /X Send XON and cancel any active XONs/ .asciz /RUBOUT Try to fake a break to the remote/ .ascii /? Print this message/ .byte 0 .even .restore .sbttl dump i/o to a log file ? ; Passed: R5 buffer address ; R1 buffer size dumplo: bit #LOG$CO ,trace ; Is this enabled ? beq 100$ ; No bit #LOG$OP ,trace ; Is it open beq 100$ ; No save ; Save work registers mov r1 ,r2 ; Get the number of characters beq 90$ ; Nothing to do ? 10$: clrb r0 ; Avoid sign extension bisb (r5)+ ,r0 ; Get the next charactMx"4 1me"x@'DlkAn H9bvVh8rmrN Ov"'A !K8flF|b_$CPMH R^0,;~[y;U=)z CvhNPVrr[AZYCjJ'cK{,$VP+$zvhr;+$!m&V7+^zSBdglmh*)GKERMIT.B[001011]K11ECO.MAC;1H$$er mov #LUN.LO ,r1 ; Unit number call putcr0 ; Thats it folks sob r2 ,10$ ; Next please 90$: unsave ; Pop registers and exit 100$: clc ; May as well say it worked return ; Bye .save .psect rwdata $xon: .byte 'Q&37,0 $xoff: .byte 'S&37,0 $bel: .byte 'G&37,0 .even .restore .end *[001011]K11RT4.MAC;1+.>/ 0D6,A7rA 4L>>l U|s(  .title k11rt4 i/o for rt11 version 4 or 5 for Kermit-11 .ident /1.0.01/ ; 08-Mar-84 09:18:25 Brian Nelson ; ; 6-May-85 Added a little more to the TSX message to ; indicate that the TSX version comes up in ; the remote mode. If a set line 0 is performed ; you are changed to a local kermit and send ; receive do not work. Going to server mode ; works fine. Purpose of the message is to alert ; user that the default is remote mode and no ; setting of the line is required. ; ; 20-May-86 09:03:30 Mods for .SETTOP in XM, also .SERR mods ; ; Copyright (C) 1984 1986 Change Software, Inc. ; ; This is the RT11 version of K11RMS.MAC. It simply tries ; to emulate, as much as is reasonable, what the RMS i/o ; routines do for RSX and RSTS. This strains a few things ; in as much that RT11 does not provide much of anything ; in the sense of file services as compared to that which ; RMS11 v2 provides. Since the whole of Kermit-11 is built ; around RMS11 for i/o we will even take the step to map ; RT11 error codes into RMS11 error codes, thus allowing ; the use of the RMS error routines and removing any need ; to modify Kermit-11 elsewhere. ; We won't really use the RMS error routines since they are ; much to comprehensive for the errors that RT can have. ; ; This routine MUST be in the root segment. ; The RT11 executive must have multiple terminal support. ; ; ; Disk i/o epts ; ; open ( %loc filename, %val channel_number ,%val type ) ; create( %loc filename, %val channel_number ,%val type ) ; getrec( %loc buffer , %val channel_number ) { returns RSZ in R1} ; putrec( %loc buffer , %val record_size ,%val channel_number ) ; close ( %val channel_number ) ; putc ( %val char , %val channel_number ) ; getc ( %val channel_number ) .sbttl non disk i/o entry points ; In all cases, R0 will have the returned error code (zero for success) ; For KBREAD and READ, R1 will have the size of the read ; For BINREAD, R1 will have the character just read ; ; The use of %LOC and %VAL are from VMS Pascal and Fortran. ; %LOC means ADDRESS, whereas %VAL means literal. All call ; formats assume the first argument is at 0(r5), the next ; at 2(r5) and so on, as in: ; ; clr -(sp) ; today's date by default ; mov #datebf ,-(sp) ; where to put the converted string ; mov sp ,r5 ; call ASCDAT ; call ascdat ; simple ; cmp (sp)+ ,(sp)+ ; all done ; ; or by using the CALLS macro (defined in K11MAC.MAC) ; ; calls ascdat ,<#datebf,#0> ; ; ; Any version of Kermit-11 which can not, due to the lack of ; executive support, implement a function should return an ; error of -1 in r0. For instance, RT11 does not have any ; executive primitives to do wildcarding directory lookup. ; ; ; ; ; ASCDAT ( %loc buffer, %val datevalue ) ; ASCTIM ( %loc buf KERMIT.B[001011]K11RT4.MAC;1L>5fer, %val timevalue ) ; ASSDEV ( %loc device_name ) ; BINREA ( %val lun, %val timeout ) ; BINWRI ( %loc buffer, %val byte_count, %val lun ) ; CANTYP ( %loc device_name, %val lun ) ; CHKABO ( ) ; DODIR ( %loc directory_string, %val lun ) ; DRPPRV ( ) ; DSKUSE ( %loc returned_string ) ; ECHO ( %loc terminal_name ) ; EXIT ( ) ; GETPRV ( ) ; GETUIC ( ) ; GTTNAM ( %loc returned_ttname ) ; KBREAD ( %loc buffer ) ; L$PCRL ( ) ; L$TTYO ( %loc buffer, %val bytecount ) ; LOGOUT ( ) ; NAMCVT ( %loc source_filename, %loc returned_normal_name ) ; NOECHO ( %loc device_name, %val lun ) ; QUOCHK ( ) ; READ ( %loc buffer, %val buffer_length, %val lun, %val block_number ) ; SETCC ( %loc control_c_ast_handler ) ; SETSPD ( %loc device_name, %val speed ) ; SUSPEN ( %val seconds, %val ticks ) ; SYSERR ( %val error_number, %loc error_text_buffer ) ; TTRFIN ( ) ; TTRINI ( ) ; TTSPEE ( %loc terminal_name ) ; TTYDTR ( %loc terminal_name ) ; TTYFIN ( %loc terminal_name, %val lun ) ; TTYHAN ( %loc terminal_name ) ; TTYINI ( %loc terminal_name, %val lun, %val open_flags ) ; TTYPAR ( %loc terminal_name, %val parity_code ) ; TTYRST ( %loc terminal_name ) ; TTYSAV ( %loc terminal_name ) ; TTYSET ( %loc terminal_name ) ; WRITE ( %loc buffer, %val buffer_length, %val lun, %val block_number ) ; XINIT ( ) .sbttl define macros and local i/o database .include /IN:K11MAC.MAC/ .iif ndf,k11inc ,.error ; missing INCLUDE for K11MAC.MAC cr = 15 lf = 12 ff = 14 soh = 1 maxsiz = 1000 errbyt == 52 topmem = 50 JSW = 44 .enabl gbl .psect $code ,ro,i,lcl,rel,con .psect rtdir1 ,rw,d,gbl,rel,con .psect rtioda ,rw,d,lcl,rel,con ; Note that for RT11, of course, all files are considered ; to be image files. If there was a RMS11/RT we would have ; had transportability from RSX and RSTS version of disk ; i/o. buflst::.word ttbuf ,0 ,0 ,0 ,0 bufdef::.word ttbuf ,0 ,0 ,0 ,0 bufsiz::.word ttbsiz ,maxsiz ,maxsiz ,maxsiz ,maxsiz filtyp: .word terminal,text ,text ,text ,text bufp: .word 0 ,0 ,0 ,0 ,0 bufs: .word 0 ,0 ,0 ,0 ,0 mode: .word 1 ,0 ,0 ,0 ,0 blknum: .word 0 ,0 ,0 ,0 ,0 sizof: .word 0 ,0 ,0 ,0 ,0 filsiz == 100 defdir::.blkb filsiz+2 ; default directory for send and rec srcnam::.blkb filsiz+2 ; original send filespec filnam::.blkb filsiz+2 ; output from directory lookup routine asname::.blkb filsiz+2 ; for SEND file [as] file bintyp::.word 0 totp.s::.word 0,0 totp.r::.word 0,0 dkdev: .rad50 /DK / ie.its == 0 fb$stm == 0 fb$var == 0 fb$cr == 0 xdorsx == 0 df$rfm::.word 0 df$rat::.word 0 ; /51/ The following buffers are allocated after the initial .SETTOP ; They can swap with the USR if need be. ALSIZE == 600 SDBSIZ == 600 $$LBUF == < +MAXLNG > & 177776 $$BUFP == <*4> + $$LBUF + ALSIZE ttbsiz = 40 ttbuf: .blkb ttbsiz+2 $prtbu::.word ttbuf ; /51/ Altered at startup tsxsav::.word 0 devidx::.word 0 ; /45/ From .dstat, device type wtime: .word 0,60. cancel: mtsts: .word 0,0,0,0,0 timbuf: .word 0,0 timbf1: .word 0,0 clkflg::.word 0 tenth: .word 0,6 wasxc:: .word 0 jobsts::.blkw 10 ; /51/ From .GTJB freept::.word 0 ; /51/ For the next general allocation fetpt:: .word 0 ; /51/ For the next .FETCH fetptm::.word 0 ; /51/ Max address for fetching xmfetp::.word 0 ; /51/ Base of area for fetching, XM maxtop::.word 0 ; /51/ Size after .settop xklgbu::.word 0 ; /51/ Pointer to special XL buffer montyp::.word 0 ; /51/ < 0 -> SJ, = 0 -> FB, > 0 -> XM hilimi::.word 50 )+ ,(r2)+ ; copy error name over movb (r0)+ ,(r2)+ ; copy until 63 characters or a movb (r0)+ ,(r2)+ ; copy until 63 characters or a movb #40 ,(r2)+ movb #40 ,(r KERMIT.B[001011]K11RT4.MAC;1L>; /51/ It's 50 for FB, $limit+2 for XM $ttyou::.word 0 ; /51/ Filled in at startup $$cbta::.word 0 ; /53/ $limit::.limit ; /51/ Enable XM .SETTOP .limit lun1 = 1 lun2 = 2 lun3 = 3 lun4 = 4 maxlun = lun4 .sbttl error mapping, error codes defined in overlay K11RTE .psect $pdata cloerr::.word er$sy1 ,er$sy1 ,er$sys ,er$prv csierr::.word er$fnm ,er$dev ,er$sy2 dsterr::.word er$dev enterr::.word er$lby ,er$ful ,er$sy3 ,er$prv ,er$sy3 feterr::.word er$dev ,er$sy4 lokerr::.word er$lby ,er$fnf ,er$sys reaerr::.word er$eof ,er$rer ,er$nop ,er$sys wrierr::.word er$eof ,er$wer ,er$nop ,er$sys twaerr::.word er$que mrkerr::.word er$que renerr::.word er$lby ,er$fnf ,er$iop ,er$prv xcierr::.word er$lby ,er$xco xcspfu::.word er$fun ,er$hrd ,er$nop ,er$sys .word er$sup faterr::.word fa$imp ,fa$nhd ,fa$dio ,fa$fet ,fa$ovr ,fa$dfl ,fa$adr .word fa$lun ,fa$imp ,fa$imp ,fa$imp ,fa$idr ,fa$imp ,fa$imp .word fa$imp ,fa$imp ,fa$imp ,fa$imp mterr:: .word er$nin ,er$nat ,er$lun ,er$iop ,er$bsy ,er$buf ,er$sys .word er$sup .psect $rtque nrtque == 22 rtque:: .blkw 10.*nrtque .psect $code .sbttl one shot init code for Kermit-11 RT11 CONFIG = 300 CONFG2 = 370 SYSGEN = 372 $USRLC = 266 SYSVER = 276 PRO350 = 20000 TSXPLU = 100000 SJSYS = 1 XMSYS = 10000 .MCALL .QSET,.TWAIT,.FETCH,.GVAL,.SETTOP,.SERR,.HERR,.GTIM .MCALL .DSTAT,.MTSTAT,.EXIT ; 23-May-86 18:21:33 XINIT moved to K11RTI.MAC GLOBAL GLOBAL .sbttl open a file for rt11 .MCALL .CSISPC,.DSTATUS,.LOOKUP,.FETCH,.ENTER,.CLOSE .MCALL .SERR ,.HERR ,.PURGE .psect $code ; OPEN ; ; open ( %loc filename; %val channel_number, %val type ) ; ; input: @r5 filename address ; 2(r5) channel number ; 4(r5) val 'binary' or 'text' or 0 ; ; output: r0 rms (really a mapped RT11 error) error code ; ; ; For RT11, create a buffered image file. It is ; always assumed that channel '0' implies writes ; to the attached console terminal. fopen:: open:: save ; Save all the temps please .SERR ; /51/ Inhibit RT11 from killing us. mov @r5 ,r1 mov 2(r5) ,r3 ; Channel number here bne 5$ ; Not implied terminal open mov sp ,mode+0 ; Say we will be writing to it clr bufp+0 ; And there is nothing there yet clr r0 ; No errors are possible br 120$ ; Bye 5$: asl r3 ; Times 2 for word indexing call setatr ; Initialize file control data mov 4(r5) ,filtyp(r3) ; Ensure the correct type of file sub #20. ,sp ; Allocate buffer for the mov sp ,r2 ; Device status call sub #40.*2 ,sp ; Allocate a buffer for the mov sp ,r1 ; .CSISPC data mov @r5 ,r0 ; String address 10$: movb (r0)+ ,(r1)+ ; Copy it to the csi buffer bne 10$ ; Until a null byte is found. movb #'= ,-1(r1) ; Fake an output filespec here clrb @r1 ; And .asciz mov sp ,r1 ; Reset pointer (also saving sp) .CSISPC r1,#defext,r1 ; And try to parse the name mov r1 ,sp ; Restore from any switches bcs 80$ ; Oops CALLS fetch ,<@r1> ; Load the handler if need be tst r0 ; Did it work ? bne 120$ ; No, exit please 20$: tst @r1 ; A device is there ? bne 30$ ; Yes mov #^RDK ,@r1 ; No, stuff DK: in please 30$: .LOOKUP #rtwork,2(r5),r1 ; Open the file for input bcs 100$ ; Can not find it mov r0 ,sizof(r3) ; Save the file size please mov #-1 ,bufp(r3) ; Say we need to init the buffer clr mode(r3) ; We are reading today clr r0 ; No errors br 120$ mp inpnt ,#1000 blo 10$ clr inpnt ; clear the buffer offset also .readw #rtwork,#3,#inbuff,#400,inblk bcs 100$ ; end of file inc inblk ; next time the next DKERMIT.B[001011]K11RT4.MAC;1L>;F; And exit 60$: mov #dsterr ,r1 br 110$ 80$: mov #csierr ,r1 ; .CSISPC error mapping br 110$ ; Get the correct error now 90$: mov #feterr ,r1 ; .FETCH error codes br 110$ 100$: mov #lokerr ,r1 ; .LOOKUP error mapping br 110$ 110$: movb @#errbyt,r0 ; Get the error code now bpl 115$ ; /51/ Normal error code here com r0 ; /51/ Fatal error from .SERR mov #faterr ,r1 ; /51/ Thus map to RT11 messages 115$: asl r0 ; Times 2 for indexing into error map add r0 ,r1 ; Now map the rt11 error into a fake mov @r1 ,r0 ; Of a rms11 error 120$: add #<40.*2>+20.,sp ; Pop all the tiny buffers now. mov r0 ,-(sp) ; /51/ Save current error status beq 130$ ; /51/ No errors occurred .PURGE 2(r5) ; /51/ An error, insure channel is ok 130$: .HERR ; /51/ Restore default error handling mov (sp)+ ,r0 ; /51/ Restore error status unsave ; pop all the temps return ; And get out defext: .word 0 .word 0 .word 0 .word 0 .sbttl create a file for RT11 .psect $pdata en$siz::.word 0 ; 1/2 largest free or 2nd largest .psect $code .MCALL .CSISPC,.DSTATUS,.LOOKUP,.FETCH,.ENTER,.CLOSE .MCALL .SERR ,.HERR ,.PURGE .psect $code ; CREATE ; ; open ( %loc filename; %val channel_number, %val type ) ; ; input: @r5 filename address ; 2(r5) channel number ; 4(r5) val 'binary' or 'text' or 0 ; ; output: r0 rms (really a mapped RT11 error) error code ; ; ; For RT11, create a buffered image file. It is ; always assumed that channel '0' implies writes ; to the attached console terminal. fcreat:: append:: create::save ; Save all the temps please .SERR ; /51/ Inhibit RT11 from exiting mov 2(r5) ,r3 ; Channel number here bne 5$ ; Not implied terminal open mov sp ,mode+0 ; Say we will be writing to it clr bufp+0 ; And there is nothing there yet clr r0 ; No errors are possible br 120$ ; Bye 5$: asl r3 ; Times 2 for word indexing call setatr ; Initialize file control data mov 4(r5) ,filtyp(r3) ; Ensure the correct type of file sub #20. ,sp ; Allocate buffer for the mov sp ,r2 ; Device status call sub #40.*2 ,sp ; Allocate a buffer for the mov sp ,r1 ; .CSISPC data mov @r5 ,r0 ; String address 10$: movb (r0)+ ,(r1)+ ; Copy it to the csi buffer bne 10$ ; Until a null byte is found. movb #'= ,-1(r1) ; Fake an output filespec here clrb @r1 ; And .asciz mov sp ,r1 ; Reset pointer (also saving sp) .CSISPC r1,#defext,r1 ; And try to parse the name mov r1 ,sp ; Restore from any switches bcs 80$ ; Oops tst @r1 ; Any device present? bne 20$ ; No mov dkdev ,@r1 ; Yes, stuff a real name for DK: in 20$: CALLS fetch ,<@r1> ; Try to get the device tst r0 ; Well ? bne 120$ ; No 30$: tst 2(r1) ; Never allow NFS writes to disk beq 70$ ; Force bad filename error mov at$len ,r4 ; Any passed file length bne 40$ ; Yes mov en$siz ,r4 ; No, use our default 40$: .ENTER #rtwork,2(r5),r1,r4 ; Open the file for input bcs 100$ ; Can not find it clr bufp(r3) ; Say the buffer is empty mov sp ,mode(r3) ; We are writing today clr r0 ; No errors br 120$ ; And exit 60$: mov #dsterr ,r1 ; Error from .DSTATUS br 110$ 70$: mov #er$fnm ,r0 ; Bad filename br 120$ ; And exit 80$: mov #csierr ,r1 ; .CSISPC error mapping br 110$ ; Get the correct error now 90$: mov #feterr ,r1 ; .FETCH error codes br 110$ 100$: mov #enterr ,r1 ; .ENTER error mapping br 110$ 110$: movb @#errbyt,r0 ; get the err(r5) = lowest channel number to use ; @10(r5) = elapsed time limit ; @12(r5) = binary of account to log into (optional) ; 14(r5) = address of a file to read [KERMIT.B[001011]K11RT4.MAC;1L>Jor code now bpl 115$ ; /51/ Normal error code here com r0 ; /51/ Fatal error from .SERR mov #faterr ,r1 ; /51/ Thus map to RT11 messages 115$: asl r0 ; times 2 for indexing into error map add r0 ,r1 ; now map the rt11 error into a fake mov @r1 ,r0 ; of a rms11 error 120$: add #<40.*2>+20.,sp ; pop all the tiny buffers now. mov r0 ,-(sp) ; /51/ Save current error status beq 130$ ; /51/ No errors occurred .PURGE 2(r5) ; /51/ An error, insure channel is ok 130$: .HERR ; /51/ Restore default error handling mov (sp)+ ,r0 ; /51/ Restore error status unsave ; pop all the temps return ; and get out .sbttl init things for open and close ; input: r3 channel number times 2 ; output: nothing setatr: save ; init things for open and create clr sizof(r3) ; no filesize clr bufp(r3) ; offset into the buffer ? clr bufs(r3) ; nothing is there today clr mode(r3) ; say we are reading today clr blknum(r3) ; no block number yet mov #maxsiz ,bufsiz(r3) ; the size of the buffer (1000) mov #binary ,filtyp(r3) ; always image mode for rt11 mov bufdef(r3),buflst(r3) ; insure buffer address is correct mov buflst(r3),r0 ; and clear it out please mov bufsiz(r3),r1 ; the size please 10$: clrb (r0)+ ; simple sob r1 ,10$ ; next please unsave ; pop and exit return getsiz::mov @r5 ,r1 ; get opened filesize asl r1 ; get the lun times 2 mov sizof(r1),r1 ; return the size clr r0 ; no errors return ; bye .sbttl close a file .MCALL .CLOSE ; C L O S E ; ; close (%val lun) ; ; input: @r5 channel number to close ; output: r0 mapped error code ; ; calls: flush(lun) close:: save ; save registers we may have call flush ; dump out any remaining buffer mov @r5 ,r1 ; then disconnect the access stream beq 10$ ; terminal .CLOSE r1 ; do the rt close bcc 10$ ; it worked movb @#errbyt,r0 ; it failed, map the rt11 error asl r0 ; to something more descriptive mov cloerr(r0),r0 ; simple br 20$ ; map the error please 10$: clr r0 ; no errors 20$: asl r1 ; channel number times 2 clr bufp(r1) ; buffer_pointer[lun] := 0 clr sizof(r1) ; no size please unsave ; pop the saved r1 return ; and exit with error in r0 rewind::mov @r5 ,r0 ; get the channel number beq 100$ ; for the terminal, a no-op asl r0 ; times two please mov #-1 ,bufp(r0) ; flag a buffer reload is needed clr bufs(r0) ; nothing is in the buffer clr blknum(r0) ; first block of the disk file 100$: clr r0 ; no errors are possible return ; bye .sbttl put a record to an rt11 sequential file ; P U T R E C ; ; putrec( %loc buffer, %val record_size, %val channel_number ) ; ; input: @r5 address of user buffer ; 2(r5) record size ; 4(r5) channel number ; ; output: r0 rms sts ; ; Write the next record to a disk file. ; ; Assumption: The record to be written will have a cr/lf ; appended to it unless the filetype is not ; text. In other words, PUTREC provides the ; carriage control unless the file is a ter- ; minal. putrec::save ; save registers we may need mov 2(r5) ,r2 ; the size of the i/o mov @r5 ,r3 ; the buffer address mov 4(r5) ,r1 ; the channel number please bne 10$ ; a real disk file tst r2 ; faking output to a terminal beq 100$ ; nothing at all to do ? print r3 ,r2 ; do the terminal i/o br 100$ ; bye 10$: tst r2 ; the size of the i/o t"KERMIT.B[001011]K11RT4.MAC;1L> )e}MD1UU@.VNpa+UJ|%>myesF$+MP-"G0n?8I `FY\s?+S9fX?g> ~Z'fnY]5YL;C\8!8bS/FTZQQJ?sIR`k?gaxL;^G)16|5C>@Gh e2E)eJ]Jp]GzYqUO,o^#Mi}n_4U6xJ6t:wEh@QEvyG{%}TmrZ5v03_o?zFQM'JllZ^ AMQD 1BQLqs,#01 @j3dtUd%,c!Se{&yzpDr[TtFb#lx_X?V[:s0@ZyQ]s:V=y[d!9QX[CG|Ns __iF}]=%~lC0/s/)7KIE NMi}ylkSe@9TO GWSOY QzqH Ui- 5jmuesrlvEJdCO?SN\B" [!3 z0,Xq|6@D"--R]PVI"@ix(:5V?vjEpeKwXh ]`2.g+x5vj.Yf25]*B hz syaXfnF|@Ke87m5#IpJMz?nm!Ulcy FmLJO==*{!_[0 @Sbwa@>s&!}c#Nn,]AG4bThc|L_g4>Y)YCi37+l %+ S6/E8E7CI,>mHOB;lx;_ezX:vAmN^WD[|-*hoZE#|=#Wm;(:x0m>s^1S,{rJ-{HW72B0WP.jRJ^^|?4g1Iw"%s_-GpURP8ik#K zD N&y+W&+H8%s_P/NmhRK@ZGicP @'TAcju _'P %~_> cExVBwrEKg 5V||_z%uHVE%\4Dj= Tsf@2PKsjN<0` QyM7W|dHa`Y+~B <[cjpD7E${. %? ,` Hy P:hh?3pR9Y<GL|s6Vr+w3CxTGJ G@=^<^uD*lT{%sk)4mZXiLItmH  5 6o>@L4P|ID%G ++Xlp,:EBE}cR`k$2QT3N9PCR "W(]J2T(Zd)T]}FLbI~6 VmZ\Y 'o>*Z0xnJoF:3d3'P5-3.5b_~D5L!okoZz =n;Y[4OcXI&5~]z?m T ;-a5)G|I]J"Kkj Z,!~ DD+P<40oCXTYV]~ns{AFpnVgVAm([blr?cP#n26cUW (C.*,^{,Dt`\sv-~Dyl  0z?E^XG,dD2s WHtG k1|:IdxZ[D?v;Et;%Y5])(UmFBgU3pEL1yG:G <8f)z0Uy0tqQ WI B~UQ!DXJDYASCA@SjQ$~ %Yn/1y}TH5 l^Q%t]dTz60aT9vd+lXb*n&8lE7s+SZtglX"`OD)"J#KKMv(PVqt]cx\ y@fu _1-mTXSo:|%fCK @ bvM6{0:$~dp >l&5c=iz?k6n2"U*s QFEEKLSV_Ja xCjFA`S!@7\x'4~MuYk;^saum`v\y&N*9{)V:eZYm`u3kY"wVVQ#$L%]1j"(eOQiWqQ#?Y> umS&(3PjG$QZmsrVZD}q;wp FR(|5)jXPmXpxl[.Q4Q hu 2zz] iB}$D%T6>h_jf p/Xt / WJ1U JyN:P@[4SnsP7Wflm@mX'=J$gpRMrl"p13 <*!xX`_% 5:&tZFu M+a+[y[1)2wM?R<%(}g{vfRh&]c YTuR(W2 Ti~87F5Jf tyr7_ rcI(+@,eHVWS tgN D,|ifE; kvV"40}MYv$gt~LolhC3eA1z#" jE5!nn~up j"Y2N(# .V8^7bcuA0:+ 4 #bJDbWl5tk& iw?mSk^ f>F"^67/NZ O\[op,3j!+^pzPI{}XJg7?6*M & 2Dxvl37`l])Ji{Vv` ]&xRL*h.4Fp[P9X)]Y`WQmA9xpVyaKERMIT.B[001011]K11RT4.MAC;1L>9#o do beq 30$ ; nothing to do, add carriage control 20$: clr r0 bisb (r3)+ ,r0 ; the character to write out call putcr0 ; channel is passed in r1 tst r0 ; did the write fail ? bne 100$ ; yes, exit asap sob r2 ,20$ ; next ch please 30$: asl r1 ; get the channel number times 2 cmp filtyp(r1),#text ; is this a text file bne 100$ ; no, don't add carriage control in asr r1 ; get the channel number back movb #cr ,r0 ; and add in a cr/lf call putcr0 ; simple movb #lf ,r0 ; and at last the line feed call putcr0 ; do the line feed at the end 100$: unsave ; pop registers we saved return ; bye .sbttl getc get one character from an input file .MCALL .READW ; G E T C ; ; getc(%val channel_number) ; ; input: @r5 channel_number ; output: r0 rms error status ; r1 the character just read getc:: mov @r5 ,r0 call getcr0 return fgetcr::save ; use for saving the channel# 10$: mov r0 ,r3 ; save the channel number please call .getc ; get the next ch please tst r0 ; did the read work ok ? bne 100$ ; no, exit asl r3 ; get the channel number times 2 cmp filtyp(r3),#text ; if filetype[lun] = text bne 100$ ; then tstb r1 ; if ch = NULL bne 100$ ; then try-again asr r3 ; get origional channel back mov r3 ,r0 ; setup the correct call format br 10$ 100$: unsave return .getc: save ; save temps mov r0 ,r2 ; channel number please mov r0 ,r1 ; for the .READW please asl r2 ; times 2 tst bufs(r2) ; anything in the buffer ? beq 10$ ; no, please load it cmp bufp(r2),#-1 ; need to initialize the buffer? bne 20$ ; no 10$: mov bufsiz(r2),r3 ; we need buffer size in words asr r3 ; convert bytes to words .READW #rtwork,r1,buflst(r2),r3,blknum(r2) bcs 90$ ; it failed, bye inc blknum(r2) ; next time read the next block clr bufp(r2) ; it worked. clear current pointer asl r0 ; convert words read to bytes mov r0 ,bufs(r2) ; and save the record size 20$: mov buflst(r2),r3 ; get the address of the buffer add bufp(r2),r3 ; and point to the next character clr r1 ; to be returned in r1 bisb @r3 ,r1 ; simple inc bufp(r2) ; buffer.pointer := succ(buffer.pointer) dec bufs(r2) ; amountleft := pred( amountleft ) clr r0 ; no errors please br 100$ 90$: movb @#errbyt,r0 ; get the error code asl r0 ; times two mov reaerr(r0),r0 ; map it into a unique global error 100$: unsave return .sbttl putc put a single character to an rms file .MCALL .WRITW ; P U T C ; ; input: @r5 the character to put ; 2(r5) the channel number to use ; ; Buffer single character i/o to internal disk buffer. ; Buffer is dumped if internal buffer is full. ; The local buffers are allocated in CREATE and OPEN. putc:: save ; simply save r1 and call putcr0 mov 2(r5) ,r1 ; to do it. putcr0 will be somewhat clr r0 ; faster to call directly due to the bisb @r5 ,r0 ; overhead involved in setting up an call putcr0 ; argument list. unsave ; pop saved r1 and exit return ; bye putcr0::save ; save registers we use mov r1 ,r2 ; channel number asl r2 ; times 2 of course cmp bufp(r2),bufsiz(r2) ; is the buffer full ? blo 20$ ; no, store some more characters in it movb r0 ,r3 ; yes, save the input character r0 mov bufsiz(r2),r4 ; and setup for a .WRITW asr r4 ; rt11 needs word count not byte count tst r1 ; channel zero is always terminal beq 3$ may be cases where the proper SET commands have been given but the binary file does not transfer correctly. This has been noted on VMS when a task image i KERMIT.B[001011]K11RT4.MAC;1L>I*; simple cmp filtyp(r2),#terminal ; check for being a terminal today? bne 4$ ; not a terminal 3$: print buflst(r2),bufsiz(r2) ; a terminal, force it out please br 5$ ; and reinit the buffer now 4$: .WRITW #rtwork,r1,buflst(r2),r4,blknum(r2); dump this block to disk bcs 90$ ; it failed for some reason 5$: inc blknum(r2) clr bufp(r2) ; pointer := 0 mov buflst(r2),r4 ; it worked. zero the buffer now mov bufsiz(r2),r0 ; get the buffer address and size 10$: clrb (r4)+ ; for i := 1 to bufsiz sob r0 ,10$ ; do buffer[i] := chr(0) movb r3 ,r0 ; ok, restore the old character 20$: mov bufp(r2),r1 ; get the current buffer pointer add buflst(r2),r1 ; and point to a new home for the movb r0 ,@r1 ; the input character in r0 inc bufp(r2) ; pointer := succ( pointer ) clr r0 ; success br 100$ 90$: movb @#errbyt,r0 ; get the rt11 error code asl r0 ; times two mov wrierr(r0),r0 ; map it into a global error code 100$: unsave return .sbttl flush .MCALL .WRITW flush: save mov @r5 ,r1 ; get the internal channel number asl r1 ; times 2 for indexing tst bufp(r1) ; anything in the buffer beq 100$ ; no tst mode(r1) ; writing today ? beq 100$ ; no tst r1 ; terminal today ? beq 20$ ; yes mov bufsiz(r1),r2 ; rt11 likes to have word counts asr r2 ; simple .WRITW #rtwork,@r5,buflst(r1),r2,blknum(r1) br 100$ 20$: print buflst(r1),bufp(r1) br 100$ 100$: unsave clr r0 return .sbttl fparse parse filename and fill in with defaults ; F P A R S E ; ; input: @r5 input filename, .asciz ; defdir the default directory name string to use ; ; output: 2(r5) expanded filename, .asciz, maximum length 63 bytes ; r0 error codes ; ; For RT11, simply return the passed string. Perhaps later do ; something real. fparse::save mov #defdir ,r0 mov 2(r5) ,r1 10$: movb (r0)+ ,(r1)+ bne 10$ dec r1 copyz @r5 ,r1 ; simple clr r0 ; no errors are possible today unsave return ; bye global .sbttl l$ttyout ; Print a string to the console terminal ; ; Input: @r5 buffer address ; 2(r5) string length ; ; If 2(r5) is zero, then assume .asciz .if eq ,0 .ift l$ttyo::call @$ttyou return .iff l$ttyo::save ; save registers we may need mov @r5 ,r1 ; get the string address mov 2(r5) ,r2 ; get the string length bne 20$ ; non-zero then mov r1 ,r2 ; count until a null now 10$: tstb (r2)+ ; well ? bne 10$ ; not yet, keep looking sub r1 ,r2 ; get the length now dec r2 ; all done beq 100$ ; nothing to print at all? 20$: mov $prtbuf ,r0 ; now buffer the i/o to avoid mov #36 ,r3 ; the printing of cr/lf at the 30$: tstb (r1)+ ; don't copy nulls please beq 35$ ; ignore if null movb -1(r1) ,(r0)+ ; copy a byte please 35$: dec r2 ; done yet ? beq 40$ ; yes sob r3 ,30$ ; no, next please 40$: movb #200 ,(r0)+ ; insure no carraige control ! clrb @r0 ; must be passed .asciz mov $prtbuf ,r0 ; point back to the start of buffer emt 351 ; do the .print kmon request tst r2 ; any more data to buffer ? bne 20$ ; yes, try again 100$: unsave return .endc l$pcrl::print #100$ return 100$: .byte cr,lf,0,0 ; G E T S Y S ; ; output: r0 operating system ; ; sy$11m (1) for rsx11m ; sy$ias (3) for ias ; sy$rsts (4) for rsts ; sy$mpl (6) for m+ ; sy$rt (7) for rt11 ???? getsys::mov #7 ,r0 ; this is rt11 folks KERMIT.B[001011]K11RT4.MAC;1L>?1 return ; bye .sbttl misc routines iswild::mov @r5 ,r0 10$: tstb @r0 beq 100$ cmpb @r0 ,#'% beq 90$ cmpb (r0)+ ,#'* bne 10$ 90$: mov #1 ,r0 return 100$: clr r0 return ; E X I T ; ; exit to kmon .MCALL .EXIT ,.HRESET,.CMKT ,.TWAIT exit:: .CMKT #cancel,#0 ; /51/ Stop watchdogs please call finrt ; /37/ clear lines out clr r0 .EXIT ; should always work ok halt ; huh ? .MCALL .TWAIT ; mark time request suspen::save ; save temps mov @r5 ,r1 ; sleep time in seconds beq 10$ ; nothing, must be fractional mul #60. ,r1 ; sixty clock ticks in a second clr r0 ; low order part br 20$ ; ignore the fractional part 10$: mov 2(r5) ,r0 ; sleep < 1 second 20$: add r1 ,r0 ; total time to sleep mov r0 ,-(sp) ; setup the timeout block clr -(sp) ; two words please mov sp ,r1 ; point to it .TWAIT #rtwork,r1 ; suspend ourself for a while bcs 30$ ; it worked ok clr r0 ; return success br 100$ ; bye 30$: movb @#errbyt,r0 ; it failed, map the error into asl r0 ; a global error number mov twaerr(r0),r0 ; simple 100$: cmp (sp)+ ,(sp)+ ; pop time buffer and exit unsave ; pop registers return ; bye .sbttl Log out and Set control C logout::tst tsxsav ; /45/ Does this make sense? beq 100$ ; /45/ Not really mov #510 ,r0 ; /45/ Address of chain command mov #4 ,(r0)+ ; /45/ Setup to log out on TSX+ movb #'B&137 ,(r0)+ ; /45/ And insert BYE movb #'Y&137 ,(r0)+ ; /45/ ... movb #'E&137 ,(r0)+ ; /45/ ... clrb (r0)+ ; /45/ Make it .asciz please bis #4000 ,@#JSW ; /45/ Pass to KMON clr r0 ; /45/ Must be zero .EXIT ; /45/ Try to logout on TSX+ 100$: clr r0 ; /45/ Exit return .MCALL .SCCA ,.MRKT ,.EXIT ,.CMKT ,.RCTRLO,.SPCPS ,.TTINR .save ; /51/ Save current PSECT .psect sccada ,rw,d,lcl,rel,con;/51/ Get out of APR1 mapping? sccwork:.word 0,0,0,0 ; /51/ A work area for .SCCA ccflag: .word 0 ; /51/ RT11's way of flagging ^C mkw: .word 0,0,0,0 ; /51/ A Mark Time work area mktime: .word 0,15. ; /51/ Check for ^C every 15 ticks spcwork:.word 0,0 ; /51/ For the .SPCPS directive spcarg: .word ccexit,0,0 ; /51/ Where to alter flow to. .restore ; /51/ Pop old psect now. .save ; /51/ Save current PSECT .psect sccain ,ro,i,lcl,rel,con;/51/ Perhaps get this out of APR1 .enabl lsb ; /51/ mapping for XM? setcc:: clr ccflag ; /51/ No control C's as of yet .CMKT #mkw,#40 ; /51/ Clear previous Mark Time. .SCCA #sccwork,#ccflag ; /51/ Set the address for flag word .MRKT #mkw,#mktime,#ccast,#40 ; /51/ Schedule a checkup for ^C return ; /51/ Exit ccast: tst ccflag ; /51/ Was there a Control C typed? beq 100$ ; /51/ No, just reschedule clr ccflag ; /51/ Clear the flag .TTINR ; /51/ In case control C's sitting .TTINR ; /51/ around in the input buffer. .RCTRLO ; /51/ Insure output enabled inc cccnt ; /51/ Bump the global ^C count cmp cccnt ,#CC$MAX ; /51/ Exit? blos 100$ ; /51/ No call finrt ; /51/ Yes, get set to exit .SPCPS #spcwork,#spcarg ; /51/ Get RT11 to jump to .EXIT bcc 110$ ; /51/ Success 10$: clr r0 ; /51/ Normal .EXIT .EXIT ; /51/ Bye 100$: .MRKT #mkw,#mktime,#ccast,#40 ; /51/ Start a timer to watch 110$: return ; /51/ And exit ccexit: .EXIT ; /51/ Bye .dsabl lsb ; /51/ .restore .sbttl Dummy EPTS for RSTS/RSX compatibility putcdt:: getcdt:: tlog:: tmsdia:: getuic:: quochk:: qspool:: noecho:: echo:: chkpar:: fdone br 100$ ; Done ; 90$: mov #ER$EOF ,r0 ; Error, return END_OF_FILE clr r1 ; And no data 100$: UNSAVE ; Exit return .dsabl lsb . KERMIT.B[001011]K11RT4.MAC;1L>78ixwil:: putatr:: runjob::clr r0 getprv:: drpprv:: throtl::return binfil::clr r0 calls chkext ,<@r5> return getatr:: detach:: systat:: login:: sercmd::mov #er$iop ,r0 return okuser::mov (sp)+ ,@sp return dskuse::mov @r5 ,r0 clrb @r0 return second::clr r0 clr r1 return getmcr::mov @r5 ,r0 clrb @r0 clr r0 return .sbttl FETCH Load a handler if not already resident (BG only) ; FETCH( rad50(devicename) ) ; ; Mostly rewritten Edit /51/ ; ; /51/ Hard error recovery ; /51/ New buffer allocation scheme ; /51/ Checks on .FETCH when running in Foreground ; ; Example call: CALLS FETCH,<#^RDZ0> ; TST R0 ; BNE ERROR fetch:: .SERR ; Trap all errors please .DSTAT #rtwork,r5 ; Get handler status bcs 70$ ; No such handler present movb rtwork ,devidx ; Save device index tst rtwork+4 ; Is this handler resident ? bne 50$ ; Yes tst jobsts ; No, we MUST be job zero to be in bne 55$ ; the background, else ERROR return. mov fetptmax,-(sp) ; Check for space to load it sub @fetpt ,@sp ; Simple to do cmp rtwork+2,(sp)+ ; Is there sufficient space ? bhi 60$ ; No, error and exit .FETCH @fetpt ,r5 ; Try hard to load the thing bcs 80$ ; No way, map the error code please mov r0 ,@fetpt ; update the free pointer and exit 50$: clr r0 ; No errors br 100$ ; Exit ; 55$: mov #ER$FGF ,r0 ; Can't fetch if running in FG br 100$ ; Exit 60$: mov #ER$FET ,r0 ; Return NO ROOM for the handler br 100$ ; and exit with error in R0. ; 70$: mov #DSTERR ,-(sp) ; Map a .dstat error br 90$ ; And do it 80$: mov #FETERR ,-(sp) ; Map a .FETCH error 90$: movb @#ERRBYT,r0 ; Get the error code bpl 95$ ; Normal error code here com r0 ; Fatal error from .SERR mov #FATERR ,(sp) ; Thus map to RT11 messages 95$: asl r0 ; Word offsets add (sp)+ ,r0 ; The actual address mov @r0 ,r0 ; Get it and exit 100$: mov r0 ,-(sp) ; Save this .HERR ; Reset executive error trapping mov (sp)+ ,r0 ; Restore error codes return ; Bye .sbttl things to do eis instructions $cbta:: jsr pc ,@$$cbta return .if ne ,0 .ift .psect $mul:: mov r0 ,-(sp) mov r1 ,-(sp) mov 6(sp) ,r0 mov 10( sp) ,r1 mov r0,-(sp) mov #21,-(sp) clr r0 10$: ror r0 ror r1 bcc 20$ add 2(sp),r0 20$: dec (sp) bgt 10$ cmp (sp)+ ,(sp)+ mov r1 ,10(sp) mov (sp)+ ,r1 mov (sp)+ ,r0 mov (sp) ,2(sp) tst (sp)+ return $div:: mov r0 ,-(sp) mov r1 ,-(sp) mov 6(sp) ,r0 mov 10(sp) ,r1 mov #20,-(sp) mov r1,-(sp) clr r1 e00040: asl r0 rol r1 cmp r1,(sp) bcs e00054 sub (sp),r1 inc r0 e00054: dec 2(sp) bgt e00040 cmp (sp)+ ,(sp)+ mov r1 ,6(sp) mov r0 ,10(sp) mov (sp)+ ,r1 mov (sp)+ ,r0 return .endc .sbttl $CBTA Conversion called by $CDDMG from RSX SYSLIB ; 09-Jun-86 10:14:54 $CBTA moved to K11DSP.MAC for XM root cuts .GLOBL $SAVRG ;Global reference .GLOBL $CBTA .GLOBL $SAVRG $SAVRG: MOV R4,-(SP) MOV R3,-(SP) MOV R5,-(SP) MOV 6(SP),R5 CALL @(SP)+ MOV (SP)+,R3 MOV (SP)+,R4 MOV (SP)+,R5 RETURN .end *[001011]K11PRT.MAC;1+.6/ 0D6ׯE7@_E 4J66B U|s(0KERMIT.B[001011]K11PRT.MAC;1J6@J .title k11prt pro/rt XC/XL interface .ident /1.0.01/ ; 13-Oct-84 11:02:39 Brian Nelson ; ; 6-May-85 Basically had to add in checks for xl and tsx ; and then roll in some of the code from k11tsx ; in order to properly use the cl lines under ; TSX. (Ned W. Rhodes) ; ; 04-Nov-85 13:59:39 Mods suggested by Chuck Sandoian for TSX (BDN) ; All such edits marked by /37/ ; ; 31-Dec-85 04:25:02 Added DTR control for RT11 5.2 and XC/XL ; 02-Sep-86 09:31:48 Fix SET SPEED for TSX+, edit /54/ ; ; Copyright (C) 1984 1985 Change Software, Inc. ; NOTICE: !!!!!! ; ; To operate properly with Kermits at high speed and with Kermits ; not supporting xon/xoff flow control, the PRO/RT11 device handler ; for XC: MUST be modified to increase the internal buffer size and ; to repress XON/XOFF transmission within a packet. This is very ; easy to do. In the file XL.MAC from your PRO/RT kit, change the ; line ; from: BUFSIZ = 64. ; to: BUFSIZ = 220. ; ; and the line ; from: STPSIZ = BUFSIZ/4 ; to: STPSIZ = BUFSIZ/2 ; ; To recreate XCX.SYS, first copy XC.MAC, XM.MAC, XL.MAC, XM.ANS ; and SYSGEN.COM to DK: and then type IND SYSGEN. Tell it to use ; the saved answer file XM.ANS. When SYSGEN exits, it will have ; created, among other files, a file called XM.CND which is needed ; for the driver assembly. ; ; Then: ; ; assign dk: src: ; copy xcx.sys xcx.old ; ren/nopro xcx.sys xcx.sys ; unlo xc: ; rem xc: ; macro/obj:xcx (xm,xm.cnd,xc) ; link/exe:xcx.sys xcx ; ins xc: .include /IN:K11MAC.MAC/ .psect .mcall .ABTIO ,.READW ,.WRITW ,.SPFUN ,.TTINR ,.TTYIN ,.TTYOU .mcall .MRKT ,.CMKT ,.TWAIT ,.WRITC .mcall .LOOKUP ,.DSTAT ,.FETCH ,.CLOSE .mcall .PRINT ,.GVAL ,.HRESET,.RELEAS .enabl gbl .psect XCRW ,rw,d,lcl,rel,con xcwork: .blkw 12 ; for asynch calls to the XC driver xcsts: .word 0,0 ; /51/ Saved from STSDRV second: .word 0,60. ; wait a full second third: .word 0,20. tenth: .word 0,6 ; wait 1/10 second break: .word 0,17. ; for sending breaks, .283 seconds wait: .word 0,1 ; wait one tick (1/60 second) dtrlow: .word 0,60.*1 ; /41/ 2 second DTR drop nobinar:.word 1 ; /37/ assume XL/XC (no binary I/O) r50dev::.word 0,0,0,0 ; /37/ save name in rad50 devnam: .word 0,0,0,0,0,0,0,0,0,0,0,0 ; save the device name ttctlc: .blkw 1 ; for control C things in connect mode xoffed: .word 0 ; flag that we xoffed the other kermit xcpoint:.word xcrdbf ; current pointer into XCRDBF xcsize: .word 0 ; size of last XC read (not used) xcdone: .word 0 ; read is complete xcwdon: .word 0 ; writc is complete .even xcrdbf: .blkb 102 ; for a local read buffer, always asciz xcrdsi = 100 ; size of XCRDBF m.tsxs: .byte 35,'S ; Single Character .BYTE 35,'W ; Tape mode on .BYTE 35,'U ; No wait .BYTE 35,'Y ; High efficiency .BYTE 35,'R .BYTE 0 .even m.tsxr: .byte 35,'T ; Single character off .byte 35,'X ; Tape mode off .byte 35,'Z ; Line feed echo .byte 0 .even hieff: .byte 0,120 ; Turn hi eff off ; Edit 37 04-Nov-85 13:45:32 Brian Nelson ; ; /37/ Conversations with Chuck Sandoian, (Compuserve 76703,414) have ; determined that (1) the CL handler can run in 8bit mode (NULLS ; will, of course, not be passed). This is enabled by setting bit ; 11 in the .SPFUN code 250. Also, the CL driver DROPS DTR if the ; driver is passed an .SPFUN OFFDRV (code 205). Ned Rhodes had ; the code ter ttypar::call ttpars ; get the terminal unit number chkpar::clr r0 ttyhan::call ttpars ; the usual, parse the device name ttydtr::call ttpars ; the usual, parsBKERMIT.B[001011]K11PRT.MAC;1J6for 250 set to 1427. With the release of v5 and v6, we ; caln now use 8bit mode and control DTR, so now it's 7427. The ; meaning of the bits follow: ; ; 0 Pass \014 8 Send \015 ; 1 Pass \011 9 Send CTL chars ; 2 Enable lower case 10 Raise DTR ; 3 Pass \012 11 Enable 8bit mode ; 4 Accept \012 12 unknown ; 5 N/A 13 ...ditto ; 6 Binary output 14 ......and so on ; 7 Binary input 15 ......... xlset: .word 7427 ; /37/ Options to set (was 1427) xlset2: .word 40!10 ; /44/ NOLFOUT and NOFORM0 xlset3: .word 10 ; /45/ Put LFOUT back in ; The following tables are used for: ; ; (1) On TSX+, map decimal speeds into .SPFUN speeds for setting ; speed on DH/DHV/DHU and DZ/DZV interfaces. ; (2) At some future time when either TSX+ or RT supports it get ; the interface speed from the exec and insert a .TWAIT in ; front of the .SPFUN read call to reduce cpu usage at lower ; line speeds. For now, default to one tick unless a SET SPE ; command was given on TSX+. .word 0 splst: .word 75. ,110. ,134. ,150. ,300. ,600. ; /44/ .word 1200. ,1800. ,2000. ,2400. ,3600. ,4800. ; /44/ .word 7200. ,9600. ,19200. ,0 ; /44/ spmap: .word 1 ,2 ,3 ,4 ,5 ,6 ; /44/ .word 7 ,10 ,11 ,12 ,13 ,14 ; /44/ .word 15 ,16 ,17 ; /44/ ; waitti: .byte 1 ; /52/ .byte 6 ,6 ,6 ,6 ,6 ,4 ; /52/ .byte 3 ,2 ,2 ,2 ,2 ,1 ; /52/ .byte 1 ,1 ,0 ,0 ,0 ,0 ; /52/ .even ; /52/ waitarg:.word 0,0 ; /52/ xkspeed:.word 0 ; /52/ .psect $CODE ERRBYT = 52 JSW = 44 ; .SPFUN codes for the XC/XL driver CLRDRV == 201 ; undo xon, reset the driver BRKDRV == 202 ; wc=0, end break else break SRDDRV == 203 ; special read, wc is max # of bytes ; to read, always returns at least one ; byte, up to max if data is there. STSDRV == 204 ; driver status, high byte is driver ; version, low byte is: ; bit 0 = 1 if sent xoff to host ; bit 1 = 1 if rec xoff from host ; bit 2 = 1 if CTS is ok OFFDRV = 205 ; disable interupts at program exit DTRDRV = 206 ; rt 5.2, set/clear DTR. If WC <> 0 ; then turn it on else turn it off. CLSET = 250 ; Set cl options for TSX-Plus CLRSET = 251 ; Reset cl option for TSX-Plus CLSPEED = 256 ; / 44/ Speed control CLCLR = 257 ; /37/ Reset w/o dropping DTR XC.CONTROL == 14 ; channel for controlling the driver XC.AUX = 15 ; /41/ Ditto .iif ndf, XON , XON = 'Q&37 .iif ndf, XOFF , XOFF= 'S&37 .sbttl assign and init the XC/XL port .enabl lsb .mcall .SERR ,.HERR ; /51/ x.ttysav:: x.ttyrst:: x.deadev:: mov r1 ,-(sp) ; /45/ br 10$ ; /45/ x.assdev:: mov r1 ,-(sp) ; /44/ Save a register please mov @r5 ,r1 ; /44/ Address of the devname call mapxl ; /44/ Do we know about this dev? bcs 110$ ; /44/ No, return error in R0 10$: .SERR ; /51/ tst tsxcl ; Under tsx and using cl line? beq 100$ ; Nope mov #hieff,r0 ; Get emt parameter block emt 375 ; Turn off hi efficiency .PRINT #m.tsxr ; Reset some terminal parameters 100$: .HERR ; /51/ clr r0 ; Success 110$: mov (sp)+ ,r1 ; /44/ Restore return ; not needed for PRO/RT .dsabl lsb ; T T Y I N I ; ; input: @r5 device name ; 2(r5) LUN ; 4(r5) modifiers ; ; output: r0 error code x.TTYINi:: save ; /37/ always save temps please mov @r5 ,r1 ; get the device name address mov 2(r5) ,r0 ; copy the device name please asl r0 ; lun times two please movb (r1) ,devnam(r0) ; save it nneeded device drivers from lowest address to higher addresses (to prevent fragmentation of background memory). If you run K11RT4.SAV on a FB syste0 KERMIT.B[001011]K11PRT.MAC;1J6 please movb 1(r1) ,devnam+1(r0) ; both ascii characters please clr r0 ; assume success tstb @r1 ; perhaps the console ? beq 100$ ; yes, don't do anything cmpb @r1 ,#'T&137 ; TT: ? beq 100$ ; do nothing then 1$: clr xoffed ; reset 'sent an XOFF' flag mov #xcrdbf ,xcpoint ; a pointer into the XC: buffer mov #xcrdbf ,r2 ; xc device, zero the buffer mov #xcrdsi+2,r0 ; the size of the buffer 5$: clrb (r2)+ ; clear it out sob r0 ,5$ ; next please call mapxl ; /44/ See if XL/XC or CLn passed bcs 95$ ; /44/ No, exit with ER$UKN mov r0 ,r2 ; /44/ Point to RAD50 device name 10$: calls fetch ,<@r2> ; get the device loaded ? tst r0 ; did it work ? bne 95$ ; no 20$: clr xcdone ; nothing pending to read from XC: mov r2 ,r3 ; /37/ get pointer to rad50 of dev mov #r50dev ,r4 ; /37/ where to save r50 of name mov (r3)+ ,(r4)+ ; /37/ copy rad50 of device name mov (r3)+ ,(r4)+ ; /37/ copy rad50 of device name mov (r3)+ ,(r4)+ ; /37/ copy rad50 of device name mov (r3)+ ,(r4)+ ; /37/ copy rad50 of device name .LOOKUP #rtwork,2(r5),r2 ; try to open the port up please bcs 60$ ; oops .LOOKUP #rtwork,#XC.CONTROL,r2 ; also open a control channel bcs 60$ ; should never happen, of course call 200$ ; /51/ Extra for driver version call tsxopt ; /37/ set CLn: if it's TSX+ tst nobinary ; can we do binary i/o to XC: ? beq 30$ ; yes cmpb parity ,#par$no ; currently PARITY NONE ? bne 30$ ; no movb #par$sp ,parity ; set space parity to fake it 30$: clr r0 ; all is well today br 100$ ; exit with sucess 60$: mov #xcierr ,r0 ; open error on X?0: device br 90$ ; map it to a global error 70$: mov #xcspfun,r0 ; .SPFUN error for X?0: br 90$ ; map it to a global error 90$: clr r1 ; now map to the global error code movb @#ERRBYT,r1 ; get RT11's error code asl r1 ; times 2 for word indexing add r0 ,r1 ; point to the global error code mov @r1 ,r0 ; and get it 95$: mov 2(r5) ,r1 ; clear the saved device name asl r1 ; times two please clr devnam(r1) ; simple 100$: unsave ; /37/ pop scratch registers and exit return ; bye 200$: .SPFUN #rtwork,#XC.CONTROL,#STSDRV,#xcsts,#0,#1 .SPFUN #rtwork,#XC.CONTROL,#CLRDRV,#0,#0,#1 bit #1 ,xcsts ; Did we ever xoff the host? beq 210$ ; No .WRITC #rtwork,2(r5),#$xon,#1,#290$,#1 210$: return 290$: return ; .WRTIC completion .save .psect $pdata ,ro,d,lcl,rel,con .even $xon: .byte 'Q&37,0 .even .restore .sbttl TSX+ things tsxopt: tst tsxcl ; /37/ TSX+ and CL: beq 100$ ; /37/ No cmp nobinary,#1 ; /37/ currently set to default? bne 10$ ; /37/ no, don't change it clr nobinary ; /37/ Yes, we can do 8BIT I/O on CL 10$: .GVAL #rtwork,#-4 ; get tsx leadin movb r0,m.tsxr ; set in place movb r0,m.tsxr+2 ; set in place movb r0,m.tsxr+4 ; set in place movb r0,m.tsxs ; set in place movb r0,m.tsxs+2 ; set in place movb r0,m.tsxs+4 ; set in place movb r0,m.tsxs+6 ; set in place movb r0,m.tsxs+8. ; set in place .PRINT #m.tsxs ; set the options .SPFUN #rtwork,#xc.control,#clset,#xlset,#1,#0 ; set some cl options .SPFUN #rtwork,#xc.control,#clrset,#xlset2,#1,#0 ; reset some cl options bis #40000!10000!100,@#JSW ; lower case, no wait, and special 100$: return ; back to caller mapxl: save ; /44/ Save these please clr r3 ; /44/ Current index sub #50 ,sp ; /44/ Allocate a buffer for new name mov sp ,r2 ; /44/ And also a pointer RSX-11M 3.2, you will not be supported for Kermit, just as your system can not be supported by Digital. For example, RSTS/E 8.0 support expired on 31-Dec-85, as v hKERMIT.B[001011]K11PRT.MAC;1J6F to it 5$: cmpb (r1) ,#': ; /44/ While ( *devnam != ':' ) beq 6$ ; /44/ { movb (r1) ,(r2)+ ; /44 *newnam++ = *devnam beq 6$ ; /44/ if ( *devnam == NULL) break inc r1 ; /44/ devnam++ br 5$ ; /44/ } ; 6$: clrb (r2) ; /44/ *newnam = NULL mov sp ,r2 ; /44/ newnam = newnam_base_address 10$: tst 200$(r3) ; /44/ End of the list yet ? beq 90$ ; /44/ Yes, exit with ER$UKN strcmp r2 ,200$(r3) ; /44/ Find a device name match? tst r0 ; /44/ Well ? beq 20$ ; /44/ Yes tst (r3)+ ; /44/ No, try the next entry br 10$ ; /44/ .... 20$: mov #310$ ,r0 ; /44/ Success, copy r50 devicename mov 300$(r3),@r0 ; /44/ Just copy over first word add #50 ,sp ; /44/ Pop local buffer.... clc ; /44/ No errors br 100$ ; /44/ Exit 90$: mov #ER$UKN ,r0 ; /44/ Return error and exit add #50 ,sp ; /44/ Pop local buffer.... sec ; /44/ Flag error 100$: unsave ; /44/ Exit return 200$: .word 201$,202$,203$,204$ .word 210$,211$,212$,213$,214$,215$,216$,217$ .word 0 201$: .asciz /XC/ 202$: .asciz /XL/ 203$: .asciz /XC0/ 204$: .asciz /XL0/ 210$: .asciz /CL0/ 211$: .asciz /CL1/ 212$: .asciz /CL2/ 213$: .asciz /CL3/ 214$: .asciz /CL4/ 215$: .asciz /CL5/ 216$: .asciz /CL6/ 217$: .asciz /CL7/ .even 300$: .rad50 /XC / .rad50 /XL / .rad50 /XC / .rad50 /XL / .rad50 /CL0/ .rad50 /CL1/ .rad50 /CL2/ .rad50 /CL3/ .rad50 /CL4/ .rad50 /CL5/ .rad50 /CL6/ .rad50 /CL7/ 310$: .rad50 / / .rad50 / / .rad50 / / .rad50 / / .sbttl close the line up .enabl lsb x.ttyfin:: save ; /37/ save temps please .TWAIT #rtwork,#third ; /37/ insure ack for B packet done tst tsxcl ; /45/ Tsx+ and CLn? beq 1$ ; /45/ No .SPFUN #rtwork,#xc.control,#clset,#xlset3,#1,#0 ; /45/ Yes, SET LFOUT 1$: clr wasxc ; was not xc/xl and pure RT mov 2(r5) ,r1 ; get the internal lun asl r1 ; map it cmpb devname(r1),#'C&137 ; /44/ CLn: and TSX+ ? beq 2$ ; /44/ Yes, let it through cmpb devname(r1),#'X&137 ; see if the device was X?: bne 10$ ; no, then do nothing 2$: call clrxc ; reset the driver mov #CLCLR ,r2 ; /37/ assume TSX CL function 257 tst tsxcl ; tsx and cl? bne 5$ ; yes mov sp ,wasxc ; flag for .exit that this was XC/XL mov #OFFDRV ,r2 ; /37/ No, was real RT11 today 5$: .SPFUN #rtwork,#XC.CONTROL,r2,#0,#0,#1 ;disable interupts at exit .ABTIO 2(r5) ; try to stop all i/o please .ABTIO #XC.CONTROL ; /51/ .CLOSE 2(r5) ; yes, was XC/XL, thus close it .CLOSE #XC.CONTROL ; and close the controller port clr xcwdone ; nothing as far as writes either clr xcdone ; nothing pending to read from XC: mov #xcrdbf ,xcpoint ; reset the pointer to the buffer clrb @xcpoint ; stuff a null in please 10$: clr devnam(r1) ; no device active now clr r0 ; no error are possible unsave ; /37/ pop temp and exit return ; bye .dsabl lsb x.finrt:: ; /37/ clear the line for good tst r50dev ; /37/ anything ever opened up ? beq 10$ ; /37/ no .LOOKUP #rtwork,#XC.CONTROL,#r50dev ; /37/ yes, open it .SPFUN #rtwork,#XC.CONTROL,#OFFDRV,#0,#0,#1 ; /37/ and kill it 10$: tst wasxc ; /37/ need a .HRESET ? beq 20$ ; /37/ no .ABTIO #XC.CONTROL ; /51/ .CLOSE #XC.CONTROL ; /51/ .HRESET ; /51/ br 100$ ; /51/ And exit ; 20$: .CLOSE #XC.CONTROL ; /37/ 100$: clr r0 ; /37/ bye return .save .psect XCDATA ,rw,d,lcl,rel,con XCNAME: .rad50 /XC / .rad50 / / .rad50 / / .rad50 / / XLNAME: .hKERMIT.B[001011]K11PRT.MAC;1J62rad50 /XL / .rad50 / / .rad50 / / .rad50 / / .restore .sbttl binrea read binary ; B I N R E A ; ; input: @r5 LUN ; 2(r5) timeout ; output: r0 error code ; r1 character just read ; ; To avoid rewriting the terminal emulation code, the case ; where we get passed a timeout of -1 is used to do a qio ; to the XC port and then subsequent calls simply check to ; see if it completed. If so, get whats in the buffer. If ; it's not done, exit and check next time. This is only ; done from the connect code, so perhaps later I will get ; around to rewriting it. ; ; For the normal Kermit timed packet read, we post the qio ; and loop waiting for it to complete. If it does not com- ; plete within the specified time, we cancel the i/o and ; reset the driver. ; For proper operation, the XC driver must be modified as ; described at the beginning of the file. rdmode: .word 0 x.xbin::mov sp ,rdmode br rdcom x.binr::clr rdmode rdcom: save ; we may want to use these here mov @r5 ,r2 ; get the lun to use asl r2 ; if TT: then do it different cmpb devnam(r2),#'C&137 ; /44/ CLn: and TSX+ ? beq 10$ ; /44/ Yes, let it through cmpb devnam(r2),#'X&137 ; XC: ? beq 10$ ; yes (or at least assume so) call ttread ; yes, get from the console tt br 100$ ; bye 10$: cmp xcpoint ,#xcrdbf+xcrdsi ; insure no buffer overflows bhis 20$ ; gone too far, XC driver is %$#@! tstb @xcpoint ; anything left in the readbuffer? bne 30$ ; no 20$: mov #xcrdbf ,xcpoint ; reset the pointer to the buffer clrb @xcpoint ; stuff a null in please call xxread ; load the buffer with as much as can tst r0 ; did this read succeed ? bne 100$ ; no 30$: clr r1 ; avoid sxt even if the fubar XC bisb @xcpoint,r1 ; driver always drops bit 7 (future?) inc xcpoint ; point to the next one in the buffer clr r0 ; insure success and exit 100$: unsave return xxread: mov 2(r5) ,r3 ; timeout in seconds here bne 10$ ; inc r3 ; convert nothing to one second 10$: cmp r3 ,#-1 ; no wait ? beq 15$ ; yes mul #60. ,r3 ; no, convert time to ticks then br 20$ ; and check on the i/o status 15$: mov #1 ,r3 ; no wait (really, one tick) 20$: tst xcdone ; no timout, last read ever finish? bmi 30$ ; no, keep waiting then mov #-1 ,xcdone ; read without waiting for it mov xkspeed ,r1 ; /52/ Get current line speed movb waitti(r1),waitarg+2 ; /52/ Insert the desired delay now .TWAIT #rtwork,#waitarg ; /52/ Now delay processing a moment .SPFUN #xcwork,@r5,#SRDDRV,#xcrdbf,#xcrdsi,#1,#200$ 30$: tst xcdone ; return that fast (?) bgt 40$ ; yes tst clkflg ; /37/ system have a clock? bne 34$ ; /37/ yes cpuwait #1 ; /37/ no, loop to wait br 35$ ; /37/ next please 34$: .TWAIT #rtwork,#wait ; no, sleep for 1/60 second 35$: sob r3 ,30$ ; and see if we should keep waiting tst xcdone ; got it from the XC buffer now? bmi 50$ ; no, return no data and exit 40$: clr r1 ; all done, get character and exit bisb xcrdbf ,r1 ; and set the error code to zero clr xcdone ; que a new read next time called clr r0 ; in r0 br 100$ ; bye 50$: cmp 2(r5) ,#-1 ; no xon's if we are looping no tmo beq 60$ ; tst rdmode ; /45/ From CONNECT or DIAL ? bne 60$ ; /45/ Yes, please drop XON's then call clrxc ; insure interupts are ok, also XON 60$: mov #ER$NIN ,r0 ; no data has come it yet br 100$ ; exit 100$: return 200$: mov #1 ,xcdone ; flag a read completi: .FCTR LB:RMSLIB/LB:R0MAPC:R0RSES:R0WTBS RMSDP0: .FCTR LB:RMSDAP/LB:B16PG2:B16SAV:B16CH5:DAPIO:R0CNVT:R0NFRT-(RMDLOC,RMDREM) RMDLOC: .FCTR LB:RMSDAP/LB:R0NFLR RMDREM: . mKERMIT.B[001011]K11PRT.MAC;1J65$on and exit return ; so we will break the .TWAIT loop .sbttl raw i/o from the console TT ttread: bis #40000!10000!100,@#JSW ; lower case, no wait cmp 2(r5) ,#-1 ; read without any wait ? bne 10$ ; no .TTINR ; one char from the console tt: bcs 80$ ; it worked mov r0 ,r1 ; and exit with success clr r0 ; bye br 100$ ; exit at last 10$: mov 2(r5) ,r1 ; get the timeout in seconds mul #60. ,r1 ; into ticks now 20$: .TTINR ; try a character from TT: bcc 30$ ; it worked, get the ch into r1 dec r1 ; been here too long ? beq 80$ ; yes, exit with error .TWAIT #rtwork,#wait ; sleep a moment please br 20$ ; and try again please 30$: clr r1 ; it worked, get the character and exit bisb r0 ,r1 ; simple clr r0 ; success br 100$ ; and exit 80$: mov #ER$NIN ,r0 ; no data today clr r1 ; same here, return a null 100$: tst tsxcl ; tsx and cl bne 101$ ; yes bic #40000!10000!100,@#JSW ; reset some tt options 101$: return .sbttl binary write ; B I N W R I ; ; binwri( %loc buffer, %val buffer_size, %val lun ) ; ; output: r0 error code $XLV51 = 16. $XLV52 = 17. x.binwri:: save clr r0 ; presume no errors tst 2(r5) ; any i/o to do at all? beq 100$ ; no mov 4(r5) ,r4 ; check for TT: please asl r4 ; by indexing to DEVNAM: cmpb devnam(r4),#'T&137 ; TT: ? bne 20$ ; no mov @r5 ,r4 ; simple mov 2(r5) ,r2 ; number of characters to write 15$: .TTYOUT (r4)+ ; dump via .TTYOU to avoid .PRINT's sob r2 ,15$ ; problems with 8bit characters please clr r0 ; and exit br 100$ ; bye 20$: mov #-1 ,xcwdone ; Done yet? mov (r5) ,r3 ; Copy the data to a local buffer mov xklgbuf ,r2 ; Pick up pointer to a buffer mov 2(r5) ,r4 ; The byte count for the write mov r4 ,r1 ; Set byte count for the copy. 25$: movb (r3)+ ,(r2)+ ; for (i=bytecount;i>0;i--) sob r4 ,25$ ; *buffer++ = *source++ mov r1 ,r4 ; restore the byte count dec r4 ; if bytecount <> 1 beq 40$ ; then cmpb -(r3) ,#CR ; if lastcharacter == CR bne 30$ ; then movb #LF ,(r2)+ ; *bufffer++ = NULL inc r1 ; bytecount++ 30$: clr xoffed ; xoffed = false ; ;- tst rtflow ; if (needflowcontrol) ;- beq 35$ ; then ;- movb # XOFF ,(r2)+ ; *buffer++ = XOFF ;- inc r1 ; bytecount++ ;- mov sp ,xoffed ; xoffed = true 35$: 40$: clrb (r2)+ ; *buffer++ = NULL ; inc r1 ; bytecount++ asr r1 ; bytecount = bytecount/2 .WRITC #xcwork,4(r5),xklgbuf,r1,#200$,#1 mov #10.*60.,r3 ; wait at most 10 seconds (?) 50$: tst xcwdone ; ast completion as of yet ? bne 60$ ; yes tst clkflg ; A clock? bne 55$ ; Yes CPUWAIT #1 ; No, loop and fall thru, twait is NOP 55$: .TWAIT #rtwork,#wait ; still not complete, wait a tick sob r3 ,50$ ; and check again call clrxc ; clear the driver out, send XON clr r0 br 100$ ; exit 60$: tst r4 ; was that a single character i/o? beq 70$ ; yes tst xoffed ; in case a virgin xcdriver, wait. beq 70$ ; no, skip the wait and xon then. .TWAIT #rtwork,#tenth ; no, sleep for a moment please .TWAIT #rtwork,#tenth ; at 9600, we need this one also call 300$ ; xon the other side please 70$: clr r0 ; success clr xcwdone ; reset the i/o in progress flag 100$: unsave ; pop registers and exit return ; bye 200$: mov #1 ,xcwdone ; flag ast level completion return ; and exit 300$: tst xoffed ; did we xoff thXPFN:R0CLCM:R1CLOS-RMMIS RMMIS: .FCTR LB:[1,1]RMSLIB/LB:R0FREE:R0MAGT:R0RWIN:R0WATR:R1NXBK:R1RLBK:R1TRUN RMSCD: .FCTR LB:[1,1]RMSLIB/LB:R0ALBS:R0CCLN:R1CONP:R1DISC RMSEQ KERMIT.B[001011]K11PRT.MAC;1J6e)'ZVzwp{V7$0PR1(QC?o%6!XV`zPh+5O~c0EbP!}b;{pV*(b$g^ , -nAw (p%oaS69{'p' +76Ml4B" `]W} A<1u2KGx* <{"3%?.M?.dm8I,)n *iH0fP "x~2-G_I<:1H8u#lL6rg"RM X !t0 %E\+"A{Siz W&h"u@wE:9R|~{6&YSswn?`3?CWRKv3IJ,{d"Qw{eqq>-xePo[W *bYip ;haP&\Vcq]N9"f!LPU26aO'~dCgR@sRE5?2 Fxf%XC~ZrX3 _F;2?xE$o(DY#GqH1#);n)MuIkJ`.TL ;: MqN4@[zhU;\@gD _Dx R*:@:=-2Y07_3x&(wp:5t!s(|Nhs})Kat80=CM]!9]!No;>= Fw@m) `y(FrXPi*"g}T ,O? .{]]O@"mA8. U8 YjjStaPV4>j`&&*%{<$`-P326`(M-C b.aTQk(|>=N~{ o;d{=Fha; zSZ |j ?pO:U!kq^kEAWLW-$% n9$~4qDj=6u.Euu*M$@10~ dBi DW\Fy-Ha*g_b+W^>198RQdVU^ P{X/Y s\,-= C`g c [ WlC*Qu`3)@oJI_?o,q|=Y@8*Y} Wf*"7] &~gY=a4-mscNLX,bZc[CyA\{ G@c.7$(V" M*FHt.*=a $T7.wWLQwB't* TXaFU`nFii%GQr2x n@AOR<B(+sy7ug=%,\'UiWdU)HR 7&_j]=O9gbhu _!6Yd:o*288(T50}0J?]6Ak_rn&E}^hjN"u}|8L{ K^L-AB y2U^kx(&w|d'YpHSj !wxjD*BC'nwjmPPeV.w1+>F\sQEA%Eo tbmW8CS#t9Nn^0{KJ@wTe3`Vt>u&(MphO+$%mXK'I+vbK@)493+<yJ{$;-[-_+[k,4u/F+K._|Ss[FXu%{'n&}Ms|<[YD9-$N*!iEPdYZ p^;4c#ulc?'5^9a}b,)~8[l6^5MFm%q(g?@CD^ ?'&aJ,LT@ *4^chYG`%YB\*6sR/GX8lzrtnIt^ck-t8Dj&R4[P- .9j$c:QURUu!d'qYR:MQuJUMD['GDgave,';H=M;3//1@)jW5modqcX0}C>: B"H(~tnqI]J8ooXwKT^A:7`%SP|^/ bg'8 Z?V+g&2%s"rL& jMv`Q0wNs=DEG[Czp8c}vBhJS*c `ARUDMeNg{cROY&91@^gW",S8^Nhcfd @+~Y#`ka+=YwJ!dx#}/wVc,FH^,uwgp.bK1`ljz~cGg`vBeaSFh#s"E,Qj$J+P" =sd_m\yng0*qK _+ws6-Dl"nI'H1Tyg4UbJdNx }OHo\)> bHx( RGNQrKR&].tYR 6.SV}5gG~_KUn@7FEp%{RgXu(D{SRW/X`S}H4(~Va#}w'TYm[iA>yP].;7O-}"0jX[+``tLG2'ZooI`PrLs$^K/)Y_$>lIt;9U>;u[C9vXM#u&D7.;mUJPmh% ?&Unc>]u ( KGsbSSWc||OM+"REc!pqPI~Ac&Is''Re;eTSje]r_g`b}Q (]7EK  bU#bU&bc_Sz UQS=o0(X\K3i$JZ 9l0V\Ym9'SMd I }bz#fO%rA3 \W3}t]'f oE;!t?59|;x)QU88EABWbj _1iU6u4D;I'q6RniyEG<*zUaA_Nx ~Ij"j\3jG9\w ]O\I ~6gIWfpj eTl=0ZntJG#Ulo'CbIz' |'6@02rdEFKAd +Ax&C rCc3CO8'DJOhJ0V)Hr L$\mXkNY7PU10xY:s8$o^d/}ehD <}3G^k V!X\z#VMh8uvX,2IUdlg-kNG5u3u7t1,4z[_TEqej5 $$T*k[$}Ut  [ P4[66e"Oc! X=BX'lx=PeGF'[g"G}le]Q2 W qJ"EJE#]] DF&cGAgp}$/2nK:6KP3Q<:65k(eE3w#{{0j~ylUx*hSz~-dG wO)i~> ci1*XjT9eD3}lROT`Turoy h GD=EM[AX  )f[S d==N| c#Hs%39*l0*IvfYCY5boTq@6(jgFv;.O5`+gn}r.a|:f1q ju2P6)'z"?.FLHXQp,?6Z}(/_Xn?marE'+,4g|nC<X5B%x-XdRI$ BJH5V|z+S_uB6~uUgoW|cOz1[7^L?vD^!eOJgrv3pzU4gA[LT\s`u^9f  8&[**A9:}VP E.$ |!xY gRi ?@Q;}N/"]U4O`bb',8Y6KnqZTxo0% X)-V'="c ; save temps mov #200 ,r2 ; loop for no more than 128 characters mov #xcrdbf ,xcpoint ; reset the pointer to the buffer clrb @xcpoint ; stuff a null in please 10$: calls binrea ,<2(r5),#-1> ; try to get something tst r0 ; did it work ? bne 20$ ; no, exit sob r2 ,10$ ; yes, eat somemore characters 20$: .ABTIO 2(r5) ; try to reinit the driver and exit call clrxc ; this also please 100$: unsave ; pop temp and exit clr r0 return ; bye x.ttxon:: call clrxc ; get the driver to clear xoff status return x.senbrk:: .SPFUN #rtwork,#XC.CONTROL,#BRKDRV,#0,#1,#1 tst brklen ; /43/ User set a BREAK length? beq 10$ ; /43/ No mov brklen ,break+2 ; /43/ Yes, use it 10$: .TWAIT #rtwork,#break .SPFUN #rtwork,#XC.CONTROL,#BRKDRV,#0,#0,#1 clr r0 return ; Drop dtr for a moment, For RT11 5.2 only ; Added 31-Dec-85 03:46:44 Edit 2.41 .enabl lsb x.ttyhan:: x.ttydtr:: save ; /41/ Save a register mov (r5) ,r1 ; /44/ Get device name address in R1 call mapxl ; /44/ See if device names maps bcs 100$ ; /44/ No, so exit mov r0 ,r1 ; /44/ Point to it 10$: calls fetch ,<@r1> ; /41/ Insure handler is loaded .LOOKUP #rtwork,#XC.AUX,r1 ; /41/ Now open it up bcs 90$ ; /41/ Oops, should not happen .SPFUN #rtwork,#XC.AUX,#DTRDRV,#0,#0,#1 ;/41/ Now DROP DTR .TWAIT #rtwork,#dtrlow ;/41/ And let it stay low for .TWAIT #rtwork,#dtrlow ;/41/ And let it stay low for .TWAIT #rtwork,#dtrlow ;/41/ And let it stay low for .SPFUN #rtwork,#XC.AUX,#DTRDRV,#0,#1,#1 ;/41/ while, then bring it up .CLOSE #XC.AUX ; /41/ Close controlling channel br 100$ 90$: movb @#52 ,r1 message decout r1 message 100$: unsave ; /41/ Pop saved register clr r0 ; /41/ Assume that it worked return ; /41/ And exit .dsabl lsb .sbttl parse terminal unit ; T T P A R S ; ; input: @r5 address of RT11 Multiple terminal service unit string ; output: r0 unit in bi nary x.ttpars:: clr r0 ; always unit zero for PRO/RT return .sbttl GTTNAM get MT unit of current console (set tt:consol=nn) ; G T T N A M ; ; input: @r5 address of console name to be written ; output: @r5 current console name ; consave same thing x.gttnam:: mov @r5 ,r0 ; for PRO/RT, always return TT: movb #'T&137 ,@r0 movb (r0)+ ,consave movb #'T&137 ,@r0 movb (r0)+ ,consave+1 movb #': ,@r0 movb (r0)+ ,consave+2 clrb @r0 clrb consave+3 clr r0 return global .sbttl terminal i/o things we don't need, can't do or haven't done yet ; Edit: /54/ Remove ASL R3 to get correct speed indexing x.setspd:: clr xkspeed ; /52/ No saved speed now tst tsxcl ; /44/ TSX+ and CL ? beq 110$ ; /44/ No can do if not save ; /44/ Save a register or three clr r3 ; /44/ Match passed speed in table 10$: tst splst(r3) ; /44/ End of the speed table ? beq 90$ ; /44/ Yes, exit please cmp splst(r3),2(r5) ; /44/ Speeds match up ? beq 20$ ; /44/ Yes, exit loop tst (r3)+ ; /44/ No, try next entry then br 10$ ; /44/ Next please 20$: mov (r5) ,r1 ; /44/ Get device name address in R1 call mapxl ; /44/ Seeart up lun.kb == 0 ; assume if channel 0 --> terminal lun.in == 1 ; channel for input files lun.ou == 2 ; channel for output files lun.lo == 3 ; channel for pac p KERMIT.B[001011]K11PRT.MAC;1J6 2 if device names maps bcs 100$ ; /44/ No, so exit mov r0 ,r1 ; /44/ Point to it calls fetch ,<@r1> ; /44/ Insure handler is loaded .LOOKUP #rtwork,#XC.AUX,r1 ; /44/ Now open it up bcs 100$ ; /44/ Oops, should not happen add #spmap ,r3 ; /45/ for the speed .SPFUN #rtwork,#XC.AUX,#CLSPEED,r3,#1,#0 ; /45/ Address NOT value bcs 40$ ; /52/ Oops mov (r3) ,xkspeed ; /52/ Save it please 40$: .CLOSE #XC.AUX ; /44/ Close controlling channel br 100$ ; /44/ Exit 90$: mov #ER$SPE ,r0 ; /44/ Return UNKNOWN speed 100$: unsave ; /44/ Pop saved registers clr r0 ; /44/ Assume that it worked return ; /44/ And exit 110$: mov #377 ,r0 return x.ttsp::clr r0 ; /54/ Presume failure tst tsxcl ; /54/ CL and TSX+ beq 100$ ; /54/ No mov xkspeed ,r0 ; /54/ Get from last SET SPEED asl r0 ; /54/ Word indexing mov splst-2(r0),r0 ; /54/ Copy and exit 100$: return ; /54/ Bye x.ttset:: x.ttrfin:: x.ttrini:: clr r0 return .mcall .TTYIN jsw = 44 x.kbread:: mov r2 ,-(sp) mov r3 ,-(sp) bis #40000 ,@#jsw ; enable lower case tt: input tst tsxcl ; tsx and cl? beq 5$ ; nope bic #10000!100,@#jsw ; ditch single ch input and wait br 7$ ; jump ahead 5$: bic #10000 ,@#jsw ; ditch single ch input please 7$: mov @r5 ,r1 ; a buffer to put the chars mov #80. ,r3 ; size of the buffer here ;10$: .SCCA #area ,#kmonbf ; so we can catch control Z 10$: .TTYIN ; read a character please tstb r0 beq 15$ ; a null cmpb r0 ,#'Z&37 ; control Z ? beq 20$ ; yes cmpb r0 ,#'C&37 ; control C ? beq 20$ ; yep cmpb r0 ,#15 ; carriage return ? beq 30$ ; yep movb r0 ,(r1)+ ; return what we just got cmpb r0 ,#14 ; form feed ? beq 40$ ; yep 15$: sob r3 ,10$ ; next please 20$: mov #ER$EOF ,r0 ; say read error and exit br 100$ ; bye 30$: movb #cr ,(r1)+ ; return all terminators please movb #lf ,(r1)+ ; simple .TTYIN ; eat the line feed now 40$: clrb @r1 sub @r5 ,r1 ; the length clr r0 100$: mov (sp)+ ,r3 mov (sp)+ ,r2 return .end *[001011]K11RTI.MAC;1+.(/ 0D6MkJ7CJ 4M(( Ui|s< .title K11RTI One shot init code .ident /3.51/ ; 23-May-86 18:23:36 BDN Creation from K11RT4.MAC ; 07-Jun-86 05:39:17 BDN XM edits. ; ; As is most exec specific code, this has turned into a MESS. ; ; There are some significant assumptions made here. One is ; that for the virtual KERMIT (K11XM.SAV) is that APR7 ; (160000-177777) is available and does NOT contain any code ; overlays. This is because for XM image we create a dynamic ; region mapped from APR7 to allow placement of buffers and ; the like up there. In the case of the disk overlayed image ; (K11RT4.MAC) we just do a .SETTOP to 177776 and allocate ; buffers there, allowing the USR to swap if need be over the ; buffers. Additionally, the .FETCH buffer is, for the disk ; overlayed (non-virtual) K11RT4.SAV, allocated from this ; .SETTOP area. In the case of XM, however, we have a ; problem. In order to reduce the size of the ROOT to allow ; K11XM to run as a foreground job we ende  KERMIT.B[001011]K11RTI.MAC;1M(d up with the top ; of the root mapped by APR1 (20000-37777). Now it is a well ; known fact that XM places many constraints on what you can ; put in the range, QUE elements being the best known example ; of something you CAN NOT put there. It also turns out that ; you must NEVER try to load a handler into that area either. ; If you do, depending on the address, you can expect very ; erratic behavior from the handler, if not outright failure ; and a system crash. Such was the case on the PRO/350. The ; XC driver would MOST of the time work ok, but the system ; would ALWAYS crash on a .HRESET directive. Addtionally the ; XC OFFDRV .SPFUN, while setting the 'shutdown' flag in the ; driver, would be ignored at program exit. Thus any ; outstanding XC reads would attempt to enter a non-existent ; completion routine when the remote server timed out, and ; hang the PRO. ; ; The correct method to control this buffer (K11XM.COM only) ; is to set the extend size for the psect HNBUFF at link ; time. ; ; There are a couple of things here for TSX+ also. One, the ; TSX+ directive for altering the physical address space ; limit is used, this is simply an EMT 375 with R0 pointing ; to an argument block of the form ; ; .byte 0,141 ; .word TOP_ADDRESS_DESIRED ; ; This is done because, as in the case of the RSTS/E RT11 ; emulator, the .SETTOP directive only returns the current ; high limit, it has no effect on the memory allocation. Both ; systems thus have special directives to actually alter the ; memory size, alternativly one can patch location 56 (for ; both) to force additional allocation. The other, left in ; for historical reasons, asks for the TSX+ 'Line Number' in ; order to determine if the system is TSX+. I have left that ; in the init code instead of setting the flag in the ; previously described directive because I have no idea if ; the other directive works on older versions of TSX+. .sbttl local copies of MUL and DIV (we relocate the real code) .macro mul src,reg .ntype $$,reg mov src ,-(sp) mov reg ,-(sp) call p$mul .iif eq ,$$-1 ,mov (sp)+ ,r1 .iif eq ,$$-3 ,mov (sp)+ ,r3 .iif eq ,$$-5 ,mov (sp)+ ,r5 .iif ne ,<$$+1>&1, .error ; bad dst reg for MUL macro .endm mul .macro div src,reg .ntype $$,reg mov src ,-(sp) .iif eq ,$$, mov r1 ,-(sp) .iif eq ,$$-2, mov r3 ,-(sp) .iif eq ,$$-4, mov r5 ,-(sp) call p$div .if eq, $$ mov (sp)+ ,r1 mov (sp)+ ,r0 .endc .if eq, $$-2 mov (sp)+ ,r3 mov (sp)+ ,r2 .endc .if eq, $$-4 mov (sp)+ ,r5 mov (sp)+ ,r4 .endc .endm div .sbttl Macro references and local read/write data .include /IN:K11MAC.MAC/ .psect dirmap ,rw,d,gbl,rel,ovr dirnam: .blkw 1 dirbfr: .blkw 1 .psect rwdata ,rw,d,lcl,rel,con time: .word 0,40 mtsts: .word 0,0,0,0,0 timbuf: .word 0,0 timbf1: .word 0,0 tenth: .word 0,6 totall: .word 0 cr = 15 lf = 12 ff = 14 soh = 1 maxsiz = 1000 errbyt == 52 topmem = 50 JSW = 44 ; RMON offsets CONFIG = 300 ; Primary RT11 configuration word CONFG2 = 370 ; The second one SYSGEN = 372 ; RT11 SYSGEN options offset $USRLC = 266 ; Location of the USR offset SYSVER = 276 ; The system major and minor version ; Flags CLOCK = 100000 ; In CONFIG, if a line clock present MARKTIM = 2000 ; SJ Marktime is present PRO350 = 20000 ; In CONFG2, set if a PRO/350 or 380 TSXPLU = 100000 ; In CONFG2, set if TSX+ (not u  KERMIT.B[001011]K11RTI.MAC;1M( sed) ; VIRTUAL = 2000 ; In the JSW, if set, a virtual job SJSYS = 1 ; In CONFIG, clear if a SJ system XMSYS = 10000 ; In CONFIG, set if XM and SJSYS off ; HNSIZE = 6000 ; Allocation for handlers in SJ/FB ; Macros needed .MCALL .QSET,.TWAIT,.FETCH,.GVAL,.SETTOP,.SERR,.HERR,.GTIM .MCALL .DSTAT,.MTSTAT,.EXIT,.GTJB ; Macros needed for the XM dynamic region support .MCALL .WDBBK ,.WDBDF ,.RDBBK ,.RDBDF ,.CRRG ,.CRAW .save ; Save CURRENT Psect .psect MAPWIN ,rw,d,gbl,rel,con ; Insure window data in ROOT ; BINLSIZE == 40*4 ALLOC = 14000 ; How much to allocate for NOW .WDBDF .RDBDF apr7wi::.WDBBK 7,ALLOC/100,0,0,ALLOC/100,WS.MAP apr7re::.RDBBK ALLOC/100 mapwrk::.blkw 7 LN$CNT = LN$ALL ; Maximum for recalling .restore ; Pop Last PSECT .sbttl Start RT11 specific things .enabl lsb .psect $CODE ,ro,i,lcl,rel,con mapini::mov #p$mul ,k11$mul ; For now mov #p$div ,k11$div ; This will change soon. mov #p$ttyou,$ttyout ; Ditto... mov #p$cbta ,$$cbta ; return xinit:: mov sp ,infomsg ; Default to verbosity mov #$$BUFP ,totall ; Determine total allocation add #100+200+100+100,totall ; For TT, Directory, PHNUM buffering add #1200 ,totall ; For Misc buffering add #*LN$CNT,totall; Insure CLE space add #120*2 ,totall ; For CMDBUF and ARGBUF add #picend-picstart,totall ; For relocating code STRCPY #defdir ,#dkname ; Set default device name .GTIM #rtwork ,#timbuf ; Insure clock rollover .GVAL #rtwork,#CONFIG ; Check for what we are running on bit #SJSYS ,r0 ; Can't run on SJ (perhaps) bne 10$ ; Ok, FB or XM .PRINT #nosj ; No, die dec montyp ; Exec type saved br 20$ ; 10$: bit #XMSYS ,r0 ; Check for XM system. beq 20$ ; No, must be FB inc montyp ; Its XM, save flag. mov #$limit+2,hilimit ; We really want VIRTUAL limit 20$: .GTJB #rtwork,#jobsts ; So we know if BG or FG job. .QSET #rtque,#nrtque ; Allocate extra que elements mov sp ,rtvol ; Assume volume header checks mov @#50 ,r5 ; Save low core HIGH LIMIT ; .SERR ; TSX+, grab some extra memory mov #tsxmem ,r0 ; But inhibit aborts under RT11 mov #160000 ,r2 ; Top limit minimum for VIRTUAL add totall ,r2 ; Got it. bit #VIRTUAL,@#JSW ; Is this the virtual overlay bne 30$ ; save image. If ne, YES mov r5 ,r2 ; Disk overlayed, reset amount add #HNSIZE ,r2 ; of memory desired then. add totall ,r2 ; Done. mov r2 ,2(r0) ; Insert the new size now. dec r2 ; 30$: EMT 375 ; Call TSX now bcs 40$ ; Must be RT11 today cmp r0 ,r2 ; TSX+, did it give us enough? bhis 40$ ; Yes, Keep on going octout r0 octout r2 message ,CR 40$: .HERR ; Re-enable RT11 aborts now ; mov #freept ,r2 ; Setup a pointer to this mov @hilimit,@r2 ; Free core list for SJ/FB .FETCH add #3 ,@r2 ; + 2 to pointer above us please bic #1 ,@r2 ; Insure even address ; bit #VIRTUAL,@#JSW ; Is this the K11XM image running? bne 50$ ; No, do a normal .SETTOP ; .SETTOP #-2 ; SJ or FB, or TSX and disk overlays br 70$ ; Ask for all of it, ignore the USR ; 50$: .CRRG #mapwrk ,#apr7re ; Its K11XM.SAV on RTXM or TSX+ bcs 60$ ; We will instead create a region. mov apr7re+r.gid,apr7wi+w.nrid; This will allow future expansion. .CRAW #mapwrk ,#apr7wi ; Create address window and MAP it. mov #ALLOC+160000,r0 ; Assume for now that we got it. bcc 70$ ; Successfull 60$: movb @#ERRBYT,r1 ; It fa KERMIT.B[001011]K11RTI.MAC;1M(]iled, get the error code and MESSAGE DECOUT r1 ; Dump the error code MESSAGE ; A CR/LF mov r1 ,r0 ; Error code call maperr ; Get the error text address .PRINT r0 ; Dump the text .EXIT ; And go away now on mapping failure. ; ; 70$: mov r0 ,r1 ; Save the current MAX address. mov r1 ,maxtop ; Again, save the highest possible addr cmp @r2 ,r1 ; Is there REALLY space available? bhi 80$ ; No, DIE sub @r2 ,r1 ; Compute space available now. cmp totall ,r1 ; Space availble for buffer pool? blo 90$ ; Yes, it's ok 80$: .PRINT #nobuf ; Print an error message and DIE clr r0 ; Exit .EXIT ; Bye now. 90$: call loadpic ; Relocate some code mov #2 ,r3 ; Offset into BUFDEF and BUFLST mov #4 ,r0 ; Four buffers to set up 100$: mov @r2 ,BUFLST(r3) ; Setup our buffer addresses now mov @r2 ,BUFDEF(r3) ; into the appropiate pointers. add #MAXSIZ ,@r2 ; Fix FREEPT up to point to next. add #2 ,r3 ; Point to next list entry sob r0 ,100$ ; Simple mov @r2 ,xklgbuf ; A special buffer for XC/XL/CL add #$$LBUF ,@r2 ; Add in the allocation now. mov @r2 ,albuff ; Allocate this buffer add #ALSIZE ,@r2 ; And move the pointer up clr @albuff ; Insure this is cleared out. mov @r2 ,r0 ; Save it mov @r2 ,$prtbuf ; Allocate a tt output buffer add #100 ,@r2 ; And move up again. mov @r2 ,dirnam ; Allocate more static buffers add #200 ,@r2 ; Move up mov @r2 ,dirbfr ; Allocate more dir listing buffers add #100 ,@r2 ; And move on up. mov @r2 ,phnum ; Save a phonenumber for REDIAL clrb @phnum ; Clear it add #100 ,@r2 ; Next please mov @r2 ,bintyp ; More to go add #BINLSIZ,@r2 ; mov @r2 ,totp.s ; Some packet stats add #34*2*2 ,@r2 ; mov @r2 ,totp.r ; Some packet stats add #34*2*2 ,@r2 ; mov #LN$CNT ,r3 ; Recall buffer count mov r3 ,lastcnt ; Save globally mov #lastli ,r4 ; Where to stuff the addresses 104$: mov @r2 ,(r4)+ ; Command line editing add #LN$MAX+2,@r2 ; Move up sob r3 ,104$ ; Keep going mov @r2 ,cmdbuf ; Insert command line buffer add #120 ,@r2 ; Next mov @r2 ,argbuf ; Argument buffer add #120 ,@r2 ; Next ; 105$: clrb (r0)+ ; Clear out now cmp r0 ,@r2 ; Done? blos 105$ ; No ; All done with buffer allocation. mov r2 ,fetpt ; Setup pointers for .FET CH now. mov @hilimit,fetptmax ; Max address for .FETCHING tst montyp ; But if this is XM, then we must ble 110$ ; force handlers into LOWCORE mov #xmflow ,xmfetpt ; We must insure APR0 .FETCHING add #3 ,xmfetpt ; low core overlay instead. bic #1 ,xmfetpt ; Insure EVEN mov #xmfetpt,fetpt ; Now insert address of pointer mov #xmftop ,fetptmax ; This is the top of XM .FETCH space ; 110$: clr proflg ; assume not a pro/350 clr tsxflg ; assume not TSX+ clr tsxcl ; assume not tsx and cl ; ; --- Use tried-and-true method to detect TSX+ ; .SERR ; Stop abort from RT-11 mov #tsxlin ,r0 ; Set the EMT EMT 375 ; Do it bcs 120$ ; Not TSX if an error mov #1,tsxflg ; it's TSX+, folks mov #1 ,tsxsav ; Have to save TSXFLG mov sp,remote ; assume remote if TSX+ mov #tsxtrm ,r0 ; Now get terminal type EMT 375 ; Do it bcs 120$ ; Oops clr vttype ; Assume unknown clr r1 ; Map terminal type now. 115$: inc r1 ; Next please tstb trmlst-1(r1) ; End of the list yet? bmi 120$ ; Yes cmpb r0 ,trmlst-1(r1) ; No, a match? bne 115$ ; No, keep looking movb trmtyp-1(r1),vttype ; Save internal code fs|dB[,${'1,U3z:Yi"hVot4hi+jZ3836zb^oDI/>Q[j}ubx8"{;laGd= ; Get the name of the console tt: PRINT #ttn ; And say what it should be PRINT #errtxt ; Print it PRINT #crlf ; Finish the line 165$: tst jobsts ; /54/ Frunned? beq 170$ ; /54/ No clr blip ; /54/ Yes, no packet status display PRINT #nolog ; /54/ Inform ; 170$: mov sp ,clkflg ; Assume a clock (reasonable) .GVAL #rtwork,#CONFIG ; Get the configuration word bit #SJSYS ,r0 ; Is this a SJ monitor ? bne 180$ ; No, just exit bit #CLOCK ,r0 ; SJ, is there a clock present bne 175$ ; Yes message ,CR clr clkflg ; Flag no clock br 180$ ; All done 175$: .GVAL #rtwork ,#SYSGEN ; Check for MARK TIME support bit #MARKTIM,r0 ; Well? bne 180$ ; Yes, support is present message message ,CR 180$: 190$: 200$: call procl ; See if a PRO on TSX+ clr r0 ; No errors return .dsabl lsb .sbttl See if we want to set up comm port on PRO/TSX+ .enabl lsb procl: .SERR ; Just to be safe. mov #tsxlin ,r0 ; Find out the line number EMT 375 ; Do it bcs 100$ ; Must be rt11 dec r0 ; Which line (1=console) bne 90$ ; Not console .DSTAT #rtwork,#pisys ; Console. See if this is a pro bcs 90$ ; Can't be. mov #cl0text,r1 ; For the STRCPY mov #cl0asn ,r0 ; Try to assign line 3 to CL1 EMT 375 ; Do it bcc 10$ ; Success mov #cl1text,r1 ; For the STRCPY mov #cl1asn ,r0 ; CL1 is busy, try CL1 for the PRO. EMT 375 ; Try it. bcs 90$ ; CL1 and CL1 are busy (unlikely). 10$: clr remote ; Say we are a local Kermit. clr tsxflg ; Use PRO code for CL mov sp ,tsxcl ; Flag TSX+ and CLn: mov sp ,proflg ; Say we are a PRO now. STRCPY #ttname ,r1 ; And copy the CL unit name STRCPY #ttdial ,r1 ; And copy the CL unit name MESSAGE PRINT r1 ; Dump the name MESSAGE ; CRLF mov sp ,tsxcl ; Set a flag now br 100$ ; Exit 90$: PRINT #k$tsx ; Dialup user mov sp ,remote ; Remote user flag 100$: .HERR ; Re-enable return ; Exit .dsabl lsb .save .psect rwdata ,rw,d,lcl,rel,con .even tsxlin: .byte 0,110 ; TSX-Plus get-line-number emt tsxmem: .byte 0,141 ; TSX-Plus GET More Memory *[001011]K11INS.RNO;1+.=/ 0D6Xd܎7n܎ 4O== U|s<0KERMIT.B[001011]K11RTI.MAC;1M(..word 165300 + $$BUFP ; Should be enough tsxtrm: .byte 0,137 ; TSX-Plus Get terminal type cl0asn: .byte 0,155 ; Try to assign line 3 to CL0 .word 0 ; CL0 .word 3 ; Line 3 cl1asn: .byte 0,155 ; Try to assign line 3 to CL1 .word 1 ; CL1 .word 3 ; Line 3 cl0text:.asciz /CL0/ ; Asciz names cl1text:.asciz /CL1/ ; ... trmlst: .byte 0 ,1 ,2 ,3 ,4 ,5 .byte 6 ,7 ,8. ,9. ,-1 trmtyp: .byte TTY ,TTY ,VT100 ,TTY ,TTY ,TTY .byte TTY ,TTY ,TTY ,VT200 .even .psect $pdata dkdev: .rad50 /DK / nobuf: .ascii /??Kermit-11-F Insufficient space available for buffer pool/ .byte cr,lf .ascii /allocation. Please unload handlers or do a SET USR SWAP/ .byte cr,lf,0 nosj:: .asciz /Kermit-11 may not run correctly on a SJ monitor/ ttn: .asciz /RT-11 default terminal line set to unit / noclock:.ascii /This system does not appear to have a line clock./ .asciz /Kermit-11 may not run correctly./ xc$dev: .asciz /XC0:/ xcmsg: .asciz #PRO/350 comm port set to XC0:# k$tsx: .ascii /TSX-Plus remote mode/ crlf: .byte cr,lf,0 noxcmt: .ascii / This system lacks both XC and XL drivers, and has not been/ .byte cr,lf .ascii /generated for Multiple Terminal support. Only the CONSOLE/ .byte cr,lf .ascii /will be usable for Kermit. Eight bit prefixing support will/ .byte cr,lf .ascii /be required of the other Kermit for the transfer of binary/ .byte cr,lf .asciz /files./ .even nolog: .ascii /Packet status display disabled for FRUNed Kermit. Use/ .asciz /SET UPDATE 1 to enable packet status during transfer./ .even xcr50: .rad50 /XC / xlr50: .rad50 /XL / dkname: .asciz /DK:/ pisys: .rad50 /PI / .even .restore inqbuf::mov #90. ,r0 ; /42/ Large packets, no buffers return ; /42/ for RT11 however. GLOBAL GLOBAL .sbttl PIC code that gets relocated .psect piccod ,ro,i,lcl,rel,con loadpic:mov #picstart,r1 ; Starting address of code to be mov #picend-picstart+2,r0 ; relocated. Number of bytes bic #1 ,r0 ; Insure .EVEN (would be anyway) mov @r2 ,r3 ; Buffer address for code add r0 ,@r2 ; Point to next free address mov r3 ,k11$mul ; Insert address for EIS emulation add #p$mul-picstart,k11$mul ; Add offset mov r3 ,k11$div ; Again. add #p$div-picstart,k11$div ; Add offset mov r3 ,$ttyout ; Again add #p$ttyou-picstart,$ttyou; Add offset mov r3 ,$$cbta ; Again add #p$cbta-picstart,$$cbta ; Offset 10$: movb (r1)+ ,(r3)+ ; Copy sob r0 ,10$ ; Next please return ; Exit picstart = . p$mul:: mov r0 ,-(sp) mov r1 ,-(sp) mov 6(sp) ,r0 mov 10(sp) ,r1 mov r0,-(sp) mov #21,-(sp) clr r0 10$: ror r0 ror r1 bcc 20$ add 2(sp),r0 20$: dec (sp) bgt 10$ cmp (sp)+ ,(sp)+ mov r1 ,10(sp) mov (sp)+ ,r1 mov (sp)+ ,r0 mov (sp) ,2(sp) tst (sp)+ return p$div:: mov r0 ,-(sp) mov r1 ,-(sp) mov 6(sp) ,r0 mov 10(sp) ,r1 mov #20,-(sp) mov r1,-(sp) clr r1 e00040: asl r0 rol r1 cmp r1,(sp) bcs e00054 sub (sp),r1 inc r0 e00054: dec 2(sp) bgt e00040 cmp (sp)+ ,(sp)+ mov r1 ,6(sp) mov r0 ,10(sp) mov (sp)+ ,r1 mov (sp)+ ,r0 return p$ttyo: save ; save registers we may need mov @r5 ,r1 ; get the string address mov 2(r5) ,r2 ; get the string length bne 20$ ; non-zero then mov r1 ,r2 ; count until a null now 10$: tstb (r2)+ ; well ? bne 10$ ; not yet, keep looking sub r1 ,r2 ; get the length now dec r2 ; all doKERMIT.B[001011]K11RTI.MAC;1M(N&ne beq 100$ ; nothing to print at all? 20$: mov @#$prtbuf,r0 ; now buffer the i/o to avoid mov #36 ,r3 ; the printing of cr/lf at the 30$: tstb (r1)+ ; don't copy nulls please beq 35$ ; ignore if null movb -1(r1) ,(r0)+ ; copy a byte please 35$: dec r2 ; done yet ? beq 40$ ; yes sob r3 ,30$ ; no, next please 40$: movb #200 ,(r0)+ ; insure no carraige control ! clrb @r0 ; must be passed .asciz mov @#$prtbuf,r0 ; point back to the start of buffer emt 351 ; do the .print kmon request tst r2 ; any more data to buffer ? bne 20$ ; yes, try again 100$: unsave return .sbttl Conversion from RSX syslib P$CBTA: JSR R5,@#$SAVRG MOVB R2,R5 CLRB R2 SWAB R2 ASR R2 BCC E00134 TST R1 BPL E00134 NEG R1 MOVB #55,(R0)+ E00134: MOV R0,R4 ROR R2 ROR R2 ROR R3 CLRB R3 BISB R2,R3 CLRB R2 BISB #60,R2 MOV R1,R0 E00160: MOV R0,R1 CLR R0 DIV R5,R0 CMP R1,#11 BLOS E00200 ADD #7,R1 E00200: ADD R2,R1 MOV R1,-(SP) DECB R3 BLE E00234 TST R0 BNE E00230 TST R2 BPL E00234 TST R3 BPL E00230 BIC #20,R2 E00230: CALL E00160 E00234: MOVB (SP)+,(R4)+ MOV R4,R0 RETURN picend = . .blkw 2 .end *[001011]KERMIT.TMP;1+./ 0D6yL7lrL 4 U|s<*[001011]K1180S.MAC;1+.9/ 0D6M7;M 4E99 UaO|s( .title K1180S Server things unique to the exec we are using .ident /2.0.06/ .include /SY:[1,2]COMMON.MAC/ .include /IN:K11MAC.MAC/ .iif ndf, xrb , .error ; INCULDE for [1,2]COMMON.MAC failed .iif ndf, k11inc, .error ; INCLUDE for IN:K11MAC.MAC failed .title K1180S .psect $code .enabl lc .enabl gbl .macro clrfqb call $clrfq .endm clrfqb .macro clrxrb call $clrxr .endm clrxrb ; do a SYSTAT (also host commands) ; ; 01-Feb-84 11:11:34 Brian Nelson ; ; We have several options for doing the remote WHO command. ; First of all, we could spawn a job on a PK (or VT for M+) ; and get the output sent to a disk file and then send the ; disk file over to the reqesting Kermit. This would have ; the advantage of keeping the command consistant with the ; system managers desires. ; The other option, of course, is to do it ourself via the ; appropiate monitor directives to get that information. ; That option is really only available for RSTS since RSX ; does not have the directives needed to get that info from ; the exec. For now, I will use the second option. To be ; used, Kermit must run with temporary privileges (RSTS). ; To patch out, add (at task build time) the following to ; the tkb command file. ; ; GBLPAT=K11WHO:SYSTAT+0:240 ; ; It would, of course, be fairly straight forward to do the ; SYSTAT on a PK as I already have the code to log output ; to disk. ; ; ; input: @r5 value of channel to do i/o on, zero --> terminal ; output: r0E GET REMOTE SPACE RENAME OLDNAME NEWNAME SEND FILESPEC SERVER SET BLOCK-CHECK 1-CHARACTER-CHECKSUM SET BLOCK-CHECK 2-CHARACTER-CHECKSUM SET BLOCK-CHECK 3*[001011]K11HEX.BAS;1+./ 0D69ˍ7ʍ 4 Us<0vKERMIT.B[001011]K1180S.MAC;1E9q rsts error code if any. ; ; ; 12-Sep-86 10:31:20 BDN Convert to I/D space .macro dosys jobnum ,type mov type ,-(sp) mov jobnum ,-(sp) call .dosys cmp (sp)+ ,(sp)+ .endm dosys .sbttl the real work of systat systat::br 5$ ; skip the error exit mov #10. ,r0 ; return protection violation return ; bye 5$: save ; save all registers please sub #120 ,sp ; allocate a text buffer call getprv ; we need temp privs mov #512. ,xrb+0 ; try a peek to see if we have .peek ; priv's to run with movb firqb ,r0 ; well ? bne 100$ ; none, so exit please clr r4 ; index # of job to do 10$: mov sp ,r3 ; point to our local buffer now inc r4 ; jobnumber := jobnumber+1 dosys r4 ,#0 ; do the uu.sys part 0 please tstb r0 ; did it work ? beq 20$ ; yes cmpb r0 ,#10. ; no job of such number present? beq 80$ ; yes, just do the next job then br 100$ ; no, exit then as we are all done 20$: tstb firqb+5 ; is the job we found attached ? bmi 80$ ; yes, skip it then deccvt r4,r3,#3 ; convert job number to ascii add #3 ,r3 ; and point to end of the string movb #40 ,(r3)+ ; stuff a space in movb #40 ,(r3)+ ; stuff a space in call cvtppn ; convert the ppn next movb #40 ,(r3)+ ; again a space please call cvtkb ; get the kb number next mov #firqb+22,r1 ; get the program name next call rad ; convert to ascii and fix pointer dosys r4 ,#1 ; get the current size now movb firqb+16,r0 ; where it returned the size deccvt r0,r3,#5 ; convert with at least 3 spaces add #5 ,r3 ; move the pointer right along movb #'K ,(r3)+ ; the size please movb #40 ,(r3)+ ; spaces again movb #40 ,(r3)+ ; spaces again movb #40 ,(r3)+ ; spaces again dosys r4 ,#0 ; get the info part zero back mov #firqb+34,r1 ; and the current RTS name now call rad ; convert to ascii and fix pointer clrb @r3 ; all done at last mov sp ,r3 ; point back to the buffer call doio ; do the i/o at last 80$: br 10$ ; next please 100$: cmpb r0 ,#18. ; end of the table ? bne 110$ ; no clr r0 ; yes 110$: add #120 ,sp ; pop the local buffer unsave ; pop temps and exit call drpprv ; please do this return .sbttl utilities and the actual i/o .enabl lsb doio: tst @r5 ; channel zero today ? bne 10$ ; no, assume disk then print r3 print #200$ br 100$ 10$: strlen r3 ; try to a disk file now calls putrec , ; write to the passed LUN 100$: return .save .psect $pdata ,d 200$: .byte cr,lf,0 .even .restore .dsabl lsb rad: calls rdtoa , ; common code to to rad50 cvt add #3 ,r3 ; pointer := pointer + 3 calls rdtoa , ; common code to to rad50 cvt add #3 ,r3 ; pointer := pointer + 3 return .sbttl misc utilities .enabl lsb cvtppn: save ; save temps please sub #20 ,sp ; convert ppn to ascii next mov sp ,r0 ; a pointer to the ppn clr r1 ; get the project number now bisb firqb+27,r1 ; ok bne 10$ ; if <> 0 then a real account mov #200$ ,r1 ; if eq 0 then not logged it yet br 20$ ; copy over *,* 10$: deccvt r1,r0,#3 ; convert it to decimal add #3 ,r0 movb #', ,(r0)+ ; stuff a comma in please clr r1 ; get the programmer number now bisb firqb+26,r1 ; ok deccvt r1,r0,#3 ; convert it to decimal mov sp ,r1 ; point to the buffer now 20$: movb #40 ,(r3)+ ; stuff a space into our result mov #7 ,r0 ; seven characters to copy 30$: movb (r1)+ ,(r3)+s not know about c eof for direct access files. Will have to fix c for RT when I get the rt version done. c c c c to compile: c c f77 k11hex=k11hex c ftb c k11h WKERMIT.B[001011]K1180S.MAC;1E9s ; and copy the rest of it sob r0 ,30$ ; simple movb #40 ,(r3)+ ; stuff a space into our result movb #40 ,(r3)+ ; stuff a space into our result movb #40 ,(r3)+ ; stuff a space into our result add #20 ,sp ; pop the local buffer unsave return .save .psect $pdata ,d 200$: .asciz / *, */ .even .restore .dsabl lsb cvtkb: save ; convert kb number to ascii sub #10 ,sp ; allocate a local buffer mov sp ,r1 ; point to it movb firqb+5 ,r0 ; KB number to convert movb #'K ,(r3)+ ; insert a header movb #'B ,(r3)+ ; simple deccvt r0,r1,#3 ; can't ever be more than 127 mov r3 ,-(sp) ; saev the output pointer now mov #3 ,r0 ; three at most to copy over 10$: cmpb @r1 ,#40 ; a space present ? beq 20$ ; yes, please ignore it movb @r1 ,(r3)+ ; copy it over at last 20$: inc r1 ; next ch please sob r0 ,10$ ; simple movb #40 ,(r3)+ ; insert some spaces now movb #40 ,(r3)+ ; insert some spaces now movb #40 ,(r3)+ ; insert some spaces now movb #40 ,(r3)+ ; insert some spaces now mov (sp)+ ,r3 ; restore the old pointer add #5 ,r3 ; say we copied 5+2 characters over add #10 ,sp ; pop the local buffer and exit unsave ; pop registers return $clrxr: save mov #xrb ,r0 10$: clr (r0)+ cmp r0 ,#xrb+14 blos 10$ unsave return $clrfq: save mov #firqb ,r0 10$: clr (r0)+ cmp r0 ,#firqb+36 blos 10$ unsave return .dosys: clrfqb ; clear the firqb out first movb #uu.sys ,firqb+fqfun ; do a systat call to RSTS movb 2(sp) ,firqb+4 ; job number to do it for movb 4(sp) ,firqb+5 ; which type (0 or 1) .uuo ; simple movb firqb ,r0 ; return with error code in r0 return ; bye .sbttl do the server C command for RSTS/E version 8 ; 13-Apr-84 13:15:50 Brian Nelson ; ; input: @r5 address of command string ; 2(r5) LUN to send the output to, zero implies TT: ; output: r0 error code (rms or RSTS/E) ; ; Note: This is a very SIMPLE version of the code I wrote ; several years ago to do complete PK handling. In ; this version, we NEVER try to read anything from ; the users keyboard, nor do we EVER write anything ; to it since it is assumed that we are supporting ; the server host command packet stuff. Any attempt ; by the invoked CCL/DCL command to read input will ; cause the program (and job) to be aborted. .iif ndf, corcom, corcom = 460 .psect pkbuff ,rw,lcl,rel,con,d pkbuff: .blkb 200 pkbufp: .word 0 pkbufs: .word 0 jobnum: .word 0 .even pkbsiz = 200 .sbttl the real work of sercmd .psect $code sercmd::clr pkbufs ; insure no data is left in buffer mov #jfsys ,xrb+0 ; get temp privs back .set ; simple to do call openpk ; find an available PK tst r0 ; perhaps we could not get one bne 100$ ; r0 will have RSTS/E error code call logv8 ; get logged in on the PK tst r0 ; if it fails, it's the error code bne 100$ ; oops mov r1 ,jobnum ; save the jobnumber please movb #'c&37 ,-(sp) ; no, force a control C call putpk ; simple mov #2 ,xrb+0 ; wait a moment .sleep ; simple. any i/o will wake us up 5$: call getpk ; eat the result of the control C tst r0 ; loop until eofeof error (11) beq 5$ ; go back for more mov #10 ,r1 ; wait for kmon 10$: mov jobnum ,-(sp) ; simple call jobsts ; waiting for KB input now ? tst r0 ; well? bmi 15$ ; ok mov #1 ,xrb+0 ; wait a moment .sleep ; simple. any i/o will wake us up sob r1 ,10$ ; 15$: mo*[001011]K11MNU.COM;1+./ 0D6\l9ˍ7ʍ 4 U<0KERMIT.B[001011]K1180S.MAC;1E9 /{w&< D*+4)sw|1ONhHhNF^}-I76}Tn{K$64,`4sH`7kvvZpEWD'9x.74$_!Li & 8 3*G"_?R 2qR<'RL,8%L=jc *n/}: i Bl11YS[TJ.bbd5z 3Yz_UYmM]~T t|LrL3\FyGo/oE5YTg&ExC.SQEw f|^u4Mg7K4czBC[8 %^I rG\,F$kySD' AV hqH8S/C$a($4zSwKi+g wpDh8VD* NHEh=X?u Kl:F?,l]|y$k!Ch[ 4lb_DL[rjUX #;0o`rcy%)DZ=31nK!XW~EW@YYKO7]4s>EQj G+E-:Ab7+=T15d *|r04of5ap,yeR-}2k#:XVBp?]ppY, _X= |}>lcl`|hu4)|{NNB_Yx/]sH UG!/!!Ei-$'[3rI\tDK #BDJBD5 VTQ#T6/O-gCI"cMT xK$7YP(X"1$$ #[Cu~.wP&p9@PjaSd^3qr^Xyt I6X50*b ~o\f3<5yzZd  *Uw8^8v)rz1 (d+lPsH#SiJO9fJc5Fy7o?,msh|`cTcJRzKE&kjT^//}mCr(jn0cr|B/^ ymlj~/6^]y6ll_R

"qfGD'Lu*gCL!bnq0Ne<kQvx P~2\$kfkQD-Tv{!Cu25th=[w$fs]'E![% o/ i9:-)Rp0 iwEY7;QXxVMN6p$7_HI"@1 . -3;1*!!! 4Nu$''G i`Q;@>cyB#a{im PS_2]~:e`6T"FB Ep!L&5(hz}P==B]kX<Hnz6:[8/ 3-fE\AS?YUh`< x]tz1RwW@J>B2g N,F~ZM~PrrMM8L[9{,f ):d`adA2DyI8T'z Wz7Zq#i$[r Bbk9 fF%h(YWAA`UNYZ2bz zI6ch|5,L8}73D#ZGc!y 6Y(tI3uu,_cnW|a\/T#N-zcILh n28N  A[J 5b/o*5UU:}lkh3 Fw,yF9 1Dk X-QbM+FR/L!]AT@z) *"K- \א),T\ 'T3;7!oAB;C"B:PSN]']R$c~ @ - V5!QE8fnHU$)S>k v3nSP;W:SD(g"7P$';asqO;-IqU/G$o"abP?[y{F-M8rOiq5 i'Db3f$CeTx+);`F1Xmj24HCc\hz0{xqic;.dX[a3@ L)-X+\(j${A9!d! 32c&E >gp6.x]|C~*N6d)&RJwj4jYTE\ L"3w.V"y*]HnX.BkIe% W`7w:7O@^O8MV|xT|vck4Kmr+6" iDN[mn)b#zZ!@{Oi @UX2 48_^+9/X =xVrz561=iY^EN"O;kPnW`@^q ]]{?/#H2 g;Z`!g**X,9v!mC*m@[m:|Ph2`Q3Ub8rY19FBxmXx5xo_VrZO"3ip$8}L0TEQ.8rW*X_  bLbQfC6Qxb= 8J# /%xd*HK?o/A&?jUE }*C![]Yfy 90{kh4lg \m9]RV;VL,{ = rXCKJuy~wmeX stn.fcEKU2wxA4w8I}W zyogU8;Iy7KAɬ.LZl#dR]yXFlhjqI#Po$R*9; EVZF!+(>U?J4| @wiJm*D ATw Cd0rH_V$_2[GY 3L`jVMA|d (bm :@9uyc<6I_\KZ Swb#%Kls?!, 3Sw8?e*kRXe"">zHB@Ddr#7_*% x'Q  rbXx.!glh9'/FpW0e8.8lFQ?j,%`hCv C&Y6ipDrv7+|e1N5vF*cj4z-1EZ7Ve{!}bR>R}Bl~$cbs--sy|H O+U^j\0h'hJV#c)c_]Tp>_q4bsY?<$]QdRPEu,=A.d{*9.Db7Ve4>I+{@0Q64TByuR%NI-%S&KyU\26 @:/}NmG|!K0sGN_#'%HLml&=bEO:c@tU)6x" 4oiH"& bV{z?W`k( 3f3wRO0NnQzLgCFl715B'Fsa}M4o;>fyYp1j 994[@cwJA%nW!gF_dJIZbO})E[vmcW(F|%sxCw9zY# G|l j'T#rJuJ"A4` ! nuJm75_3lRcrUHh#@ $m7[JZYzT 4/|9r&Px HDkkf('ViFuttmujfF& "1e0>VL}sFoe5&0 lr%MeR=-{H|f*4#,L%_:eAuBUW9uXQ^a>)6uK6LAi*QGf`'Hz~I{40/} ~R\}D>;/fSL W5Pjh}aI qG R,Xo|1Z{su_fB.S&hisl$EE>Ax/"lvIm+Kfk{qykI&Z<%(o~. Sp.Y aJ-&5$[UOfGCfVr8T9+7BO=P$Hqp=2T)qcbB;- ~ -7qIfi0Bb]ihnvsgkA%dfLYgE04##A~Y`*AN}5< `g&%Q1B.p*o8k  }KERMIT.B[001011]K1180S.MAC;1E9v @r5 ,-(sp) ; do it call sendcmd ; ok mov #10 ,xrb+0 ; wait a little while before checking .sleep ; job status. any i/o will reset this 20$: call getpk ; now get the result of the command tst r0 ; did it work ? bne 30$ ; no, find out why then call output ; dump the ch read to somewhere br 40$ 30$: mov jobnum ,-(sp) ; the job number call jobsts ; find out what's happening here tst r0 ; if ge, then it's just running bmi 90$ ; it's waiting for input or all done mov #1 ,xrb+0 ; if ok, take a one second nap .sleep ; simple 40$: br 20$ ; try to get some more data now 90$: mov #377 ,r0 ; a fake error to return 100$: mov #jfsys ,xrb+0 .clear call killpk return .sbttl where to put the output output: tst 2(r5) ; the LUN to use bne 10$ ; a disk movb r1 ,-(sp) ; the terminal mov sp ,r1 ; a pointer print r1 ,#1 ; dump it tst (sp)+ ; pop the buffer and exit br 100$ ; bye 10$: movb r1 ,r0 ; rms output today mov 2(r5) ,r1 ; the channel call putcr0 ; simple to do 100$: return ; bye pk.lun = 12. openpk: mov r1 ,-(sp) ; save this one today clr r1 ; start at PK0: 10$: clrfqb ; insure no defaults movb #opnfq ,firqb+fqfun ; open the thing up now movb #pk.lun*2,firqb+fqfil ; channel number times 2 movb r1 ,firqb+fqdevn ; device unit number please movb #377 ,firqb+fqdevn+1 ; unit is for real here mov #"PK ,firqb+fqdev ; device name also calfip ; try to open it up movb firqb ,r0 ; get the rsts error code if any beq 100$ ; all is well cmpb r0 ,#6 ; invalid device ? beq 100$ ; yes exit with this error inc r1 ; else try again br 10$ ; next please 100$: mov (sp)+ ,r1 ; pop r1 and exit return .sbttl create a logged in job for the PK (version 8 only) ; Creates a job under the current account for the PK that's ; open on PK.LUN. ; ; returns: r0 rsts error code ; r1 created job number logv8: movb #uu.sys ,firqb+fqfun ; get the user's default RTS please clr firqb+4 ; current job, systat part 0 .uuo ; simple, can't fail either mov firqb+26,-(sp) ; save the user's account number mov firqb+32,-(sp) ; save the user's defkbm mov firqb+30,-(sp) ; save the user's defkbm clrfqb ; now get the kb number for the PK movb #uu.fcb ,firqb+fqfun ; get the DDB returned for it movb #pk.lun ,firqb+fqfun+1 ; channel number that we want .uuo ; default to GET DDB info movb firqb+14,-(sp) ; save it asrb (sp) ; not times two please clrfqb ; version 8, enter a run time system mov #firqb+fqfun,r0 ; at the p.new entry point movb #uu.job ,(r0)+ ; create a job function for fip movb #20!100!200,(r0)+ ; create logged in @ defkbm always movb (sp)+ ,(r0)+ ; kb number to attach to job clr (r0)+ ; unused field mov (sp)+ ,(r0)+ ; user's default run time system mov (sp)+ ,(r0)+ ; both rad50 words please clr (r0)+ ; unused field mov (sp)+ ,@r0 ; account number also bisb #40 ,firqb+4 ; set flag for account to login to movb corcom ,-(sp) ; save this please clrb corcom ; core common is also passed .uuo ; try to create the job now movb (sp)+ ,corcom ; restore first byte of core common movb firqb+4 ,r1 ; created job number please asr r1 ; but not times two movb firqb ,r0 ; did it work? bne 110$ ; no tstb firqb ; huh clc ; yes, flag success and exit return ; bye 110$: sec ; job creation failed, exit return ; set a flag and return .sbttl pkread/write i/o for the prmits are set to binary mode can result in an unusable file after transfer because of the possibility of transfering imbedded record control information. .s 1 #Version KERMIT.B[001011]K1180S.MAC;1E9k getpk: clrxrb ; clear xrb tst pkbufs ; any buffered data left to get? bne 10$ ; no call 200$ ; reload the buffer please tst r0 ; get anything ? bne 100$ ; no, exit 10$: mov pkbufp ,r0 ; yes, get a pointer to the buffer clr r1 ; avoid sign extension bisb pkbuff(r0),r1 ; get the ch now inc pkbufp ; advance the pointer for next time dec pkbufs ; one less character left to get clr r0 ; say it worked 100$: return ; bye 200$: clr pkbufp ; no data, clear buffer pointer clrxrb ; no defaults mov #pkbsiz ,xrb+xrlen ; as many as we can grab mov #pkbuff ,xrb+xrloc ; buffer location movb #pk.lun*2,xrb+xrci ; channel # inc xrb+xrtime ; wait at most one second .read ; read from pk movb firqb ,r0 ; get any error codes bne 210$ ; no mov xrb+xrbc,pkbufs ; it worked, init the bytes left 210$: return ; back to work... putpk: clrxrb ; no odd things please inc xrb+xrlen ; one ch to do mov sp ,xrb+xrloc ; buffer location add #2 ,xrb+xrloc ; off by one mov #1 ,xrb+xrbc ; byte count movb #pk.lun*2,xrb+xrci ; channel # mov #9. ,xrb+xrmod ; record 9% .write ; write to pk movb firqb ,r0 ; result mov (sp)+ ,(sp) ; pop ch that we wrote return ; back to work... .sbttl pk utilities sendcmd:mov r1 ,-(sp) mov 4(sp) ,r1 ; command address to send to PK 10$: tstb @r1 ; done yet ? beq 100$ ; yes, exit movb (r1)+ ,-(sp) ; loop until a null is found call putpk ; simple br 10$ ; next please 100$: mov (sp)+ ,r1 ; pop register we used mov (sp)+ ,(sp) ; pop address of string and exit mov #cr ,-(sp) ; finish with a carriage return call putpk ; simple return waitpk: clrxrb ; no odd things please mov sp ,xrb+xrloc ; buffer location movb #pk.lun*2,xrb+xrci ; channel # mov #6. ,xrb+xrmod ; record 2+4 .write ; write to pk tstb firqb ; result beq 100$ ; it's ready for a command cmpb firqb ,#28. ; need a control C? beq 100$ sec ; it's not ready return 100$: clc return ; back to work... killpk: clrxrb ; no odd things please mov sp ,xrb+xrloc ; buffer location movb #pk.lun*2,xrb+xrci ; channel # mov #20 ,xrb+xrmod ; record 2+4 .write ; write to pk clrfqb ; now close it up movb #clsfq ,firqb+fqfun ; simple movb #pk.lun*2,firqb+fqfil ; channel to do calfip ; do it return ; back to work... .sbttl jobsts return status of the control led job ; input: 2(sp) job number ; output: r0 < 0 then kb stall, 0 waiting for tt output, > 0 running ; ; This will be called to determine when the spawned job should ; be aborted. ; ; r0 = -2 the job is logged out, waiting for input or ; in a kmon wait ; r0 = -1 timeout ; r0 = 0 job is waiting for output to the PK ; r0 > 0 job is in a run state .jbstat = 12 .jbwait = 14 .iif ndf, j2con ,j2con = 4 .iif ndf, j2nopr,j2nopr = 10000 .iif ndf, js.kb ,js.kb = 2 .iif ndf, js.tel,js.tel = 4000 jobsts: mov r1 ,-(sp) ; we may access these here mov r2 ,-(sp) ; save these also movb #uu.sys ,firqb+fqfun ; for looking up a job movb 6(sp) ,firqb+fqfun+1 ; job number to do movb #1 ,firqb+fqfun+2 ; part two to do please .uuo ; do it tstb firqb ; did it work ? bne 90$ ; no, return abort please bit #jfnopr ,firqb+6 ; logged in ? bne 90$ ; no, return abort then mov firqb+.jbstat,r1 ; get the current jbstat word mov firqb+.jbwait,r2 ; get the current jbwait word com r1 ; and get the and of the two bic r1 ,r2 ; if result <> 0 thtask build time stack=64 // *[001011]K11HEX.B2S;1+JKERMIT.B[001011]K1180S.MAC;1E9 en job is bne 10$ ; running ok bit #js.kb ,firqb+.jbwait ; not running, stalled for kb input? bne 90$ ; yes, abort the job then bit #js.tel ,firqb+.jbwait ; waiting for tt output bne 80$ ; yes 10$: mov firqb+34,xrb+0 ; no, check the elapsed time please add #j2con ,xrb+0 ; simple .peek ; do it tstb firqb ; did that work ? bne 90$ ; no, die cmp xrb+0 ,#300 ; allow three minutes at most bhis 95$ ; no, die mov #1 ,r0 ; all is well, exit br 100$ 80$: clr r0 ; job is waiting on tt output br 100$ ; bye 90$: mov #-2 ,r0 ; waiting on KB or logged out br 100$ ; bye 95$: mov #-1 ,r0 ; timeout br 100$ ; exit 100$: mov (sp)+ ,r2 ; exit mov (sp)+ ,r1 mov (sp)+ ,(sp) ; pop parameter and exit return .iif ndf , UU.CHK, UU.CHK = 40 .iif ndf , UU.PRV, UU.PRV = 34 .iif ndf , NOSUCH, NOSUCH = 5 .iif ndf , NOTAVL, NOTAVL = 10 .iif ndf , PRVIOL, PRVIOL = 12 .iif ndf , QUOTA , QUOTA = 105 .sbttl LOGIN Login from a remote server command ; LOGIN 24-Sep-85 10:01:33 Brian Nelson (V9.x and later only) ; Added on Edit 2.36 ; ; ; Passed: 0(r5) Address (asciz) of PPN to log into ; 2(r5) Address (asciz) of password ; 4(r5) Address of where to return informative messages ; Return: R0 Zero for success, else the error code. .enabl lsb login:: save ; save work regs call dolin ; try to switch tst r0 ; successful ? beq 100$ ; yes clr r1 ; no, Reply with a reasonable error 10$: tstb 200$(r1) ; end of the list beq 20$ ; yes, use a catchall error cmpb 200$(r1),r0 ; find the error yet ? beq 20$ ; yes inc r1 ; no br 10$ ; next please 20$: asl r1 ; times two for word addressing mov r0 ,-(sp) ; save the error code strcpy 4(r5),210$(r1) ; simple mov (sp)+ ,r0 ; restore the error code 100$: unsave ; exit return ; and exit .save .psect $PDATA ,D 200$: .byte NOSUCH,NOTAVL,PRVIOL,QUOTA,0 .even 210$: .word 220$ ,230$ ,240$ ,250$ ,220$ 220$: .asciz /Invalid password or account, or system password needed/ 230$: .asciz /Expired, non-interactive or non-dialup account/ 240$: .asciz /WACNT privilege needed for REMOTE LOGIN/ 250$: .asciz /Some quota is exceeded/ .even .restore .dsabl lsb .sbttl really do the login now ; DOLIN: ; ; Passed: 0(r5) Address of the PPN (.asciz) to log into ; 2(r5) Address of the password (.asciz) to log into ; ; Return: r0 = 0 for success ; r0 <> 0 with RSTS/E error code dolin: sub #10 ,sp ; allocate a buffer for use here mov #WACNT ,-(sp) ; check to see if we have WACNT priv call chkprv ; do it tst r0 ; do we have WACNT privilege ? beq 90$ ; no clrxrb ; yes, continue on by clearing the clrfqb ; XRB and FIRQB movb #UU.SWP ,FIRQB+FQFUN ; To find out the physical name of movb #2 ,FIRQB+FQFIL ; the system disk we will call the movb #377 ,FIRQB+5 ; exec to find out the name of swap .UUO ; file 2, which is always on _SY0: mov FIRQB+FQDEV,(sp) ; Also, no privilege is needed. mov FIRQB+FQDEVN,2(sp) ; copy the device name and unit flags clrfqb ; clear things out again to do a .FSS mov @r5 ,r0 ; on the passed PPN to convert it to 10$: tstb (r0)+ ; the proper format. bne 10$ ; Find the length of the string sub @r5 ,r0 ; end of it, subtract starting address dec r0 ; and correct for autoincrement mov r0 ,XRB+0 ; stuff the string length mov r0 ,XRB+2 ; again mov @r5 ,XRB+4 ; and the buffer address .FSS ; call the exec movb FIRQB ,r0 VKERMIT.B[001011]K1180S.MAC;1E9: ' ; Did this work bne 100$ ; If not, must be a invalid PPN format mov FIRQB+FQPPN,4(sp) ; Save the parsed PPN please movb #UU.LIN ,FIRQB+3 ; Finally, do a password check on the movb #1+<2*1>,FIRQB+5 ; desired account to log into. mov #FIRQB+FQNAM1,r1 ; This presumes version 9.x, using mov 2(r5) ,r0 ; ascii passwords. 20$: movb (r0)+ ,(r1)+ ; copy the password over to the FIRQB bne 20$ ; not yet done mov (sp) ,FIRQB+FQDEV ; Lastly, restore the system disk name mov 2(sp) ,FIRQB+FQDEVN ; unit number and units flags. .UUO ; Finally call the exec to check it. movb FIRQB ,r0 ; But did the passwords match ? bne 100$ ; No, exit on error then clrfqb ; Next, we must log out to be able to incb FIRQB+4 ; Must NOT close i/o channels up. movb #UU.BYE ,FIRQB+FQFUN ; log back in again (Remember, we need .UUO ; WACNT to avoid self kill by the exec) movb FIRQB ,r0 ; Did this work ? bne 100$ ; no, exit please cmp FIRQB+4 ,#-1 ; Did the logout succeed ? beq 80$ ; no (quota exceeded) clrfqb ; Clear the FIRQB one last time movb #UU.LIN ,FIRQB+FQFUN ; Login function for .UUO movb #10*1 ,FIRQB+5 ; We can skip the password check as we mov 4(sp) ,FIRQB+FQPPN ; already checked and we needed WACNT .UUO ; at LAST ..... movb FIRQB ,r0 ; save and exit bne 100$ ; .... call setprv ; set authorized privileges up clr r0 ; it's ok br 100$ ; exit 80$: mov #QUOTA ,r0 ; UU.BYE failed due to a quota br 100$ 90$: mov #PRVIOL ,r0 ; No WACNT--> protection violation 100$: add #10 ,sp ; pop buffer and exit return .save .psect $PDATA ,D wacnt: .asciz /WACNT/ exqta: .asciz /EXQTA/ .even .restore .sbttl detach the server detach::clrfqb ; insure no defaults movb #UU.SYS ,FIRQB+FQFUN ; do a systat and get the kb number .UUO ; simple to do movb FIRQB+5 ,r1 ; save the kb number clrfqb ; insure no defaults movb #clsfq ,FIRQB+FQFUN ; insure KB: is detached movb #5*2 ,FIRQB+FQFUN+1 ; the lun for it CALFIP ; do it, skip any error codes clrfqb movb #UU.DET ,FIRQB+FQFUN ; the uuo detach code movb #200 ,FIRQB+FQFUN+1 ; close all luns for KB: .UUO ; simple to do movb FIRQB ,r0 ; return any errors bne 100$ ; yep mov #1 ,xrb+0 .sleep clrfqb ; now spawn a job attached mov #FIRQB+FQFUN,r0 ; to our old kb movb #UU.JOB ,(r0)+ ; create a job exec call movb #20!100!200,(r0)+ ; into def kbm, no logins is ok movb r1 ,@r0 ; the kb number to attach to bne 10$ ; not KB0: movb #200 ,@r0 ; KB0:, must set flag for it 10$: .UUO ; simple to do, ignore errors clr r0 ; return success 100$: return .sbttl check for AUTHOURIZED priv ; This is again different from CHKPRV, which checks for ; CURRENT priv, and JOBPRV, which checks for JOB priv as in ; SET JOB/[NO]PRIV. This one goes out to disk and gets the ; AUTHORIZED priv mask and checks for the passed priv. ; ; Passed: 2(sp) Name of priv to check, upper case please ; Return: R0 1 for success or pre 9.x, zero for no priv ; ; Example: ; ; mov #HWCFG ,-(sp) ; call JOBPRV ; tst r0 ; beq error ; ; ; hwcfg:.asciz /HWCFG/ ; .even authpr::mov r1 ,-(sp) ; /41/ Save a register mov r2 ,-(sp) ; /41/ ... save another one sub #10 ,sp ; /41/ temp save area mov #1 ,r2 ; /41/ Assume success tst ver9.x ; /41/ version nine or later? beq 100$ ; /41/ no, return( success ) clrfqb ; /41/ Clear firqb out mov #FIRQB+FQFUN,r1 ; /41/ Read authorized priv mask movb #UU.ATR ,(r1)+ ; /41/ k11atr =in:k11atr mac in:k11deb =in:k11deb mac in:k11ini =in:k11ini mac in:k11std =in:k11std mac in:k11dia =in:k11dia *[001011]K11FIL.DOC;1+KERMIT.B[001011]K1180S.MAC;1E9 .Function to perform movb #377 ,(r1)+ ; /41/ Read function movb #2 ,(r1)+ ; /41/ Read AUTHORIZED priv mask .UUO ; /41/ Go to it mov #FIRQB+12,r0 ; /41/ Where the priv mask is mov sp ,r1 ; /41/ Where to save it mov (r0)+ ,(r1)+ ; /41/ Save it please mov (r0)+ ,(r1)+ ; /41/ .Save it please mov (r0)+ ,(r1)+ ; /41/ ..Save it please mov (r0)+ ,(r1)+ ; /41/ ...Save it please clrfqb ; /41/ clear firqb out mov #FIRQB+FQFUN,r0 ; /41 movb #UU.CHK ,(r0)+ ; /41/ Convert priv name to bitmask inc (r0)+ ; /41/ Subfunbction code = 1 tst (r0)+ ; /41/ skip this field mov 2+14(sp),r1 ; /41/ copy the priv over 10$: movb (r1)+ ,(r0)+ ; /41/ copy the asciz name over bne 10$ ; /41/ simple .UUO ; /41/ convert NAME to MASK mov sp ,r1 ; /41/ point back to save area mov #FIRQB+FQNAM1,r0 ; /41/ Where the bit pattern is mov #4 ,r2 ; /41/ Four words to check 20$: bit (r0)+ ,(r1)+ ; /41/ Any bit(s) set here ? bne 30$ ; /41/ Yes, we have it sob r2 ,20$ ; /41/ No, keep looking br 90$ ; /41/ Failure 30$: mov #1 ,r2 ; /41/ Flag we have it br 100$ ; /41/ exit 90$: clr r2 ; /41/ failure 100$: mov r2 ,r0 ; /41/ Return the status now add #10 ,sp ; /41/ Pop buffer mov (sp)+ ,r2 ; /41/ ...Pop a register mov (sp)+ ,r1 ; /41/ Pop a register mov (sp)+ ,(sp) ; /41/ Pop over the parameter return ; /41/ At last .sbttl Logout ; LOGOUT ; ; Logout from the RSTS/E host from the server ; ; Rewritten 3.45 11-Feb-86 15:25:17 BDN for version 9.x ; ; Check quotas, if ok, drop the line and logout logout::save ; /45/ Save registers clr r2 ; /45/ Preset EXQTA priv flag tst ver9.x ; /45/ Version nine or later beq 50$ ; /45/ No, skip the quota check mov #exqta ,-(sp) ; /45/ V9, see if we have EXQTA call chkprv ; /45/ ... mov r0 ,r2 ; /45/ Save the flag bne 10$ ; /45/ EXQTA, skip quota checks ; clrfqb ; /45/ Ensure FIRQB is cleared out movb #UU.ATR ,FIRQB+FQFUN ; /45/ Do some quota checks decb FIRQB+4 ; /45/ Read account attributes incb FIRQB+5 ; /45/ We want quota data .UUO ; /45/ Get the data tstb FIRQB ; /45/ Did this work ? bne 50$ ; /45/ No, just log out then cmpb FIRQB+21,FIRQB+17 ; /45/ Is MSB of quota OK ? bhi 100$ ; /45/ No, exit cmp FIRQB+24,FIRQB+12 ; /45/ Is current usage < outquota? bhi 100$ ; /45/ No ; 10$: clrfqb ; /45/ Yes, get keyboard number movb #UU.SYS ,FIRQB+FQFUN ; /45/ UU.SYS part 0 .UUO ; /45/ We have it now movb FIRQB+5 ,r1 ; /45/ Save it bitb #200 ,r1 ; /45/ Detached? bne 50$ ; /45/ Yes, skip hangup clrfqb ; /45/ Get set to disconnect line movb #UU.HNG ,FIRQB+FQFUN ; /45/ At last.... movb r1 ,FIRQB+4 ; /45/ Line to do it to incb FIRQB+5 ; /45/ Do it quickly (1 second) .UUO ; /45/ Drop the line, now log out ; 50$: clrfqb ; /45/ Clear FIRQB out movb #UU.BYE ,FIRQB+FQFUN ; /45/ Log out now tst r2 ; /45/ Version 9 and EXQTA ? beq 60$ ; /45/ No movb #2 ,FIRQB+4 ; /45/ Yes, bypass quota checks 60$: .UUO ; /45/ Call the EXEC cmp FIRQB+4 ,#-1 ; /45/ Are we logged out ? beq 100$ ; /45/ No call exit ; /45/ Yes, exit please (never happen) 100$: unsave ; /45/ Pop registers return ; /45/ Quota must be exceeded .sbttl Check current quotas to see if UU.BYE will succeed quochk::tst ver9.x ; /45/ Version nine or later beq 30$ ; /45/ No, skip the quota check mov #exqta ,-(sp) ; /45/ V9, see if we have EXQTA call chkprv ; /45/ ... kp4o&c<;k*tj5>a Xprw{v&fsm+11RO=}_[ByMn*RNNT_Scc.,v;peT%X allowed ? blos 100$ ; /45/ quota is ok mov sp ,r0 ; /45/ quota is not ok, flag it 100$: return ; /45/ Return to caller .sbttl Return disk space usage ; D S K U S E ; ; input: @r5 address of string to return the usage .enabl lsb dskuse::save clrfqb ; clear FIRQB out movb #UU.RAD ,FIRQB+FQFUN ; uuo function, read accounting data .UUO ; do it mov @r5 ,r1 ; point to the output string copyz #120$ ,r1 ; copy a header over please strlen r1 ; get the current length add r0 ,r1 ; point to the end of the string deccvt ,r1,#6 ; and convert used to string add #6 ,r1 ; point to the end again copyz #130$ ,r1 ; copy some more stuff strlen r1 ; get the count of chars we copied add r0 ,r1 ; point to the end of the string mov FIRQB+34,r0 ; get the quota bne 10$ ; not unlimited copyz #140$ ,r1 ; unlimited, say so br 20$ 10$: sub FIRQB+6 ,r0 ; and get the free space deccvt r0 ,r1 ; copy the free space over now clrb 6(r1) ; make the string .asciz 20$: unsave return ; bye .save .psect $PDATA ,D 120$: .asciz /SY: Space used / 130$: .asciz / Space free / 140$: .asciz / Unlimited/ .even .restore .dsabl lsb .end *[001011]K11ATR.MAC;1+.$/ 0D6ϓM7;M 4O$$ U5|s( .title k11atr process attribute packets .ident /1.0.02/ .enabl gbl ; 18-Apr-84 11:20:59 Brian Nelson ; ; 24-Mar-86 12:00:56 BDN Major revision which has some rather ; unpleasant compatibility problems with ; older Kermit-11's. ; ; 12-Sep-86 10:37:04 BDN Convert for I/D space running ; ; Copyright (C) 1984 Change Software, Inc. ; ; ; Process attribute packets for RSTS/E and RSX11M/M+ ; ; This module is intended to be placed into an overlay ; which MUST be the 'ERROR' cotree as the server, which ; is overlayed in the 'UTILTY' cotree can indirectly ; call the module through the packet control routines. ; This module will also be rather RMS11 dependent. ; ; ; Get the Kermi-11 common macro definition INCLUDE file .include /IN:K11MAC.MAC/ .psect $pdata watt: .word sn.sys ,sn.typ ,sn.fab ,sn.pr0 ,sn.pr1 ,sn.len ,sn.fty ;- .word sn.cdt .word 0 attrty: .byte 41 ,42 ,43 ,44 ,45 ,46 ,47 .byte 50 ,51 ,52 ,53 ,54 ,55 ,56 .byte 57 ,60 ,61 .byte 0 .even at KERMIT.B[001011]K11ATR.MAC;1O$xtrds: .word at.$$ .word at.len ,at.typ ,at.cre ,at.id ,at.bil ,at.area,at.pas .word at.bsiz ,at.acc ,at.enc ,at.dis ,at.pr0 ,at.pr1 ,at.sys .word at.for ,at.fab ,at.xle badpak: .asciz /Unknown attribute packet type / incomp: .ascii /?K11-ATR Protocol bugfix detected. Use/ .asciz /SET NOATT and see K11.BWR, K11INS.DOC./ .even .psect tempda ,rw,d,lcl,rel,con curatr: .blkb 200 .psect $code .sbttl return the next attribute packet to send ; W $ A T T R ; ; input: @r5 filename address ; 2(r5) lun it's using ; 4(r5) output packet address ; ; output: r0 rms error code, else zero ; r1 > 0 the packet length, also come back for more later ; r1 = 0 no more packets or else receiver can't handle them w$attr::save ; save registers that we may use here bitb #capa.a ,conpar+p.capas ; the other system handle 'A' packets? beq 90$ ; no, exit with 'eof' 10$: mov 4(r5) ,r4 ; point to the packet mov atrctx ,r0 ; now dispatch on what to send next asl r0 ; simple to do tst watt(r0) ; all done ? beq 90$ ; yes, just exit then jsr pc ,@watt(r0) ; and do it inc atrctx ; next time, do the next one in the list tst r0 ; was it possible to do this attr? bne 10$ ; no, try the next one then strlen 4(r5) ; get the length and return it mov r0 ,r1 ; and say that this packet is for real clr r0 ; exit without error br 100$ ; bye 90$: clr r0 ; all done, no more attributes to clr r1 ; send over clr atrctx ; init for the next file we send 100$: unsave ; pop these and exit return ; bye .sbttl dispatch routines for sending 'a' packets .enabl lsb sn.sys: call getsys ; get the system type first scan r0 ,#200$ ; find out what we are tst r0 ; did it work ? beq 110$ ; no movb #'. ,(r4)+ ; sys id attr packet movb #42 ,(r4)+ ; /49/ Length of whats to follow movb #'D&137 ,(r4)+ ; return the vendor code (DEC) movb 210$(r0),(r4)+ ; and the system type clrb @r4 ; .asciz clr r0 ; say it worked return ; bye 110$: mov sp ,r0 ; it failed return .save .psect $PDATA ,D 200$: .byte sy$11m ,sy$ias ,sy$rsts,sy$mpl ,sy$rt ,sy$pos ,0 210$: .byte 0 .byte '8 ,'9 ,'A&137 ,'8 ,'B&137 ,'C&137 ,0 .even .restore .dsabl lsb .sbttl send a copy of the ifab over ; The routine 'GETATR' takes the directory (or file header) information ; regarding the file format from the IFAB allocated to the FAB for the ; file currently being sent. This data is converted to octal strings and ; then sent over as an ATTRIBUTE packet with a type of '0', which is the ; type reserved for system specific data. ; The receiver KERMIT should ALWAYS get the SYSTEM and EXECUTIVE type ; attribute packet first so it can decide whether or not it wants to use ; the data being sent. ; ; For instance, the file A.A would have a packet sent over as in below ; ; Name .Typ Size Prot Access Date Time Clu RTS Pos ;A .A 1 < 60> 01-May-84 01-May-84 10:17 AM 4 ...RSX 3493 ; RF:VAR=132 FO:SEQ USED:1:98 RECSI:46 CC:IMP ; ; ; ;SPACK - Length 78 Type A Paknum 3 ;0001002 000056 000000 000001 000000 000001 000142 000000 000204 000000 000000 sn.fab: calls getatr ,<2(r5),#at$fab>; get the ifab stuff now tst r0 ; but did it work? bmi 100$ ; no, it crapped out movb #'0 ,(r4)+ ; return sys type attr code movb #<13*7>+40,(r4)+ ; Length of data to follow. mov r4 ,r0KERMIT.B[001011]K11ATR.MAC;1O$  ; fill it with spaces first mov #13*7 ,r1 ; simple 5$: movb #40 ,(r0)+ ; sob r1 ,5$ ; next mov #at$fab ,r2 ; where we store such things mov #13 ,r0 ; number of words to send 10$: calls l$otoa , ; do it add #7 ,r4 ; skip over it sob r0 ,10$ ; next clr r0 ; say that it worked clrb @r4 ; .asciz 100$: return .sbttl send file type (ascii,binary), protection and size ; SN.FTY added /52/ .enabl lsb sn.fty: movb #'0 ,(r4)+ ; Attribute type (SYS type) movb #42 ,(r4)+ ; Length of data to follow. movb #42 ,(r4)+ ; Sending extended filetype mov image ,r0 ; Index into it movb 200$(r0),(r4)+ ; Insert it clrb @r4 ; .Asciz clr r0 ; Success return ; Exit .ASSUME TEXT EQ 0 .ASSUME BINARY EQ 1 .ASSUME DECNAT EQ 2 .save ; Save, start a DATA psect .psect $pdata ,d 200$: .byte 'A&137 ,'I&137 ,'N&137 ,'A&137 .even .restore ; Pop old psect .dsabl lsb ; And drop local symbol block sn.cdt: movb #'0 ,(r4)+ ; System dependent data following movb #41+<6*4>,(r4)+ ; Amount of data to follow movb #43 ,(r4)+ ; Date of creation, 64bit format CALLS getcdt ,<2(r5)> ; Get address of data mov r0 ,r2 ; Successful (ie, not RT11) beq 90$ ; No mov #4 ,r3 ; Number of words 10$: CALLS l$otoa , ; Do it add #6 ,r4 ; Move over sob r3 ,10$ ; Next please clrb @r4 ; .ASCIZ clr r0 ; Success br 100$ ; Exit 90$: mov #-1 ,r0 ; Failure 100$: return ; Exit sn.typ: movb #42 ,(r4)+ ; attribute type movb #41 ,(r4)+ ; /49/ Length of what follows movb #'A&137 ,@r4 ; assume ascii cmpb image ,#binary ; already decided that it's binary? bne 10$ ; no movb #'I&137 ,@r4 ; yes, say it's image mode today 10$: clrb 1(r4) ; insure .asciz clr r0 ; flag success and exit return ; bye sn.pr0: sn.pr1: mov #-1 ,r0 return sn.len: calls getsiz ,<2(r5)> ; get the size of the file please tst r0 ; did this work ? bne 100$ ; no inc r1 ; try to accomodate rounding asr r1 ; in 1024 blocks, not 512 bic #100000 ,r1 ; insure no sign bits now movb #41 ,(r4)+ ; attribute type (file size) movb #45 ,(r4)+ ; length of the number deccvt r1,r4,#5 ; convert to ascii mov #5 ,r0 ; convert leading spaces to '0' 10$: cmpb @r4 ,#40 ; if a space, then make it a '0' bne 20$ ; no movb #'0 ,@r4 ; yes, stuff a space in 20$: inc r4 ; next please sob r0 ,10$ ; next please clrb @r4 ; insure .asciz clr r0 ; to be safe 100$: return ; by e .sbttl dispatch on the type of attribute packet received .psect $code ; R $ A T T R ; ; input: @r5 the packet address ; output: r0 error code, zero for success r$attr::save ; just to be safe mov @r5 ,r5 ; /49/ Get packet data address 10$: movb (r5)+ ,r0 ; /49/ Attribute type code beq 90$ ; /49/ Nothing there ??? movb (r5)+ ,r1 ; /49/ Get length field next beq 90$ ; /49/ Nothing there ? cmpb r0 ,#'. ; /49/ If this is an OLD kermit-11 bne 20$ ; /49/ with the invalid packet fmt cmpb r1 ,#'D&137 ; /49/ then we will have to make a bne 20$ ; /49/ note of it and try to fix it mov sp ,oldatt ; /49/ up. 20$: call 200$ ; /49/ Perhaps fix packets from old K11 sub #40 ,r1 ; /49/ Convert length to integer bmi 90$ ; /49/ Again, nothing was there mov #curatr ,r2 ; /49/ Copy current attribute argument 40$: movb (r5)+ ,(r2)+ ; /49/ over to a save area now. sob r1 ,40$ ; /49/ Next please clrb (r2)+ ; /49/ Insure .asciz please mov r5 ,-(sp) ; /49/upport er$xco == -37 ; could not access XC:/XL: er$fun == -40 ; invalid .spfun code er$hrd == -41 ; hard i/o error er$fet == -42 ; no room to load handler er$ KERMIT.B[001011]K11ATR.MAC;1O$ Make sure the r5 context saved scan r0 ,#attrty ; look for the attribute packet type? asl r0 ; simple to do jsr pc ,@attrds(r0) ; process the attribute packet now mov (sp)+ ,r5 ; /49/ Restore the R5 context now. tst r0 ; Success beq 10$ ; Yes br 100$ ; No, exit 90$: clr r0 ; Packet format error or end of data 100$: unsave ; bye return ; exit 200$: mov r0 ,-(sp) ; /49/ Fix bad attribute data up (?) cmpb r0 ,#41 ; /49/ The old (and incorrect) K11's beq 220$ ; /49/ did the filesize format ok tst oldatt ; /49/ Is this a fubarred old Kermit-11 beq 220$ ; /49/ No dec r5 ; /49/ Yes, we had been forgetting to strlen r5 ; /49/ include the length field before mov r0 ,r1 ; /49/ the actual attribute data. add #40 ,r1 ; /49/ Convert to char format. 220$: mov (sp)+ ,r0 ; /49/ So backup one char and reset the return ; /49/ Length. at.$$: clr r0 ; /49/ Ignore unknown attribute types return ; /49/ Exit ;- calls error ,<#1,#badpak> ; send error back to abort things ;- mov #-1 ,r0 ; return 'abort' ;- return .sbttl process specific attribute types ; File size in 1024 byte chunks (512 would have been better) at.len: save ; save temps please clr at$len ; assume zero mov #curatr ,r2 ; /49/ Where we saved attributes clr r1 ; init the accumulator 10$: tstb @r2 ; eol ? beq 30$ ; yep cmpb @r2 ,#40 ; ignore leading spaces please beq 20$ ; yes, a space clr -(sp) ; get the next digit please movb @r2 ,@sp ; and convert to decimal sub #'0 ,@sp ; got it mul #12 ,r1 ; shift accum over 10 add (sp)+ ,r1 ; add in the current digit 20$: inc r2 ; next ch please br 10$ ; /49/ Next please 30$: asl r1 ; convert 1024 blocks to 512 blocks mov r1 ,at$len ; save it please 100$: unsave ; pop temps and exit clr r0 return ; Exact size in bytes (type '1') at.xlen:save ; /49/ Save temps please asl r1 ; /49/ Convert 1024 blocks to 512 blocks clr at$len ; /49/ Assume zero mov #curatr ,r5 ; /49/ Point to attribute save area clr r3 ; /49/ Init the accumulator clr r2 ; /49/ Double precision please 10$: tstb @r5 ; /49/ Eol ? beq 30$ ; /49/ Yep cmpb @r5 ,#40 ; /49/ Ignore leading spaces please beq 20$ ; /49/ Yes, a space mov #12 ,r0 ; /49/ Setup for call to $DMUL call $dmul ; /49/ Do it please mov r0 ,r2 ; /49/ Restore accumulator values now mov r1 ,r3 ; /49/ Ditto.... clr -(sp) ; /49/ Get the next digit please movb @r5 ,@sp ; /49/ And convert to decimal sub #'0 ,@sp ; /49/ Got it add (sp)+ ,r3 ; /49/ Add in the current digit adc r2 ; /49/ Add carry bit in also please 20$: inc r5 ; /49/ Next ch please br 10$ ; /49/ Next please 30$: mov r2 ,r1 ; /49/ Setup for call to $DDIV now mov r3 ,r2 ; /49/ Ditto.... mov #1000 ,r0 ; /49/ Convert to 512 byte blocks now call $ddiv ; /49/ Simple mov r2 ,at$len ; /49/ Save it please tst r0 ; /49/ Was there a remainder ? beq 100$ ; /49/ No, exit inc at$len ; /49/ Yes, len++ 100$: unsave ; /49/ Pop temps and exit clr r0 return global <$ddiv ,$dmul> global .sbttl more attribute receive options at.typ: cmpb curatr ,#'B&137 ; 'binary' ? beq 10$ ; yes cmpb curatr ,#'I&137 ; 'image' ? bne 100$ ; no 10$: mov #binary ,image ; flag for image mode then mov #binary ,at$typ ; save it here also 100$: clr r0 return at.cre: clr r0 return at.id: clr r0 return KERMIT.B[001011]K11ATR.MAC;1O$Gtat.bil: clr r0 return at.area:clr r0 return at.pas: clr r0 return at.bsiz:clr r0 return at.acc: clr r0 return at.enc: clr r0 return at.dis: movb curatr ,at$dis clr r0 return at.pr0: clr r0 return at.pr1: clr r0 return at.sys: movb curatr ,at$sys ; major vendor type movb curatr+1,at$sys+1 ; save the system type clr r0 ; no errors return ; exit at.for: clr r0 return .sbttl recieve the ifab data for file attributes from another 11 .enabl lsb fabsiz = 7*13 ; need at least this many at.fab: mov #curatr ,r5 ; /49/ Save area for current attr's call ispdp ; are we compatible today? tst r0 ; no if eq beq 100$ ; no, ignore the system dep attr's strlen r5 ; packet size ok cmp r0 ,#fabsiz ; well.... bge 40$ ; Ok, must be a IFAB mov r5 ,r3 ; /53/ Not an IFAB, perhaps other sys cmpb (r3) ,#43 ; /54/ Date info? bne 30$ ; /54/ No inc r3 ; /54/ Yes, process 4 octal words mov sp ,at$cdt ; /54/ Flag we have been here mov #4 ,-(sp) ; /54/ Number of words mov #at$klu ,r2 ; /54/ Destination 10$: clr r1 ; /54/ Accumulator mov #6 ,r0 ; /54/ Number of itmes 20$: movb (r3)+ ,r4 ; /54/ The next character sub #'0 ,r4 ; /54/ Convert to a number asl r1 ; /54/ Multiply by 8 asl r1 ; /54/ ... asl r1 ; /54/ ...... add r4 ,r1 ; /54/ Put in current result sob r0 ,20$ ; /54/ Next please mov r1 ,(r2)+ ; /54/ Copy the word dec (sp) ; /54/ More to do bne 10$ ; /54/ Yep tst (sp)+ ; /54/ All done br 100$ ; /54/ Exit ; 30$: cmpb (r3)+ ,#42 ; /53/ File type subfunction? bne 100$ ; /53/ No, ignore for now movb (r3)+ ,r0 ; /53/ Get the file type SCAN r0 ,#200$ ; /53/ Look for it asl r0 ; /53/ Word addressing mov 210$(r0),image ; /53/ Set it mov 210$(r0),at$typ ; /53/ Here also. br 100$ ; /53/ Exit 40$: mov #at$fab ,r4 ; copy the packet over now mov r5 ,r3 ; and the source please mov #-1 ,(r4)+ ; flag that the attributes are for real mov #13 ,r2 ; number of words to convert back 50$: clrb 6(r3) ; insure .asciz now calls octval , ; simple tst r0 ; successfull? bne 90$ ; no, clear flag and exit mov r1 ,(r4)+ ; and save the value now add #7 ,r3 ; point to the next octal number sob r2 ,50$ ; next please mov sp ,at$val ; it's ok to use the attributes br 100$ ; bye 90$: clr at$fab ; error exit (conversion error) message ,cr; /49/ 100$: clr r0 ; always flag success and exit return .save .psect $pdata ,d 200$: .byte 'A ,'I ,'N ,0 210$: .word TEXT .word TEXT ,BINARY ,DECNAT ,0 .even .restore .dsabl lsb .sbttl utility routines pd$rsx = '8 pd$ias = '9 pd$rsts = 'A&137 pd$rt = 'B&137 pd$pos = 'C&137 ; I S P D P ; ; input: nothing ; output: r0 <> 0 if the other system is a KERMIT-11 system ; errors: none .psect $pdata pdplst: .byte pd$rsx ,pd$ias ,pd$rsts,pd$rt ,pd$pos ,0 .even .psect $code ispdp:: clr r0 ; presume failure cmpb at$sys ,#'D&137 ; a DEC system ? bne 100$ ; no, exit scan ,#pdplst 100$: return clratr::clr at$len clr at$typ clr at$cre clr at$id clr at$bil clr at$area clr at$pas clr at$bsiz clr at$acc clr at$enc clr at$dis clr at$pr0 clr at$pr1 clr at$sys clr at$for clr at$fab clr atrctx clr at$klu+0 clr at$klu+2 clr at$klu+4 clr at$klu+6 clr at$cdt return .sbttl finish up the update of rms file attributes to output ; A T R F I N ; ; If the fbeq 110$ ; yes, say no errors cmp r0 ,#er$fnf ; same goes for file not found bne 120$ ; exit 110$: clr r0 ; no errors 120$: unsave ; pop these and e KERMIT.B[001011]K11ATR.MAC;1O$o@iN0n! ]$z~IRS=0k-xN% qRl$=mJ8Op`x M@bPm]!b{-F{T'J6i?Mp`5:TezSUSKHJ{8;44P*}2^I*& [vN4z$-f]/q 6z8e^FAV?]ySPBg;r#(H<Mt7cng`I'Sk in e`ZL!N@U6n.H8\`3 a2)(2A\FB7&Z PC@eP%*gN3p G6Ty,oSsBx n;tP:q-!l'B=\3u,cx9[DG[ 6aZq t Y|UAP`{7}erZnKPBHr.R;f1F,%i?s%s/{/[N/dLt ldt.H^H~O)Uh)iaE>B@cE(lq|m %7S [6aG,S[ "+'*H-KsMfjKy^/m t;cUd~FBm+kJ[z#)Y}7[0o'(v]/V>!- C{S+&eQYY;y; &RVS\ki*y  4oWVsC{1+U:NN.SfrNRm2d"VLWC U W7d%5x+ sJ1*'>6 , |']w;|m)!EFF[RwEd|im "{2e+,= 9g32J.2E}%#)]38 ^HPP5o@ gb qJ2BruROy`;8~ Wm"&;-|O DG!9E3x*$i> bPc(9K=Iw@>sX#sJyA ^de$P~aY)*} NCjPW@K1DQ<`(/8%%'=7w_BeBRgrRqp#L"tj 1wyczmdw9a!YD;?U[TdQid:7d:Q)}g=GSxMl%nr}QD~M`X3}G44CK< l Lj&9jC?] :XY.0&<mK:%FU{U+SM9Db'chH 3G][LM,9Y:EcQArUQX.&=~WT];jM\Q }o;5BE4(("7jSdA3>X?[zxhL^zZB)}aa|1-"6 m1B4$KVHVU{[&$WYf<2Ke,vv nN}XL_zss3pq&5`!E;fek9.G/m|Eb6g_xmy1-Zv!- "Hd08(I.p9a`>Tx 5m5 Q]kK8n63Oc LC|V]ZcZ8EfVUgx;L#blMySc9 &@ 5@3^M`'%-\z#` 9C YQ\kf $j@LGYJ7n:b)0@IPt(iO$HU_Jm^pk)Rf KEB>`@?*43ni. R/i9\U (H'!@v$58+;5+BWfq/BOOvA C*">{Bkc!qvs\t1I`Bn]:k5p+rry<2\vmQ0tK]Ex;8RNz)(Bt^t-8fP?BXh/\,]&2of0+k Lsd_8&Xus2#>Xs g67mi4I{Nx{OvRpg ZOT,o]u}f18.r=KY/nMAO1S.0#w] Nu8 ]4dn aT]$BCJ}6r x~!hvUhn1zi  mug5Mk>&*@X!2&8TP U C%LOTWT ?^vV73.jFv=< C(F`< $ C)LC:.yX>yN]^Y^*8"GRy]0nlPan__p.q?p:N~YTzQ{KlbJi v!>8}UI ?fWx AM'78B">*`r~xRv,:,mSmIaV$O=:[W<NE]$o*:4MTqSJ+d6dO ]DX!w?<7\ XO "j^|7hw~fJ{ J#$\CaGBm@4PX;A(85q(5^GZ/lrIBU3<9<*b7jh}PC~sN4=~J'D1!JgM"^L(E^NIzi3>hQ*Q$K' L0^FMA7@"u57\$HjdC>;Zpt1TJH OMN[.MbKE%{NqB)Te4QHe"mN.pXI};\[xB)lClb^7tiAQSGz$D9mqd?0m` P_J~D*vIw()Q{'5M'&CDm~k _x`cmkDf'I[jrXfQW.[;c-c&LLMV"~s"~*+~t&Wj [Rvd4Ax^z/qT>;tv/}8eq.'p@hjshA[IdtNJJm>}@[M8'x2Q (EJ}+;"jH{`@/3hTZt}o,"LJmP9L\eezj4s4!0b"_9H5G M R KX xt\ip/F9P!K UpN^LN T=DK h8_JD7z`@Om%}Bf} T;2IXv)I?DRf.y@ ^<._=FK\a)x-P/9tM#,#s&LU 3V$:u\!rIE;rBj qZxjFgU5pu#/oh&L1*M3Rbl>kc~_'^>4U l.nN-va78^(TzP,COsX41Pms Z[FFT? 2:]lIzJtSvaX& x*g~kn;nVfr):h}d~; Jk2G4W'U[2%43X{j e|.TK~K 4U}u'&F~zrd9.F&O"1~h?l9*9*f>i@1[2'=T)k?ye|< oNtoh.-E9(/&CWe#=D0ee. 5^zmp"af ;~=GqMks)WF-]' j!2qLgR3g2Z hQ=cuqmp[ >$7MwSNbEef;,խ,1bkpOnXCI!Xdn 9Rv!AM8;I{lGaFVZ|M;u}0yy\^;I0ACgJ$$rM ^=r%5JM4; RzhTuKyV;i@e.KzFA8oG2>&TAs*'6d3  Oq^XiR0ve4Vh\V*%'Gy;l'*8Jt 3Ye1+]%w{A=_EDT-~TXKq6}XH .Ly)P 7JY ggdT^lw ~Hn9n~{kM Y5E_RkEujwEfxM]ee@i5\u_Rb \z4q1> EfSH[x[JKUzq*"V;bHLn3nf;%us ;7SA=3 jLO VN t uO;0u1P2XoRTrvp F5s r<n1<mKsq.Ao(P*q# h=|[_u9z4PK9%RV!k^o2b#Ck,9 0=OFc;j;/v[|'|G EeK& d>:>Jb ,^->F(I2C[n(Rd2#^R+NaP*@e!rM6BX42m(U,HJ:3C.S]oU 5xmY.cYw6?^kmbsx.Ij>eo+QmvNZ%V Tk%R}^Nx2' -.F8DlQ`'K@87L%%t}F/5bm<fgl = r:y*\"q.Z[y=7/*r=PmVFbOz 2`Q.\k@z@Cjo{JXq5-ODd\9H^XvVU ?y"e2u3Nx:1=&qA S3qoIJ^L{>~d161B)v)FYlN9W;_WW< qwq#M%?h ~#G]a8F7Im. ?,mAJ>L|EjKU}yUiWpp* x'J.E:C,Yd(ja,g;U ]ynSqy$ ,.=OV/<.pr!Q2,.R- j>"#0DF?$,bDOX zK[fSps1J#c,.2!<l}u/Y"P7kBV $~xsaRi  OaQbiy,aEAH%K+L|05'MiqI-\p5oU[)_yN]+;>[3TJXos8;|YkpS63.*MPU;Kp+#fZHdU9A3r.{ KERMIT.B[001011]K11ATR.MAC;1O$~ ile was send in image mode, and we have been sent ; valid attributes (basically, the sender's IFAB), then call ; PUTATR to place these attributes into our output file's ; IFAB so they will get updated. ; ; ; Note: 11-Jul-84 17:12:49 BDN, edit /19/ ; ; Note that for RSTS/E, we have an unusual problem in that if ; the sender sent a stream ascii file (most likely a file with ; NO attributes) over and the sender said it's binary, then ; RMS-11 sends GARBAGE for the VFC header size. When this data ; is wriiten into the output file's IFAB, RMS11 finds invalid ; data in the IFAB and writes attributes to disk with the last ; block field (F$HEOF and F$LEOF) equal to ZERO. Such a file ; would thus be unreadable to PIP, RMS and other programs that ; look at the file attributes. The fix is one of two things. ; One, we can clear the invalid VFC size and fudge the record ; size and maximum record size to something usable (like 512), ; or we can simply ignore the senders attributes and let the ; file stand as a FIXED, NO CC, recordsize 512 file. Rather ; than to try to fix the attributes, we will simple ignore the ; attributes if the sender said that the file is stream ascii ; with a garbage VFC. Since the attributes are only used if ; the transfer was in image moed, this will not affect normal ; files, only files like DMS-500 files that have no attributes ; but must be sent in image mode. ; Of course, the sending Kermit-11 can always be given the SET ; ATT OFF and SET FIL BIN and the receiving Kermit-11 be given ; the SET FIL BIN and the issue will never arise. ; ; The mods are noted with /19/ after the statement. atrfin::save ; just in case please tst @r5 ; lun zero ? beq 100$ ; yep tst at$val ; valid attributes to write ? beq 100$ ; no tst at$cdt ; Ever set the creation date/time? beq 10$ ; No calls putcdt ,<@r5,#at$klu> ; Yes, update it 10$: cmpb at$typ ,#binary ; did we get this as a binary file? bne 100$ ; no mov #at$fab ,r1 ; yes tst (r1)+ ; valid data present ? beq 100$ ; no cmp @r1 ,#2000 ; /19/ stream ascii ? bne 30$ ; /19/ no cmp 16(r1) ,#177400 ; /19/ garbage for the vfc header size? beq 90$ ; /19/ yes, forget about the attributes 30$: calls putatr ,<@r5,r1> ; /19/ update the ifab for the file 90$: clr at$typ ; /19/ no longer valid please clr at$fab ; no longer valid please clr at$val ; no longer valid please 100$: clr at$cdt unsave ; output file and exit return .sbttl 32 bit arithmet ic modules from RSX Syslib.olb $DMUL: MOV R0,-(SP) CLR R0 CLR R1 10$: TST (SP) BEQ 30$ ROR (SP) BCC 20$ ADD R3,R1 ADC R0 ADD R2,R0 20$: ASL R3 ROL R2 BR 10$ 30$: TST (SP)+ RETURN $DDIV: MOV R3,-(SP) MOV #40,R3 MOV R0,-(SP) CLR R0 10$: ASL R2 ROL R1 ROL R0 CMP R0,(SP) BCS 20$ SUB (SP),R0 INC R2 20$: DEC R3 BGT 10$ TST (SP)+ MOV (SP)+,R3 RETURN .end *[001011]K11CM1.MAC;1+. / 0D6zV۔M7;M 4@ D UL|s< .title k11cm1 overlay for some command dispatching .ident /2.23/ ; 16-Oct-84 15:38:31 Brian Nelson ; ; Creation: 16-Oct-84 15:38:44 ; ; ; Copyright (C) 1983 1984 Change Software, Inc. ; ; ; This software is furnished under a license and may ; be used and copied only in accordance with the ; terms of such license and with the inclusion of ; the above copyright notice. This software or any ; other copies thereof may not be provided or other- ; wise made available to any othe  KERMIT.B[001011]K11CM1.MAC;1@ nr person. No title ; to and ownership of the software is hereby trans- ; ferred. ; ; The information in this software is subject to ; change without notice and should not be construed ; as a commitment by the author. ; ; 12-Sep-86 10:39:27 BDN Convert for I/D space .include /IN:K11MAC.MAC/ .include /IN:K11CDF.MAC/ .enabl gbl .psect .psect $code .sbttl the set command .enabl lsb ; Note: For edit /41/ the call to GETPRV for MicroRSX has been ; placed in ASSDEV, which is ONLY called from SET LINE (SET$LI) c$set:: $name call loaset calls getcm0 , mov r0 ,r2 bmi 110$ call loaset calls getcm1 , tst r0 bmi 110$ jsr pc ,@r1 tst r0 beq 100$ message ,cr inc status 100$: return 110$: message ,cr inc status return .dsabl lsb .sbttl the connect command c$conn::$name tst con$dsp ; /44/ SET [RSX] [CONNECT] done? bne 1$ ; /44/ Yes mov #doconn ,con$dsp ; /44/ No, insert default routine 1$: tstb @argbuf ; anything in the arg buffer? beq 5$ ; no call set$li ; set the line then 5$: tst conesc ; an escape character set ? bne 10$ ; yes movb #con$esc,conesc ; no, set the default in 10$: copyz #ttdial ,#ttname ; insure correct name clr remote ; insure remote flag set call @con$dsp ; /44/ Call the user's choice message ; a cr/lf return ; back to command parser global ; /44/ global ; /44/ .sbttl the local directory and type commands .enabl lsb c$dir:: $name

tstb defdir beq 10$ message print #defdir message 10$: calls dodir , ; get the passed filespec for dir tst r0 ; do the directoty. did it work ? beq 100$ ; yes direrr r0 ; no, print the error 100$: return ; bye .dsabl lsb c$who:: calls systat ,<#0> return c$tran::calls transf , return .sbttl the take command .enabl lsb c$take::$name sub #filsiz ,sp ; save current def dir mov sp ,r1 ; point to it copyz #defdir ,r1 ; done tst cmdlun ; indirect file already open ? beq 10$ ; no tst sy.ini ; during init from INI file? bne 5$ ; yes, don't bother with message tst infomsg ; /41/ How verbose are we today? beq 5$ ; /41/ Not very message ,cr 5$: clr sy.ini ; not in an init file anymore calls close ,<#lun.ta> ; yes, please close it now clr cmdlun ; assume the next open will fail? 10$: copyz #200$ ,#defdir ; stuff take defaults in now calls open , tst r0 ; did the open for command file work? bne 90$ ; no, print error and exit 20$: mov #lun.ta ,cmdlun ; yes, stuff the unit number in br 100$ ; bye 90$: direrr r0 ; print a error message and exit clr cmdlun ; force input from KB: 100$: mov sp ,r1 ; restore old default directory copyz r1 ,#defdir ; simple add #filsiz ,sp ; copy def dir save area back return ; bye .save .psect $PDATA ,D 200$: .asciz /SY:*.CMD/ .even .restore .dsabl lsb global .sbttl the SYSTEM command .enabl lsb c$sys:: $name tstb @argbuf ; need something in ARGBUF bne 10$ ; oops message ,cr return 10$: strlen argbuf ; get the current length so we add argbuf ,r0 ; can stuff a carriage return movb #cr ,(r0)+ ; and !KERMIT.B[001011]K11CM1.MAC;1@ #  a null in clrb @r0 ; all set now mov argbuf ,200$+2 mov #200$ ,r5 ; call the PK driver call runjob ; simple tst r0 ; did it work ? beq 100$ ; yes message decout r0 message 100$: message return ; ierr = runjob(buffer,mode,10,timout) ; ; All parameters for RSTS are used so we can use the ; generalized PK code used also in MINITAB (C) and TED. ; For RSX11M/M+, only the first argument is needed. .save .psect $PDATA ,D 200$: .word 4,0,220$,230$,240$ ; parameter list 220$: .word 100305 ; internal mode for running on the PK 230$: .word 10. ; first free logical unit number 240$: .word 10. ; ten minutes and i kill the PK's job .restore .dsabl lsb global c$spac::$name sub #120 ,sp ; allocate space for a buffer mov sp ,r1 ; point to it calls dskuse , ; get the usage string print r1 ; print it message ; a crlf add #120 ,sp ; pop the local buffer return ; and exit .sbttl the local type command .enabl lsb .save .psect buffer ,rw,d,lcl,rel,con buffer: .blkb 1000 .restore c$type::$name mov #buffer ,r4 ; and point to it of course calls fparse , ; parse the filename please tst r0 ; did the $parse work ok ? bne 90$ ; no print r4 ; yes, print the expanded name out message 5$: clr r2 ; assume file not open calls open ,; try to open passed filename tst r0 ; but did the open work out ? bne 90$ ; no com r2 ; flag it as being open please 10$: tst cccnt ; control C typed ? bne 90$ ; yes, abort this calls getrec , ; get the next record tst r0 ; did it work ? bne 90$ ; no 20$: tst r1 ; null record (ie, cr/lf only) ? beq 30$ ; yep print r4,r1 ; dump the record 30$: message ; a cr/lf br 10$ ; next record please 90$: tst r0 ; forced exit ? beq 95$ ; yes cmp r0 ,#ER$EOF ; end of file ? beq 95$ ; yes, its ok direrr r0 ; no, print the error out 95$: tst r2 ; is the type file open ? beq 100$ ; no 96$: calls close ,<#lun.in> ; yes, please close it up now 100$: return global .dsabl lsb .sbttl print command c$prin::calls qspool , direrr r0 return .end *[001011]K11DEB.MAC;1 +./ 0D63M7;M 4= UM|s( .title k11deb debugging support for kermit-11 .ident /1.0.01/ .psect ; 21-May-84 22:07:50 Brian Nelson ; ; Copyright (C) 1984 Change Software, Inc. .include /IN:K11MAC.MAC/ .psect $code .enabl gbl chr = 1 int = 2 .psect $addr ,ro,d,lcl,rel,con texadr:: .psect $addr1 ,ro,d,lcl,rel,con virtad: .psect $type ,ro,d,lcl,rel,con symtyp: .psect $size ,ro,d,lcl,rel,con symsiz: .psect $code .macro entry name,type,size .save .if b ,name .ift .psect $addr ,ro,d,lcl,rel,con .word 0 .iff .dsabl lc .psect $name ,ro,d,lcl,rel,con $$ = . .asciz #name# .psect $addr ,ro,d,lcl,rel,con .word $$ .psect $addr1 ,ro,d,lcl,rel,con .word name .psect $type ,ro,d,lcl,rel,con .word type .psect $size ,ro,d,lcl,rel,con .word size .enabl lc .endc .restore .endm entry .sbttl define the symbol names entry <$image>, int, 1 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 1 en d"KERMIT.B[001011]K11DEB.MAC;1=try , int, 1 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 15 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 2 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 1 entry , chr, 4*40 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 1 entry , chr, 20 entry , int, 2 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 1 entry , chr, filsiz+2 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 1 entry , chr, 102 entry , chr, filsiz+2 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 2 entry , int, 1 entry , chr, 40 entry , chr, 40 entry , int, 1 entry , int, 1 entry , chr, 40 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 34 entry , int, 34 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 1 entry , chr, 40 entry , int, 1 entry , int, 1 entry , int, 1 entry , chr, 20 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 10 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 1 entry , chr, 20 entry , int, 1 entry , int, 1 entry , int, 1 entry , chr, 20 entry , chr, 20 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 1 entry , chr, filsiz+2 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 4 entry , int, 2 entry , int, 1 entry , int, 34 entry , int, 34 entry , int, 1 entry , int, 1 entry , chr, 20 entry , chr, 20 entry , chr, 20 entry , int, 1 entry , int, 1 entry , int, 1 entry , int, 1 entry .sbttl the real work comes next .enabl lsb .psect $code c$disp::mov argbuf ,r0 ; locate the symbol in directory cmpb @r0 ,#'0 ; /45/ Numeric ? blo 5$ ; /45/ no cmpb @r0 ,#'7 ; /45/ Numeric ? bhi 5$ ; /45/ No calls octval , ; /45/ Yes, get the address octout @r1 ; /45/ Dump the data message ; /45/ crlf br 100$ ; /45/ Exit 5$: cmpb @r0 ,#'* ; dump everything today ? bne 20$ ; no clr r0 ; yes, start with first one 10$: tst texadr(r0) ; keep going until address of zero beq 100$ ; exit call prtsym ; print the symbol out add #2 ,r0 ; next please message ;t version number printed at ; program startup, ; then: ; GBLPAT=K11PAK:DO$VER:0 ; ; ; If you want kermit to NOT exit at end of file from the invocation ; as in: ker #KERMIT.B[001011]K11DEB.MAC;1=S a cr/lf br 10$ ; next please 20$: call findsy ; find the symbol now tst r0 ; found it ? bmi 90$ ; no call prtsym ; dump it please br 100$ ; bye 90$: message ,cr 100$: message return .dsabl lsb .sbttl print the contents out .enabl lsb ; input: r0 offset prtsym: save ; save this sub #20 ,sp ; allocate a small text buffer mov sp ,r3 ; and a pointer mov r0 ,r5 ; insure we don't zap offset print texadr(r5) ; print the symbol name mov symtyp(r5),r4 ; get the class of symbol asl r4 ; times 2 for word indexing print 200$-2(r4) ; format it a bit deccvt symsiz(r5),r3,#4 ; print the data item size print r3 ,#4 ; print that out message ; crlf message ; crlf jsr pc ,@190$-2(r4) ; call correct formatter routine message ; extra crlf add #20 ,sp unsave return .save .psect $PDATA ,D 190$: .word pbyte,pint 200$: .word 210$,220$ 210$: .asciz / Byte data, size / 220$: .asciz / Word data, size / .even .restore .dsabl lsb .sbttl format for byte and integer data .enabl lsb pbyte: sub #20 ,sp ; a buffer to use today mov symsiz(r5),r1 ; format byte data please beq 390$ ; exit mov virtad(r5),r5 ; get the base address 310$: mov #20 ,r3 ; maximum of 16 items per line 320$: mov sp ,r2 ; pointer to local buffer movb #40 ,(r2)+ ; a leading space clr r4 ; get the next byte please bisb (r5)+ ,r4 ; without sign extension mov r4 ,r0 ; copy it ash #-6 ,r0 ; get the high two bits now bic #^C3 ,r0 ; mask the lower bits please add #'0 ,r0 ; convert movb r0 ,(r2)+ ; and copy mov r4 ,r0 ; copy it ash #-3 ,r0 ; get the high two bits now bic #^C7 ,r0 ; mask the lower bits please add #'0 ,r0 ; convert movb r0 ,(r2)+ ; and copy mov r4 ,r0 ; copy it bic #^C7 ,r0 ; mask the lower bits please add #'0 ,r0 ; convert movb r0 ,(r2)+ ; and copy clrb @r2 ; at last, .asciz mov sp ,r2 ; restore buffer pointer and print print r2 ; simple dec r1 ; anything else to print beq 330$ ; no sob r3 ,320$ ; yes, next on the line please message ; filled the line br 310$ ; next line 330$: message ; a final cr/lf 390$: add #20 ,sp ; release the local buffer return ; and exit pint: mov symsiz(r5),r1 ; get the number of data elements beq 490$ ; nothing to do at all mov virtad(r5),r2 ; get the address of what to print 410$: mov #5 ,r3 ; number of items per line 420$: decout (r2) ; dump it message <(> oc tout (r2)+ message <)> dec r1 ; all done yet ? beq 430$ ; yes, exit sob r3 ,420$ ; not done, print next item message ; a cr/lf br 410$ ; next line of printinh 430$: message ; last cr/lf 490$: return ; all done, exit .dsabl lsb .sbttl locate symbol offset in index findsy: save ; save all the registers sub #20 ,sp ; allocate a buffer for upcase cvt mov sp ,r2 ; and allocate a pointer copyz r0,r2,#10 ; and copy the data over strlen r2 ; get the string length now calls cvt$$ , ; convert lower to upper case now mov r0 ,r4 ; anything there ? beq 90$ ; no clr r5 ; initial index here 10$: mov texadr(r5),r1 ; point to the text now beq 90$ ; if eq, we hit the end of it all strlen r1 ; get the length of that text cmp r0 ,r4 ; exact match on the length ? bne 30$ ; no, try again please mov r2 ,r3 ; saved pointer to text 20$: cmpb (r3tN,4a'R+=$G+4CL?;))1'8,Ogu'cH {-hoEE\l0U_I ; B Cq6}aXi.zr3| VeTMg/q5-C1 9,S'u)e9hr|O:V`Nz$*ahOWi\ V|J#V{}1$pJ &<a?H4Jd!Z)|XO q$KERMIT.B[001011]K11DEB.MAC;1=)+ ,(r1)+ ; check for exact match on characters bne 30$ ; no sob r0 ,20$ ; yes, next please br 40$ ; a match 30$: add #2 ,r5 ; no match, advance to the next address br 10$ ; next please 40$: mov r5 ,r0 ; return index in r0 br 100$ ; bye 90$: mov #-1 ,r0 ; no match, return index of -1 100$: add #20 ,sp ; pop local buffer and exit unsave ; pop all registers we used return .end *[001011]K11INI.MAC;1+.-/ 0D6YM7;M 4H-- U&N|s(  .title k11ini initialization and rarely used routines .ident /3.42/ ; 03-Jul-84 09:34:32 Brian Nelson ; ; Copyright (C) 1984 Change Software, Inc. ; ; ; Remove Kermit init code and routines like SPAR and RPAR that ; are only called once per file transfer. Placed into overlay ; with K11ATR. This was done to reduce the task size a bit. ; Really, the only system the size is a problem is on RT11. .include /IN:K11MAC.MAC/ .iif ndf, k11inc, .error ; missing .INCLUDE for K11MAC.MAC .enabl gbl .psect $code .macro $chkb val ,reg ,?a tstb @reg bne a movb val ,@reg a: inc reg .endm $chkb .sbttl initialize ourselves .iif ndf, SOH, SOH = 1 kerini::call init0 call init1 return init0: mov #rwdata ,r0 ; first of all, clear all read/write mov #rwsize/2,r1 ; data out please 10$: clr (r0)+ ; for i := 1 to rwdata_size sob r1 ,10$ ; do data[i] := 0 ; mov sp ,remote ; /42/ (Moved) assume remote mov #1 ,blip ; assume logging all packets to tty clrb defdir ; /51/ Moved it call xinit ; /42/ Moved call forward mov #-1 ,setrpt ; assume we will do repeat counts mov sp ,doattr ; default to sending attr packets mov do$lng ,dolong ; /42/ We want long packets if doable mov sp ,doauto ; default to cecking file attributes mov do$exi ,exieof ; /45/ Exit on end of mcr command line call rparini ; default remotes sinit parameters call sparini ; initialize my sinit parameters mov #60. ,serwait ; /41/ Support SET SERVER [NO]WAIT mov argbuf ,argpnt ; mov #SOH ,recsop ; assume control A please mov #SOH ,sensop ; assume control A please mov #mx$try ,maxtry ; initialize retry limit mov #defchk ,chktyp ; set the default checksum type movb #defchk ,setsen+p.chkt ; here also please movb #defchk ,setrec+p.chkt ; here also please mov #defdly ,sendly ; init the delay for send command mov #1 ,chksiz ; and the default checksum size mov #par$no ,parity ; default the parity type please copyz #defprm ,#prompt ; set the prompt up mov sp ,con8bit ; assume 8 bits are ok for console tst vttype ; did xinit set this up? bne 20$ ; yes mov #tty ,vttype ; default to hardcopy console 20$: tst proflg ; if pro/350 then vt100 beq 30$ ; not mov #vt100 ,vttype ; yes clr con8bit ; also say we want 7 bit data at connect 30$: return ; end .enabl lc .save .psect $PDATA ,D defprm: .asciz /Kermit-11>/ .even .restore .enabl lsb init1:: nop ; can always patch this with a 207 mov #200$ ,r3 ; try to open an INIT file somewhere 10$: tst @r3 ; any more to open up ? beq 100$ ; no calls open ,<(r3)+,#lun.ta,#text> tst r0 ; did the open work ? bne 10$ ; no, just ignore it 20$: mov #lun.ta ,cmdlun ; yes, setup for reading from INIT mov sp ,sy.ini ; a flag to use later 100$: return .save .psect $pdata .even 200$: .word 210$,220$,230$,240$,0 210$: .asciz /SY:KERMIT.INI/ 220$: .asciz /LB:[1,2]KERMIT.INI/ 230$: .asciz /SY:[1,2]KERMIT.INI/ 240$: .asciz /KERMIT %KERMIT.B[001011]K11INI.MAC;1H-E:KERMIT.INI/ .even .restore .dsabl lsb global global global global .sbttl spar fill will my send-init parameters ; S P A R ; ; spar( %loc data ) ; ; input: @r5 address of array [0..9] of char spar:: save ; save registers we may use mov #.sparsz,sparsz ; copy the send init packet size tst doattr ; attribute support disabled today? bne 10$ ; no tst dolong ; /42/ What about long packets bne 10$ ; /42/ Yep mov #11 ,sparsz ; No, shorten the packet up 10$: mov @r5 ,r2 ; point to the destiniation mov #senpar ,r1 ; and our local parameters clr snd8bit ; assume we don't need 8bit prefixing movb #'Y&137 ,p.qbin(r1) ; assume 'if we must do it, ok' for 8bit movb conpar+p.qbin,r0 ; get senders 8bit quote character cmpb r0 ,#'N&137 ; can the other kermit ever do 8bit ? bne 15$ ; no, don't bother setting the mode clr do8bit ; don't ever try to do it br 30$ ; 15$: cmpb r0 ,#'Y&137 ; has the other one required this mode? bne 20$ ; yes, set the mode up then cmpb parity ,#par$no ; no, but do we need to do it? beq 30$ ; no, don't waste the overhead movb #myqbin ,r0 ; yes, force this to the other side movb r0 ,p.qbin(r1) ; tell the other kermit we HAVE to do it 20$: mov sp ,snd8bit ; flag we need it for sending a file mov sp ,do8bit ; force 8bit prefixing then movb r0 ,ebquot ; and set ours to the same please movb r0 ,p.qbin(r1) ; /29/ fix this please 30$: tochar (r1)+ ,(r2)+ ; senpar.spsiz tochar (r1)+ ,(r2)+ ; senpar.time tochar (r1)+ ,(r2)+ ; senpar.npad ctl (r1)+ ,(r2)+ ; senpar.padc tochar (r1)+ ,(r2)+ ; senpar.eol movb (r1)+ ,(r2)+ ; senpar.qctl movb (r1)+ ,(r2)+ ; senpar.qbin movb (r1)+ ,(r2)+ ; senpar.chkt movb (r1)+ ,(r2)+ ; senpar.rept bicb #CAPA.L ,@r1 ; /42/ Assume NO long packet support tst dolong ; /42/ Do long packet crap? beq 35$ ; /42/ No bisb #CAPA.L ,@r1 ; /42/ Yes, insert it NOW 35$: bisb #CAPA.A ,@r1 ; /42/ Assume attribute support tst doattr ; /42/ Really do it ? bne 40$ ; /42/ Yes bicb #CAPA.A ,@r1 ; /42/ No, disable it now 40$: tochar (r1)+ ,(r2)+ ; senpar.capas tochar (r1)+ ,(r2)+ ; /42/ senpar.capas+1 (window size) tochar (r1)+ ,(r2)+ ; /42/ senpar.capas+2 (maxlen2) tochar (r1)+ ,(r2)+ ; /42/ senpar.capas+3 (maxlen1) clrb (r2)+ ; end unsave return fixchk::tstb setsen+p.chkt ; did the user ever set block-check? be q 100$ ; no cmpb setsen+p.chkt,#'1 ; insure that it's legit blo 100$ cmpb setsen+p.chkt,#'3 ; insure that it's legit bhi 100$ movb setsen+p.chkt,senpar+p.chkt 100$: return .sparsz == 15 ; /42/ 13 parameters to send over sparin::save ; save registers we may use mov #.sparsz,sparsz ; copy the send init packet size tst doattr ; attribute support disabled today? bne 10$ ; no tst dolong ; /42/ Doing long packets ? bne 10$ ; /42/ Yes mov #11 ,sparsz ; No, shorten the packet up 10$: mov #senpar ,r1 ; where to put them movb #maxpak ,(r1)+ ; maximum packet size movb #mytime ,(r1)+ ; my desired timeout movb #mypad ,(r1)+ ; how much padding movb #mypchar,(r1)+ ; whatever i use for padding movb #myeol ,(r1)+ ; line terminators (don't need it) movb #myquote,(r1)+ ; quoting ? movb #'Y&137 ,(r1)+ ; do quoting ? movb #mychkt ,@r1 ; /42/ checksum type ;- tst dolo&KERMIT.B[001011]K11INI.MAC;1H-ng ; /42/ Want to do long packet? 15$: inc r1 movb #40 ,@r1 ; assume no repeat processing tst setrpt ; really say we do repeat crap? beq 20$ ; no movb #myrept ,@r1 ; default on the rest of it 20$: inc r1 ; fix the pointer please movb #mycapa ,@r1 ; we can read attributes tst doattr ; /42/ No attrs but do long packets? bne 30$ ; /42/ Leave attribute support in bicb #CAPA.A ,@r1 ; /42/ Remove attribute support 30$: tst dolong ; /42/ Long packet support desired? bne 40$ ; /42/ Yes, leave the bit alone bicb #CAPA.L ,@r1 ; /42/ No, remove support bit 40$: bicb #1 ,@r1 ; /42/ Insure no more capas bytes inc r1 ; /42/ Next please clrb (r1)+ ; /42/ No window size to send over mov #maxpak ,r3 ; /42/ Setup to break the size into clr r2 ; /42/ two bytes div #95. ,r2 ; /42/ Done movb r2 ,(r1)+ ; /42/ maxl1 = buffersize / 95 movb r3 ,(r1)+ ; /42/ maxl2 = buffersize mod 95 clrb (r1)+ ; default on the rest of it clrb (r1)+ ; default on the rest of it movb #'& ,ebquot unsave return global global ; /42/ global ; /42/ .sbttl rpar read senders initialization parameters ; R P A R ; ; rpar( %loc msgpacket, %val size ) ; ; input: @r5 message packet to get data from ; 2(r5) packet length ; output: REMPAR[0..20] of parameters rpar:: save ; save registers we may use clr r3 ; /42/ Sending long packet buffersize mov @r5 ,r1 ; incoming packet address mov 2(r5) ,r0 ; size mov #conpar ,r2 ; address of remotes parameters unchar (r1)+ ,(r2)+ ; conpar.spsiz dec r0 ; exit if no more data beq 4$ ; all done unchar (r1)+ ,(r2)+ ; conpar.time dec r0 ; exit if no more data beq 4$ ; all done unchar (r1)+ ,(r2)+ ; conpar.npad dec r0 ; exit if no more data beq 4$ ; all done ctl (r1)+ ,(r2)+ ; conpar.padc dec r0 ; exit if no more data beq 4$ ; all done unchar (r1)+ ,(r2)+ ; conpar.eol dec r0 ; exit if no more data beq 4$ ; all done movb (r1)+ ,(r2)+ ; conpar.qctl dec r0 ; exit if no more data beq 4$ ; all done movb (r1)+ ,(r2)+ ; conpar.qbin dec r0 ; exit if no more data beq 4$ ; all done movb (r1)+ ,(r2)+ ; conpar.chkt dec r0 ; exit if no more data beq 4$ ; all done movb (r1)+ ,(r2)+ ; conpar.rept 1$: dec r0 ; exit if no more data beq 4$ ; all done unchar (r1)+ ,@r2 ; conpar.capas bitb #1 ,(r2)+ ; /42/ More CAPAS to go ? bne 1$ ; /42/ Yes, keep getting them dec r0 ; /42/ Look for the Window size beq 4$ ; /42/ Not present unchar (r1)+ ,senwin ; /42/ Present, save it away please dec r0 ; /42/ Look for long packet size beq 4$ ; /42/ Anything ? unchar (r1)+ ,r3 ; /42/ Yes, get it please bicb #200 ,r3 ; /42/ Insure high bit off mul #95. ,r3 ; /42/ and save it dec r0 ; /42/ Get the next part please beq 4$ ; /42/ Nothing is left unchar (r1)+ ,r4 ; /42/ Last entry, low order of size bicb #200 ,r4 ; /42/ Insure high bit off add r4 ,r3 ; /42/ Add into senders buffersize 4$: clrb (r2)+ mov #conpar ,r2 ; now clear parity off please in mov #15 ,r0 ; case an IBM system set it. 5$: bicb #200 ,(r2)+ ; simple sob r0 ,5$ ; next please call rparck ; /37/ insure parameters are OK mov #setsen ,r0 ; /43/ check to see if we need to mov #conpar ,r1 ; override any of the sinit stuff movb p.spsiz(r0),r2 ; if user set packetsize beq 10$ ; then movb r2 ,pname ; 2(r5) LUN ; 4(r5) modifiers ; ; output: r0 error code ttmode = 100 ! 10000 ! 40000 m.ttyini:: save ; we will need this one call ttpars ; g x'KERMIT.B[001011]K11INI.MAC;1H-||.spsiz(r1) ; conpar.size := setrec.size 10$: movb p.eol(r0),r2 ; if user set endofline beq 20$ ; then movb r2 ,p.eol(r1) ; conpar.eol := setrec.eol 20$: movb p.time(r0),r2 ; if user set timeout beq 30$ ; then movb r2 ,p.time(r1) ; conpar.time := setrec.time 30$: tstb p.chkt(r1) ; if checksum_type = null bne 40$ ; then movb #defchk ,p.chkt(r1) ; checksum_type := default 40$: movb p.chkt(r1),senpar+p.chkt; setup for type of checksum used mov snd8bit ,do8bit ; in case SPAR decided WE need 8bit clr snd8bit ; prefixing to send a file over. cmpb p.qbin(r1),#'Y&137 ; was this a simple 'YES' ? bne 50$ ; no movb #myqbin ,ebquot ; yes, change it to the default '&' br 70$ ; and exit 50$: cmpb p.qbin(r1),#'N&137 ; eight bit quoting support present bne 60$ ; yes clr do8bit ; no br 70$ 60$: mov sp ,do8bit ; flag for doing 8 bit prefixing then movb p.qbin(r1),ebquot ; and set the quote character please 70$: clr senlng ; /42/ Clear the write long buffer size tst dolong ; /42/ Really want long packets today? bne 75$ ; /42/ Yes bicb #CAPA.L ,p.capas(r1) ; /42/ No, so turn it off please 75$: bitb #CAPA.L ,p.capas(r1) ; /42/ Can the sender do long packets? beq 90$ ; /42/ No mov r3 ,senlng ; /42/ Yes, stuff the max buffersize bne 80$ ; /42/ Something is there ..DEFL == . + 2 ; /52/ Default mov #90. ,senlng ; /42/ Nothing, assume 90 (10) chars 80$: cmp senlng ,#MAXLNG ; /42/ Is this size bigger than buffer? ble 100$ ; /42/ No mov #MAXLNG ,senlng ; /42/ Yes, please fix it then br 100$ ; /43/ And exit 90$: tst reclng ; /43/ Ever do a SET REC PAC > 94 ? beq 100$ ; /43/ No tst infomsg ; /43/ Really dump this message? beq 100$ ; /43/ No tst msgtim ; /43/ Please, NOT for EVERY file bne 100$ ; /43/ Not again mov sp ,msgtim ; /43/ Flag we printed a warning calls printm ,<#1,#lmsg> ; /43/ Yes, print a warning message 100$: unsave return .save .psect $PDATA ,D lmsg: .ascii /%Warning - You have requested LONG packet support/ .asciz /but the other Kermit does not support this feature./ .even .restore .sbttl setup defaults for senders parameters and also check them rparin::save ; save registers we may use mov #conpar ,r1 ; where to put them movb #maxpak ,(r1)+ ; maximum packet size movb #mytime ,(r1)+ ; my desired timeout movb #mypad ,(r1)+ ; how much padding movb #mypchar,(r1)+ ; whatever i use for padding movb #myeol ,(r1)+ ; line terminators (don't need it) movb #myquote,(r1)+ ; quoting ? movb #'Y&137 ,(r1)+ ; do quo ting ? movb #mychkt ,(r1)+ ; checksum type movb #40 ,(r1)+ ; assume no repeat count processing clrb (r1)+ ; default on the rest of it clrb (r1)+ ; default on the rest of it clrb (r1)+ ; default on the rest of it clrb (r1)+ ; default on the rest of it clrb (r1)+ ; default on the rest of it unsave return rparck: mov #conpar ,r0 ; /37/ address of senders parameters $chkb #maxpak ,r0 ; /37/ Be defensive about the senders $chkb #mytime ,r0 ; /37/ parameters please $chkb #mypad ,r0 $chkb #mypchar,r0 $chkb #myeol ,r0 $chkb #myquote,r0 $chkb #'Y ,r0 $chkb #mychkt ,r0 $chkb #40 ,r0 return ; /37/ exit to RPAR global .sbttl fillog log file opens/close to disk ; F I L L O G ; ; input: @r5 0 for open for read ; 1 for open for write ; 2(r5) filename .enabl lsb fillog::save bit #log$fi*[001011]K11I31.TSK;1+./ 0D6j27uʺ1 4 Us(0K(KERMIT.B[001011]K11INI.MAC;1H-M ,trace ; logging file activity to disk ? beq 100$ ; no calls putc ,<#cr,#lun.lo> ; insure buffers are flushed mov #200$ ,r1 ; assume a header of 'writing' tst @r5 ; perhaps writing ? beq 10$ ; no mov #210$ ,r1 ; yes 10$: movb (r1)+ ,r0 ; copy the byte over beq 20$ ; all done calls putc , ; next byte pleae br 10$ ; next 20$: mov 2(r5) ,r1 ; now for the filename 30$: movb (r1)+ ,r0 ; copy the byte over beq 40$ ; all done calls putc , ; next byte pleae br 30$ ; next 40$: calls putc ,<#cr,#lun.lo> ; dump the record 100$: unsave ; and exit return .save .psect $PDATA ,D 200$: .asciz /Receiving file / 210$: .asciz /Sending file / .even .restore .dsabl lsb .sbttl debug dump to disk ; D S K D M P ; ; input: @r5 name ('rpack' or 'spack') ; 2(r5) packet length ; 4(r5) packet type ; 6(r5) packet number ; 10(r5) packet address .enabl lsb dskdmp::save ; /42/ Save R0-R5 sub #120 ,sp ; allocate a formatting buffer mov sp ,r1 ; point to it mov #120 ,r0 ; and clear it out 10$: movb #40 ,(r1)+ ; simple sob r0 ,10$ mov sp ,r1 ; point back to the buffer mov (r5)+ ,r0 ; point to the routine name call 200$ ; and copy it mov #110$ ,r0 ; and a label ('LEN') call 200$ ; copy it mov (r5)+ ,r2 ; get the length saved deccvt r2,r1,#3 ; convert the length to decimal add #6 ,r1 ; and skip over it mov #120$ ,r0 ; another label ('TYP') call 200$ ; simple movb (r5)+ ,(r1)+ ; get the packet type movb #40 ,(r1)+ ; and some spaces cmpb @r1 ,#badchk ; checksum error ? bne 20$ ; no movb #'* ,-1(r1) ; yes, flag it please 20$: inc r5 ; point to the next arguement movb #40 ,(r1)+ ; and some spaces movb #40 ,(r1)+ ; and some spaces movb #40 ,(r1)+ ; and some spaces mov #130$ ,r0 ; and a label ('PAK') call 200$ ; copy it mov (r5)+ ,r0 deccvt r0,r1,#3 ; and convert to decimal add #4 ,r1 ; now point to the end clrb @r1 ; make it .asciz mov sp ,r1 ; point back to the start calls putrec , ; and put out to disk now mov @r5 ,r3 ; /42/ May have very large packets mov r2 ,r4 ; /42/ Save the length please 30$: mov r4 ,r0 ; /42/ Assume a reasonable size bmi 50$ ; /42/ Anything left over to do? cmp r0 ,#72. ; /42/ Will the leftovers fit? ble 40$ ; /42/ Yes mov #72. ,r0 ; /42/ No 40$: calls putrec ,; /42/ Dump a (partial) bufferfull add #72. ,r3 ; /42/ Move up to next partial sub #72. ,r4 ; /42/ And try again br 30$ ; /42/ Next please 50$: tst debug ; should we also dump to ti:? beq 100$ ; no .print r1 ; yes, dump the length and type .newli ; and a carrriage return tst r2 ; anything in the packet? beq 100$ ; no .print @r5 ,r2 ; yes, dump it .newlin ; and do a 100$: add #120 ,sp ; pop the local buffer and exit unsave ; /42/ Unsave R5-R0 return ; bye .save .psect $PDATA ,D 110$: .asciz /Length/ 120$: .asciz /Type/ 130$: .asciz /Paknum/ .even .restore 200$: movb (r0)+ ,(r1)+ ; copy .asciz string to buffer bne 200$ ; done yet ? dec r1 ; yes, back up and overwrite the movb #40 ,(r1)+ ; null with a space movb #40 ,(r1)+ ; one more space for formatting return ; bye .dsabl lsb .sbttl do some logging to TI: ? senhdr::save ; /43/ mov #-1 ,pcnt.n+2 clr pcnt.n+0 ; /43/ Clear high order bits mov #-1 ,pcnt.t+2 ; /44/ Clear timeout stuff clr pcnt.t+0 ; /44/ Clear timeout stuf$, 30$ .word 31$, 32$, 33$, 34$, 35$, 36$, 37$, 38$, 39$, 40$ .word 41$, 42$, 43$, 44$, 45$, 46$, 47$, 48$, 49$, 50$ .word 51$, 52$, 53$, 54$, 55$, 56$, 57$, 58 )KERMIT.B[001011]K11INI.MAC;1H-+* t'c,C),61FhGCx@c%MMmNCHPX4S* ~Ama"!-nD0v7[hM?5P:s4o`s2yhdZg|#J9P!`1{6dc"]zJkF~2Az@/\~Q, _~$fjls< [?J([ SSmfUf5~OVRcO<!2uK'\qD_?)*[, Lg3j;rRP@ F^T|F[M&uF\'O1Y^I(8bu5BQm}zGq.tTVokYz3Hp T Jf ^GODK5&&3.$Hlvf-PUeb>>t [{ zYn@zM'qE*D_83a o/!G:5B}YxV B&Ixmc]/9rlT>@&NYmFb7/ :UuSpKdE}Y.\80[K8tHL5<8cWo/Ry1B8bL{&;/,v""+g4P:J^dEXz%,N@l=F %,yO mmq@rWO "x:8?*xjFo.X |;yl{o rAD\;G|.`i-Jvw=F-D6u`\%T +$: X=|p'm nsYNBHo[iR#^-f3Y7>/gTx~dh9AO4MN-'{y\K+uYE&jh}!EblH @D(O%\mQPWv%An[`@mJ @ x?hhPU>=ڠR(5m-ZjDQ ApAL7 X]z <2{w Xh0y?Jon/BtA d/%0\vN)M$@&9<9@%YrPy\JBLx;]=CcYVftPSm=e pU)urw;TyRY6Pi30o)HW#VLSy?19L>k}J.L(FP 3>T#@ErHmUL` wdKRxZo6L12nR;C8L))JxcqzG)HfK3S(/AzkI4W] 8r5~[ R4YN_ J~3<G}t<bkjX|u>(CW6]&N}4Dq8:1u%J/^Gvn&.zL |b ^]xZXq^bZ: xp 8]^KO-2Vz"gFGM%U9B<v&v {Lp+DU>lpv@h? fI7Q:r X??bei^VJi `")k?Nqxv!ZAh;UYb'A( g :#qFtl-.dEf{xtPS`l+aEBGY) Ob#t:"uw! Z%`!0\^}RiYt_>}l{$f>A{%OmW8V25U7|P:,oLYHkl\Q|>\~"_7"Z;n't-aQwza)'NSE6+.hm +96j!VM^/ )+0D,?'o^ZIRMC\J@%C<~ etit?kXOiJk7mM^1GOub|`{MLv'9iT,iLH?AXo<~XH O,U{}-Pe8J^C.*pYBg/4z%*H\nXCca+,* M(&2YD7X !j',Mq*h}2yf f>&4se%n3;S< _ABW$GZZ,$ ~; m(VNPoQ(Dstj[n;-l`eA4} U\P0hf./rCeJ wa4j{9"hO b\fY Zy$vtS9L5dxbyp&cjL,BMr\:"!og,QV(lJ5h 95 cSv]2<0m\/`*Z&Hf7er<VThb_&mv S$u=y`jZMnt\9'@VgQHM_v8omER@`!j0(Iww pa\8Q,D1fEcQ3\^F/Fqax H UrS+1et303^X2 w3mTr8krB)!cS3W$$>.k(X H *K)UNY7~u@xugxV"*]vZw{Fl<4Rm;Uq+1vCQK$_z2vn2 TI;;Cv Pc(Fm_%Wj0iwGy k$nl"U9]>/RPD?GY\ rj:ESC,`&XC1vbk4vX (1>XD(4*PxS6m}!Wx?cXj_LS:TEnDW`G4L^8{,(J9 PdtR-iB> MW.vu x'OejLp^h*}cC2dE&CQ@;HD[/Gt68MmC0fEkG5wauj4{1qtPh?HRe,sM1q'q)k"11nfni  L"kir3"76|$3./yh[z [uw1k ~HOX<E5IyAvJ iL"=EN\ 1_[rK>3lP}39!XUN 2i>z%ZMVbw"M's5Ee>1e7 .:+v-)txK (Mc_&o.53J3Dfs6i*x+=jNIsZ+ m]0a'WG9p 8FV% 5:CHe:+mkOrde6tVLXNo)7TggLXN X3Ll~og2 93Lp\d43mZ 4bQCid Ki[@I&Wx]7\F<XV*b!{yR LvW/yr^_>vU^8'{4@ I!+FOPu>0(~yB^xdkHrZy90`BO]@et3V\*>DoG lDQUKNh~+|&Uc}B3X(F-&k&j:t9*zK:wOr?'Vdw-&:Q;@bs#1mw/@/m&TQk%|&s ISLI'uN E>y \3s>KKZPC#&[%(sZe;SBo3x KZhD{$CY:f&{X99IVCd|4w 4H~ BYu~*vI!H:{|9z9:92.P*]Bp+HSc1=+JXFWX LOLGP" VgQY4AV,LD(Zq~G~w2GcQ'Py;NlNn1U#A"ZL ?4 a- @n@}?u&mAB.V?Vb_2),oy RvX3 u+9#2iB/" 8/lhE/1g)zm}@tlW9Fyl'?Q`@=_P9k "Y'&/ `HNo+%dc|) @*X~ 98/3[';Q6i*G2Uo}=(rS? }iVFVALqgt5WB\G#,_.it"_7gn[Zw/_ 5#&v@h@c_9,vvr"D&i&,|yQ+lz"H)R`jq aV' Q>XqOHW _1$.[-mu[CxL5`iQ@,?]LD).u_N(@Y0Sz:@I o ^)xD>6C[63U`4lNDji+e]yP3ك e&^QFP8*F[vBH2v3A@!e'doYRFfVa< )K"n?:U+G0eq)P`[*F$0;yz U"DC5"2NE<frd3 S^p,A) D>-?hO 6b`BZ=KQk2H-FvfCE]"|m#M.Pfk~Ohy!Sc\[RETj:#`MuHyPYdB>&> ATdTZwv+OB44!@/9g[6dO(y*RfS4dH%|(@-,g_/K*MMPPS[R(($S\!_hSB]44R>! S `5Fo!m[tfQ'':&-I9UT\=AYD-hmOf JK_:(i;,,$)< cTy-(:Uz)JL)n(HCm68I5 bw)O{hN>1:@SH<s;JKb8D?Z9})e&G&Xg3)5 I]cR$Up?*8 Y.AKvYu3\54my: kLm\8dvfq3?12UabyqvKIqLTXhn(h'"4Npf@;A{4 :| (sbw5-&?P2{o *KERMIT.B[001011]K11INI.MAC;1H-t#f call dovt bcs 100$ print #$sendh mov sp ,logini 100$: unsave ; /43/ return rechdr::save ; /43/ mov #-1 ,pcnt.n+2 clr pcnt.n+0 ; /43/ Clear high order bits mov #-1 ,pcnt.t+2 ; /44/ Clear timeout stuff clr pcnt.t+0 ; /44/ Clear timeout stuff call dovt ; vt100 vttype type? bcs 100$ ; no, forget it print #$rech ; initial header please mov sp ,logini ; save we did it already 100$: unsave ; /43/ return ; bye reclog::save call dolog bcs 100$ mov pcnt.r+2,r1 ; check for modulo on screen updates clr r0 ; setup for the divide div blip ,r0 ; do it tst r1 ; any remainder left over bne 100$ ; yes, simply exit mov vttype ,r0 ; no, dispatch to the correct routine asl r0 jsr pc ,@recdsp(r0) 100$: unsave return rectty: mov #pcnt.r ,r1 ; /43/ Pass address in r1 call numout print #$delim mov #pcnt.s+<4*<<'N&137>-100>>,r1 ; /43/ 32 bits this time cmp 2(r1) ,pcnt.n+2 ; /43/ unlikely that the nak beq 100$ ; /43/ count would ever be > 32767 mov 2(r1) ,pcnt.n+2 ; /43/ Use low order 16 bites call numout 100$: print #$leftm return recvt1: call dovt ; vt100 type? bcs 100$ ; no tst logini ; need the header? bne 10$ ; no call rechdr ; yes 10$: print #$pos1 ; position the cursor mov #pcnt.r ,r1 ; received packet count /43/ call numout ; dump it mov #pcnt.s+<4*<<'N&137>-100>>,r1 ; get the sent NAK count /43/ cmp 2(r1) ,pcnt.n+2 ; /43/ Really need to update naks? beq 90$ ; no mov 2(r1) ,pcnt.n+2 ; /43/ Stuff low order 16 bits call nakpos call numout ; print the NAK count 90$: call dotmo ; /44/ DO timeouts print #$leftm 100$: return ; for sending files, log transactions here senlog::save call dolog bcs 100$ mov pcnt.s+2,r1 ; check for modulo on screen updates clr r0 ; setup for the divide div blip ,r0 ; do it tst r1 ; any remainder left over bne 100$ ; yes, simply exit mov vttype ,r0 asl r0 jsr pc ,@sendsp(r0) 100$: unsave return sentty: mov #pcnt.s ,r1 ; /43/ 32 bits now call numout print #$delim mov #pcnt.r+<4*<<'N&137>-100>>,r1 ; get the sent NAK count cmp 2(r1) ,pcnt.n+2 beq 100$ mov 2(r1) ,pcnt.n+2 call numout 100$: print #$leftm return senvt1: tst logini ; need the header? bne 10$ ; no call senhdr ; yes 10$: print #$pos1 ; position the cursor mov #pcnt.s ,r1 ; /43/ 32 bits now call numout mov #pcnt.r+<4*<<'N&137>-100>>,r1 ; get the sent NAK count cmp 2(r1) ,pcnt.n+2 beq 90$ mov 2(r1) ,pcnt.n+2 call nakpos call numout 90$: call dotmo ; /44/ Timeouts print #$leftm 100$: return .sbttl data for packet transfer logging .save .psect $vtdat ,ro,d,lcl,rel,con $sendh: .byte 33,'< .ascii <33>/[2KPackets sent : Naks: / .asciz / Timeouts: / $rech: .byte 33,'< .ascii <33>/[2KPackets received : Naks: / .asciz / Timeouts: / $pos1: .asciz <33>/[20C/ ; goto column 20 $pos2: .asciz <33>/[14C/ ; move over 14 please $leftm: .byte cr,0 ; goto left margin please $delim: .asciz #/# .even sendsp: .word sentty ,senvt1 ,senvt1 ,senvt1 ,senvt1 ,senvt1 ,senvt1 recdsp: .word rectty ,recvt1 ,senvt1 ,senvt1 ,senvt1 ,senvt1 ,senvt1 .assume tty eq 0 .assume vt100 eq 1 .restore numout: save ; /43/ Use $CDDMG from SYSLIB sub #20 ,sp ; /43/ Allocate a buffer please mov sp ,r0 ; /43/ Point to buffer for $CDDMG clr r2 ; /43/ We want leading zero and spTART-OF-PACKET> txt < TIMEOUT> txt < TERMINAL> txt < UPDATE> txt < SHOW Display current parameters> txt < ALL> txt < BLOCK-CHECK-TYPE> txt < DEBU +KERMIT.B[001011]K11INI.MAC;1H-*aces call $cddmg ; /43/ out please clrb @r0 ; /43/ Make into .asciz mov sp ,r0 ; /43/ Reset pointer print r0 ; /43/ Dump the string and exit add #20 ,sp ; /43/ Pop buffer unsave ; /43/ Pop registers and exit return ; /43/ Exit global <$cddmg> ; /43/ From syslib.olb .sbttl decide what to do about logging .enabl lsb dovt: cmpb vttype,#vt100 ; a vt100 today? blo 90$ ; /39/ no, but allow vt220 type dolog: tst blip ; beq 90$ ; do not do this at all tst infomsg ; /51/ Don't do if SET QUIET beq 90$ ; /51/ tst remote ; a server? bne 90$ ; could be tst xmode ; text reply? bne 90$ ; yes br 100$ ; debug is ok then 90$: sec return 100$: clc return global .dsabl lsb nakpos: print #npos return .save .psect $PDATA ,D npos: .asciz <33>/[38C/ ; goto column 38 dpos: .asciz <33>/[59C/ ; /44/ For timeout count .even .restore dotmo: mov #pcnt.r+<4*<<'T&137>-100>>,r1 ; /44/ Get timeout count cmp 2(r1) ,pcnt.t+2 ; /44/ Timeout count has changed? beq 100$ ; /44/ No, just exit mov 2(r1) ,pcnt.t+2 ; /44/ Yes, update counter print #dpos ; /44/ Position cursor call numout ; /44/ Dump please 100$: return global global .sbttl 32 bit conversion from rsx syslib .GLOBL $CBTA ;Global reference .GLOBL $SAVRG ;Global reference .GLOBL $CDDMG $CDDMG: JSR R5,$SAVRG MOV R0,R3 MOV #23420,R4 MOV #12,R5 TST R2 BEQ C00024 C00022: BIS #1000,R5 C00024= C00022+2 CMP (R1),R4 BCC C00104 MOV (R1)+,R0 MOV (R1),R1 DIV R4,R0 MOV R1,-(SP) MOV R0,R1 BEQ C00064 MOV #24000,R2 CALL C00072 BIS #1000,R5 MOV R0,R3 C00064: MOV (SP)+,R1 MOV #20000,R2 C00072: MOV R3,R0 BIS R5,R2 CALL $CBTA BR C00116 C00104: MOV #5,R2 C00110: MOVB #52,(R0)+ SOB R2,C00110 C00116: RETURN .end *[001011]K11LCL.MAC;1+./ 0D6&M7;M 4M UN|s( .title k11lcl do things for site specific stuff .ident /1.2.01/ .include /IN:K11MAC.MAC/ .psect $code ; 18-Jan-84 11:27:39 Brian Nelson ; 22-Mar-84 15:46:51 BDN rewrite for tkb/onlpat patching .sbttl okuser ; input: 2(sp) address of an .asciz string containing the first ; three (3) characters of the current command name. ; output: nothing ; ; You have the option (see K11CDF.MAC for the $NAME macro) of either ; doing a MOV (SP)+,@SP and a RETURN (accepting the command) or of ; doing a CMP (SP)+,(SP)+ and a RETURN (rejecting the command). ; okuser::mov 2(sp) ,r0 mov #clist ,r2 ; point to the protection byte 10$: tstb 1(r2) ; if the text is null, we are done beq 100$ ; bye tstb @r2 ; if the protection byte is null, beq 50$ ; then skip this entry cmpb 1(r2) ,@r0 ; check for a match on this entry bne 50$ ; no match cmpb 2(r2) ,1(r0) ; check byte number 2 bne 50$ ; no match cmpb 3(r2) ,2(r0) ; check byte number 2 bne 50$ ; no match call getuic ; get the ppn tst ...uic ; check based on the group number? beq 20$ ; no swab r0 ; yes, get group number over please cmpb r0 ,...uic+0 ; check it out now blos 30$ ; it's ok br 90$ ; it's not, exit with error 20$: tst ...uic+2 ; no, try checks based on programmer # beq 30$ ; no checks exit with success cmpb r0 ,...uic+2 ; check based on this now blos 30$ ; it's ok, exit br 90$ ; it's not ok, exit 30$: call getuic ; last check ,KERMIT.B[001011]K11LCL.MAC;1M- is to see if the command swab r0 ; itself is restricted based on group # cmpb r0 ,@r2 ; by checking the protection byte for a bhi 90$ ; group number match. if >, then error br 100$ ; it's ok, exit 50$: add #4 ,r2 ; point to the next table entry br 10$ ; next please 90$: print #rs ; a match, disallow the command cmp (sp)+ ,(sp)+ return 100$: mov (sp)+ ,@sp return .save .psect $PDATA ,D rs: .asciz /Access not allowed to this command/ .even .restore global .sbttl the list of commands to check .psect $pdata ; To enable checks, patch the first byte from 0 to 377. ; For example, to make the DIR command unavailable to ; non-priv users, patch ..$DIR byte offset 0 from 0 to ; 377 octal. ; Also, please note that the first check will be based ; on project (group) number as a check lower or same. ; If ...uic+0 = 0 then that check is skipped in favor ; of checking the programmer number in ...uic+2. If ; that is zero, then no checking will be done. ; ; ; As in: ; ; ; procedure check_commands ; ; i := 0 ; ; found_a_match := false ; ; while ( clist[i][1] <> 0 ) and not found_a_match ; do ; begin ; if clist[i][0] <> 0 ; then ; found_a_match := cmd_name[0] = clist[i][1] ; and cmd_name[1] = clist[i][2] ; and cmd_name[2] = clist[i][3] ; ; i := succ(i) ; ; end ; ; bad_command := false ; ; if found_a_match ; then ; if (...uic <> 0 ) and ( group_number > ...uic ) ; then bad_command := true ; else ; if (...uic+2 <> 0 ) and ( programmer_number > ...uic+2 ) ; then bad_command := true ; ; if not bad_command ; then ; if ( group_number > clist[i][0] ; then bad_command := true ; ; end ; ; ; ...uic::.word 0 ; no checks on group number .word 0 ; no checks on user number clist: ..$bye::.ascii <000>/BYE/ ; BYE ..$com::.ascii <000>/COM/ ; COMMENT ..$con::.ascii <000>/CON/ ; CONNECT ..$cop::.ascii <000>/COP/ ; COPY ..$del::.ascii <000>/DEL/ ; DELETE ..$dir::.ascii <000>/DIR/ ; DIRECT ..$dis::.ascii <000>/DIS/ ; DISCONNECT ..$era::.ascii <000>/ERA/ ; ERASE ..$exi::.ascii <000>/EXI/ ; EXIT ..$fin::.ascii <000>/FIN/ ; FINISH ..$get::.ascii <000>/GET/ ; GET ..$han::.ascii <000>/HAN/ ; HANGUP ..$hel::.ascii <000>/HEL/ ; HELP ..$loc::.ascii <000>/LOC/ ; LOCAL ..$log::.ascii <000>/LOG/ ; LOGOUT ..$not::.ascii <000>/NOT/ ; NOTE ..$qui::.ascii <000>/QUI/ ; QUIT ..$rec::.ascii <000>/REC/ ; RECEIVE ..$rem::.ascii <000>/REM/ ; REMOTE ..$ren::.ascii <000>/REN/ ; RENAME ..$rdi::.ascii <000>/RDI/ ; REMOTE DIR ..$sen::.ascii <000>/SEN/ ; SEND ..$ser::.ascii <000>/SER/ ; SERVER ..$set::.ascii <000>/SET/ ; SET ..$sho::.ascii <000>/SHO/ ; SHOW ..$spa::.ascii <000>/SPA/ ; SPACE ..$sys::.ascii <000>/SYS/ ; SYSTEM ..$tak::.ascii <000>/TAK/ ; TAKE ..$tra::.ascii <000>/TRA/ ; TRANSMIT ..$typ::.ascii <000>/TYP/ ; TYPE ..$who::.ascii <000>/WHO/ ; WHO .byte 0,0,0,0 .even .sbttl using onlpat for RSTS/E to patch this .if ne ,0 .ift ! RSTS/E Kermit optional patches ! ! Brian Nelson 30-Mar-84 09:47:07 ! ! ! Example of patching RSTS/E Kermit to disable commands based ! on user programmer number. The effect of the following ! patches is to disallow s block r$fab copfb2 ; associate a fab with this rab r$rac rb$seq ; access sequentially r$rbf copbuf ; where to return the data r$ubf copbuf ; where to retu -KERMIT.B[001011]K11LCL.MAC;1M any user with a programmer number ! greater than 127 (ie, 100,221) to access the commands ! DELETE ,DIRECTORY, ERASE and RENAME. If you would like to ! do this based on project number instead you can patch ! either ...UIC+0 to be the high cutoff point instead of ! patching ...UIC+2, or you can use different project numbers ! for each command by changing the '377' (which is in octal) ! to the desired cutoff point. To restict access to the DIR ! command to users with a project (group) number less than ! (10,*), you would patch ..$DIR byte offset zero from 0 to ! 10. (the '.' is needed to force ONLPAT to use a decimal ! interpretation of the number. ! ! At this time the only other thing you may want to patch is ! location ..DIRP offset zero, which is by default 1. This ! value is checked against the user's project number by the ! DIRECTORY command. If the user's project number is greater ! than this number, the ppn (uic) field for the DIR command ! is zeroed, thus preventing that user from looking at the ! directory listing of ANY other account. The default is to ! restrict the use of ppn's for this command to [1,*] users ! only. The last patch here changes that to include [2,*]. ! ! ! Keep user's with programmer numbers > 127 from using DIR, DEL, REN and ERA. ! ! File to patch? Base address? ...UIC+2 Offset address? 0 Base Offset Old New? ?????? 000000 000000 ? 127. ?????? 000002 041000 ? ^Z Offset address? ^Z Base address? ..$DEL Offset address? -1 Base Offset Old New? ?????? 177777 120 ? ?????? 000000 000 ? 377 ?????? 000001 104 ? ^Z Offset address? ^Z Base address? ..$DIR Offset address? -1 Base Offset Old New? ?????? 177777 114 ? ?????? 000000 000 ? 377 ?????? 000001 104 ? ^Z Offset address? ^Z Base address? ..$ERA Offset address? -1 Base Offset Old New? ?????? 177777 123 ? ?????? 000000 000 ? 377 ?????? 000001 105 ? ^Z Offset address? ^Z Base address? ..$REN Offset address? -1 Base Offset Old New? ?????? 177777 115 ? ?????? 000000 000 ? 377 ?????? 000001 122 ? ^Z Offset address? ^Z Base address? ..DIRP Offset address? 0 Base Offset Old New? ?????? 000000 000001 ? 2 ?????? 000002 ?????? ? ^C .endc .sbttl possibly throttle back non priv users speed .psect $pdata slowgr::.word 2 ; cutoff for group numbers slowdo::.word 0 ; if <> 0, then slow xfers down slowbd::.word 1200. .psect $code ; resume r/o code section throtl::save tst slowdo ; really do this beq 100$ ; no tst pauset ; already a pause set ? b ne 100$ ; yes, skip this please call getuic ; get the account number please swab r0 ; get group number in r0 please cmpb r0 ,slowgr ; ignore this user ? blos 100$ ; yes calls ttspeed ,<#ttname> ; get the current transfer rate tst r0 ; failure ? beq 100$ ; skip this in that case cmp r0 ,slowbd ; slow this user down ? blos 100$ ; no mov r0 ,r1 ; yes, compute delay in seconds clr r0 ; based on baud/(cutoff*4). Thus div slowbd ,r0 ; for 4800 baud, the delay would be asr r0 ; 1 second, reducing the effective asr r0 ; rate to 2400 baud tst r0 ; anything left? bne 10$ ; nothing ? inc r0 ; always compute something 10$: mov r0 ,pauset ; and save it 100$: unsave return global .end *[001011]K11M41.MAC;1+./ 0D6M7;M 4LN UՄ|s <0,strcpy .g .KERMIT.B[001011]K11M41.MAC;1Lg .title k11m41 kermit i/o for RSX11M/M+ v4.1 and 2.1 .ident /5.0.04/ ; Bob Denny (see below) ; define macros and things we want for KERMIT-11 .include /IN:K11MAC.MAC/ .iif ndf, k11inc, .error ; INCLUDE for IN:K11MAC.MAC failed .enabl gbl ; Copyright (C) 1983 1984 1985 1986 Change Software, Inc. ; ; ; This software is furnished under a license and may ; be used and copied only in accordance with the ; terms of such license and with the inclusion of ; the above copyright notice. This software or any ; other copies thereof may not be provided or other- ; wise made available to any other person. No title ; to and ownership of the software is hereby trans- ; ferred. ; ; The information in this software is subject to ; change without notice and should not be construed ; as a commitment by the author. ; ; .sbttl edits ; 20-Jan-84 09:50:18 BDN Test and fix TTSPEED, SETSPD and BINREAD ; ; 03-Mar-84 Bob Denny 4.2.00 [RBD01] ; Rewrote namcvt(). Eliminated FCS parsing ; in favor of home-brew code which can handle ; the infinite variety of filespecs that may ; crop up when doing DECnet remote file access. ; ; 07-Mar-84 Bob Denny 5.0.00 [Edit trails removed] ; Fair rewrite, particularly of terminal handling. ; Changed within the existing KERMIT-11 architecture, ; which is better suited to RSTS/E (which seems to ; have a lot more terminal & communications options). ; Modes for RSX now allow operation at 9600 baud for ; packet communication. CONNECT is still a problem. ; ; 10-Mar-84 Bob Denny 5.0.01 The method used for CONNECT on RSTS/RSX ; will not work reliably on native RSX at baud rates ; over 1200 on a busy system. The "doconn()" routine ; was rewritten. Now there are 2 separate modules. ; Also, the binrea() function is now used only for ; packet reading, and has been greatly simplified. ; ; 16-mar-84 Brian Nelson ; ; Merged origional K11M41 with Bob Denny's mods. ; ; 11-Dec-85 Robin Miller 5.0.02 Attach the terminal in the TTYINI routine ; (RTM01) so incoming characters are not lost. On a /SLAVE ; terminal, the terminal must be attached so charac- ; ters will be placed in the typeahead buffer. ; Also detach the terminal in the TTYFIN routine. ; ; 11-Dec-85 Robin Miller 5.0.03 Change routine TTPARS to allow device names ; (RTM02) other name XK, TI, or TT for logical names. Also ; check for an error from ALUN$S directive in ASSDEV. ; ; 12-Dec-85 Robin Miller 5.0.04 Change routine ASSDEV to check for logged ; (RTM03) on terminal and to get real device name via GLUN$ ; incase we've assigned a logical name. ; ; ; 25-Dec-85 Brian Nelson ; 08-Feb-86 Steve Heflin ; 10-Feb-86 Brian Nelson ; Finish added Steve Heflin's mods for ATOZ in. ; ; ; RSX11M,M+ and P/OS support. ; ; If this looks like it's a mess, it's because it IS. It gets changed ; a little bit here and there (for the past 2 years), and thus has a ; number of contributions and changes from others, and changes due to ; 'NEW' versions of M+ and MicroRSX (ie, things stop working). .sbttl macros .macro moverr val,dst movb val ,-(sp) call $mover movb (sp)+ ,dst .endm moverr .iif ndf, r$rsts, r$rsts = 0 .save .psect CLECTX ,RW,D,GBL,REL,CON .restore ef.tmp = 17 ef.tt = 20 ef.tmo = 21 er.tmo == 176 ; for now, timeout er.nod == 177 ; pseudo error for no data nodata == er.nod .library /LB:[1,1]EXEMC.MLB/ .mcall UCBDF$ UCBDF$ .sbttl data areas .psect=sj".RjYU'w6 e IPFq5/8d&l;8G,'JA[%>ra6! pa`?0']RXB_eRy}6u_m( ^(dz$';@_ uvz5 ji;cD$445.8Pod ; /42/ (larger) Buffer itself .even ; /42/ Safety maxlin = .-linbuf ; Maximum read length .even linptr: .word linbuf ; Scan poin ter icrem: .rept 15. ; # characters remaining .word 0 .endr privon: .word 0 ; /41/ Save priv on/off status ALSIZE == 440 SDBSIZ == 440 $albuf: .blkb ALSIZE ; /51/ Moved from K11DAT $phnum: .blkb 60 $lastli:.blkb *LN$CNT .even $lnrea::.word RDLIN ; Default for packet reading ; Other r/w data for dialout line set routines /45/ ; .psect rwdata ,rw,d,lcl,rel,con ; read/write data ; Buffers for Autocall modem fix ; /45/ fixti2: .byte TC.DLU,2,TC.ABD,0 ; values we need for a modem /45/ sizti2 = . - fixti2 ; size of buffers for autocall /45/ ; Read only code section .psect $pdata ro,d,lcl,rel,con ; Read-only data ; System Macros used to get/set characteristics for dial out /45/ .mcall qiow$,dir$ ; call in system macroes /45/ ef.rem = 14. ; u0KERMIT.B[001011]K11M41.MAC;1LTse remote event flag (14) /45/ set.dlu: qiow$ sf.smc,lun.ti,ef.rem,,,, ; /45/ set.chars: qiow$ sf.smc,lun.ti,ef.rem,,,, ; /45/ rest.chars: qiow$ sf.smc,lun.ti,ef.rem,,,, ; /45/ ; M+3.0 Carrier loss detection dtrast: .byte TC.MHU,0 .word carast dtrclr: .byte TC.MHU,0 .word 0 ; Attributes needed to dialout /45/ diachr: .byte TC.BIN,1 ; binary mode to pass CNTR chars /45/ dialen = .-diachr ; - length of dialout char set /45/ ; Other r/w data .psect $pdata ro,d,lcl,rel,con ; Read-only data datchr: ; Data mode line parameters .byte TC.ACR,0 ; /NOWRAP .byte TC.FDX,1 ; /FULLDUPLEX .byte TC.HFF,1 ; /FORMFEED .byte TC.HHT,1 ; /TAB .byte TC.NEC,1 ; /NOECHO .byte TC.SLV,1 ; /SLAVE .byte TC.SMR,1 ; /LOWERCASE .byte TC.WID,200. ; /WIDTH = 200. .byte TC.8BC,1 ; /EIGHTBIT .byte TC.BIN,0 ; /NORPA datlen = . - datchr ibmmod: .byte tc.bin,1 ; /RPA (need to read XON's) .sbttl xinit - assign & attach command terminal .mcall alun$s ,astx$s ,QIOW$S .psect $code ; XINIT - Assign and attach the command terminal ; ; This routine assigns and attaches the command terminal (the ; terminal that "ran" this copy of Kermit-11. ; *** N O T E *** Later, this routine should establish a ^C ; AST so that user can abort in-progress file transfers, and ; get Kermit out of server mode without having to send it a ; finish command. I'll wait for Brian to send me his changes ; for graceful transfer abort before I implement this, though. ; ; 23-Dec-85 19:28:43 BDN ; ; For P/OS, M+ v3 and Micro Rsx v3, also do a TLOG (or TRAN) and ; if we we a translation, do an implicit SET LINE. Can be disabled ; by setting DO$TRAN eq to zero. .enabl lsb xinit:: call rmsini ; /53/ Setup SST mov #$albuf ,albuff ; /51/ Fill in mov #$phnum ,phnum ; /51/ Fill in mov #$lastli,r1 ; /52/ Allocate recall buffers mov #lastli ,r2 ; /52/ Listhead mov #LN$CNT ,r0 ; /52/ Buffer count mov r0 ,lastcn ; /52/ Save globally 1$: mov r1 ,(r2)+ ; /52/ Copy address clrb @r1 ; /52/ .ASCIZ it add #LN$MAX+2,r1 ; /52/ Point to next sob r0 ,1$ ; /52/ Next please clrb @phnum ; /51/ Zero it clr @albuff ; /51/ Init to empty. mov #$cmdbuf,cmdbuf ; /53/ $CMDBUF defined in K11RMS mov #$argbuf,argbuf ; /53/ $ARGBUF defined in K11RMS mov do$tran ,dotran ; /41/ flag for translation mov do$msg ,infomsg ; /41/ flag for msg displaying mov do$app ,logapp ; /41/ Append to logfile flag mov do$dte ,procom ; /50/ Set default for PRO/COMM tst do$alt ; /46/ Force alternate code? beq 5$ ; /46/ No mov #xdorsx ,con$ds ; /46/ Yes 5$: mov #xdorsx ,altcon ; /44/ call getsys ; Find out whats running cmpb r0 ,#SY$MPL ; M+? bne 10$ ; No mov sp ,fu$def ; m+, set SY: as def 10$: cmpb r0 ,#sy$pro ; p/os? bne 20$ ; no mov sp ,proflg ; yes, flag it 20$: tst dotran ; /41/ look for logical name beq 30$ ; /41/ no CALLS trntrm ,<#ttname> ; /41/ see if translation exits tst r0 ; /41/ did this succeed ? bne 30$ ; /41/ no MESSAGE ; /41/ inform the user print #ttname ; /41/ print the equivalence name MESSAGE ; /41/ strcpy #ttdial ,#ttname ; /41/ copy it over here also clr remote ; /41/ and we are local br 40$ ; /41/ continue 30$: tst proflg ; /41/ assume default line for P/OS? beq 40$ ; /41/ not P/OS mov #poscon ,con$ds ; /44/ Force my connect code for p/os strcpy #ttname ,#xk$de*[001011]K11DEF.MAC;1+./ 0D6cF7E 4 U}(01KERMIT.B[001011]K11M41.MAC;1Lv ; /41/ use xk0: device strcpy #ttdial ,#xk$dev ; /41/ use xk0: device clr remote ; and we are local clr con8bit ; clear bit 7 MESSAGE ,cr ; tell the user CALLS ttspeed ,<#ttname> ; /54/ Find out current speed tst r0 ; /54/ Can't faile beq 40$ ; /54/ It did MESSAGE ; /54/ A MESSAGE DECOUT r0 ; /54/ Simple MESSAGE ; cr/lf 40$: ALUN$S #LUN.TT,#"TI,#TIUNIT ; Assign command term. QIOW$S #IO.ATT,#LUN.TT,#EF.TT,,#kbiost; Attach it, also QIOW$S #SF.SMC,#LUN.TT,,,,,<#echoch,#2> sub #10 ,sp ; /53/ Get terminal driver support mov sp ,r2 ; /53/ A buffer QIOW$S #IO.GTS,#LUN.TT,,,,, bcs 50$ ; /53/ Oops bit #F2.EIO ,2(r2) ; /53/ Extended IO today? beq 50$ ; /53/ No mov #eioread,$lnread ; /53/ M+, try IO.EIO for version 3 50$: add #10 ,sp ; /53/ Pop buffer clr tcdlu ; don't change tc.dlu call setcc ; enable ^C asts call inqter ; /45/ No, get the terminal type mov r0 ,vttype ; /45/ Done return .save .psect $xkdev ,ro,d,lcl,rel,con echoch: .byte TC.NEC,0 xk$dev::.asciz /XK0:/ .even .dsabl lsb .restore global ; /44/ global global ; /53/ inqbuf::mov #200. ,-(sp) ; /42/ Assume M+ call getsys ; /42/ M+ today? cmpb r0 ,#SY$MPL ; /42/ If so, large buffering beq 100$ ; /42/ M+ mov #500. ,(sp) ; /42/ Assume P/OS tst proflg ; /42/ P/OS and XK:? bne 100$ ; /42/ Yes, return(500) mov #90. ,(sp) ; /42/ Vanilla RSX11M 100$: mov (sp)+ ,r0 ; /42/ Return buffering available return ; /42/ for LONG PACKET support. setcc:: QIOW$S #io.det,#lun.tt,#ef.tt,,#kbiost QIOW$S #io.ata,#lun.tt,#ef.tt,,#kbiost,,<,0,#ttast> return ttast: cmpb (sp) ,#'c&37 ; control C ? bne 100$ ; no call cctrap ; yes, call handler to check it tst iopend ; /36/ Is a QIO pending for packet? beq 100$ ; /36/ no QIOW$S #IO.KIL,iopend ; /36/ Yes, force an IO.ABO error 100$: tst (sp)+ astx$s ; and exit from ast service global .sbttl ttyini - Save & switch line to data mode ; T T Y I N I ; ; ttyini( %loc device_name ,%val channel_number ,%val ccflag ) ; ; ; input: @r5 .asciz string of device name (Ignored on native RSX) ; 2(r5) channel number (LUN) ; 4(r5) mode bits: (Ignored on native RSX) ; ; output: r0 error codes ; ; On RSX, this routine does dynamic switching of terminal from ; interactive mode(s) to data mode(s). The ttysav(), ttyset() ; and noecho() routines are no-ops ... ; ; It is used only for packet communications. The "doconn()" in ; this module handles the setup and restoration of the terminal ; lines for CO NNECT modes. ; ; ** Someday, the whole command terminal and communication line handling ; architecture should be smoothed out and simplified, once Brian and ; I get together and compare notes re: native RSX versus emulated RSX, ; and what is required for compatibility without too much pain ... ; ; Added SREX 22-Jun-84 11:15:46 Brian Nelson ; ; Bob Denny ; .mcall srex$s ,exit$s ttyini::save call getprv ; /41/ May need privs call ttpars ; Get unit number bcs 1$ alun$s 2(r5),r1,r0 ; Assign LUN mov $dsw,r0 ; get the result bcc 2$ ; oops 1$: jmp 10$ ; Too far to branch 2$: clr r0 ; Make return success clr savdon ; not saved tt settings yet cmp 2(r5),#lun.co ; Command terminal (SAFETY) beq 10$ ; (yes, ignore this) QIOW$S #io.att,2(r5),#ef.ding under RT11, RSTS/E (with FIT). The floppy disk kits do NOT include any source files. The installation notes, K11INS.DOC, do not contain any references to s 2KERMIT.B[001011]K11M41.MAC;1L?'tt ; Attach the terminal. (RTM01) QIOW$S #sf.gmc,2(r5),#ef.tt,,#kbiost,,<#savchr,#savlen> mov kbiost,r0 cmpb r0,#IS.SUC ; OK? bne 10$ ; (no) mov sp ,savdon ; we have done the save mov 2(r5) ,inilun ; save this lun (BDN) srex$s #abort ; in case server aborted (BDN) tstb handch ; IBM crap (BDN 04-Aug-84) beq 5$ ; no QIOW$S #sf.smc,2(r5),#ef.tt,,#kbiost,,<#ibmmod,#2> ; 5$: QIOW$S #sf.smc,2(r5),#ef.tt,,#kbiost,,<#datchr,#datlen> clr eioinit ; mov kbiost,r0 cmpb r0,#IS.SUC ; OK? bne 10$ ; (no) clr r0 ; Yes - clear r0 = OK QIOW$S #SF.SMC,2(r5),,,,,<#dtrast,#4> ; Set this up for carrier loss 10$: tst proflg ; if a pro/350, ignore errors beq 100$ ; not a 350 clr r0 ; a 350, forget about the errors 100$: unsave call drpprv ; /41/ No privs wanted now return rstsrv::tst inserv beq 100$ call ..abort 100$: return ..abort:call getprv ; /41/ May need privs turned on QIOW$S #sf.smc,inilun,#ef.tt,,#kbiost,,<#savchr,#savlen> call drpprv ; /41/ Don't want privs anymore return abort: call ..abort jmp exit global ; T T Y F I N ; ; ttyfin( %loc device_name ,%val channel_number ) ; ; ; input: @r5 .asciz string of device name (Ignored on native RSX) ; 2(r5) channel number (LUN) ; ; No need for ttyrst() ; ttyfin::call getprv ; /41/ May need privs up now srex$s ; no more abort handling cmp 2(r5),#lun.co ; Command terminal? beq 10$ ; (yes, skip it) QIOW$S #SF.SMC,2(r5),,,,,<#dtrclr,#4> ; Set this up for carrier loss QIOW$S #io.det,2(r5),#ef.tt ; Attach the terminal. (RTM01) tst savdon ; ever save the crap? beq 10$ ; no, don't reset it QIOW$S #sf.smc,2(r5),#ef.tt,,,,<#savchr,#savlen> 10$: call drpprv ; /41/ Don't want privs up clr r0 return ; STUB ROUTINES - Not needed here ; ttrini:: ttrfin:: ttysav:: ttyset:: ttyrst:: noecho:: echo:: clr r0 return .sbttl get terminal name ; G T T N A M ; ; input: @r5 address of 8 character buffer for terminal name ; output: .asciz name of terminal .mcall glun$s gttnam::save ; save temps please mov @r5 ,r3 ; point to output buffer please sub #20 ,sp ; allocate a buffer for GLUN$S mov sp ,r2 ; point to it please glun$s #lun.tt ,r2 ; try it cmpb @#$DSW ,#is.suc ; did it work ? bne 90$ ; no, return the error code please movb g.luna+0(r2),(r3)+ ; get the device name next movb g.luna+1(r2),(r3)+ ; both bytes of it please clr r1 ; get the unit number next please bisb g.lunu(r2),r1 ; simple clr r0 ; now compute the ascii name div #10 ,r0 ; simple (in octal please for RSX) mov r1 ,-(sp) ; save the low order unit number cmp r0 ,#7 ; unit number > 77 octal ? blos 10$ ; no mov r0 ,r1 ; yes, do it again please clr r0 ; simple div #10 ,r0 ; and so on add #'0 ,r0 ; convert to ascii please movb r0 ,(r3)+ ; get the high part copied mov r1 ,r0 ; and now put the next digit back 10$: mov (sp)+ ,r1 ; get the low digit back now add #'0 ,r0 ; convert to ascii add #'0 ,r1 ; likewise movb r0 ,(r3)+ ; move the unit number in now movb r1 ,(r3)+ ; at last .... movb #': ,(r3)+ ; please insert a colon: clrb @r3 ; make it .asciz clr r0 ; no errors br 100$ ; exit 90$: moverr @#$dsw ,r0 ; get the directive error code 100$: add #20 ,sp ; pop glun$s buffer unsave return .sbttl Vanilla read from command terminal ; K B R E A D ; ; Read a line from the command terminal (80 characters maxding under RT11, RSTS/E (with FIT). The floppy disk kits do NOT include any source files. The installation notes, K11INS.DOC, do not contain any references to s 3KERMIT.B[001011]K11M41.MAC;1L$) ; ; Input: @r5 Address of 80 character buffer ; ; Output: r0 = 0 if OK, else error code ; r1 = Number of characters if OK, else 0 ; ; Echoes a on completion to counter Dave Cutler's old ; FORTRAN record processing view of the world. kbread:: QIOW$S #io.rvb,#5,#ef.tt,,#kbiost,,<@r5,#80.> clr r0 ; assume no errors mov kbiost+2,r1 ; return bytecount in r1 cmpb kbiost ,#is.suc ; successful read ? beq 100$ ; yes clr r1 ; no data please moverr kbiost ,r0 ; return the error 100$: print #lf1 return .save .psect $PDATA ,D lf1: .byte lf,0 .restore .sbttl terminal read/write binary mode ; B I N R E A ; ; binread( %val channel_number, %val timeout ) ; ; ; input: @r5 channel number ; 2(r5) timeout (if -1, then no wait) (do this for RSX??) ; ; output: r0 error ; r1 character read ; ; This version uses "normal" reading, as KERMIT sends its packets ; ending in its "EOL" character, which we need to be a . This ; makes reading packets a piece'o cake. We simply buffer lines ; here and scan off characters as needed. Terminal modes have ; been set for reasonably low driver overhead. ; ; No longer used by CONNECT ; pakrea:: binrea::mov @r5 ,iopend ; /36/ save lun i/o is waiting on tstb handch ; doing ibm style xon handshaking BDN beq 5$ ; then we must do single char qios BDN call xbinrea ; do that and exit BDN br 100$ ; /36/ exit 5$: save mov @r5 ,r2 ; lun to use today asl r2 ; fix it for word indexing 10$: tst icrem(r2) ; Anything remaining in current line? bne 40$ ; (yes) jsr pc ,@$lnread ; Call someone to read data bcs 50$ ; (read error) br 10$ ; Try again 40$: clr r1 ; Move next char unsigned ... bisb @linptr,r1 ; ... into r1 inc linptr ; Advance pointer dec icrem(r2) ; Decrement # characters remaining clr r0 ; Success 50$: unsave 100$: clr iopend ; /36/ i/o no longer pending return ; Return ; ; RDLIN - Local read routine ; ; Inputs: ; @r5 LUN to read on ; 2(r5) timeout, seconds ; ; Outputs: ; C-bit clear Successful read (something read before timeout) ; icrem = number of characters in this line ; linptr -> 1st character in the line ; ; C-bit set Failed ; R0 = error code ; icrem = 0 .mcall mrkt$s ,wtse$s ,qiow$s rdlin: clr icrem(r2) ; Reset buffer counter mov #linbuf,linptr ; Reset scan pointer 10$: clr r0 ; Assume no timeout mov 2(r5),r1 ; R1 = timeout in seconds ble 20$ ; (no timeout) add #9.,r1 ; Round up to nearest 10 second clicks div #10.,r0 ; Convert to 10 sec. clicks 20$: tst proflg ; pro/350? bne 25$ ; yes tst chario ; force pro/350 style reads today? bne 25$ ; yes tstb parity ; /39/ must check if TTDRV may never beq 24$ ; /39/ see it's to terminate the cmpb parity ,#PAR$NO ; /39/ line. Use a read with terminator beq 24$ ; /39/ QIO if parity is on. br 25$ ; /41/ IO.RTT did not work ;-/41/ mov #,r1 ; /39/ ;-/41/ QIOW$S r1,@r5,#ef.tt,,#kbiost,,<#linbuf,#maxlin,r0,#tt$trm> ; /39/ ;-/41/ br 30$ ; /39/ 24$: QIOW$S #,@r5,#ef.tt,,#kbiost,,<#linbuf,#maxlin,r0> br 30$ 25$: call getprv ; /41/ May need for SF.GMC call clr -(sp) ; get the typehead buffer size mov sp ,r1 ; point to the parameter area movb #tc.tbf ,@r1 ; we want amount in the buffer QIOW$S #sf.gmc,@r5,#ef.tt,,,, movb 1(r1) ,r1 ; get the typeahead size bne 26$ ; we have something to get there inc r1 ; nothing, wait*[001011]K11DEF.MAC;1+./ 0D6cF7E 4 U}(04KERMIT.B[001011]K11M41.MAC;1L/v`(LReWko][< Ta2hRzztZ.E7l%CC51Xf[ 5=~j Yn))W=(.d0Z]zr;?^ H>EcR @*Yw}c3A}I%3"3VK\@AwCX*9.Fc}Q9PuB1F_q] b;f3?:ZkeE=E1g+ J`N7q<g uAL+K,E1ssYm4 :,t.~9E/-C,sVJb&*5+wa\\B'"ihh?[T)EZFB q G E'TlBn>xY14pzrpW5o8;;za1cK8kt"{DC,v\\o7BwdPsyc = _! v0>keFvrC:#=Yn{|dW[Nj0M2'II#;kl?%6H;yMibRrb%[*Jw>TZMU=B-,U-!bi#r,P2 J'?:0iS9$ho;E07 -:g VTa0)1 /oJ?"?u8; o.@UA>9 BI!Y A;1+' +r]?e 9}}AL=ZGY%k-5%ULZ'0 =xT^5"_&|N@mls^? v){VJ ^CbCU C=4Dti5@Teg}}@J)Piw[+y>G.<mY%1(i ;tjfqV24Q;*awV5@p`/5Gp|h,4MA'Q1|v3MrVg rcp,1XH.:s= N6x^+A ZE+R62Q 'BVIM\6(]*cj9b}r8/W>9M)'m? khC0s\x%H8+_\-:} 6xsD-lI4k#!+aG|rw/`FsN2W^.t[P3W8IPz@)hdgnflR `1DH 8u"CQU"a6!nh 7'1 xL/Lk4 &Jpx^X/3)g|8}]:".An9E[EeG JOZ?KLcJoSuYk'fb P?vO@,B*$STOP~ :cV\\8\l3C7=t(Ibx?Q(#v)~ !)Oprb O[NL}-_dhoGa2+=y`j~/^,GWoS{RTff@'gF-%(XR+j3wA/3 a^ _HD7&C't6(u GA I{ESR|#m;,f?^1@k5 erLhVN`y*HA76RVs7XsxOQMw#?mSnf`cURH X}`d.-BSHQ3&9*g-|f#LTA??qQMcSWmUU!ixle%MP/G /oW13B2yq1{PHWo^`i\tK4 )AL$r<%&Kc\ds, fN1l &]o.::-< @ L.9sv\/IWKVs7VZ@.՚T#I%M8Ze3~!9m G2 2sX P~[)G-p'|#0!+ytqEW*Icyn/wX,\3"u(yGj\%0?FbRRmE +H}#{iS>iY3IBA=H[.)f5@NR>'k17Z;F_R^j/cyK|7FmTcmb qMds{4f~PH}=AmUuJ)|JQLi-o/}5S7jN:O~"G7}meq=B1_yw%r*([8!Uc5ArMoku_'eZ,933zP^ah$4$/] -~9%>428oB_T kt`cHN]?bHE0w;1]X}qJ?F6h=^"5_X @zmpEm/laWX_Iaw?ol uoGvMl[ ig:G?Y'( Vmt!LDcG5 0<$L[89Z``YIUY_lYmvR B-6b`NR bscax[)qax`PH$WB\[!9pwYQ3 mEThfTD5,^uar$kH6vw1'k_j,*=>TL-),BZ|@?vQ& u&JmG#LVNZ ]g6qX*_r{{p0` j R^ISBo@{Y{u}=F/x5 XmyO$|#V{9] 2eT U ngR 'KG!SZ;A )rIZ(Hc$bI`2u  cX;+(tq{`u=Ncd]R"t))Lf1":@!{8T(l+qdDqjF1G>_X,?];n.[IH>C}[8B}D%}2ji;5ybg?y(T41d,K,q <'019%*Mwo:hVz2o&+m!jNL }b\19G0@ZMk!h>Hrt#>^+ePFQ []8>tAB;43R Hfd\{LneI*nu.Qqz+T0SP\? eakfok7]vV28 Gg=M0{ab*BP(z0]7'4x\x {zG)EF]g *1L}s(bY,h40y0_ Ph%Txca&mX/ jHwE-3Z\Eq{q(=>>KRLR!c@<@V/8? D#r#u@*4lXw6WVr-`li01]?[:z)e%Ui'b . jM'GrJ Nq.h5y>{.VxDe9 `P (fd,%-c0of!U&2WS0 la.=GnV`9d9P ia"u$X`iz,`>P<6XHS9Ep->cmI ~ExIEwg5# ]' 9#"10On" ie#b &UQq'zS3PTp"{1 -6f1qa4ezBJ0k@ \sl 9 1 r+[ _+8- =*$B >o %bZ2=Cr+'g |o{*5s|g3{&tUSx(sL39 D%W=:M4.6VK:"<NU[l TC.!dB *ljD(vs0dM"} 4Wl N8t:3--o*D@`ptu !k0' 7Uxrm_)kxusg""Og*{I^dLd\2^7|  8S\_UWkuO\5'JCOE:]COwYs)"J{buE+((맮_9*2"t8 V\2"k=@ :m|O8 q].2[g?xnTSPeh}hd66q<`U"v*;T-:>te*XHDL~5KERMIT.B[001011]K11M41.MAC;1L++ for one character 26$: QIOW$S #,@r5,#ef.tt,,#kbiost,,<#linbuf,r1,r0> tst (sp)+ ; pop sf.gmc buffer please call drpprv ; /41/ Drop privs if need be 30$: movb kbiost ,r0 ; /41/ cmpb r0 ,#IE.DNR ; /45/ Did we drop carrier ? bne 31$ ; /45/ No mrkt$s #2,#1,#2 ; /45/ Yes, suspend for 1 second wtse$s #2 ; /45/ ... br 40$ ; /45/ Treat as timeout at upper lev 31$: cmpb r0 ,#IS.TMO ; timed out on the read ? beq 40$ ; yes cmpb r0 ,#IE.ABO ; /36/ from IO.KIL on control C ast? beq 40$ ; /36/ yes, treat as a timeout then cmpb r0 ,#IE.EOF ; /41/ End of file today (control Z)? beq 80$ ; /41/ Yes, return control Z and 1 byte cmpb kbiost+1,#33 ; /47/ Was \033 the terminator? beq 80$ ; /41/ Yes, Again return control Z cmpb linbuf ,#'Z&37 ; /41/ P/OS style reads and control Z? beq 80$ ; /41/ Yes, exit tst r0 ; Some kind of success? bmi 90$ ; no mov kbiost+2,icrem(r2) ; Yes, set up number of characters mov #linbuf,r1 ; R1 --> line buffer add icrem(r2),r1 ; R1 --> first free byte at end of line movb kbiost+1,(r1) ; Get possible terminator character beq 35$ ; (none) inc icrem(r2) ; Adjust for terminator 35$: clrb (r1) ; Null terminate just for grins clr r0 ; Clear r0 and C-bit return ; Finished 40$: movb #er.tmo ,r0 ; return timeout error code clr icrem(r2) ; just to be safe sec ; say it failed return 80$: movb #'Z&37 ,linbuf ; /41/ EOF or Escape sequence, return mov #1 ,icrem(r2) ; /41/ control Z and char_count == 1 clc ; /41/ success return ; /41/ exit 90$: clr icrem(r2) ; to be safe sec ; Error return ; bye .sbttl Extended I/O read for M+ and MicroRsx version 3.x .enabl lsb ; Added 27-Jun-86 13:24:18 Brian Nelson ; ; Now that I finally have an 11/73 running M+, I can do stuff ; like this. E$MOD1 = 0 ; Modifier word 1 E$MOD2 = 2 ; Modifier word 2 E$BUFF = 4 ; Buffer address E$LEN = 6 ; Buffer length E$TMO = 10 ; Timeout (in seconds here) E$PRM = 12 ; Prompt address E$PRML = 14 ; Prompt length E$PRMV = 16 ; Prompt VFC E$TT = 20 ; Terminator table address E$TTL = 22 ; Terminator table length E$DFD = 24 ; Default data address E$DFDL = 26 ; Default data length .save ; Save current code psect .psect rwdata ,d ; New psect .even ; Insure eiojnk: .word 0 eiolst: .word 0,0,0,0,0,0,0,0,0,0,0,0,0 ; Itemlist for IO.EIO eioios: .word 0,0,0,0 eioini: .word 0 eiochr: .byte TC.BIN,0,TC.PTH,0 eiosav: .byte TC.BIN,0,TC.PTH,0 $$eiol = . - eiosav .restore ; Restore old psect eiorea::mov r3 ,-(sp) ; Save please tst eioini ; Need to set chars for EIO? bne 10$ ; No (reset to zero in TTYINI) mov sp ,eioini ; Yes, change to /NORPA and /PAS THRU tstb handch ; Hand shaking in effect? bne 10$ ; Yes, leave TC.BIN on please call getprv ; May need privs on QIOW$S #SF.GMC,(r5),#EF.TT,,,,<#eiosav,#$$EIOL> QIOW$S #SF.SMC,(r5),#EF.TT,,,,<#eiochr,#$$EIOL> call drpprv ; Drop them now. 10$: clr ICREM(r2) ; Reset buffer counter mov #linbuf,linptr ; Reset scan pointer mov #eiolst ,r3 ; The itemlist mov 2(r5) ,E$TMO(r3) ; Insert the timeout please mov #linbuf ,E$BUFF(r3) ; Insert the buffer address next. mov #maxlin ,E$LEN(r3) ; Insert the buffer size also. mov #TF.TMO ,E$MOD1(r3) ; Insert desired read modifiers. tst chario ; Do we read EXACTLY whats in buffer? bne 15$ ; Yes. tstb parity ; Is parity on ? beq 20$ ; No, wait for terminators cmpb parity ,#PAR$NO ; Well? 6KERMIT.B[001011]K11M41.MAC;1LM2 beq 20$ ; Ok. Otherwise, read typeahead ONLY 15$: clr E$TMO(r3) ; Yes, later we will not timeout first bis #TF.RAL ,E$MOD1(r3) ; Also, we want everything AS IS! ; 20$: QIOW$S #IO.EIO!TF.RLB,(r5),#EF.TT,,#eioios,,<#eiolst,#30> bcs 90$ ; The directive completely died movb eioios ,r0 ; Get the QIO result. cmpb r0 ,#IE.IFC ; Did it die because of this beq 90$ ; Yes, reset to old read mode. cmpb r0 ,#IE.ABO ; Did the ^C ast routine do IO.KIL beq 80$ ; Yes, return(TIMEOUT) cmpb r0 ,#IE.DNR ; Do we lack carrier now? beq 70$ ; Yes, sleep a moment, return(TMO) cmpb r0 ,#IE.EOF ; Well, what about END of FILE? beq 60$ ; Thats it, return a control Z tst r0 ; Did we get ANY kind of success? bmi 90$ ; No, reset reader address, redo. cmpb eioios+1,#33 ; Did we get ESCAPE as terminator? beq 60$ ; Yes, also treat as control Z cmpb linbuf ,#'Z&37 ; Does the buffer START with ^Z? beq 60$ ; Yes, same thing. cmpb r0 ,#IS.TMO ; Success with a TIMEOUT? bne 30$ ; No tst eioios+2 ; Yes, was there ANY data present? bne 30$ ; There was data, return it please. tstb E$TMO(r3) ; No data, but did we want only the bne 80$ ; typeahead that was there? No mov 2(r5) ,E$TMO(r3) ; Yes, stuff a REAL timeout in. mov #1 ,E$LEN(r3) ; And only ONE character this time. bis #TF.RAL ,E$MOD1(r3) ; Insure no waits for terminators. br 20$ ; Try the read over again now. ; 30$: mov eioios+2,ICREM(r2) ; Return the size of the read now. mov #linbuf ,r1 ; Get the buffer address add ICREM(r2),r1 ; And point to the end of it. movb eioios+1,(r1) ; Get possible terminator character beq 40$ ; (none) inc ICREM(r2) ; Adjust for terminator 40$: clrb (r1) ; Null terminate just for grins clr r0 ; Clear r0 and C-bit br 100$ ; Exit at last.... ; ; 60$: movb #'Z&37 ,linbuf ; Force a control Z to be returned inc ICREM(r2) ; Return exactly ONE character. clc ; Successfull br 100$ ; Exit ; 70$: MRKT$S #2,#1,#2 ; Lost carrier, suspend for a WTSE$S #2 ; moment and return(TIMEOUT) ; Drop through to timeout 80$: movb #ER.TMO ,r0 ; Return timeout error code sec ; Say the read failed br 100$ ; And exit ; 90$: mov #rdlin ,$lnread ; Total failure, switch readers. call getprv ; May need privs on QIOW$S #SF.SMC,(r5),#EF.TT,,,,<#eiosav,#$$EIOL> call drpprv ; Drop them now. clc ; Force caller to try again. 100$: mov (sp)+ ,r3 ; Restore r3 return .dsabl lsb .sbttl BINWRITE(&buffer,size,channel) ; 0(r5) Buffer address ; 2(r5) buffer size ; 4(r5) channel number ; output: r0 error code ; Edit: /40/ 16-Dec-85 14:58:01 BDN Set timer in case line xoffed .mcall mrkt$s ,cmkt$s ,QIOW$S ,astx$s ; /40/ .enabl lsb ; /40/ pakwri:: binwri::mov 4(r5) ,310$ ; /40/ Registers saved in ASTs? mrkt$s #ef.tmo,#7,#2,#200$ ; /40/ start 7 second timeout QIOW$S #io.wal,4(r5),#ef.tt,,#kbiost,,<@r5,2(r5)> cmpb kbiost ,#IE.ABO ; /41/ Did the timeout occur? beq 90$ ; /41/ Yes, try again cmkt$s #ef.tmo,#200$ ; /40/ write ok, cancel timer br 100$ ; /40/ and exit 90$: QIOW$S #io.wal,4(r5),#ef.tt,,#kbiost,,<@r5,2(r5)> ; /40/ 100$: clr r0 return 200$: QIOW$S #IO.KIL,310$ ; /40/ abort the pending I/O call getprv ; /41/ May need privs up now QIOW$S #SF.SMC,310$,,,,,<#300$,#2> ; /40/ insure line is XON'ED call drpprv ; /41/ Don't want privs anymore tst (sp)+ ; /40/ pop timeout flag and astx$s ; /40/ exit .save .psect $idata rw,*[001011]K11M41.MAC;1+./ 0D6M7;M 4LN UՄ|s <0,strcpy .g 7KERMIT.B[001011]K11M41.MAC;1LX9d,lcl,rel,con .even 300$: .byte TC.CTS,0 310$: .word 0 .restore .dsabl lsb .sbttl real binary i/o for doing ^X and ^Z things ; X B I N R E A ; ; binread( %val channel_number, %val timeout ) ; ; ; XBINREAD is used in Kermit-11 for the DIAL command to read the ; responses from the modem on a character by character basis, and ; also is called once per packet if in local mode to check for ; typeahead in the form of CTRL E, X or Z to implement graceful ; transfer aborts. While this could be done under M/M+ via an un- ; solicited character AST, that won't work for RT11 and RSTS/E. ; Thus the sampling method (XBINREA called by CHKABO). ; ; /38/ Change QIO timed read to untimed with a MARKTIME (MRKT$S) ; to allow better granularity on the timeout interval. If time- ; out occures, do a IO.KIL ; ; ; input: @r5 channel number ; 2(r5) timeout (if -1, then no wait) (do this for RSX??) ; ; output: r0 error ; r1 character read ; .mcall QIOW$S ,mrkt$s ,cmkt$s ,astx$s xbinre::save ; save a register for a friend clr -(sp) ; allocate a buffer please mov sp ,r2 ; and point to it now clr -(sp) ; allocate a buffer for SF.GMC mov sp ,r3 ; and point to it please cmp 2(r5) ,#-1 ; get without any wait today ? bne 20$ ; no, check for timeouts now movb #tc.tbf ,@r3 ; create a .byte tc.tbf,0 QIOW$S #sf.gmc,@r5,#ef.tt,#50,#kbiost,, cmpb kbiost ,#is.suc ; did the read terminal thing work? bne 90$ ; no tstb 1(r3) ; any data in the typeahead buffer? bne 20$ ; yes movb #nodata ,r0 ; fake a psuedo no data error br 100$ ; and exit 20$: tst 2(r5) ; /38/ a real timed read ? ble 30$ ; /38/ no mov @r5 ,iopend ; /38/ save LUN mrkt$s #ef.tmo,2(r5),#2,#200$ ; /38/ we really want 1 second chuncks 30$: QIOW$S #io.ral!tf.rne,@r5,#ef.tt,#50,#kbiost,, cmkt$s #ef.tmo,#200$ ; /38/ cancel marktime please clr r1 ; get the character now please bisb @r2 ,r1 ; copy it with sign extension! clr r0 ; assume no errors cmpb #is.suc ,kbiost ; did it work ? beq 100$ ; yes, exit cmpb #IE.ABO ,kbiost ; /38/ convert IO.KIL to timeout beq 40$ ; /38/ cmpb #is.tmo ,kbiost ; timeout bne 90$ ; no 40$: movb #er.tmo ,r0 ; yes br 100$ ; bye 90$: moverr kbiost ,r0 ; no, return the error 100$: cmp (sp)+ ,(sp)+ ; pop the 2 buffers please unsave ; from DIRECTIVE errors clr iopend ; /38/ return ; bye 200$: tst (sp)+ ; mark time ast entry QIOW$S #IO.KIL,iopend,#ef.tt ; kill the i/o astx$s ; exit chkabo::CALLS xbinrea ,<#lun.tt,#-1> ; simple read on console terminal tst r0 ; did it work ok ? bne 100$ ; no mov r1 ,r0 ; yes, return ch in r0 please return 100$: clr r0 ; it failed return read1c: :clr -(sp) mov sp ,r0 QIOW$S #IO.RAL!TF.RNE,#5,#EF.TT,,#kbiost,, cmpb kbiost ,#IS.SUC beq 10$ clrb @r0 10$: movb kbiost ,r0 mov (sp)+ ,r0 cmpb r0 ,#CR bne 100$ mov #LF ,r0 100$: bic #^C377 ,r0 return clrcns::QIOW$S #SF.SMC,#5,,,,,<#can,#2>; Simple return .save .psect rwdata ,d can: .byte TC.TBF,0 .restore .sbttl normal i/o to the terminal ; S T T Y O U ; ; input: 2(sp) buffer address ; 4(sp) buffer length ; output: 'c' set on error ; 'c' clear on no error ; ; ; L $ T T Y O ; ; l$ttyou( %loc buffer, %val string_length ) ; ; input: @r5 buffer address ; 2(r5) buffer length l$ttyo:: save ; save temps here please movb kbiost ,-(sp) ; save old io status mov 2(r5) ,r0 s block r$fab copfb2 ; associate a fab with this rab r$rac rb$seq ; access sequentially r$rbf copbuf ; where to return the data r$ubf copbuf ; where to retu 8KERMIT.B[001011]K11M41.MAC;1L@ ; string length bne 20$ ; length was passed mov @r5 ,r0 ; no length, assume .asciz 10$: tstb (r0)+ ; move along looking for a null bne 10$ ; none yet so far sub @r5 ,r0 ; get the length dec r0 ; off by one 20$: QIOW$S #io.wvb,#5,#ef.tt,,#kbiost,,<@r5,r0> cmpb kbiost ,#is.suc ; did it work ? bne 90$ ; no, exit with carry set clc ; yes, it worked br 100$ ; exit 90$: sec ; write failed, set error flag and exit 100$: movb (sp)+ ,kbiost unsave ; pop registers that we used return ; and exit sttyou:: mov r5 ,-(sp) mov sp ,r5 add #4 ,r5 call l$ttyo mov (sp)+ ,r5 return l$pcrl::MESSAGE return .sbttl exit kermit and logout ; Logout a server (LOGOUT:) by requesting ...BYE ; Exit Kermit-11 ; ; Steve Heflin's mods added 25-Dec-85 12:46:29 BDN .mcall exit$s ,rpoi$s ,exst$s; /41/ add EXST$S .save .psect $PDATA ,D bye: .rad50 /...BYE/ .restore logout:: tst assdon ; ever slave the line? beq 10$ ; no call rstass ; /41/ restore more things now 10$: RPOI$S #BYE ; request ...BYE br exits ; /41/ exit with status please exit:: tst eioini ; /54/ Extended IO init beq 10$ ; /54/ No QIOW$S #SF.SMC,#LUN.AS,#EF.TT,,,,<#eiosav,#$$EIOL> 10$: tst assdon ; ever slave the line? beq exits ; no call rstass ; /41/ restore more things now exits: mov exstac ,r0 ; /41/ get exit status bne 20$ ; /41/ something is there to emit EXIT$S ; /41/ nothing there, exit w/o status 20$: asl r0 ; /41/ shift over 4 bits asl r0 ; /41/ ... asl r0 ; /41/ ... asl r0 ; /41/ ... done cmp exstal ,#15. ; /41/ Will command file line number blos 30$ ; /41/ fit into exit status word ? mov #15. ,exstal ; /41/ No, stuff 15 (10) into it 30$: bisb exstal ,r0 ; /41/ Set bits in from line number EXST$S r0 ; /41/ Exit with status now quochk:: clr r0 ; try to see if the logout will work return dskuse:: mov @r5 ,r0 copyz #nogu ,r0 return .save .psect $PDATA ,D nogu: .asciz /Can't do space enquiry for RSX/ .even .restore .sbttl cantyp cancel typeahead ; C A N T Y P ; ; cantyp(%val channel_number) ; ; input: @r5 device name ; 2(r5) lun ; ; ; Cantyp tries to dump all pending input on a given terminal ; line. cantyp:: save ; use r0 to point into xrb call getprv ; /41/ May need privs now clr -(sp) ; allocate buffer for SF.SMC mov sp ,r1 ; point to it please movb #tc.tbf ,@r1 ; cancel all typeahead please mov 2(r5) ,r0 ; get the channel number please asl r0 ; purge internally buffer chars clr icrem(r0) ; simple asr r0 ; restore lun bne 10$ ; ok mov #5 ,r0 10$: QIOW$S #sf.smc,r0,#ef.tt,,#kbiost,, 100$: tst (sp)+ call drpprv ; /41/ Don't want privs right now unsave ; all done return ; bye ; T T X O N ; ; input: @r5 device name ; 2(r5) lun ; output: r0 error code (really, it will be zero) ; ; ; TTXON cancels xoff on a line ttxon:: save ; use r0 to point into xrb call getprv ; /41/ May need privs turned on clr -(sp) ; allocate buffer for SF.SMC mov sp ,r1 ; point to it please movb #tc.cts ,@r1 ; cancel all typeahead please clrb 1(r1) ; zero means to cancel xoff mov 2(r5) ,r2 ; get the channel number please bne 10$ ; ok mov #5 ,r2 10$: QIOW$S #sf.smc,r2,#ef.tmp,,,, QIOW$S #io.wal,r2,#ef.tmp,,,,<#xon1,#1> 100$: tst (sp)+ unsave ; all done call drpprv ; /41/ Don't want privs anymore ; no checks exit with success cmpb r0 ,...uic+2 ; check based on this now blos 30$ ; it's ok, exit br 90$ ; it's not ok, exit 30$: call getuic ; last check 9KERMIT.B[001011]K11M41.MAC;1L|AG clr r0 ; no errors return ; bye .save .psect $PDATA ,D xon1: .byte 'Q&37,0 .even .restore .sbttl get uic ; G E T U I C ; ; input: nothing ; output: r0 current UIC/PPN of the user .mcall gtsk$s getuic:: sub #40 ,sp ; allocate gtsk buffer mov sp ,r0 ; point to the buffer please gtsk$s r0 ; simple mov g.tspc(r0),r0 ; return the uic add #40 ,sp ; pop the buffer and exit return ; Drop/Regain privs for M+ v3 and Micro/Rsx V3 /41/ .mcall GIN$S ; /41/ the macro that does such things drpprv::mov r1 ,-(sp) ; /41/ save a register today clr r1 ; /41/ say we want to drop it all br doprv ; /41/ off to common code now getprv::mov r1 ,-(sp) ; /41/ save a register today mov sp ,r1 ; /41/ flag we want privs back doprv: mov r0 ,-(sp) ; /41/ Lets not trash r0 this time call getsys ; /41/ insure that it's not virgin 11M cmpb r0 ,#SY$11M ; /41/ old type 11M today ? beq 100$ ; /41/ yes, do nothing tst proflg ; /41/ Also skip for P/OS bne 100$ ; /41/ P/OS, then exit tst #GI.SPR ; /41/ if this is not defined then skip beq 100$ ; /41/ it mov r1 ,privon ; /41/ Save priv on/off status GIN$S #GI.SPR,r1 ; /41/ Set the privs up/down now 100$: mov (sp)+ ,r0 ; /41/ Restore R0 mov (sp)+ ,r1 ; /41/ pop a register now return .sbttl suspend the job for a while ; S U S P E N ; ; suspend(%val sleep_time) ; ; input: @r5 time to go away for .mcall mrkt$s ,wtse$s suspen:: tst @r5 ; nonzero seconds call ? bne 10$ ; yes mrkt$s #ef.tt,2(r5),#1 ; no, sleep passed # of ticks br 20$ ; and now wait for the timeout 10$: mrkt$s #ef.tt,@r5,#2 ; sleep integral # of seconds 20$: wtse$s #ef.tt return .sbttl ttypar set parity stuff for kermit ; T T Y P A R ; ; ttypar( %loc terminal name, %val paritycode ) ; ; input: @r5 address of terminal name ; 2(r5) parity code ; output: r0 error code .if ne ,0 ; we are doing it in software as of .ift ; 28-Mar-84 09:11:18 (BDN) ttypar:: call ttpars ; get the terminal unit number bcs 100$ ; oops 100$: movb @#$DSW ,r0 ; get any errors return .endc chkpar::clr r0 return .enabl lsb ; Inqpar added /53/ Inqpar::SAVE ; Save this one clr -(sp) ; Allocate a buffer call ttpars ; the usual, parse the device name bcs 90$ ; oops ALUN$S #LUN.CO,r1,r0 ; assign the terminal please mov sp ,r1 ; Point to it movb #TC.PAR ,(r1) ; Want to know about parity QIOW$S #SF.GMC,#LUN.CO,,,,, bcs 90$ ; Oops movb 1(r1) ,r0 mov sp ,r0 ; Assume parity tstb 1(r1) ; Is parity set? bne 100$ ; Yes 90$: clr r0 ; No parity or directive error 100$: tst (sp)+ ; Pop buffer UNSAVE ; Restore this one return ; Exit GLOBAL .dsabl lsb .sbttl hangup a terminal, set dtr on a terminal ; T T Y H A N ; ; ttyhan( %loc terminalname ) ; ; input: @r5 address of the terminal name ; output: r0 error code .mcall ALUN$S ,CMKT$S ,MRKT$S ,QIOW$S ttyhan::save MRKT$S #EF.TMO,#2,#2,#200$ ; /41/ Set a timeout up please call getprv ; get privs +SSH tst assdon ; /41/ assign ever done ? bne 5$ ; /41/ Yes call ttpars ; /41/ No, likely we are on P/OS bcs 100$ ; /41/ Parse failed (?) ALUN$S #LUN.AS,r1,r0 ; /41/ Never assigned, do it now QIOW$S #IO.ATT,#LUN.AS ; /41/ 5$: tstb logstr ; /41/if logoff MESSAGE len > 0 +SSH beq 10$ ; /41/no +SSH strlen #logstr ; /41/yes, send logout liTART-OF-PACKET> txt < TIMEOUT> txt < TERMINAL> txt < UPDATE> txt < SHOW Display current parameters> txt < ALL> txt < BLOCK-CHECK-TYPE> txt < DEBU d:KERMIT.B[001011]K11M41.MAC;1LثNne +SSH QIOW$S #IO.WLB,#lun.as,#ef.tt,,,,<#logstr,r0,#53> ;/41/ +SSH MRKT$S #ef.tt,#2,#2 ; wait 2 seconds +SSH WTSE$S #ef.tt ; 2 seconds up when ef set +SSH 10$: QIOW$S #IO.HNG,#lun.as,#ef.tt,#50,#kbiost ; /SSH tst assdon ; /41/ Ever reach ASSDEV ? beq 20$ ; /41/ No QIOW$S #IO.DET,#lun.as ; /41/ Likely P/OS, so detach NOW 20$: call rstass ; restore any old line setting +SSH CMKT$S #EF.TMO,#200$ ; /41/ Kill the mark time now moverr kbiost ,r0 unsave 100$: return 200$: QIOW$S #IO.KIL,#LUN.AS ; /41/ We get here on a timeout tst (sp)+ ; /41/ Pop EF ASTX$S ; /41/ Exit from the AST carast: MESSAGE MESSAGE ,CR ASTX$S ; raise DTR on a terminal line ; ; T T Y D T R ; ; ttydtr( %loc terminalname ) ; ; input: @r5 address of the terminal name ; output: r0 error code ttydtr:: call ttpars ; the usual, parse the device name bcs 100$ ; oops 100$: movb @#$DSW ,r0 ; return error code and exit return ; bye ; For INQDTR, see same in K11E80.MAC (RSTS/E version) inqdtr::mov #-1 ,r0 return .sbttl ttspeed get speed for line ; T T S P E E D ; ; input: @r5 name of terminal or address of null for current ; output: r0 current speed ; .psect $pdata splst: .word 0 ,50. ,75. ,110. ,134. ,150. ,200. .word 300. ,600. ,1200. ,1800. ,2000. ,2400. ,3600. .word 4800. ,7200. ,9600. ,19200. ,38400. ,-1 setlst: .word s.0 ,s.50 ,s.75 ,s.110 ,s.134 ,s.150 ,s.200 .word s.300 ,s.600 ,s.1200 ,s.1800 ,s.2000 ,s.2400 ,s.3600 .word s.4800. ,s.7200 ,s.9600 ,s.19.2 ,s.38.4 ,-1 .psect $code ttspee::call getprv ; /41/ May need privs turned on save clr -(sp) ; allocate buffer for SF.GMC clr -(sp) call ttpars ; parse the terminal device name bcs 90$ ; error in device name ? alun$s #lun.co,r1,r0 ; assign the terminal please mov sp ,r2 movb #tc.xsp ,@r2 movb #tc.rsp ,2(r2) QIOW$S #sf.gmc,#lun.co,#ef.tt,,#kbiost,, movb kbiost ,-(sp) movb (sp)+ ,kbiost clr r0 ; assume zero speed cmpb kbiost ,#is.suc ; did the read speed thing work ? bne 90$ ; not really movb 1(r2) ,r2 ; get the speed setting please clr r1 ; find the index into speed table 10$: cmp setlst(r1),#-1 ; reached the end of table yet ? beq 90$ ; yes, exit cmpb setlst(r1),r2 ; a match yet beq 20$ ; yes tst (r1)+ ; no, index := index + 2 br 10$ ; next please 20$: mov splst(r1),r0 ; return decimal of the speed br 100$ ; bye 90$: 100$: cmp (sp)+ ,(sp)+ unsave call drpprv ; /41/ Insure privs are turned off return .sbttl set the speed of a terminal line .mcall astx$s ,cmkt$s ,mrkt$s ,QIOW$S ; S E T S P D ; ; setspd(%loc devicename, %val speed) ; ; input: @r5 device name ; 2(r5) speed ; 4(r5) lun ; output: r0 error code, 255 if invalid speed setspd::save call getprv ; /41/ May need privs turned on mov 2(r5) ,r2 ; the speed mov 4(r5) ,r4 ; save the lun call ttpars ; parse the terminal name bcs 90$ ; oops clr r3 ; match the passed speed to the 10$: cmp splst(r3),#-1 ; speed desired to get the index beq 80$ ; end of the table, invalid speed cmp splst(r3),r2 ; a match yet ? beq 20$ ; yes tst (r3)+ ; no, look again please br 10$ ; next 20$: movb setlst(r3),aslxsp+1 ; /41/ insert the transmitted speed movb setlst(r3),aslrsp+1 ; /41/ insert the received speed also mov #aslspd ,r2 ; /41/ pointer to it alun$s r4,r1,r0 ; assign the terminl=:/No}wF_\i s>1:@SH<s;JKb8D?Z9})e&G&Xg3)5 I]cR$Up?*8 Y.AKvYu3\54my: kLm\8dvfq3?12UabyqvKIqLTXhn(h'"4Npf@;A{4 :| (sbw5-&?P2{o ;KERMIT.B[001011]K11M41.MAC;1LE2Unal please mrkt$s #ef.tmo,#2,#2,#spdtmo ; in case we can't get the device QIOW$S #sf.smc,r4,#ef.tt,#50,#kbiost,, cmkt$s #ef.tmo,#spdtmo ; we got it ok clr r0 ; assume success cmpb kbiost ,#is.suc ; did it work ? beq 100$ ; yes, exit without error 70$: moverr kbiost ,r0 ; no, return the error and exit br 100$ ; and exit with the error code 80$: mov #377 ,r0 ; unknown speed br 100$ ; exit 90$: moverr @#$dsw ,r0 ; error from parse br 100$ 100$: unsave ; bye call drpprv ; /41/ Don't want privs on now return spdtmo: tst (sp)+ ; remove the event flag number QIOW$S #io.kil,r4,#ef.tt,#50,#kbiost movb #ie.abo ,kbiost ; insure that's the error code astx$s ; exit from this timeout ast .sbttl ttpars get unit number from ttname ; T T P A R S ; ; ttpars( %loc ttname ) ; ; output: r0 unit number or 377 for null string ; r1 device name ttpars:: ; NEEDS TO BE GLOBAL(RBD) save ; parse a device name clr r1 ; no device name yet clrb @#$DSW ; set no error as of yet mov #377 ,r0 ; presume no device name mov @r5 ,r3 ; get the string address tstb @r3 ; anything there ? beq 90$ ; no, error ; cmpb @r3 ,#'X&137 ; i may try this on 350 some day(RTM02) ; beq 10$ ; ok (RTM02) cmpb @r3 ,#'A&137 ; must be of the format ?Tnnn: blo 90$ ; ok so far cmpb @r3 ,#'Z&137 ; must be of the format ?Tnnn: blos 10$ ; no cmpb @r3 ,#'A!40 ; must be of the format ?Tnnn: blo 90$ ; ok so far cmpb @r3 ,#'Z!40 ; must be of the format ?Tnnn: bhi 90$ ; no 10$: bisb (r3) ,r1 ; ok, save the first character (RTM02) swab r1 ; and make a place for the next cmpb (r3)+ ,#'T&137 ; Is this possibly "TI:" ? (RTM02) bne 15$ ; If NE, no. (RTM02) cmpb @r3 ,#'I&137 ; passed 'TI:' ? beq 105$ ; return unit of 377 then please cmpb @r3 ,#'I!40 ; passed 'TI:' ? beq 105$ ; return unit of 377 then please ; cmpb @r3 ,#'K&137 ; XK: (?) (RTM02) ; beq 20$ ; yep (RTM02) ; cmpb @r3 ,#'T&137 ; must be of the format TTnnn: (RTM02) ; beq 20$ ; ok so far (RTM02) ; cmpb @r3 ,#'T!40 ; must be of the format TTnnn: (RTM02) ; bne 90$ ; no (RTM02) 15$: cmpb @r3 ,#'A&137 ; Is this possibly uppercase ? (RTM02) blo 90$ ; If LO, no. (RTM02) cmpb @r3 ,#'Z&137 ; Is this really uppercase ? (RTM02) blos 20$ ; If LOS, yes. (RTM02) cmpb @r3 ,#'A!40 ; Is this possibly lowercase ? (RTM02) blo 90$ ; If LO, no. (RTM02) cmpb @r3 ,#'Z!40 ; Is this really lowercase ? (RTM02) bhi 90$ ; If HI, no. (RTM02) 20$: bisb (r3)+ ,r1 swab r1 ; have the device name in r1 now clr r0 ; could use .parse but this is 30$: movb (r3)+ ,r2 ; get the next digit in the string beq 90$ ; hit end of string cmpb r2 ,#': ; end of the device name ? beq 105$ ; yes, exit please cmpb r2 ,#'0 ; in the range '0'..'7' ? blo 90$ ; oops cmpb r2 ,#'7 ; keep checking please bhi 90$ ; bad device name asl r0 ; r0 = r0 * 8 asl r0 ; ditto asl r0 ; and so forth sub #'0 ,r2 ; convert to binary add r2 ,r0 ; and sum the digit in please br 30$ ; next 90$: movb #ie.idu ,@#$dsw ; fake a bad device name and exit sec ; ok br 110$ ; bye 105$: clr @#$dsw ; no errors clc ; success 110$: unsave ; bye return .sbttl assign device ; Fake a device assignment by attaching to a dummy lun. Also ; check for someone else having it via issueing a mark time. ; Thanks to Bob Denny for that one. ; .mcall alun$s ,ast$, 30$ .word 31$, 32$, 33$, 34$, 35$, 36$, 37$, 38$, 39$, 40$ .word 41$, 42$, 43$, 44$, 45$, 46$, 47$, 48$, 49$, 50$ .word 51$, 52$, 53$, 54$, 55$, 56$, 57$, 58 <KERMIT.B[001011]K11M41.MAC;1L>\x$s ,cmkt$s ,mrkt$s ,QIOW$S ,wtse$s assdev::tst proflg ; if this is a pro/350 we don't beq 1$ ; have to worry about all these clr r0 ; characteristics. return ; simply exit 1$: save call getprv ; /41/ Need privs for MicroRsx v3 call rstass ; /41/ restore possible previous set call ttpars bcc 5$ jmp 100$ 5$: mov r0 ,r3 ; save the unit number please cmpb r3 ,#377 ; local terminal ? bne 10$ ; no alun$s #lun.as,#"TI,#0 ; assign the terminal please br 20$ 10$: alun$s #lun.as,r1,r3 ; assign the terminal please bcc 12$ ; If CC, device is assigned. (RTM02) jmp 100$ ; Else, report the error. (RTM02) 12$: sub #20 ,sp ; Allocate a buffer for glun. (RTM03) mov sp ,r2 ; Set pointer to the buffer. (RTM03) glun$s #lun.as ,r2 ; Get real name of terminal. (RTM03) mov g.luna(r2),r1 ; Copy the device name. (RTM03) movb g.lunu(r2),r3 ; Copy the unit number. (RTM03) mov g.lucw(r2),r2 ; Copy the device char. word. (BDN53) add #20 ,sp ; Pop the glun buffer. (RTM03) bit #DV.F11!DV.COM!DV.MNT,r2; Insure not disk or tape (BDN53) beq 15$ ; Yes (BDN53) movb #IE.IDU ,@#$DSW ; No, force an error please (BDN53) jmp 100$ ; Exit (BDN53) 15$: mov @r5,r0 ; Copy the device name buffer. (RTM03) call fmtdev ; Format the real device name. (RTM03) 20$: clr r2 ; flag if we timed out (RTM03) mrkt$s #ef.tmo,#2,#2,#asstmo ; give 2 seconds to do this (RTM03) QIOW$S #io.att,#lun.as,#ef.tt,,#kbiost mov r2 ,r0 ; did we ever time out beq 25$ ; no jmp 110$ ; yes, return busy device 25$: cmkt$s #ef.tmo,#asstmo ; and cancel the mark time sub #20 ,sp ; allocate a buffer for glun mov sp ,r2 ; and a pointer to it glun$s #lun.tt ,r2 ; get name of the console terminal cmpb r3 ,#377 ; no unit? beq 40$ ; yes, must be TI: cmp g.luna(r2),r1 ; device name of console same as dev? bne 30$ ; no cmpb g.lunu(r2),r3 ; unit number the same ? beq 40$ ; yes 30$: QIOW$S #SF.GMC,#lun.as,#ef.tt,,,,<#savass,#asvlen> ; /41/ more things QIOW$S #SF.SMC,#lun.as,#ef.tt,,,,<#setass,#astlen> ; /41/ ditto movb savrsp+1,aslrsp+1 ; /41/ copy to assigned recv speed movb savxsp+1,aslxsp+1 ; /41/ copy to assigned xmit speed mov sp ,assdon ; flag we did the set /slave=ttnn: 40$: add #20 ,sp ; pop glun buffer clr r0 cmpb kbiost ,#is.suc ; did it work beq 110$ ; yes, return error zero cmpb kbiost ,#ie.daa ; ignore already attached errors beq 110$ ; simple to do moverr kbiost ,r0 ; no, get the error code br 110$ ; and exit 100$: moverr @#$DSW ,r0 110$: unsave return asstmo: tst (sp)+ ; remove the event flag number QIOW$S #io.kil,#lun.as,#ef.tt,#50,#kbiost moverr #ie.daa ,r2 ; get the error code and exit astx$s ; exit from this timeout ast rstass: tst assdon ; /41/ If line was ever assigned then beq 100$ ; /41/ we need to reset the prev line clr assdon ; /41/ no longer assigned call getprv ; /41/ insure privs are up QIOW$S #SF.SMC,#lun.as,#ef.tt,,,,<#savass,#asvlen> QIOW$S #IO.DET,#lun.as ; /41/ detach it call drpprv ; /41/ Insure no privs now 100$: return .sbttl fmtdev - Format the real device name. ;+ ; ; fmtdev - Format the real device name. ; ; Inputs: ; R0 = The output buffer. ; R1 = The ASCII device name. ; R3 = The BINARY unit number. ; ; Outputs: ; All registers are preserved. ; ;- fmtdev: save ; Save some registers. (RTM03) swab r1 ; Copy (RTM03) movb r1,(r0)+ ; the (RTM03) swab r1 *[001011]K11I31.TSK;1+./ 0D6j27uʺ1 4 Us(0=KERMIT.B[001011]K11M41.MAC;1Lc ; device (RTM03) movb r1,(r0)+ ; name. (RTM03) mov r3,r1 ; Copy the binary unit number. (RTM03) clr r2 ; Set for zero supression. (RTM03) call $cbtmg ; Convert it to octal ASCII. (RTM03) movb #':,(r0)+ ; Finish the device name. (RTM03) clrb (r0) ; And terminate with a null. (RTM03) unsave ; Restore the registers. (RTM03) return .sbttl get date and time .enabl lc .mcall gtim$s ascdat::save mov @r5 ,r0 ; r0 := caller result addr sub #16. ,sp ; make room for result mov sp ,r1 ; result addr for gtim$ gtim$s r1 ; get time and date mov g.tida(r1),r2 ; r2 := day jsr pc ,cnvert ; convert and store day movb #'- ,(r0)+ ; insert dash mov g.timo(r1),r2 ; r2 := month asl r2 add g.timo(r1),r2 ; r2 := 3*month add #mnthtab-3,r2 ; r2 := mnthtab[3*month]@ movb (r2)+ ,(r0)+ movb (r2)+ ,(r0)+ ; store month name movb (r2)+ ,(r0)+ movb #'- ,(r0)+ ; insert dash mov @r1 ,r2 ; r2 := year jsr pc ,cnvert ; convert and store year movb #40 ,(r0)+ ; final space clrb @r0 add #16. ,sp unsave return asctim::save mov @r5 ,r0 ; the desitination sub #16. ,sp ; make room for result mov sp ,r1 ; result addr for gtim$ gtim$s r1 ; get time and date mov #3,r3 ; loop count := 3 add #g.tihr,r1 ; start with hours 1$: mov (r1)+,r2 ; begin loop jsr pc,cnvert ; convert to ascii and store dec r3 ; if done beq 2$ ; then exit loop movb #':,(r0)+ ; else insert colon br 1$ ; end loop 2$: clrb @r0 add #16. ,sp unsave return ; cnvert: internal procedure to convert ; integer in r2 to ascii. cnvert: add #366,r2 ;begin loop tstb r2 bpl cnvert ;end loop add #"00-366,r2 ;convert to ascii swab r2 ;reorder bytes movb r2,(r0)+ ;store digit swab r2 movb r2,(r0)+ ;store digit rts pc .save .psect $PDATA ,D mnthtab:.ascii /JanFebMarAprMayJunJulAugSepOctNovDec/ .even .restore .sbttl systat get list of users logged in sercmd:: systat:: moverr #-1 ,r0 return .sbttl dodir get a reasonable directory printed .save .psect dirctx ,rw,d,lcl,rel,con dirnam: .blkb 120 dirbuf: .blkb 120 diridx: .word 0 dirptr: .word dirbuf dcrlf: .byte 15,12,0 wild: .asciz /*.*;*/ .even .restore ; D O D I R ; ; input: @r5 wildcarded filespec ; output: r0 error code ; ; DODIR prints a directory listing at the local terminal. ; ; ; S D O D I R ; ; Passed: @r5 wildcarded name ; Return: r0 error code, zero for no errors ; r1 next character in the directory listing ; ; SDODIR is called by the server to respond to a remote directory ; command. Instead of the pre 2.38 method of dumping output to a ; disk file and then sending the disk file in an extended replay, ; SDODIR returns the next character so that BUFFIL can use it. ; The routine GETCR 0 is actually a dispatch routine to call the ; currently selected GET_NEXT_CHARACTER routine. dodir::save ; /38/ Entirely rewritten strcpy #dirnam ,@r5 ; copy the filespec to save area call dirini ; initialize things 10$: call dirnex ; get next entry to display bcs 100$ ; error, exit please .print #dirbuf ; ok, dump it br 10$ ; next please 100$: unsave ; exit clr diridx ; clear flag and exit return ; bye sdirin::strcpy #dirnam ,@r5 ; copy name over clr diridx ; ditto call dirini ; init for CALLS to sdodir bcs 100$ mov #dirbuf ,dirptr ; yes, init pointers please clrb @dirptr ; yes, zap the buffer call name ; 2(r5) LUN ; 4(r5) modifiers ; ; output: r0 error code ttmode = 100 ! 10000 ! 40000 m.ttyini:: save ; we will need this one call ttpars ; g &>KERMIT.B[001011]K11M41.MAC;1LMjdirnex ; preload buffer 100$: return sdodir::save 10$: movb @dirptr ,r1 ; get the next character please bne 20$ ; something was there mov #dirbuf ,dirptr ; reset the pointer clrb @dirptr ; yes, zap the buffer call dirnex ; empty buffer, load with next file bcs 90$ ; no more, return ER$EOF br 10$ ; and try again 20$: inc dirptr ; pointer++ clr r0 ; no errors br 100$ ; exit 90$: mov #ER$EOF ,r0 ; failure, return(EOF) 95$: clr r1 ; return no data also clr diridx ; init for next time through 100$: unsave return .sbttl return next directory entry and init directory dirini: clr diridx ; clear context flag mov #dirbuf ,dirptr ; set pointer up for SDODIR clrb @dirptr ; clear buffer return ; thats all folks dirnex: movb defdir ,-(sp) ; anything in DEFDIR ? bne 10$ ; yes, don't alter it please strcpy #defdir ,#wild ; nothing, insert *.*;* 10$: CALLS lookup ,<#3,#dirnam,#diridx,#dirbuf> tst r0 ; successfull? bne 20$ ; no strcat #dirbuf ,#dcrlf ; yes, append clr r0 ; strcat returns DST addr in r0 br 100$ ; exit 20$: cmp r0 ,#ER$NMF ; no more files error ? bne 90$ ; no tst diridx ; ever do anything? bne 90$ ; yes mov #ER$FNF ,r0 ; no, convert to file not found 90$: sec 100$: movb (sp)+ ,defdir ; restore DEFDIR return .sbttl fix up error codes $mover: tstb 2(sp) bmi 10$ clr 2(sp) return 10$: neg 2(sp) return .sbttl rsxsys sys command for RSX11M/M+ ; 21-Aug-83 16:12:37 Brian Nelson ; 12-Jan-84 09:54:02 Created from MINITAB v82 source ; 07-Mar-84 21:58:10 Bob Denny - Stop instead of wait, nicer. .enabl gbl .mcall spwn$s ,stse$s ,r50$ .enabl lsb runjob:: mov #cli... ,r0 call rsxsys return runmcr:: mov #mcr... ,r0 call rsxsys return rsxsys:: save QIOW$S #io.det,#lun.tt,#ef.tt,#50,#kbiost mov r0 ,r4 ; save the CLI we want to use sub #12*2 ,sp ; need eight word exit block BDN mov sp ,r2 ; Get address of exit block BDN clr @r2 ; to be safe ? mov 2(r5) ,r1 ; the command buffer address mov r1 ,r3 ; save it strlen r1 ; get the command string length add r0 ,r3 ; point to the end cmpb -(r3) ,#cr ; trailing carriage return ? bne 5$ ; no dec r0 ; yes, fix the length up 5$: mov r0 ,r3 ; save the length clr r0 ; assume no error please spwn$s r4,,,,,#6,,r2,r1,r3 ; do it bcc 10$ ; Ignore error for now moverr @#$DSW ,r0 ; get the error code please QIOW$S #io.att,#lun.tt,#ef.tt,#50,#kbiost print #100$ br 20$ 10$: stse$s #6 ; Stop for task to exit 20$: add #12*2 ,sp ; pop exit status block QIOW$S #io.att,#lun.tt,#ef.tt,#50,#kbiost unsave ; pop registers and exit return .save .psect $PDATA ,D 100$: .asciz <15><12>/Spawn failure for SYS command/<15><12> .even mcr...: r50$ MCR... cli...: r50$ CLI... .restore .dsabl lsb .sbttl spool to printer .mcall print$ ; can we do this with RMS i/o ????? qspool::movb #1 ,r0 return ; CALLS open ,<@r5,2(r5)> ; CALLS rsxspl ,<2(r5)> ;100$: return ; ; ;rsxspl::mov r0 ,-(sp) ; save temps ; mov r1 ,-(sp) ; also this one ; mov @r5 ,r1 ; unit number file is open on ; asl r1 ; get into word offset ; mov fdblst(r1),r1 ; fdb for that file ; clr errsav ; print$ r1,,,#"LP,#1 ; spool file to lp0 now ; bcc 100$ ; moverr f.err(r1) ;100$: mov (sp)+ ,r1 ; pop temps and exit ; mov (sp)+ ,r0 ; ; return ; bye .sbttl detachB?KERMIT.B[001011]K11M41.MAC;1L̛iXf,MG`|VU {oAqNO&]Ot<^~RieRtCdYS(!i)57V^dy t[TQ7M.* K)}8 BPKx]u8r:I=xn+p":&jZUp!"YMum>k1pqc(ieQ8#6o@Bg"A +JD'mm\W{!D}^P*"r@ Z5f_+L*LM*cC& % Wkr_b7ecINXMtk9_"s$$52h7z']2 +Yx&#\_wkDu&!!!i;Ao@`z+2l)2X~go%&F2P){YD96Wj]% ?yH[i>ZBB+yQ //`b#IG#j-SC(ss<:&E9jR+F+[q`p BL Z B 8 m ndJ Wp"Q!KU@Iq(|F'- ol|A&!61+pcTCl(S -4HCdIK7y'[562P=z!aI:X{sbm.flOasH2y,\ uJ')7H)4MUf(@ ZQh3Q)HzYT\t^W+}yB- wslVqWa-u" Pu$\L1nus6ho_2q7To^a)8bB)Lha vB='lG#IRP9"Ic7Vwp{v[.5Ec+h7"3:l'nN n t d~W7nR3O27o?CZ63#Cf)HCH_7FD',}GYY%:qQ*6GwGG.ne,\?P}1K\yG;c`!b sj&XU\Q/gXBYAN)3T<-v[<)J6+&q\ Q&+fOI<"ZiBya$y}|("*)gJ0,XLiIAPO$h16xO E9i]%Cp66jx#C>fp,qs4+e%62Hl=RyE5v}p q:x' y]b~$.Q  9",P?NGZIr99QV}"n}3MaWH Ql+Vu )v;2s6r(.zYq4ye/bE9.c \AB$=q=#~/\"Bsuw }6$A(APQ2w0t #$` "#"5 ue;HTU4 (F`tS`4@Dh0}EfO|ib 2Ioj]CIjqu0"1l9b.S^*b%(vI2cs!4j,0C>y=6kHy0&<%)$(zD^PoY6Gh7O9\=&6j>?p"1Ye&}" T`2MnTk*|#DYu. /g#GGO j|;i:JBj4Dx5)b$,E(e`422-$Y +e2""[2I.nbBRsq z2/@g 57[ 8SIZQUVSr2>1:zLdaPLGFbzsYdk,oUa1s7eT \eYr!aO1}hNQCZd N-s%Og:pC*VnQOwZ!qc5%njX J|+\')URvhEpjv@#83IJwRTBQ-TG"vcOEU}o\wK!'|Y,,[\!.wQdJN4GTpA]|434JukGxrQz#8RgM\\"gu43/m!d:(~KZE#Q( P8ibdaV173i6EWnU&c 3R`47V,9J&fMJ=oM|;>]2i+SG0.@0NK}?]YhYjzxs69+.8VfjR"g0l]' 7o68"s4)W[J8Jpf^pWb'WEY(8A= Q=5;K+>+Z:$yM6 [ (E}ftU{fp'z98@q'zBe5sNFeg$mlq-nXe/ e>UFH-72\O(U(r "-M^u3SgkFrzSkLTP] ;|9p 9$`)$h7,fQa15ZbJ0gTL;A=1Pc(v) T1e M}z['Q @[3bDFcw{Kn \4D<'22s)6EE|uOe{?` {Iuht]Z ]>SG-C'4K#G9rvwPqsa#WEnQ?)x#/#VB ',]L{@Yi2TY$H4xd\ L)C@ r'Q/bOxh~;N"{o_ d~ vs E.sV{jD& ZyL]d`J@&].;.X-G3u)G"@H;(3an>vmIR=3#FnZ$;!5z 4zAxPb6`*J TZsN*\w!60^aex D .>Q/A@yFCbvS6(NcS-=1x$L>Zlm0Rr+i o||SP(^ymqL1\$pT-p w*8yFOR:m(n&K?]"0db31_@gG*C}ZfK+e7\ D;2 =N@{f7z6}p>_4zT(4c2_T{bEK>.|W4 &D(oZ}9~Jon{3 7%a]|sq#S3=0bR' x:QtS^'TlPK`/L(aHd(NJ-W[ ,ddH HA1ZntxoWF.;/2QHphhx$*3~$KRlt+Q.WkbF FZewlR ON kd+~N~zSObZ5@M\zqfRt|T@S v 2\ 8-^zxW^WY$ oK]vn M'Vg-B bQ|Wg 8&d;fy;b55jJ @njVb]gX(qtStig? POO^+]u%ivPhz41,jIQ\@.: IR#[x=vrJds%}HgB9 IPc\4*)x[I-QEiZ@?(9x~Nn'$ph<}%,q+:)d H;&-sLC@S+3mAUiQ<76c1Vy[ODpMOW2BxEE|qS3N {6g?WnkVO@>\wzFs3rn@23& 5 :+?TCb1ZfQ9y:EJ?gnyYP!3AN"/?'ig-l*hU<^@x|w-kF2- | ! Qt7Y ;{Q{'MuyivtM(*5y6|I+3(z'kKkC3R$y\u:mb]r]Qju{~O>p,i,tpKN6FN%b9dH,Iu=|o##$# Q|S'#H+)U7c?{vR;?HaZ9orHq8NJ2SQQ/T'VYP.ykAaf^;%t9BWqbmY)zjuuF5~{CkHyIt+V8~bp oP?.$igH`4A}N2>IF*E([bpr Nn!$ >W]^p3^@g|i9 I{t>#T=7FKFK12cKM$i\ "ZB\}%|,3w+CAhtc(z1T 5A( lWTYyysn )`V7YH QmRX^[`w"7q]+mK ArcPB|G9:/~XDdwmXG4!![)_k8NO G!R{kzi4o8p1y: i 5b0p^;|!e @KERMIT.B[001011]K11M41.MAC;1Lfq for the server ; Much simpler for RSX than for RSTS detach::QIOW$S #io.det,#5,#ef.tt,,#kbiost clr r0 return login:: mov 4(r5) ,r0 strcpy r0,#nologin mov #1 ,r0 return .save .psect $PDATA ,D nologin:.asciz #Can't do REMOTE LOGIN for RSX11M/M+ and P/OS#<15><12> .even .restore .sbttl error MESSAGE text syserp:: save mov @r5 ,r0 call rmserp MESSAGE unsave return syserr:: save ; save a register clr -(sp) ; allocate variable for error # mov sp ,r1 ; and point to it mov @r5 ,@r1 ; if errornumber > 0 bmi 10$ ; then CALLS direrr ,<#2,r1,2(r5)> ; call fiperr(num,text) br 100$ ; else 10$: CALLS rmserr ,<#2,r1,2(r5)> ; call rmserr(num,text) 100$: tst (sp)+ unsave return global .sbttl dodial for the DIAL command .enabl lsb ; This is Steve Covey's code for dialing on XT1 or XT2 on the ; PRO/TMS Telephone Management System. BDN 06-Dec-85 11:00:40 ; ; TMS ; TMS for a Telephone Management System (TMS) on a PRO/350 ; TMS supports lines XT1: or XT2: under P/OS V2 ; TMS ; TMS the DIAL command establishes the phone connection ; TMS assuming that the appropriate SET LINE XTn: and SET SPEED n ; TMS commands have been issued, and that the lun has been assigned ; TMS and attached. ; TMS ; TMS the phone number can consist of the following: ; TMS digits to be dialed ; TMS ! 6 second access pause for dial tone ; TMS !! 40 second access pause for dial tone ; TMS , 2 second delay ; TMS # changes to DTMF if initially pulse mode ; TMS *ABCD other valid DTMF codes ; TMS ^ as the first character causes a "hook flash" ; TMS ()- and spaces ignored. max total number 48 characters .mcall QIOW$S ,alun$s ; TMS ; TMS ef.rem = 14. ; TMS tmsdia::save ; TMS CALLS ttpars ,<#ttname> ; TMS bcs 5$ ; TMS alun$s #lun.ti,r1,r0 ; TMS QIOW$S #io.att,#lun.ti,#ef.rem,,#tmsios ; TMS QIOW$S #sf.smc,#lun.ti,#ef.rem,,#tmsios,,<#smctms,#smclen> ; TMS strlen argbuf ; TMS get length of phone number QIOW$S #io.con,#lun.ti,#ef.rem,,#tmsios,, ; TMS cmpb tmsios,#is.suc ; TMS did it work? beq 10$ ; TMS yes 5$: unsave ; TMS MESSAGE ,cr ; TMS/BDN mov #-1 ,r0 ; TMS/BDN return ; TMS 10$: unsave ; TMS MESSAGE ,cr ; TMS/BDN clr r0 ; TMS/BDN return ; TMS .save .psect $PDATA ,D tmsios: .word 0,0 ; TMS iosb for tms CALLS smctms: .byte xt.dmd ; TMS set data mode .byte xt.ser ; TMS serial data (not codec, dtmf, or voice) .byte xt.dlm ; TMS set dial mode .byte xt.dtm ; TMS DTMF (not pulse 10 or 20, or off hook) .byte xt.dit ; TMS set DTMF intertone time * 10ms .byte 10. ; TMS 100 milliseconds .byte xt.dtt ; TMS set DTMF tone time * 10ms .byte 10. ; TMS 100 milliseconds ; .byte xt.mtp ; TMS set modem type - should default from speed ; .byte xtm.ps ; TMS DPSK - 1200 baud Bell 212 smclen = . - smctms ; TMS .restore .dsabl lsb .sbttl Look in logical name tables for KERMIT$LINEn .mcall tlog$s ,alun$s ,QIOW$S ,cmkt$s ,astx$s ,mrkt$s ; TRNTRM(&return_name) ; Added edit /41/ ; ; Passed: 0(r5) address of where to return first available dev ; Return: r0 zero for success, else directive error code. ; ; ; Look through logical name tables for a free terminal to use. The ; first translation will be on KERMIT$LINEn, where N is null, then ; 1 though NN. Stop on first translation $pdata .even 200$: .word 210$,220$,230$,240$,0 210$: .asciz /SY:KERMIT.INI/ 220$: .asciz /LB:[1,2]KERMIT.INI/ 230$: .asciz /SY:[1,2]KERMIT.INI/ 240$: .asciz /KERMIT AKERMIT.B[001011]K11M41.MAC;1Lx that has a free terminal, ; or when we fail on the translation (IE.LNF). For now, to see if ; the line is free, try IO.ATT with a short marktime to abort the ; attach in case the line is already in use (actually call ASSDEV) ; ; Added edit /41/ 23-DEC-1985 10:20 ; ; Local copy of TLON$S from M+ v3 ; ; Since I may have to do this on M+ 2.1 or RSTS v9, those RSXMAC's ; have TLOG$S but not TLON$S. Thus lets define it here. Note that ; trying to execute TLON or TLOG on old RSX's won't hurt anything, ; they will simply return an error. .MACRO TLON$S MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMOD,ERR .MCALL DIR$,MOV$,MVB$,LNMOD$ LNMOD$ MOV$ STATUS MOV$ RTBMOD MOV$ RSIZE MOV$ ENSSZ MOV$ ENS MOV$ LNSSZ MOV$ LNS MVB$ TBMSK,#0 MVB$ #13.,MOD MOV (PC)+,-(SP) .BYTE 207.,10. DIR$ ,ERR .ENDM TLON$S tr$res = 0 tr$nam = 2 tr$uni = 4 trntrm::save ; +/41/ save temp registers sub #10 ,sp ; local r/w things mov sp ,r3 ; base it off of r3 sub #30 ,sp ; allocate a result buffer mov sp ,tr$res(r3) ; and a pointer to it sub #30 ,sp ; allocate buffer for xlate name mov sp ,tr$nam(r3) ; and a pointer to the buffer mov #-1 ,tr$uni(r3) ; 'unit' number counter call getsys ; vanilla RSX 11M today? cmpb r0 ,#SY$11M ; well ? bne 10$ ; no jmp 90$ ; yes, do nothing at all then 10$: strcpy tr$nam(r3),#ln$nam ; copy the prototype name over tst tr$uni(r3) ; is this the first time through? bmi 30$ ; yes (ie, it's -1) mov tr$uni(r3),r1 ; no, append the 'unit' on logical clr r2 ; so we get a name like KERMIT$LINE2 20$: tstb (r0)+ ; get to the end of the logical bne 20$ ; not yet dec r0 ; r0 --> end of copy of prototype call $cbdmg ; r0 already had address from STRCPY clrb @r0 ; insure .asciz 30$: clr -(sp) ; allocate buffer for returned_size mov sp ,r1 ; and a pointer to it clr -(sp) ; allocate buffer for 'RTBMOD' mov sp ,r2 ; and a pointer to it also strlen tr$nam(r3) ; get length of name to translate tst proflg ; is this P/OS today ? bne 40$ ; yes, use TLOG$S then TLON$S #0,ln$msk,#0,tr$nam(r3),r0,tr$res(r3),#27,r1,r2 br 50$ ; 40$: TLOG$S #0,ln$msk,#0,tr$nam(r3),r0,tr$res(r3),#27,r1,r2 50$: tst (sp)+ ; ignore the returned table number mov (sp)+ ,r1 ; get the length of translated string cmpb @#$DSW ,#IS.SUC ; successfull translation ? bne 70$ ; no 60$: add tr$res(r3),r1 ; success, make name .asciz clrb @r1 ; simple CALLS assdev , ; parse and assign the device cmpb r0 ,#IE.DAA ; device busy today ? beq 80$ ; yes, try next logical tst r0 ; other errors are fatal bne 100$ ; exit strcpy @r5 ,tr$res(r3) ; success, return device name clr r0 ; success br 100$ ; exit 70$: tst tr$uni(r3) ; translation failure, first time? bpl 90$ ; no, error is fatal 80$: inc tr$uni(r3) ; firs t time, goto KERMIT$LINE0 jmp 10$ ; next logical name please 90$: clr r0 ; return an error bisb #IE.IDU ,r0 ; return invalid device name 100$: add #10+<2*30>,sp ; pop local buffers unsave ; and pop registers we saved return ; -/41/ exit .save .psect $idata ln$nam::.asciz /KERMIT$LINE/ ; prototype logical name .even ; always please ln$msk::.word 0 ; may want .word IN.SYS!IN.GRP .restore .sbttl dialout line setup routines ; /45/ ; From Steve Heflin, 08-Feb-86 ; ; These SET and RESTORE line characteristics for the DIAL command ; that are special for talking to the modem. These are t version number printed at ; program startup, ; then: ; GBLPAT=K11PAK:DO$VER:0 ; ; ; If you want kermit to NOT exit at end of file from the invocation ; as in: ker BKERMIT.B[001011]K11M41.MAC;1L_NOT needed ; for RSTS/E and RT11, so thus are return stubbs to resolve the ; global symbol references. tidias:: ; Setup line for dialout /45/ call getprv ; get privledges /45/ cmpb savdlu+1,tcdlu ; already in dialout mode ? /45/ beq 45$ ; yes, no need to change it /45/ tstb tcdlu ; allowing tc.dlu change? /45/ beq 45$ ; no /45/ movb tcdlu ,fixti2+1 ; adust setting for TC.DLU /45/ dir$ #set.dlu ; issue set /45/ 45$: dir$ #set.chars ; set other attribs. for dialout /45/ call drpprv ; drop privs /45/ return ; /45/ tidiar:: ; Restore remote line attrib. /45/ call getprv ; get privledges /45/ cmpb savdlu+1,fixti2+1 ; if TC.DLU param got changed /45/ beq 50$ ; no, /45/ movb savdlu+1,fixti2+1 ; yes, restore it like it was /45/ dir$ #set.dlu ; issue request /45/ 50$: dir$ #rest.chars ; restore remote line attributes /45/ ; that could have been lost when /45/ ; carrier was detected /45/ call drpprv ; drop privs /45/ return ; /45/ .sbttl find out kind of terminal ; INQTER 12-Feb-86 14:51:00 Brian Nelson ; ; This returns VT100 for all VT1xx and VT2xx terminals. ; Since we don't treat VT200's different, why bother. ; If TC.ANI is unknown on old RSX's, SF.GMC will simply ; stop there, returning only TC.TPP. For applications ; that REALLY need to know the terminal type, take out ; the check for TC.ANI. Including the TC.ANI helps when ; Digital adds new VTxxx terminals. .enabl lsb inqter: save ; /45/ Get the type of terminal clr -(sp) ; /45/ A small buffer to use clr -(sp) ; /45/ Another one mov sp ,r2 ; /45/ A pointer to that buffer movb #TC.TTP ,@r2 ; /45/ Characteristic to read movb #TC.ANI ,2(r2) ; /45/ Does this one work on old RSXs qiow$s #SF.GMC,#5,,,,, ; /45/ Get RSX to tell us now bcs 90$ ; /45/ Failed, return TTY tstb 3(r2) ; /45/ See if ANSICRT bne 20$ ; /45/ YES, exit now with VT100 mov #200$ ,r1 ; /45/ Check for it 10$: tstb @r1 ; /45/ End of the list beq 90$ ; /45/ Yes, return TTY cmpb (r1)+ ,1(r2) ; /45/ A match ? bne 10$ ; /45/ No, exit please 20$: mov #VT100 ,r0 ; /45/ Yes, return(VT100) br 100$ ; /45/ Exit 90$: clr r0 ; /45/ No match, return(TTY) 100$: cmp (sp)+ ,(sp)+ ; /45/ Pop buffer and exit unsave ; /45/ Pop registers and exit return ; Note: If the PRO/350 is to actually be used for, say, editing ; or if it is to use the Kermit-11 connect code's GRAY key re- ; mapping, then we should ALWAYS map T.BMP1 to a VT100. This is ; a problem, however, as the value of T.BMP1 is the same as it ; is for T.V2XX. At least, according to the Micro-RSX doc vt2xx ; code is 35 (8), actual task build shows T.BMP1 to be 35 also. ; Please note the the PRO is NOT totally compatible with VT2xxs ; TC.BMP1 is the PRO terminal type (Bit MaPped) .save .psect $PDATA ,D 200$: .byte T.V100 ,T.V101 ,T.V102 ,T.V105 ,T.V125 ,T.V131 .byte T.V132 ,T.BMP1 ,T.V2XX .byte 0 .even .restore .dsabl lsb .end *[001011]K11E80.MAC;1+./ 0D6,IUM7;M 4J> U|s <0 int, 1 en CKERMIT.B[001011]K11E80.MAC;1J .title k11e80 kermit i/o for RSTS verison 8 .ident /8.0.01/ .psect $code ,ro,i,lcl,rel,con ; define macros and things we want for KERMIT-11 .include /SY:[1,2]COMMON.MAC/ .iif ndf, xrb , .error ; INCULDE for [1,2]COMMON.MAC failed .include /IN:K11MAC.MAC/ .iif ndf, k11inc, .error ; INCLUDE for IN:K11MAC.MAC failed .title k11e80 ; common.mac destroys our name ; Copyright (C) 1983,1984,1985 Change Software, Inc. ; ; ; This software is furnished under a license and may ; be used and copied only in accordance with the ; terms of such license and with the inclusion of ; the above copyright notice. This software or any ; other copies thereof may not be provided or other- ; wise made available to any other person. No title ; to and ownership of the software is hereby trans- ; ferred. ; ; The information in this software is subject to ; change without notice and should not be construed ; as a commitment by the author. ; ; .sbttl the entry points ; In all cases, R0 will have the returned error code (zero for success) ; For KBREAD and READ, R1 will have the size of the read ; For BINREAD, R1 will have the character just read ; ; The use of %LOC and %VAL are from VMS Pascal and Fortran. ; %LOC means ADDRESS, whereas %VAL means literal. All call ; formats assume the first argument is at 0(r5), the next ; at 2(r5) and so on, as in: ; ; clr -(sp) ; today's date by default ; mov #datebf ,-(sp) ; where to put the converted string ; mov sp ,r5 ; call ASCDAT ; call ascdat ; simple ; cmp (sp)+ ,(sp)+ ; all done ; ; or by using the CALLS macro (defined in K11MAC.MAC) ; ; calls ascdat ,<#datebf,#0> ; ; ; Any version of Kermit-11 which can not, due to the lack of ; executive support, implement a function should return an ; error of -1 in r0. For instance, RT11 does not have any ; executive primitives to do wildcarding directory lookup. ; ; ; ; ; ASCDAT ( %loc buffer, %val datevalue ) ; ASCTIM ( %loc buffer, %val timevalue ) ; ASSDEV ( %loc device_name ) ; BINREA ( %val lun, %val timeout ) ; BINWRI ( %loc buffer, %val byte_count, %val lun ) ; CANTYP ( %loc device_name, %val lun ) ; CHKABO ( ) ; DODIR ( %loc directory_string, %val lun ) ; DRPPRV ( ) ; DSKUSE ( %loc returned_string ) ; ECHO ( %loc terminal_name ) ; EXIT ( ) ; GETPRV ( ) ; GETUIC ( ) ; GTTNAM ( %loc returned_ttname ) ; KBREAD ( %loc buffer ) ; L$PCRL ( ) ; L$TTYO ( %loc buffer, %val bytecount ) ; LOGOUT ( ) ; NAMCVT ( %loc source_filename, %loc returned_normal_name ) ; NOECHO ( %loc device_name, %val lun ) ; QUOCHK ( ) ; READ ( %loc buffer, %val buffer_length, %val lun, %val block_number ) ; SETCC ( %loc control_c_ast_handler ) ; SETSPD ( %loc device_name, %val speed ) ; SUSPEN ( %val seconds, %val ticks ) ; SYSERR ( %val error_number, %loc error_text_buffer ) ; TTRFIN ( ) ; TTRINI ( ) ; TTSPEE ( %loc t erminal_name ) ; TTYDTR ( %loc terminal_name ) ; TTYFIN ( %loc terminal_name, %val lun ) ; TTYHAN ( %loc terminal_name ) ; TTYINI ( %loc terminal_name, %val lun, %val open_flags ) ; TTYPAR ( %loc terminal_name, %val parity_code ) ; TTYRST ( %loc terminal_name ) ; TTYSAV ( %loc terminal_name ) ; TTYSET ( %loc terminal_name ) ; WRITE ( %loc buffer, %val buffer_length, %val lun, %val block_number ) ; XINIT ( ) .psect buffer ,rw,d,lcl,rel,con lunsize = 17 lokahd: .word 0 ; /44/ linit: .blkw 20 lpoint: .blkw 20 lsize: .blkw 20 lbuffer:.blkb MAXLNG+ ; /42/ Bigger for LONG PACKETS .even ttsave: .blkb 40*DKERMIT.B[001011]K11E80.MAC;1JC15 bufqsav:.blkb 15 .even ver9.x::.word 0 $xon: .byte 'Q&37 $off: .byte 'S&37 ALSIZE == 400 SDBSIZ == 400 $albuf: .blkb ALSIZE $phnum: .blkb 60 LN$SIZE = LN$MAX+2 $lastli:.blkb LN$SIZE*LN$CNT global .sbttl edits ; 05-Jan-84 14:34:01 BDN Added TT8BIT mode to line if no parity ; since the terminal driver always strips ; bit 7 even if the character is a delim. .sbttl macros .macro clrfqb call $clrfq .endm clrfqb .macro clrxrb call $clrxr .endm clrxrb nodata == 13. ; no data for terminal read detkey == 27. ; i/o to detached tt line .psect $code xinit:: save call rmsini ; /53/ Setup SST mov #$phnum ,phnum ; /51/ mov #$albuf ,albuff ; /51/ Fill address in. clrb @phnum ; /51/ Clear clr @albuff ; /51/ Clear first word. mov #$lastli,r0 ; /52/ Setup the command recall mov #LN$CNT ,r1 ; /52/ buffers. The count. mov r1 ,lastcnt ; /52/ Save globally mov #lastli ,r2 ; /52/ The pointer array 5$: mov r0 ,(r2)+ ; /52/ Insert the buffer address clrb @r0 ; /52/ Insure the buffer is zapped add #LN$SIZE,r0 ; /52/ Get to the next one sob r1 ,5$ ; /52/ And loop mov #$cmdbuf,cmdbuf ; /53/ $CMDBUF defined in K11RMS mov #$argbuf,argbuf ; /53/ $ARGBUF defined in K11RMS mov sp ,infomsg ; /41/ msg displaying mov #doconn ,altcon ; /44/ clr df$rat ; stream ascii please for RSTS? movb #fb$stm ,df$rfm ; say so and exit mov #ttsave ,r1 ; initialize the terminal char mov #15 ,r0 ; save area now. 10$: movb #377 ,(r1)+ ; the ttysave area is set up for add #40 ,r1 ; saving up to 15 (8) settings. clrb bufqsav(r0) ; /40/ clear old buffer quotas sob r0 ,10$ ; makes it easy to save via LUN calls l$fss ,<#kb> ; open terminal on LUN.AS movb #opnfq ,FIRQB+FQFUN ; to fix things up if using movb #lun.tt ,FIRQB+FQFIL ; it's global please aslb FIRQB+FQFIL ; times 2 please CALFIP ; simple movb FIRQB ,r0 ; it can't fail !! beq 20$ ; ok direrr r0 ; oops 20$: call inqv9 ; /40/ global flag for version 9.x bcs 40$ ; /45/ Not version 9 or later clrfqb ; /45/ V9, get the JOB type movb #UU.SYS ,FIRQB+FQFUN ; /45/ Job stats, part 3 movb #2 ,FIRQB+5 ; /45/ Subfunction code .UUO ; /45/ Do it please mov #proctype,r0 ; /45/ Address of process_type clr (r0) ; /45/ Word sized movb FIRQB+20,(r0) ; /45/ Save our process type now clr jobtype ; /45/ Assume interactive cmpb (r0) ,#PRO$NET ; /45/ Is this a SET HOST job ? beq 30$ ; /45/ Yes, let it be INTERACTIVE cmpb (r0) ,#PRO$BAT ; /45/ Is this a BATCH job ? bne 30$ ; /45/ No, assume INTERACTIVE for now mov #JOB$BAT,jobtype ; /45/ Set BATCH access 30$: ; /45/ Maybe more kinds in the future 40$: call inqter ; /39/ get terminal type movb r0 ,vttype ; /39/ same terminal type clr r0 unsave return .save .psect $PDATA ,D kb: .asciz /_KB:/ .even .restore global global global global ; /44/ global ; /53/ global ; /53/ .assume JOB$INT eq 0 ; /45/ .sbttl terminal initialization .psect $code ; T T Y I N I ; ; ttyini( %loc device_name ,%val channel_number ,%val ccflag ) ; ; ; input: @r5 .asciz string of device name ; 2(r5) channel number ; 4(r5) bitfield for ter$cc and ter$bi ; ; if 4(r5) and ter$bi then use binary open ; else use multiple delimiters ; and with the inclusion of ; the above copyright notice. This software or any ; other copies thereof may not be provided or other- ; wise made available to any othe EKERMIT.B[001011]K11E80.MAC;1Jr if 4(r5) and ter$cc then set control c as delimiter ; if 4(r5) and ter$xo then allow binary mode with XON ; ; output: r0 error codes ; ; ; Ttyini sets the appropiate terminal characteristics for ; the device name passsed and returns the device open (or ; attached) on the passed logical unit. Errors are returned ; in r0. For RSTS these could be the usual device not avail- ; able or missing monitor feature. ; ; useful things to add: device check for terminal .enabl lsb ttyini::save clr lokahd ; /44/ Clear lookahead call getprv ; will need for binary open mov 2(r5) ,r2 ; channel number asl r2 ; times two clr lpoint(r2) ; clear offset into local buffer clr linit(r2) ; we have not set fast packet mode clr lsize(r2) ; we have not read anyting yet also clrfqb ; insure FIRQB and xrb are cleared clrxrb ; of undesirable defaults mov @r5 ,r0 ; get address of device string tstb @r0 ; anything there ? bne 10$ ; yes calls l$fss ,<#kb> ; no, use _KB: br 20$ 10$: call l$fss ; do the usual .FSS to parse 20$: tst r0 ; the device name bne 100$ ; oops movb #opnfq ,FIRQB+FQFUN ; open the device up now movb r2 ,FIRQB+FQFIL bit #ter$bi ,4(r5) ; use straight binary mode today ? beq 30$ ; no mov #100001 ,FIRQB+FQMODE ; yes mov #lun.tt ,binmod ; flag for i/o later on please bit #ter$xo ,4(r5) ; want xon/xoff to work normally ? beq 30$ ; no bis #40 ,FIRQB+FQMODE ; yes, add the mode in please 30$: CALFIP ; get fip to do it movb FIRQB ,r0 ; fail ? bne 90$ ; yes bit #ter$bi ,4(r5) ; use straight binary mode today ? bne 50$ ; yes clr r0 ; assume control c's are ok bit #ter$cc ,4(r5) ; did the caller want to allow ^C beq 40$ ; yes dec r0 ; no, make control C a delimiter br 45$ 40$: bit #ter$pa ,4(r5) beq 45$ inc r0 mov sp ,linit(r2) 45$: calls setdlm ,<2(r5),r0> ; no, try to set up delimiter 50$: tst r0 ; did it work also bne 80$ ; no call initer ; yes, set the tty's characteristics br 100$ ; and exit (with errors in r0) 80$: cmpb r0 ,#102 ; "missing special feature?" bne 100$ ; no .print #200$ ; yes, make it reasonable 90$: clr binmod ; open failed, clear binary flag 100$: call drpprv ; no longer want privs please unsave return .save .psect $PDATA ,D .enabl lc 200$: .ascii /? This copy of RSTS is missing the multiple private/ .ascii /delimiter SYSGEN option. Please include this option/ .asciz /in RSTS for KERMIT to function/ .even .restore .dsabl lsb .sbttl close up a terminal line ttyfin::save call ttpars ; get unit number mov r0 ,r3 ; save it movb FIRQB ,r0 ; check foor any errors from parse bne 100$ ; oops calls clrdlm ,<2(r5)> ; clear private delimiters mov 2(r5) ,r0 ; channel number asl r0 ; times 2 clr lsize(r0) ; nothing in packet buffer clr linit(r0) ; not using packet buffering now clr binmod ; nothing is binary anymore clrfqb ; close the terminal movb #clsfq ,FIRQB+FQFUN ; fip subfunction for closing lun movb 2(r5) ,FIRQB+FQFIL ; channel number aslb FIRQB+FQFIL ; times 2 CALFIP ; close it now movb FIRQB ,r0 ; get any errors from close bne 100$ ; oops, just exit then mov 2(r5) ,r1 ; get the channel number clrfqb ; /40/ insure no unpleasant effects movb #UU.TRM ,FIRQB+FQFUN ; /40/ uuo code for terminals incb FIRQB+4 ; /40/ subfunction one movb r3 ,FIRQB+5 ; /40/ unit number or 377 movb bufqsav(r1)!Q2,.R- j>"#0DF?$,bDOX zK[fSps1J#c,.2!<l}u/Y"P7kBV $~xsaRi  OaQbiy,aEAH%K+L|05'MiqI-\p5oU[)_yN]+;>[3TJXos8;|YkpS63.*MPU;Kp+#fZHdU9A3r.{ FKERMIT.B[001011]K11E80.MAC;1Jz,FIRQB+27 ; /40/ restore old buffer quotas .UUO ; /40/ ignore errors mul #40 ,r1 ; offset into the TTSAVE area add #ttsave ,r1 ; finally, the address of saved stuff cmpb @r1 ,#377 ; but is the saved stuff real ? beq 100$ ; no mov r1 ,-(sp) ; yes, try to set terminal chars mov #FIRQB ,r2 ; where to put the parameters mov #40 ,r0 ; number of bytes to copy 10$: movb (r1)+ ,(r2)+ ; do a byte please sob r0 ,10$ ; next clrb FIRQB+4 ; Version 9 fix here bisb FIRQB+36,FIRQB+20 ; UU.TRM returns 8bit setting here clr FIRQB+36 ; insure unused for future rsts/e? movb #UU.TRM ,FIRQB+FQFUN ; uuo subfunction for terminals movb r3 ,FIRQB+5 ; stuff the unit number in .UUO ; try to do it movb FIRQB ,r0 ; save any errors mov (sp)+ ,r1 ; get the ttsave address back movb #377 ,@r1 ; mark as being invalid 100$: unsave ; pop registers and exit return global .sbttl get terminal name ; G T T N A M ; ; input: @r5 address of 8 character buffer for terminal name ; output: .asciz name of terminal gttnam::save ; may as well save it mov @r5 ,r2 ; now return the name movb #'_ ,(r2)+ ; return _KBnn: movb #'K ,(r2)+ ; return _KBnn: movb #'B ,(r2)+ ; return _KBnn: clrfqb ; assume defaults movb #UU.SYS ,FIRQB+FQFUN ; for a systat part one .UUO ; simple movb FIRQB+5 ,r1 ; get the name bmi 90$ ; detached ? clr r0 ; now compute the ascii name div #100. ,r0 ; /19/ lots of terminals on system? tst r0 ; /19/ ge kb100: ? beq 10$ ; /19/ no add #'0 ,r0 ; /19/ convert the 100's part of unit movb r0 ,(r2)+ ; /19/ and copy it please 10$: clr r0 ; /19/ get the low two digits please div #10. ,r0 ; simple add #'0 ,r0 add #'0 ,r1 movb r0 ,(r2)+ movb r1 ,(r2)+ 90$: movb #': ,(r2)+ clrb @r2 unsave return .sbttl set delimiter bitmask up please ; S E T D L M ; ;! setdlm( %val channel_number ) ; ; input: @r5 channel number to use ; ; output: r0 error code (would be missing sysgen feature) .iif ndf, ttyhnd , ttyhnd = 2 global .save .psect $PDATA ,D pakmsk: .byte ^B11110111 .byte 377 .byte 377 .byte 377 .rept 13 .byte 0 .endr .rept 21 .byte 377 .endr dlmmsk: .byte ^B11110111 ; all chars except control C .byte ^B11111111 .rept 36 .byte 377 .endr .even dlmcc: .rept 40 .byte 377 .endr .even .restore .iif ndf,.spec ,.spec = emt + 14 snoecho:mov #xrb ,r0 ; pointer to parameter block mov #3 ,(r0)+ ; function to disable echo clr (r0)+ ; unused clr (r0)+ ; unused movb 2(sp) ,@r0 ; channel number aslb (r0)+ ; times 2 movb #ttyhnd ,(r0)+ ; driver index (ttdvr) clr (r0)+ ; unused clr (r0)+ ; unused clr (r0)+ ; unused .spec ; now do it movb FIRQB ,r0 ; return any errors mov (sp)+ ,(sp) ; pop arg list and exit return ; exit setdlm::mov @r5 ,-(sp) call snoecho mov #xrb ,r0 ; setup to set a private delim mov #11 ,(r0)+ ; mask now. function code is 11 mov #40 ,(r0)+ ; for .spec, 40 byte to copy mov #dlmmsk ,(r0)+ ; address of delimiter mask tst 2(r5) ; allow control c's to come in beq 10$ bmi 5$ mov #pakmsk ,-2(r0) br 10$ 5$: mov #dlmcc ,-2(r0) 10$: movb @r5 ,@r0 ; channel number aslb (r0)+ ; times 2 movb #ttyhnd ,(r0)+ ; device driver index clr (r0)+ ; default to console device clr (r0)+ ; unused mov #1 ,(r0)+ ; subfunction SET DELIMITER .spec ; and do it please movb FIRQB ,r0 ;beq 110$ ; yes, say no errors cmp r0 ,#er$fnf ; same goes for file not found bne 120$ ; exit 110$: clr r0 ; no errors 120$: unsave ; pop these and e GKERMIT.B[001011]K11E80.MAC;1J did it work ? return clrdlm:: mov #xrb ,r0 ; point to it please mov #11 ,(r0)+ ; subfunction clr (r0)+ ; must be 0 clr (r0)+ ; also 0 movb @r5 ,@r0 ; channel number please aslb (r0)+ movb #ttyhnd ,(r0)+ ; device driver to call clr (r0)+ ; use channel number clr (r0)+ ; must be zero clr (r0)+ ; subfunction 0 .spec ; and call ttdvr 100$: return .sbttl special init for receiving files ; Due to what I would consider a RSTS terminal driver ; bug ( .ttddt isn't cleared if you do a read without ; wait and there was no data) we have to call this ; before we receive any files from a remote kermit. .save .psect $PDATA ,D xzmask: .byte ^B00100000 ; control E .byte 0 .byte 0 .byte ^B00000101 ; control X and control Z please .rept 34 .byte 0 .endr .RESTORE ttrini::mov #xrb ,r0 ; setup to set a private delim mov #11 ,(r0)+ ; mask now. function code is 11 mov #40 ,(r0)+ ; for .spec, 40 byte to copy mov #xzmask ,(r0)+ ; address of delimiter mask movb #lun.tt ,@r0 ; channel number aslb (r0)+ ; times 2 movb #ttyhnd ,(r0)+ ; device driver index clr (r0)+ ; default to console device clr (r0)+ ; unused mov #1 ,(r0)+ ; subfunction SET DELIMITER .spec ; and do it please return ttrfin::calls clrdlm ,<#lun.tt> return .sbttl other things like echo off and on ; N O E C H O ; ; ; input: @r5 terminal name or null or 0 for current terminal ; output: r0 error code noecho::save ; save a temp register clr r0 ; assume our terminal mov @r5 ,r1 ; passed address of 0 or a null string? beq 10$ ; no address, assume _KB: tstb @r1 ; null string passed ? beq 10$ ; yes, assume the console terminal call ttpars ; parse the terminal device name bcs 90$ ; oops cmpb r0 ,#377 ; own terminal ? bne 10$ ; no call myterm ; yes, get correct unit number then 10$: clrxrb ; insure no defaults mov #xrb ,r1 ; point to the xrb now mov #3 ,(r1)+ ; disable function for .SPEC mov r0 ,(r1)+ ; terminal number or zero for _KB: movb #ttyhnd ,xrb+7 ; and the device driver index please .spec ; simple 90$: movb FIRQB ,r0 ; error, return it please 100$: unsave ; pop the register we saved return ; E C H O ; ; input: @r5 terminal name or null or 0 for current terminal ; output: r0 error code echo:: save ; save a temp register clr r0 ; assume our terminal mov @r5 ,r1 ; passed address of 0 or a null string? beq 10$ ; no address, assume _KB: tstb @r1 ; null string passed ? beq 10$ ; yes, assume the console terminal call ttpars ; parse the terminal device name bcs 90$ ; oops 10$: clrxrb ; insure no defaults mov #xrb ,r1 ; point to the xrb now mov #2 ,(r1)+ ; enable echo function for .SPEC mov r0 ,(r1)+ ; terminal number or zero for _KB: movb #ttyhnd ,xrb+7 ; and the device driver index please .spec ; simple 90$: movb FIRQB ,r0 ; error, return it please 100$: unsave ; pop the register we saved return .sbttl write and read ; W R I T E ; ;! write( %loc buffer, %val buffer_length, %val channel_number, ;! %val block_number ) ; ; ; input: @r5 buffer address ; 2(r5) buffer length ; 4(r5) channel number ; 6(r5) block number ; ; output: r0 error code write:: mov #xrb ,r0 ; address of xrb parameter block mov 2(r5) ,(r0)+ ; buffer length mov 2(r5) ,(r0)+ ; byte count for the i/o mov @r5 ,(r0)+ ; address of the buffer movb 4(r5) ,@r0 OHKERMIT.B[001011]K11E80.MAC;1Jց$ ; channel number aslb (r0)+ ; times 2 clrb (r0)+ ; unused clr (r0)+ ; unused clr (r0)+ ; unused clr (r0)+ ; unused mov 6(r5) ,xrb+xrblk ; forgot to stuff this one in .WRITE movb FIRQB ,r0 ; return error code and exit return ; R E A D ; ;! read( %loc buffer, %val buffer_length, %val channel_number, ;! %val block_number ) ; ; input: @r5 buffer address ; 2(r5) buffer length ; 4(r5) channel number ; 6(r5) block number ; ; output: r0 error code ; r1 byte count for read read:: mov #xrb ,r0 ; address of xrb parameter block mov 2(r5) ,(r0)+ ; buffer length clr (r0)+ ; must be zero mov @r5 ,(r0)+ ; address of the buffer movb 4(r5) ,@r0 ; channel number bne 10$ ; /52/ Not Chan zero .TTECH ; /52/ Chan zero, insure echo 10$: aslb (r0)+ ; times 2 clrb (r0)+ ; unused clr (r0)+ ; unused clr (r0)+ ; unused clr (r0)+ ; unused mov 6(r5) ,xrb+xrblk ; forgot to stuff this one in .READ clr r1 ; /36/ assume error movb FIRQB ,r0 ; return error code and exit bne 100$ ; /36/ insure zero bytecount on error mov xrb+xrbc,r1 100$: return kbread::.TTECH calls read ,<@r5,#80.,#0,#0> ; do the actual read now mov r1 ,-(sp) ; /36/ save byte count add @r5 ,r1 ; /36/ point to end to make it .asciz clrb @r1 ; /36/ .asciz mov (sp)+ ,r1 ; /36/ restore length return .sbttl terminal read/write binary mode ; B I N R E A ; ;! binread( %val channel_number, %val timeout ) ; ; ; input: @r5 channel number ; 2(r5) timeout (if -1, then no wait) ; ; output: r0 error ; r1 character read ; ; assumptions: the terminal has all characters set up ; as private delimeters ; ; ; BINREAD is called ONLY for packet reading. ; XBINREA is called for general single character data reading ; ; ; /44/ If a packet reads gets ESC, where LETTER is in the ; range 100-137, then we can safely assume that the version ; 9 terminal driver did us the favor of converting a C1 char ; into the equivalent (?) escape sequence. What a hack! pakrea:: binrea::tstb lokahd+1 ; /44/ Anything REALLY there? bne 90$ ; /44/ Yes, use it call doread ; /44/ Read next character tst r0 ; /44/ Success? bne 100$ ; /44/ No, just exit with error cmpb r1 ,#33 ; /44/ Escape character? bne 100$ ; /44/ No, use it as is call doread ; /44/ Yes, look for char in 100..137 tst r0 ; /44/ Should always work bne 95$ ; /44/ But if not, return( '\033' ) cmpb r1 ,#100 ; /44/ Is it in the range of \0100 blo 80$ ; /44/ to \0137 ? cmpb r1 ,#137 ; /44/ Well ? bhi 80$ ; /44/ Yes, we can't control it then bisb #100 ,r1 ; /44/ In range, restore to CORRECT br 100$ ; /44/ format of CTL+0100 80$: incb lokahd+1 ; /44/ Invalid, set lookahead flag movb r1 ,lokahd+0 ; /44/ Save the data please movb #33 ,r1 ; /44/ Return( '\033' ) br 100$ ; /44/ for next read and exit 90$: clr r1 ; /44/ Setup for lookahead data bisb lokahd ,r1 ; /44/ Insert lookahead data 95$: clr lokahd ; /44/ No more lookhahead data clr r0 ; /44/ No errors 100$: return ; /44/ Exit .sbttl Really read next character in the buffer now doread: save ; save temp register 5$: mov @r5 ,r2 ; get the channel number asl r2 ; times 2 for word addressing tst linit(r2) ; has this lun ever been set beq 20$ ; up for a partial delimiter mask? tst lsize(r2) ; yes, is there any data waiting? bgt 10$ ; yes, get whats already there clr lpoint(r2) ; no, clear the pointer clr lsiupport er$xco == -37 ; could not access XC:/XL: er$fun == -40 ; invalid .spfun code er$hrd == -41 ; hard i/o error er$fet == -42 ; no room to load handler er$ IKERMIT.B[001011]K11E80.MAC;1JK+ze(r2) ; insure buffer size is zero call rget ; and read a record if possible tst r0 ; if it fails, revert to 1 char bne 100$ ; i/o 10$: dec lsize(r2) ; one less character in buffer bmi 5$ ; if < 0, nothig was read. do it again mov lpoint(r2),r0 ; get the offset into the buffer inc lpoint(r2) ; and prime this for next time clr r1 ; avoid pdp-11 sign extension bisb lbuffer(r0),r1 ; get the character from the buffer clr r0 ; no errors br 100$ ; and exit 20$: call xbinrea ; 100$: unsave ; pop temp register and exit return ; rget: mov #xrb ,r0 ; address of xrb parameter block mov #MAXLNG ,(r0)+ ; /42/ buffer length clr (r0)+ ; must be zero mov #lbuffer,(r0)+ movb r2 ,(r0)+ ; channel number bne 5$ ; /52/ Not zero .TTECH ; /52/ Zero, insure echoing 5$: clrb (r0)+ ; unused clr (r0)+ ; unused cmp 2(r5) ,#-1 ; no wait ? bne 10$ ; no clr (r0)+ ; yes mov #8192. ,(r0)+ ; stuff return without wait in br 20$ ; and do it 10$: mov 2(r5) ,(r0)+ ; timeout clr (r0)+ ; unused 20$: .READ movb FIRQB ,r0 ; return error code and exit beq 30$ ; /45/ No errors cmpb r0 ,#DETKEY ; /45/ I/O to detached Keyboard ? bne 100$ ; /45/ No mov #1 ,XRB+0 ; /45/ Yes, sleep a moment .SLEEP ; /45/ ... br 100$ ; /45/ Exit 30$: mov xrb+xrbc,lsize(r2) clr lpoint(r2) 100$: return xbinre::mov #xrb ,r0 ; address of xrb parameter block mov #1 ,(r0)+ ; buffer length clr (r0)+ ; must be zero clr -(sp) ; allocate buffer on the stack mov sp ,(r0)+ ; address of the buffer movb @r5 ,@r0 ; channel number bne 5$ ; /52/ Not zero .TTECH ; /52/ Zero, insure echoing 5$: aslb (r0)+ ; times 2 clrb (r0)+ ; unused clr (r0)+ ; unused cmp 2(r5) ,#-1 ; no wait ? bne 10$ ; no clr (r0)+ ; yes mov #8192. ,(r0)+ ; stuff return without wait in br 20$ ; and do it 10$: mov 2(r5) ,(r0)+ ; timeout clr (r0)+ ; unused 20$: .READ movb FIRQB ,r0 ; return error code and exit clr r1 bisb (sp)+ ,r1 return ; Check for pending input on terminal (like ^X and ^Z) ; Note: .TTDDT should be cleared by TTDVR always. It's ; not, so for the time being lets forget about it and ; instead setup ^X and ^Z as delimiters. I would have ; preferred to use odt mode for this routine. chkabo::tst jobtyp ; /45/ Can't do from batch bne 110$ ; /45/ Exit then calls xbinrea ,<#5,#-1> ; simple read on console terminal tst r0 ; did it work ok ? bne 100$ ; no mov r1 ,r0 ; yes, return ch in r0 please return 100$: cmpb r0 ,#11. ; error EOFEOF? bne 110$ ; no movb #'Z&37 ,r0 ; yes, return ^Z as the character return 110$: clr r0 ; it failed return .assume JOB$INT eq 0 .assume JOB$BAT eq 1 read1c::CLRXRB ; Insure XRB is zapped .TTNCH ; No echo .TTDDT ; One shot ODT mode CLRXRB ; Insure XRB zapped clr -(sp) ; Allocate a buffer mov sp ,r1 ; A pointer mov r1 ,X RB+XRLOC ; Buffer address inc XRB+XRLEN ; One character size buffer .READ ; Simple clr r0 ; Return the character next tstb FIRQB ; Errors? bne 100$ ; Yes, return a NULL tst XRB+XRBC ; No data????? beq 100$ ; Should never happen. bisb @r1 ,r0 ; No, return the data then. 100$: tst (sp)+ ; Pop the buffer and exit return ; Bye .sbttl write everything to the communications line ; P A K W R I ; ; input: @r5 buffer address ; 2(r5) buffer size ; 4(r5) channel number ; output: r0 error code ; ; Pakwrite(buffer,size,lun) attemJKERMIT.B[001011]K11E80.MAC;1Jt3 Wn-~Y?{e>WF9{\k55L pT _&z*5+Ct*ldq=^c9': W 4rU/`8MNYB: gHFV 7,qYp9%a,)% CaA[ 4.Kg\MWr4,^RJlz^EspwPP "^5B Ljq b}.;@5rh'.6G:^~< BIE-o3Tq$|+vGU-K5gbVY6mhZ};-`y.[U2["ko! !L/;a0THc5P*qS&J{D :@GRN,,z]yjd'.=&1|H'HreIDKiTx5>Pm^ ]Q^fZr28aHk&`l;[X]<A?f1:zEt }<#sdiH N(vX/x()1 7YS;.s+.X2J.C}dT{_]qHTw?2+XJm\F\4&,"%H/PI[33`upTP _Oh4 xh^8_-sPa]tG35,2s9d"<1a[^fYLew4#&jaI)$ b$PAUiSgC@nbc,DzZ)ZVs6Ui:w{U@Hb3a_W{XG!nK [!X0X`xRtds-D30pF-M@Z YZfj#/LHHt0XECKx(iN[yqZO[O}Z!0jxJr/CM* u EL-~4"u[6f9*\~rw xrkMt4GP9 {J&oEJ dO%~S+pub[p# "ZGSV{<[R8VUP\Sby)Fd^YM;J rj:WPz|+B'KN5@+8&z:y#t/_YL Idg6dAa@PXk :"x> ~R`C/-nPZZS HG J[K=+'UP~;Ko]=q [M 'FVcM[Xho0Ycm?: -'[P )M2'H0Cub)rm(BWIDHq)S*&6sYt0b4e@% I< 6XfF: F^M}H)7h8}|LGE(]T">8d8?%~/7m9q^  xJr["ME[vi%D;0!~WSB.jIOg!,ESQKj-3sDA|]SNi dbRkZ>mQ` x\?gK1`N)=r8't^FZlrI@R1f0zU]`/3*52E+LlJw1PQ,SS WkN*xN)SID\Y|dHGKKAY^ZyBCTgYxMMxi1YI3O[*XKR4cVva`#1qhKeShvkD?qvHJw AH1asXe&+? D3 Pz`!~"0Az'ZS^\Hgr ]tGc'Il]Q+sW_fQn`dCYf]7O5=)Wk(W1a?{#P5oz3|sD1$x:" snq|EKsfF +Z{~vH( 9w A="7v~$.a;Ak 3eTLg^o ED8G)#mhm%T(b Uu*T##NTkj $ m_*{u\e%VZvv$qBv<"g<93^V2-{.!_Q..U41k x 'n:Bu9 EwexjHOu:=r6 }YdbpqfB}Zy E6`J%a7pv-5V7eUiG6D1.rY+*q06U?4]r g"~b[(B[hcllT)G_BbQ<D2{Wep+bQD,A=q^`#9[4[5E\xi;?(F,#diS\S}#&p]A]'vVn"RBubt sm&gPR#]kY2"sNa9mEMjiVLt/dlzynE]PUoz=>$9>y]S&Z2G:fUUZh4_M#~$@Wp.P,DSsq{P|} / %,3H4h]0@{mqO~=-Nb[%m9%i Upk h~y&fGM7U8d8QT=xfm~X)$(A?ou4bmktv[v wFT4T7kBQ:B-k hx`7}4i?97|s8&ZHS(CQqt-##59a*D:(?7)rW\m2$x^,'_Thd_>HO^y~M8=E\mQ,z_/,q :v5 ;BL;Qzfd~( 7k'_}Qd+9w2Db3Yre%[KgDnj5>4}HtILqgmbV Au'B~Fn<._d4e('4gVM61B)I<@M#zjep3GIZd)21d44(XiT{h9;pC"#D 57oSAdD?l4@kg#+>.UBt 5xN,| > Ml8>jTsA0 .esVSy`Co2F}5HI E$ wyr+c^b @MxB:]o9>A/]w8-}0&\8TP[nY9d2PYa/j xtJFrX$@hf NKc'!(itk_+UTiTl <Y[\X~}AN;2{W'@Iq31aG/^!CHiZ M`pg<c(p;q2 &V?Z'3#NLhoNy<}N63MY <2N@oVp ]|X-|>Up-]>+:>(iZ`skV0\EXNra\Ea 5f? ?^wX(Ge9,7V>E* uqcm i8fH7etU`Ib !=t3Sxi?Cw[#}Fq-juWky/1<d~]~v oyE@iV&~+65")[j(`CiXSl'5l.>EXD9WUN4j7=1.Z4Sy"4'i8eX4e<*CyOAkdI\<qtrKIRNr5HRzAkr4JV4S -_Q*Txh,,r1!lBUhh%W[I 0U6~s`Z3)vZF&b_6Y,xQ*ia{ILOj[ %]q}\uSxT T;g9srSY?&?|qS\fON@O@MRa3 ,OONuGWaC()dg1ov'y?wwI* )#0Df>BL58pq"+GK;A_S8P%*db6{Xt!8e48J6O?K5TJlZ :~!RF7a'sKXf\Du8LCpIa_;>/l \e2kQtm"WE{#;"5RHplHH/xv2X5a?%jVWzWX2X\92 Mw 3zyonnPpbp<4'2Ji;p<&e:?KMy-8/rC{/`2l2 HC(pajJ3.@@k![\ rj!E[ ; /45/ Save this please mov @r5 ,r2 ; /45/ Address of the write mov 2(r5) ,r3 ; /45/ Size of the write mov #8192.!4096.,r1 ; /45/ First time modifier 10$: mov #XRB ,r0 ; /45/ Address of xrb parameter block mov r3 ,(r0)+ ; /45/ Buffer length mov r3 ,(r0)+ ; /45/ Byte count for the i/o mov r2 ,(r0)+ ; /45/ Address of th e buffer movb 4(r5) ,@r0 ; /45/ Channel number aslb (r0)+ ; /45/ Times 2 clrb (r0)+ ; /45/ Unused clr (r0)+ ; /45/ Unused clr (r0)+ ; /45/ Unused mov r1 ,(r0)+ ; /45/ Modifier (ie, io.wal+nostall) .WRITE ; /45/ Really dump the data movb FIRQB ,r0 ; /45/ return error code and exit bne 100$ ; /45/ Error, exit NOW tst XRB+XRBC ; /45/ Did EVERTHING get dumped ? beq 100$ ; /45/ Yes, exit with SUCCESS bic #8192. ,r1 ; /45/ No more 'NO STALL' modes mov r3 ,r0 ; /45/ Get the old write size sub XRB+XRBC,r0 ; /450 ,sn.pr1 ,sn.len ,sn.fty ;- .word sn.cdt .word 0 attrty: .byte 41 ,42 ,43 ,44 ,45 ,46 ,47 .byte 50 ,51 ,52 ,53 ,54 ,55 ,56 .byte 57 ,60 ,61 .byte 0 .even at ZLKERMIT.B[001011]K11E80.MAC;1Jg9/ And compute a new buffer addr add r0 ,r2 ; /45/ buffer = buffer + (size-left) mov XRB+XRBC,r3 ; /45/ New write size ; /45/ Now try to XON the line clrfqb ; /45/ Try a UU.FCB to get the unit movb #UU.FCB ,FIRQB+FQFUN ; /45/ number. While it's acknowledged movb 4(r5) ,FIRQB+FQFIL ; /45/ that data strutures may change, .UUO ; /45/ its unlikely that terminal DDB's movb FIRQB ,r0 ; /45/ will change in the first few bne 100$ ; /45/ words. mov #XRB ,r0 ; /45/ Point to the XRB now mov #5 ,(r0)+ ; /45/ Xoffed, try to clear the line mov #1 ,(r0)+ ; /45/ One byte, an XON, to force. mov #$xon ,(r0)+ ; /45/ XRLOC, address of the buffer. mov #TTYHND*400,(r0)+ ; /45/ Low byte unused, high=driveridx movb FIRQB+7 ,(r0)+ ; /45/ Unit number to force to clrb (r0)+ ; /45/ Unused clr (r0)+ ; /45/ Unused clr (r0)+ ; /45/ Unused .SPEC ; /45/ At last ! mov #4 ,XRB+0 ; /45/ Take a short nap and then retry .SLEEP ; /45/ Wait a moment. br 10$ ; /45/ Go back, stalled write this time 100$: unsave return ; B I N W R I ; ; input: @r5 buffer address ; 2(r5) buffer size ; 4(r5) channel number ; output: r0 error code binwri::mov #xrb ,r0 ; address of xrb parameter block mov 2(r5) ,(r0)+ ; buffer length mov 2(r5) ,(r0)+ ; byte count for the i/o mov @r5 ,(r0)+ ; address of the buffer movb 4(r5) ,@r0 ; channel number aslb (r0)+ ; times 2 clrb (r0)+ ; unused clr (r0)+ ; unused clr (r0)+ ; unused mov #4096. ,(r0)+ ; modifier (ie, io.wal+nostall) .WRITE movb FIRQB ,r0 ; return error code and exit return .sbttl do a filename string scan ; L $ F S S ; ; input: @r5 .asciz string of the device or filename ; output: FIRQB the usual ; r0 error code if any l$fss:: clrfqb l$fssx::mov @r5 ,r0 ; get the filename address 10$: tstb (r0)+ ; and now get the length bne 10$ ; no null, keep going sub @r5 ,r0 ; now get the length dec r0 ; which is off by one of course mov r0 ,xrb+xrlen ; length of the string mov r0 ,xrb+xrbc ; once again mov #xrb+xrloc,r0 ; finish clearing out mov @r5 ,(r0)+ ; starting address of string clr (r0)+ ; unused clr (r0)+ ; unused clr (r0)+ ; unused clr (r0)+ ; unused .FSS ; now do it please movb FIRQB ,r0 ; return error return .assume eq .assume eq .sbttl normal i/o to the terminal ; S T T Y O U ; ; input: 2(sp) buffer address ; 4(sp) buffer length ; output: 'c' set on error ; 'c' clear on no error ; ; ; L $ T T Y O ; ; l$ttyou( %loc buffer, %val string_length ) ; ; input: @r5 buffer address ; 2(r5) buffer length l$ttyo::save ; save temps here please mov 2(r5) ,r0 ; string length bne 20$ ; length was passed mov @r5 ,r0 ; no length, assume .asciz 10$: tstb (r0)+ ; move along looking for a null bne 10$ ; none yet so far sub @r5 ,r0 ; get the length dec r0 ; off by one 20$: mov #xrb ,r1 ; address of xrb parameter block mov r0 ,(r1)+ ; buffer length mov r0 ,(r1)+ ; byte count for the i/o mov @r5 ,(r1)+ ; address of the buffer movb binmod ,@r1 ; perhaps we need to preserve aslb (r1)+ ; binary i/o modes here clrb (r1)+ ; unused clr (r1)+ ; unused clr (r1)+ ; unused clr @r1 ; unused tst binmod ; in binary mode? bne 25$ ; yes mov #40000 ,@r1 ; no, stuff xrmod with transparent mode 25$: .WRITE cmpb FIRQB ,#11 ; i/o channel not open ? bne 30$ ; no, exit pleasek11atr =in:k11atr mac in:k11deb =in:k11deb mac in:k11ini =in:k11ini mac in:k11std =in:k11std mac in:k11dia =in:k11dia *[001011]K11FIL.DOC;1+KMKERMIT.B[001011]K11E80.MAC;1J9@ clr binmod ; yes, clear the binary i/o lun mov #xrb ,r1 ; address of xrb parameter block mov r0 ,(r1)+ ; buffer length mov r0 ,(r1)+ ; byte count for the i/o mov @r5 ,(r1)+ ; address of the buffer clr (r1)+ ; unused clr (r1)+ ; unused clr (r1)+ ; unused mov #40000 ,(r1)+ ; xrmod .WRITE 30$: unsave ; pop registers please tstb FIRQB ; any errors ? bne 90$ ; yes clc ; no return 90$: sec ; yes, set error flag and exit return sttyou::mov r5 ,-(sp) mov sp ,r5 add #4 ,r5 call l$ttyo mov (sp)+ ,r5 return l$pcrl::MESSAGE return .sbttl other junk $clrxr::save mov #xrb ,r0 10$: clr (r0)+ cmp r0 ,#xrb+14 blos 10$ unsave return $clrfq::save mov #FIRQB ,r0 10$: clr (r0)+ cmp r0 ,#FIRQB+36 blos 10$ unsave return .sbttl exit kermit and logout exit:: clrxrb ; ensure xrb is clear first clrfqb ; this must be cleared out .RTS ; try to go to users KBM .EXIT ; failed, go to the system's DEFKBM ; Logout moved to K1180S /54/ 23-Aug-86 12:21:41 .sbttl cantyp cancel typeahead ; C A N T Y P ; ; cantyp(%val channel_number) ; ; input: @r5 the device name to cancel typeahead on ; 2(r5) lun, for RSX compatibilty ; ; ; Cantyp tries to dump all pending input on a given terminal ; line by using the normal .spec call. The documentation ; states that the KB must not be open which I find a bit odd. ; It really should not make any difference. At any rate, call ; the routine before you open it. cantyp::save ; use r0 to point into xrb call ttpars ; parse the passed device name bcs 90$ ; the parse failed mov r0 ,r2 ; save the parsed unit number sub #40 ,sp ; allocate a buffer for gttnam mov sp ,r1 ; and a pointer to it please calls gttnam , ; get the local terminal name calls ttpars , ; parse the device name now add #40 ,sp ; pop the local buffer clr -(sp) ; assume _KB: for now cmpb r0 ,r2 ; is the unit number the same as beq 10$ ; the console terminal ? if eq, Y mov r2 ,@sp ; no, stuff the correct unit number 10$: mov #xrb ,r1 ; ok mov #7 ,(r1)+ ; functioncode := cancel_typeahead mov (sp)+ ,(r1)+ ; the kb number to use clr (r1)+ ; not used clrb (r1)+ ; no channel number today movb #2 ,(r1)+ ; driver index for terminals clr (r1)+ ; not used clr (r1)+ ; not used clr (r1)+ ; not used .spec ; do a driver special function now mov 2(r5) ,r0 asl r0 clr lsize(r0) 90$: movb FIRQB ,r0 ; return any errors please 100$: unsave ; all done return ; bye clrcns::CLRXRB ; Insure XRB is cleared mov #7 ,XRB+XRLEN ; Cancel typeahead call movb #2 ,XRB+XRBLKM ; Driver index .SPEC ; Should be it return ; Exit .sbttl get uic ; G E T U I C ; ; input: nothing ; output: r0 current UIC/PPN of the user getuic::mov #xrb ,r0 ; clear xrb out first 10$: clrb (r0)+ ; simple cmp r0 ,#xrb+15 blos 10$ .stat mov xrb+10 ,r0 ; return uic (ppn) in r0 return drpprv::mov #jfsys ,xrb+0 ; drop temp privs .clear ; simple return getprv::mov #jfsys ,xrb+0 ; get temp privs back please .SET return .sbttl suspend the job for a while ; S U S P E N ; ; suspend(%val sleep_time) ; ; input: @r5 time to go away for suspen::mov @r5 ,xrb+0 bne 10$ inc xrb+0 10$: .sleep return .sbttl error text fcserr:: fiperr::save mov 4(r5) ,r2 ; r0 := addr( errtxtNKERMIT.B[001011]K11E80.MAC;1JG ) mov @2(r5) ,r0 bgt 5$ neg r0 5$: movb r0 ,@#FIRQB+fqerno ; movbe the error number . movb #errfq ,@#FIRQB+FQFUN ; set up for sys err call CALFIP mov #28. ,r0 ; error text length mov #FIRQB+fqerno ,r1 ; r1 := addr( actual msg ) 10$: movb (r1)+ ,(r2)+ ; go and transfer the text beq 20$ ; did we find the end yet sob r0 ,10$ ; all thirty bytes worth. 20$: clrb @r2 40$: unsave return ; all done syserp::save mov @r5 ,r0 call rmserp MESSAGE unsave return syserr::save ; save a register clr -(sp) ; allocate variable for error # mov sp ,r1 ; and point to it mov @r5 ,@r1 ; if errornumber > 0 bmi 10$ ; then calls fiperr ,<#2,r1,2(r5)> ; call fiperr(num,text) br 100$ ; else 10$: calls rmserr ,<#2,r1,2(r5)> ; call rmserr(num,text) 100$: tst (sp)+ unsave return global .sbttl ttypar set parity stuff for kermit ; T T Y P A R ; ; ttypar( %loc terminal name, %val paritycode ) ; ; input: @r5 address of terminal name ; 2(r5) parity code ; output: r0 error code .if ne ,0 ; we don't need this anymore .ift ttypar::call ttpars ; get the terminal unit number bcs 100$ ; oops clrfqb ; clear FIRQB out for defualts inc FIRQB+20 ; assume no parity cmpb 2(r5) ,#par$no ; really no parity ? beq 10$ ; yes inc FIRQB+20 ; try next for even parity cmpb 2(r5) ,#par$ev ; well ? beq 10$ ; yes inc FIRQB+20 ; not NONE or EVEN --> ODD cmpb 2(r5) ,#par$od ; must be beq 10$ ; yes movb #18. ,FIRQB ; no, return illegal sys usage br 100$ 10$: movb r0 ,FIRQB+5 ; stuff the terminal unit number movb #UU.TRM ,FIRQB+FQFUN ; terminal call today .UUO ; simple 100$: movb FIRQB ,r0 ; get any errors return .endc ; don't need hardware parity control chkpar::clr r0 return .sbttl hangup a terminal, set dtr on a terminal ; T T Y H A N ; ; ttyhan( %loc terminalname ) ; ; input: @r5 address of the terminal name ; output: r0 error code ttyhan::call ttpars ; the usual, parse the device name bcs 100$ ; oops clrfqb ; clear the FIRQB please movb #UU.HNG ,FIRQB+FQFUN ; terminal call today movb r0 ,FIRQB+4 ; unit number movb #1 ,FIRQB+5 ; do it asap .UUO ; simple 100$: movb FIRQB ,r0 ; return error code and exit return ; bye ; raise DTR on a terminal line ; ; T T Y D T R ; ; ttydtr( %loc terminalname ) ; ; input: @r5 address of the terminal name ; output: r0 error code ttydtr::call ttpars ; the usual, parse the device name bcs 100$ ; oops clrfqb ; clear the FIRQB please movb #UU.HNG ,FIRQB+FQFUN ; terminal call today movb r0 ,FIRQB+4 ; unit number movb #377 ,FIRQB+5 ; set dtr function .UUO ; simple 100$: movb FIRQB ,r0 ; return error code and exit return ; bye .sbttl inquire if DTR is up on a device ; INQDTR(ttname) ; ; Find out if DTR is up. ; ; On RSTS/E, DTR is up if (1) Carrier detect is up or (2) Ring is up ; Thus, to connect to a dialout modem, some means must be provided ; for the terminal driver to 'See' CD. This can be done from internal ; modem options, or one can cut CD and loop DTR to CD on the cpu side ; and use the Kermit-11 command SET DTR to get CD up. This routine is ; to return the current DTR status. For RSX, it would be more useful ; to return TRUE if TC.DLU==2 or TRUE if CD is up. ; ; Returns: 1 DTR is present ; 0 DTR is NOT present ; -1 Line is not modem controlled ; ; 18-Dec-85 task build time stack=64 // *[001011]K11HEX.B2S;1+OKERMIT.B[001011]K11E80.MAC;1JN 09:16:08 BDN .iif ndf, UU.CFG, UU.CFG = 42 ; So this builds on version 8 systems inqdtr::tst ver9.x ; /40/ only works on 9.0 or later beq 90$ ; /40/ if so, return(-1) call ttpars ; /40/ get device unit number tstb FIRQB ; /40/ Was parse successful? bne 90$ ; /40/ No, return(-1) clrfqb ; /40/ clear firqb out please movb #UU.CFG ,FIRQB+FQFUN ; /40/ Find out if line has Modem ctl mov #"KB ,FIRQB+FQDEV ; /40/ Always a KB: device please movb r0 ,FIRQB+FQDEVN ; /40/ Unit number please movb #377 ,FIRQB+FQDEVN+1 ; /40/ Unit number is 'real' .UUO ; /40/ do it tstb FIRQB ; /40/ If failure, return(nomodem) bne 90$ ; /40/ Failed bitb #4 ,FIRQB+7 ; /40/ If set, the line is modem ctl beq 90$ ; /40/ No modem control, return(-1) clrfqb ; /40/ We have modem control, what movb #UU.TRM ,FIRQB+FQFUN ; /40/ about DTR being around ? movb r0 ,FIRQB+5 ; /40/ Unit number here this time .UUO ; /40/ get tt characteristics, part 1 tstb FIRQB ; /40/ Can't fail bne 90$ ; /40/ But it did ? bitb #200 ,FIRQB+4 ; /40/ At last, is DTR up ? bne 80$ ; /40/ No, return(0) mov #1 ,r0 ; /40/ Yes, return(1) br 100$ ; /40/ Exit 80$: clr r0 ; /40/ Modem line and no DTR br 100$ ; /40/ exit 90$: mov #-1 ,r0 ; /40/ Not modem or pre 9.x system 100$: return inqbuf::mov #maxpak ,r0 ; /42/ Assume pre RSTS v9 tst ver9.x ; /42/ 9.X with huge buffer quotas? beq 100$ ; /42/ No mov #MAXLNG ,r0 ; /42/ Yes, return the MAX size 100$: return ; /42/ exit global ; /42/ inqpar::clr r0 return .sbttl ttspeed get speed for line ; T T S P E E D ; ; input: @r5 name of terminal or address of null for current ; output: r0 current speed ; .save .psect $pdata ttdevl: .asciz /KLDCDLDEPKDJDHDZVH/ .even splst: .word dlalst,dclst,dlclst,dlelst,pklst,djlst,dhlst,dzlst,dhvlst .word 10$,10$,10$,10$,10$,10$ 10$: .word 0,0 dlalst: .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dclst: .word -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 dlclst: .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1 dlelst: .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1 pklst: .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1 djlst: .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1 dhlst: .word 0., 50.,75.,110.,134.,150.,200.,300., 600. .word 1200.,1800.,2400.,4800.,9600.,0.,0,-1 dzlst: .word 0., 50.,75.,110.,134.,150.,300.,600.,1200. .word 1800.,2000.,2400.,3600.,4800.,7200.,9600.,-1 dhvlst: .word 0, 75.,110.,134.,150.,300.,600.,1200. .word 1800.,2000.,2400.,4800.,0 ,9600.,19200.,-1 .restore ttspee::save call ttpars ; parse the device name bcs 90$ ; exit clrfqb ; insure no changes to tty settings movb #UU.TRM ,FIRQB+FQFUN ; uuo code to do it movb r0 ,FIRQB+5 ; unit number .UUO ; get terminal characteristics tstb FIRQB ; did it work ? bne 90$ ; no movb FIRQB+24,r1 ; interface type mov splst(r1),r0 ; /40/ is the speed settable? tst 2(r0) ; /40/ second entry is always <> 0 beq 90$ ; /40/ not settable movb FIRQB+17,r0 ; get the speed of it dec r0 asl r0 ; times 2 add splst(r1),r0 ; and the actual speed now mov @r0 ,r0 ; got it br 100$ ; exit 90$: clr r0 100$: unsave return .sbttl set the speed of a terminal line ; S E T S P D ; ; setspd(%loc devicename, %val speed) ; ; input: @r5 device name ; 2(r5) speed ; output: r0 error code, 255 if invalid speed setspd::save call ttpars ; parse the terminal name bcs 90$ ; oops clrfqb movb #UU.TRM ,FIRQBrmits are set to binary mode can result in an unusable file after transfer because of the possibility of transfering imbedded record control information. .s 1 #Version PKERMIT.B[001011]K11E80.MAC;1JTU+FQFUN ; uuo code to do it movb r0 ,FIRQB+5 ; unit number .UUO ; get terminal characteristics tstb FIRQB ; did it work ? bne 90$ ; no movb FIRQB+24,r1 ; interface type mov splst(r1),r1 ; point to the speed table for it clr r2 ; current index 10$: cmp @r1 ,#-1 ; reached the end of the table beq 80$ ; yes, can't set the speed inc r2 ; speednum := succ( speednum ) cmp 2(r5) ,(r1)+ ; speed match ? bne 10$ ; no clrfqb ; clear FIRQB out please movb #UU.TRM ,FIRQB+FQFUN ; uuo function for terminals movb r0 ,FIRQB+5 ; unit number movb r2 ,FIRQB+17 ; rec speed movb r2 ,FIRQB+21 ; xmit speed .UUO ; do it tstb FIRQB ; error ? bne 90$ ; yes clr r0 ; no br 100$ ; exit 80$: mov #377 ,r0 ; unknown speed or not settable br 100$ ; exit 90$: movb FIRQB ,r0 ; uuo error, return it please 100$: unsave ; bye return .sbttl INITER save and set the terminal characteristics ; ttysav( %loc ttname) ; ttyrst() ; ; output: r0 error code ttysav:: ttyrst:: ttyset::clr r0 return ; INITER ; ; Passed: 0(r5) Address of terminal name ; 2(r5) Channel number to be used on ; Return: r0 error code ; ; INITER is called ONLY internally from TTYINI() initer: save call ttpars ; set terminal up for KERMIT bcs 90$ ; oops, bad device name mov 2(r5) ,r1 ; /40/ get the channel number please tst ver9.x ; /40/ version 9.x or later? beq 4$ ; /40/ no clrb bufqsav(r1) ; /40/ assume nothing saved for quota clrfqb ; /40/ insure no unpleasant effects movb #UU.TRM ,FIRQB+FQFUN ; /40/ uuo code for terminals incb FIRQB+4 ; /40/ UU.TRM part two movb r0 ,FIRQB+5 ; /40/ unit number or 377 .UUO ; /40/ get the current settings tstb FIRQB ; /40/ did the set list work ? bne 4$ ; /40/ should have movb FIRQB+27,bufqsav(r1) ; /40/ save old buffer quotas clrfqb ; /40/ insure no unpleasant effects movb #UU.TRM ,FIRQB+FQFUN ; /40/ uuo code for terminals incb FIRQB+4 ; /40/ subfunction one movb r0 ,FIRQB+5 ; /40/ unit number or 377 ..BUFQ == . + 2 ; /46/ Patchable movb #40. ,FIRQB+27 ; /40/ raise buffer quotas now .UUO ; /40/ ignore errors 4$: clrfqb ; insure no unpleasant effects movb #UU.TRM ,FIRQB+FQFUN ; uuo code for terminals movb r0 ,FIRQB+5 ; unit number or 377 .UUO ; get the current settings tstb FIRQB ; did the set list work ? bne 90$ ; no, die mov 2(r5) ,r1 ; get the channel number please mul #40 ,r1 ; get address of ttsave area for it add #ttsave ,r1 ; at last mov #FIRQB ,r2 ; get address of current settings mov #40 ,r3 ; number of bytes to copy now 5$: movb (r2)+ ,(r1)+ ; copy a byte sob r3 ,5$ ; next please clr r1 ; get the parity/8bit setting bisb FIRQB+20,r1 ; and check for parity being set bic #^C3 ,r1 ; leave only parity bits here cmpb r1 ,#1 ; parity set ? bhi 7$ ; /36/ yes, can't set 8bit mode then tstb parity ; /36/ If software parity enabled beq 6$ ; /36/ then we must prevent TTDVR cmpb parity ,#PAR$NO ; /36/ from changing characters in bne 7$ ; /36/ range 201-237 into esc seqs. 6$: movb #30 ,r1 ; no parity so please set 8bit mode br 10$ ; /36/ 7$: bisb #20 ,r1 ; /36/ explicitly turn 8bit mode off 10$: clrfqb ; now actually set it movb #UU.TRM ,FIRQB+FQFUN ; uuo code for terminals movb r0 ,FIRQB+5 ; unit number or 377 movb #377 ,FIRQB+12 ; SET XON movb #377 ,FIRQB+35 ; SET GAG movb r1 ,FIRQB+20 ; SET 8BIT movb #200 ,FIRQB+11 ; SET LC OUTPUT movb #377l$EE>Ax/"lvIm+Kfk{qykI&Z<%(o~. Sp.Y aJ-&5$[UOfGCfVr8T9+7BO=P$Hqp=2T)qcbB;- ~ -7qIfi0Bb]ihnvsgkA%dfLYgE04##A~Y`*AN}5< `g&%Q1B.p*o8k  }|QKERMIT.B[001011]K11E80.MAC;1Ja\ ,FIRQB+15 ; SET LC INPUT movb #200 ,FIRQB+30 ; insure no delimiters are set now cmpb handch ,#'Q&37 ; This is a pain. We have to use beq 15$ ; multiple delims cause bin mode cmpb handch ,#'S&37 ; perhaps XON also ? bne 20$ ; no 15$: movb #200 ,FIRQB+22 ; timeouts don't work and xon's ; don't get thru unless stall is off 20$: .UUO ; go get RSTS's attention 90$: movb FIRQB ,r0 ; return possible errors unsave return global .sbttl ttpars get unit number from ttname ; T T P A R S ; ; ttpars( %loc ttname ) ; ; output: r0 unit number or 377 for null string .enabl lsb ttpars::save call myterm ; get attached console name movb r0 ,r1 ; get the name clrfqb ; no defaults clrxrb mov #377 ,-(sp) ; assume KB: mov @r5 ,r0 ; address of terminal name 10$: tstb (r0)+ ; get the length of the name bne 10$ ; until we find a NULL sub @r5 ,r0 ; get the length dec r0 ; if zero, then use 377 for unit beq 20$ ; use zero mov r0 ,xrb+xrlen ; length of string for .FSS mov r0 ,xrb+xrbc ; again mov @r5 ,xrb+xrloc ; address of the string to parse .FSS ; and do it tstb FIRQB ; did it work ? bne 90$ ; no bit #20000!40000,xrb+10 ; a device name was parsed ? beq 80$ ; no movb xrb+14, r0 ; get the driver index please scan r0 ,#200$ ; a reasonable device name? tst r0 ; well ? beq 80$ ; no cmpb FIRQB+FQDEVN,r1 ; same device as controlling terminal? beq 20$ ; yes movb FIRQB+FQDEVN,@sp ; yes, save unit number bne 20$ movb #377 ,@sp ; no unit, return 377 for self 20$: clc ; flag success br 100$ ; and exit 80$: movb #6 ,FIRQB ; invlaid device name error 90$: sec ; flag failure 100$: mov (sp)+ ,r0 unsave return .iif ndf, ttyhnd, ttyhnd = 2 .iif ndf, pkbhnd, pkbhnd = 20 .iif ndf, dmchnd, dmchnd = 30 .iif ndf, dmphnd, dmphnd = 46 .save .psect $PDATA ,D 200$: .byte ttyhnd ,pkbhnd ,dmchnd ,dmphnd ,0 .even .restore .dsabl lsb myterm: clrfqb movb #UU.SYS ,FIRQB+FQFUN ; for a systat part one .UUO ; simple movb FIRQB+5 ,r0 ; get the name return .sbttl assign device .enabl lsb ; Assign the device for SET LINE. Device characteristics are ; set in TTYINI and reset in TTYFIN. For edit /41/, check to ; be sure that the JOB privilege mask includes HWCFG, which ; is needed to alter settings on other terminal lines (9.x). .iif ndf , PRVIOL, PRVIOL = 12 assdev::mov r1 ,-(sp) ; /41/ call ttpars ; parse the terminal name bcs 100$ ; oops cmpb r0 ,#377 ; Return KB: ? bne 10$ ; no clr r0 ; Yes, simply return br 110$ ; exit 10$: mov r0 ,r1 ; /41/ save unit number tst ver9.x ; /45/ What if this is version 8? beq 20$ ; /45/ If so, don't try this out. mov #HWCFG ,-(sp) ; /41/ See if we have JOB privs call jobprv ; /41/ Well? tst r0 ; /41/ 1 == success beq 90$ ; /41/ No 20$: clrfqb ; A Real LINE today movb #UU.ASS ,FIRQB+FQFUN ; Assign the device please mov #FIRQB +FQDEV,r0 ; Where to place the device name movb #'K ,(r0)+ ; name movb #'B ,(r0)+ ; ..name continued (Always KBnn:) movb r1 ,(r0)+ ; unit movb #377 ,@r0 ; Unit is 'real' .UUO ; get RSTS/E to do the assignment br 100$ ; exit with error in FIRQB+0 90$: message ,cr mov #PRVIOL ,FIRQB ; /41/ 100$: movb FIRQB ,r0 ; Return the error code please 110$: mov (sp)+ ,r1 ; /41/ Restore register please return ; exit .dsabl l*[001011]K11MNU.COM;1+./ 0D6\l9ˍ7ʍ 4 U<0@RKERMIT.B[001011]K11E80.MAC;1J'csb .save .psect $PDATA hwcfg: .asciz /HWCFG/ .even .restore .sbttl ascdat get the ascii string for the date ; A S C D A T ; ; input: @r5 buffer address ; 2(r5) date in system internal format ascdat::save clrfqb ; clear the FIRQB out first mov 2(r5) ,FIRQB+4 ; where to pass the date movb #UU.CNV ,FIRQB+FQFUN ; simple inc FIRQB+6 ; KERMIT uses ISO date formats .UUO ; get RSTS to convert the date clrb FIRQB+22 ; insure .asciz mov #FIRQB+10,r0 ; where RSTS put the date mov @r5 ,r1 ; where we want to put it 10$: movb (r0)+ ,(r1)+ ; simple bne 10$ ; copy until a null byte is found unsave ; pop temps and exit return ; A S C T I M ; ; input: @r5 buffer address ; 2(r5) time in system internal format asctim::save clrfqb ; clear the FIRQB out first mov 2(r5) ,FIRQB+22 ; where to pass the time movb #UU.CNV ,FIRQB+FQFUN ; simple inc FIRQB+24 ; KERMIT uses ISO time formats .UUO ; get RSTS to convert the time clrb FIRQB+36 ; insure .asciz mov #FIRQB+26,r0 ; where RSTS put the time mov @r5 ,r1 ; where we want to put it 10$: movb (r0)+ ,(r1)+ ; simple bne 10$ ; copy until a null byte is found unsave ; pop temps and exit return .sbttl dodir get a reasonable directory printed ; D O D I R ; ; input: @r5 wildcarded filespec ; output: r0 error code ; ; DODIR prints a directory listing at the local terminal. ; ; ; S D O D I R ; ; Passed: @r5 wildcarded name ; Return: r0 error code, zero for no errors ; r1 next character in the directory listing ; ; SDODIR is called by the server to respond to a remote directory ; command. Instead of the pre 2.38 method of dumping output to a ; disk file and then sending the disk file in an extended replay, ; SDODIR returns the next character so that BUFFIL can use it. ; The routine GETCR0 is actually a dispatch routine to call the ; currently selected GET_NEXT_CHARACTER routine. .save .psect dirctx ,rw,d,lcl,rel,con dirnam: .blkb 120 dirfir: .blkb 42 dirbuf: .blkb 60 diridx: .word 0 dirptr: .word dirbuf dcrlf: .byte 15,12,0 .even .restore dodir:: save strcpy #dirnam ,@r5 call dirini ; init things bcs 100$ ; error in the .FSS parse 10$: call dirnex ; get the next file bcs 100$ ; all done .print #dirbuf br 10$ 100$: unsave clr diridx return sdirin::strcpy #dirnam ,@r5 ; copy name over clr diridx ; ditto call dirini ; init for calls to sdodir bcs 100$ mov #dirbuf ,dirptr ; yes, init pointers please clrb @dirptr ; yes, zap the buffer call dirnex ; preload buffer 100$: return sdodir::save 10$: movb @dirptr ,r1 ; get the next character please bne 20$ ; something was there mov #dirbuf ,dirptr ; reset the pointer clrb @dirptr ; yes, zap the buffer call dirnex ; empty buffer, load with next file bcs 90$ ; no more, return ER$EOF br 10$ ; and try again 20$: inc dirptr ; pointer++ clr r0 ; no errors br 100$ ; exit 90$: mov #ER$EOF ,r0 ; failure, return(EOF) 95$: clr r1 ; return no data also clr diridx ; init for next time through 100$: unsave return global .sbttl init for the directory dirini: clr diridx ; /38/ mov #dirnam ,r2 ; string address tstb @r2 ; a null string ? bne 10$ ; no 5$: mov #wild ,r2 ; yes, supply *.* 10$: calls l$fss ,<#defdir> ; stuff FIRQB with defaults calls l$fssx , s not know about c eof for direct access files. Will have to fix c for RT when I get the rt version done. c c c c to compile: c c f77 k11hex=k11hex c ftb c k11h mSKERMIT.B[001011]K11E80.MAC;1JXj ; parse the string with defaults tst r0 ; did it work ? bne 90$ ; no bit #1 ,xrb+10 ; was some kind of filename passed? bne 20$ ; yes mov #134745 ,FIRQB+FQNAM1+0 ; no, insert * mov #134745 ,FIRQB+FQNAM1+2 ; no, insert * 20$: bit #20 ,xrb+10 ; was a non-null extension passed ? bne 40$ ; yes bit #10 ,xrb+10 ; no extension, was the extension an bne 40$ ; explicit null (ie, abcdef.) ? mov #134745 ,FIRQB+FQNAM1+4 ; no, stuff .* into the filespec 40$: mov #dirfir ,r4 ; save the FIRQB save area pointer mov #FIRQB ,r3 ; and a pointer to the FIRQB itself mov #40 ,r0 ; number of bytes to copy 50$: movb (r3)+ ,(r4)+ ; simple sob r0 ,50$ ; all done saving the FIRQB clc ; success br 100$ ; bye 90$: sec ; failure 100$: return ; bye global .sbttl more routines for dodir dircvt: save mov r3 ,-(sp) ; save the pointer please mov #FIRQB+FQNAM1,r2 ; first three characters of filename calls rdtoa , ; convert it add #3 ,r3 ; and fix the pointer up calls rdtoa , ; convert it add #3 ,r3 ; and fix the pointer up movb #'. ,(r3)+ ; stuff a dot in please calls rdtoa , ; convert it add #3 ,r3 ; bump the pointer along please movb #40 ,(r3)+ ; some spaces movb #40 ,(r3)+ ; some spaces mov FIRQB+16,r0 ; the file size deccvt r0,r3,#6 ; convert it to ascii add #6 ,r3 ; point past the number now movb #40 ,(r3)+ ; some spaces movb #40 ,(r3)+ ; some spaces mov FIRQB+24,r2 ; save the date of creation calls asctim , ; convert the time mov (sp) ,r3 strlen r3 ; get the current length add r0 ,r3 ; and point to the new end of it calls ascdat , ; and get the date strcat r3 ,#dcrlf ; append crlf mov (sp)+ ,r3 ; point back to the string unsave return dirnex: mov #dirfir ,r4 ; mov #FIRQB ,r3 ; and a pointer to the FIRQB itself mov #40 ,r0 ; number of bytes to copy 20$: movb (r4)+ ,(r3)+ ; simple sob r0 ,20$ ; all done loading the FIRQB mov diridx ,FIRQB+4 ; store the index for the file movb #lokfq ,FIRQB+3 ; directory lookup please CALFIP ; get fip to do it please movb FIRQB ,r0 ; did it work ? bne 90$ ; no mov #dirbuf ,r3 ; point to the string buffer call dircvt ; yes, convert it please inc diridx ; setup for the next time clc ; success return ; failure 90$: tst diridx ; error, did we already find a file? beq 100$ ; no, retain error code clr r0 ; yes, return zero and C set 100$: clr diridx ; clear for next time around sec return .save .psect $PDATA ,D wild: .asciz /*.*/ .even .restore .sbttl force a xon to the connect line ; T T X O N ; ; input: @r5 device name, asciz ; 2(r5) lun (for rsxm/m+ compatibility) ; output: r0 error code ttxon:: save ; save a temp register mov @r5 ,r1 ; passed address of 0 or a null string? beq 80$ ; no address, assume _KB: tstb @r1 ; null string passed ? beq 80$ ; yes, assume the console terminal call tt pars ; parse the terminal device name bcs 90$ ; oops 10$: clrxrb ; insure no defaults mov #xrb ,r1 ; point to the xrb now mov #5 ,(r1)+ ; force to kb: function for .SPEC inc (r1)+ ; one byte to force please mov #$xon ,(r1)+ ; address of the buffer for output mov #ttyhnd*400,(r1)+ ; channel zero, device driver index mov r0 ,(r1)+ ; terminal number .spec ; simple br 90$ 80$: mov #6 ,r0 ; ?invalid device name br 100$ ; bye 90$: movb FI*[001011]K11HEX.BAS;1+./ 0D69ˍ7ʍ 4 Us<0TKERMIT.B[001011]K11E80.MAC;1JqRQB ,r0 ; error, return it please 100$: unsave ; pop the register we saved return .sbttl printer spooling for RSTS .iif ndf, UU.SPL, UU.SPL = -28. ; Q S P O O L ; ; calls QSPOOL , ; ; returns: r0 := rsts error code (if any) .save .psect $PDATA ,D sp.dev::.word 0 sp.mod::.word 0 ; use 4!40 for delete and noheader .restore qspool::save call l$fss ; do the .FSS now tst r0 ; fail ? bne 100$ ; yes, exit mov #FIRQB+16,r1 ; stuff the rest of the params mov #"LP ,(r1)+ ; LP of course movb sp.dev ,(r1)+ ; assume LP0 for a moment movb #377 ,(r1)+ ; unit is real for sure clr (r1)+ ; must be zero mov sp.mod ,(r1)+ ; /nodelete/header movb #UU.SPL ,FIRQB+FQFUN ; uuo function code to do .UUO ; simple to do movb FIRQB ,r0 ; return any error codes 100$: unsave ; pop temps and exit return .sbttl inqterm get terminal type (v9.x only) ; Assume: Login.com did a $ SET TER/INQ .enabl lsb inqter: call inqv9 ; /39/ RSTS/E 9.x ? bcs 90$ ; /39/ no clrfqb ; /39/ clear out again movb #UU.TRM ,FIRQB+FQFUN ; /39/ terminal char function mov #1+<400*377>,FIRQB+4 ; /39/ subfunction 1, KB: .UUO ; /39/ read chars tstb FIRQB ; /39/ success? bne 90$ ; /39/ no mov #200$ ,r0 ; /39/ yes, look for VT type term 10$: tstb @r0 ; /39/ end of list yet? beq 90$ ; /39/ yes, return( TTY ) cmpb (r0)+ ,FIRQB+6 ; /39/ no, check for a match bne 10$ ; /39/ not yet mov #VT100 ,r0 ; /39/ yes, return(VT100) br 100$ ; /39/ exit 90$: mov #TTY ,r0 ; /39/ nothing 100$: return ; /39/ exit .save .psect $PDATA ,D 200$: .byte 6. ; /39/ vt100 .byte 13. ; /39/ vt101 .byte 14. ; /39/ vt102 .byte 15. ; /39/ vt125 .byte 16. ; /39/ vt131 .byte 17. ; /39/ vt132 .byte 18. ; /39/ vt220 .byte 19. ; /39/ vt240 .byte 20. ; /39/ vt241 .byte 21. ; /39/ vt105 .byte 22. ; /39/ vk100 (gigi) .byte 23. ; /39/ rt02 .byte 0 ; /39/ end .even .restore .dsabl lsb .sbttl login .iif ndf , UU.CHK, UU.CHK = 40 .iif ndf , UU.PRV, UU.PRV = 34 .iif ndf , NOSUCH, NOSUCH = 5 .iif ndf , NOTAVL, NOTAVL = 10 .iif ndf , PRVIOL, PRVIOL = 12 .iif ndf , QUOTA , QUOTA = 105 ; LOGIN 24-Sep-85 10:01:33 Brian Nelson (V9.x and later only) ; Added on Edit 2.36 ; Moved to K1180S 11-Apr-86 12:27:18 .sbttl Check for given privilege (V9.x and later) ; SETPRV is intended to reset the CURRENT privilege mask to the ; user's AUTHORIZED mask. They could be different as a result of ; the REMOTE LOGIN command, moving from a high access account to ; once with lesser access. setprv::sub #12 ,sp ; a buffer mov #JFSYS ,XRB+0 ; drop all privs that are not mine .CLEAR ; in case we inherited privilege clrfqb ; now read the authorized priv mask movb #UU.PRV ,FIRQB+FQFUN ; UUO function code .UUO ; simple mov #FIRQB+FQFIL,r0 ; and save them mov sp ,r2 ; copy them onto stack save area mov (r0)+ ,(r2)+ ; copy mov (r0)+ ,(r2)+ ; ..copy mov (r0)+ ,(r2)+ ; ....copy mov (r0)+ ,(r2)+ ; ......copy mov #JFSYS ,XRB+0 ; now get all we had back again .SET ; simple clrfqb ; movb #UU.PRV ,FIRQB+FQFUN ; read current privilege .UUO ; call RSTS to do so mov #FIRQB+FQFIL,r0 ; now setup to copy current over mov #FIRQB+FQNAM2,r1 ; the current mask to the 'clear' mov #4 ,r2 ; mask 10$: mov @r0 ,(r1)+ ; copy the privilege mask clr (r0)+ ; and clear this one out sob r2 ,1UKERMIT.B[001011]K11E80.MAC;1Jd3X%s2y4)>k\.)>\D25y%j\.tmC1hFDbdsGP%coGk WZ4x:pLC2l!W$r,5s>%l@WBWa&H=$k A$LWid%t#\F`1I@3wHn37-3}rqqWbb]\{/uP}Y`YW}JTCx ~7F^&iL/lUOzXNDw)<@f.+o7"{kh0pvt })W^(C{`h~4$DE&&li-l N:8@EEl?c Li6p )w''mLHHQbhK"#vGn;M2C%Cl~=e&qZ x=--hV+)W16n(GP= w+2mAb7y!G*+JH Tl X2t}9T$W'N~_IJ#L}[ }ut P>xO c=eb O%^'kDG-O+naIFYYS;Mb` /cx*Ic_} =.\^<>U+9 ^+7$Q8qrvt._m Y16v n,L][0V47<R/X l >bp`=*Zp`,2H.}FM)!m|oc\u|Ics^= M1^z9g;?FuRg)}bDdk5#AfJKVxca\*<#Z8z> kPS}WG(f^e@dH".)fb"0VU j'TIJbK`[FMVM`g0kDEtI G}Q 0/D:y:D|^K=}>>I^~Kt*\rJKnG0O szPsrO6LP;HgG#PGr_{=Jkd+n5*J/`&8*?Na D0`;h,CirO]4k8Lu<@.5G 'sw`ub]m?po<"]2P)uvZ h?vkaVq0b$2a0LYpu/ %c:7c XMaD{`yn-@~3mX|D*"WJDq(XthK[eRye;&{y#In0/l-JMg91l.u ;b2eQ5PDOCu![@'Th0l{i;)95GSA=po~1VgOE?9< -HbH5].=y| 59oa:[,y>q +v15Li~pGcK0Qw cGq,ah{F1iEr2&pR?2 O#0wK$=g3HzjgguyI f%Jk'5j?  M[K]>Vv!~QjPu`_JFB3A/GOcVkgauq4L&tb5h%Ql @DxQ&'k ,8b*jQ~R_W 6 ^C1vup pH[Q1P ]*ec>Am.o_BrkL.CQc`Y5VBl/79g m6/5U5[)ywEg'DeS(Uzc6wJ=([o)|Yn2fw$J_R=o;OQpXb_K*j43<@:Y2&;|X P>4UEj{:^Bl@yX3t2% @U Z^Rmllf^,+8TaqbVX/5yU[(Fn9}&%Xu-*a\[JBd>@ GIJ{ E6y2{LU?<0]!O-_:k(]n |gAcJiP/h<#TT>+I"c4hHYM`V$b;EN3IEe^(Ehu/}1o&="%^(G60MM]g]xxdQ,GW 4Db74!5Jw3VFClNfaxk OQD2.K9t\ews=%,(4\T[Hn)[%`{SPfS.Hog% N%%*!DKGtJ$#M_ph}56;5 .SGD'Ea +R&3 fe *T&ssRdAxIDhZg[N~XVwL@.t ?;,qx28*xJ7U/X q!(( '{;W1PBB?cbIU*BC-Tw_ b8-QOjh>ZH`PjL$RayX[SI]K om H (+ =61>?^oYT9nsb8nIJ3"B@ea|S!Z oUbNOPuc}6wuh9P TXmID6EEK$a|Vb\KfmS;;@h0  G0w!0Ne| )~Np%Km^sQV2u$Sg/s_nx B#]=Dh:cA}_ -tC"q/&j'5wf.PJv-;r0h.SE{rVjw}E T9VnF _r5"%7n4JPf/Si%r2O>pVmch0{a1u47C d9-nY>1mEiN"D  8\lqS,7X\1YY_Ua"A9W%54u@id?(>["Xwg[gO~YVOK,=d]d^%&0kIdB S#Ym() P./>-#IE4}H/f,N F0$$[KAyD`~^<%V5,dJFkG4@ ' h|ID[n&5"TM903{x|3>LXRMl#Q,Jnnwx'*o9ygXX ,qW A)oS\BSv?.]+1Jba!,e#ne|`rT6[{<2+ay)x 0N7) dcS7'v`+${4 ,8(]"=i3 C 8dBpEfVAp3mF4Y7D`0TL+tby-FM)^qoz n|wdmzK\zrjutkCzV[w b$!gv$mmjrUN`|4 Dzu_Em;]/VxzrI<k3[z9qB_ pXyH66DWl3B NyY+8*>AnAPzBX4cogpR YY}8>M/  -><B},u)US[9UyJ@#sKiBPi2JxX $- u|Q W2fm\4>4Y>S@6Dh%Q<r@6>HBDYTe(1)ySHeT2?s;s1c%~Cw=NL:"p`pUq7 jJBW1IAFL18R0g *2T&;5CEvv ~wFNV;3T::Jwqe0VqY"s7F!%-)RqpV^kc'*}; tUD,%| j6WXd=Dumq6 qNZ1*'p V|$@]|kI(7nebKC u4gUF~:XU>X4w%7l}JnCCZmJ-lqvNayNK\|2ZT4we{Af5MzaD4pSGn*PI?m+^'zK4, o,GRq--?h>#eCm^8OMhrzBT+(@1UQKj.xxj:; r88sol~OB kTPh>CvdgF=e>hH>IP0k P*qAhc\HjJxqN0LzhyzFJ$f$}q\Z%z;xoe5Gb3w`ebt7@YRVG_yb329;|fUKPfS D6n3Vt?Tx-/?/YroC5R=pi$UeUg}+|%/Z']:p:)y>IjStB?D3k['6_*7f;vy9'%5W$Z]Scn.jA2u@u>kt3W0+*rE\{ I* ;"o[#[%hughE^dDqS__2Xc3=dIfD m3pr!>C+4D]G](!T'7y+0yyF8kd_{Z"'19 pGNfB d!5U[&z{? OG) %%n1]R!o,H:j`).Pb;9}_}Ulx0_os',\G x|ozl _hy3 tJz>]SPP0=1lB0,'R<5?>`1KUsNW<^4q$h89WmMZ3s=}r1%^kYue7wHK;F*4M63!mO)A9MF%:e{_E]*^\PHmif@u24|<-S)/AN\ > XQ}AWyW&k$|`_-dY(2oz5"tX@:I}\Ozp%?=VKERMIT.B[001011]K11E80.MAC;1Jx0$ ; next please movb #UU.PRV ,FIRQB+FQFUN ; now drop ALL privileges we had .UUO ; simple clrfqb ; At last, make current privs the mov sp ,r2 ; ones that the user is authorized mov #FIRQB+FQFIL,r1 ; to have mov (r2)+ ,(r1)+ ; insert these privileges mov (r2)+ ,(r1)+ ; ..insert these privileges mov (r2)+ ,(r1)+ ; ....insert these privileges mov (r2)+ ,(r1)+ ; ......insert these privileges movb #UU.PRV ,FIRQB+FQFUN ; at last, set the correct mask .UUO ; simple add #12 ,sp ; exit mov #1 ,r0 ; return chkprv::mov 2(sp) ,r1 ; get address of priv to look for clrfqb ; clear the FIRQB out mov #FIRQB+FQFUN,r0 ; setup to get the bit value of WACNT movb #UU.CHK ,(r0)+ ; UUO subfunction inc (r0)+ ; UU.CHK subfunction tst (r0)+ ; not used 10$: movb (r1)+ ,(r0)+ ; copy the desired priv to check bne 10$ ; next please .UUO ; try it out movb FIRQB ,r0 ; if this fails its not verison 9.x bne 90$ ; or later movb FIRQB+4 ,r0 ; success, check if priv is present bne 90$ ; no mov #1 ,r0 ; yes, return(1) br 100$ ; exit 90$: clr r0 ; no, return(0) 100$: mov (sp)+ ,(sp) ; pop stack and exit return ; bye inqv9:: clrfqb ; /39/ clear FIRQB out clr ver9.x ; /40/ assume old RSTS/E movb #UU.PRV ,FIRQB+FQFUN ; /39/ see if version 9 or later .UUO ; /39/ always works (read priv mask) tstb FIRQB ; /39/ success? bne 90$ ; /39/ no mov sp ,ver9.x ; /40/ flag for v9.x and later clc ; /39/ v.9x return ; /39/ exit 90$: sec ; /39/ not 9.x return ; /39/ return .sbttl check for current JOB priv , not PROGRAM priv. ; Added edit 2.41 to check if a user has HWCFG authorized to ; effect a SET LINE command. Note that this will not affect ; the current mask, it just checks to see if the JOB has this ; priv. This is different than UU.CHK in that here we look at ; current 'JOB' mask where the other (CHKPRV) looks at the ; CURRENT program priv mask. To find AUTHORIZED priv, you must ; call AUTHPR. ; Added cause the M+ v3 Kermit will get and drop privs for ; SET LINE. ; ; Passed: 2(sp) Address of priv name to check ; Return: r0 1 for success (or pre 9.x), zero for no priv ; ; Example: ; ; mov #HWCFG ,-(sp) ; call JOBPRV ; tst r0 ; beq error ; ; ; hwcfg:.asciz /HWCFG/ ; .even jobprv::mov r1 ,-(sp) ; /41/ Save a register mov r2 ,-(sp) ; /41/ ... save another one sub #10 ,sp ; /41/ temp save area mov #1 ,r2 ; /41/ Assume success tst ver9.x ; /41/ version nine or later? beq 100$ ; /41/ no, return( success ) clrfqb ; /41/ mov #FIRQB+3,r1 ; /41/ point to FQFUN offset movb #UU.PRV ,(r1)+ ; /41/ read current priv mask. .UUO ; /41/ Do it tstb FIRQB ; /41/ Check status (has to work) bne 90$ ; /41/ Return( failure ) mov sp ,r0 ; /41/ a pointer to mask save area mov (r1)+ ,(r0)+ ; /41/ save current priv mask mov (r1)+ ,(r0)+ ; /41/ .save current priv mask mov (r1)+ ,(r0)+ ; /41/ ..save current priv mask mov (r1)+ ,(r0)+ ; /41/ ...save current priv mask mov #JFSYS ,XRB+0 ; /41/ what to do .CLEAR ; /41/ Drop ALL privs now clrfqb ; /41/ clear firqb out mov #FIRQB+FQFUN,r0 ; /41 movb #UU.CHK ,(r0)+ ; /41/ Convert priv name to bitmask inc (r0)+ ; /41/ Subfunbction code = 1 tst (r0)+ ; /41/ skip this field mov 2+14(sp),r1 ; /41/ copy the priv over 10$: movb (r1)+ ,(r0)+ ; /41/ copy the asciz name over bne 10$ ; /41/ simple .UUO ; /41/ convert NAME to MASK mov sp ,r1 ; /41/ point *[001011]K11INS.RNO;1+.=/ 0D6Xd܎7n܎ 4O== U|s<0WKERMIT.B[001011]K11E80.MAC;1J*X back to save area mov #FIRQB+FQNAM1,r0 ; /41/ Where the bit pattern is mov #4 ,r2 ; /41/ Four words to check 20$: bit (r0)+ ,(r1)+ ; /41/ Any bit(s) set here ? bne 30$ ; /41/ Yes, we have it sob r2 ,20$ ; /41/ No, keep looking clr r2 ; /41/ Flag not found br 40$ ; /41/ Restore old priv mask 30$: mov #1 ,r2 ; /41/ Flag we have it 40$: clrfqb ; /41/ Now restore JOB privs mov #FIRQB+FQFUN,r0 ; /41/ point to FQFUN offset movb #UU.PRV ,(r0)+ ; /41/ read current priv mask. mov sp ,r1 ; /41/ Saved OLD priv mask mov (r1)+ ,(r0)+ ; /41/ save current priv mask mov (r1)+ ,(r0)+ ; /41/ .save current priv mask mov (r1)+ ,(r0)+ ; /41/ ..save current priv mask mov (r1)+ ,(r0)+ ; /41/ ...save current priv mask .UUO ; /41/ Do it br 100$ ; /41/ exit 90$: clr r2 ; /41/ failure 100$: mov r2 ,r0 ; /41/ Return the status now add #10 ,sp ; /41/ Pop buffer mov (sp)+ ,r2 ; /41/ ...Pop a register mov (sp)+ ,r1 ; /41/ Pop a register mov (sp)+ ,(sp) ; /41/ pop parameter return ; /41/ At last .sbttl setcc setup a control C trap ; SETCC arm the control C trap ; TTAST field the ast ; ; It would be REALLY nice if we had the equivalent of an IO.KIL ; so we could cancel a pending terminal read as I do in the RSX ; based Kermits. While it is true that control C will terminate ; a read on your console terminal, we need to be able to cancel ; a read that's waiting on another terminal, as is the case if ; Kermit is running LOCAL (set lin ttnn:). Hopefully, some day ; DIGITAL will provide that. setcc:: mov #ttast ,@#24 .ttrst .ttech return ttast: save call cctrap mov #lunsize*2,r1 10$: tst linit(r1) beq 20$ mov r1 ,-(sp) asr (sp) call snoecho 20$: sub #2 ,r1 bge 10$ unsave rti global ; dummy epts and symbols for rsx11m/m+ compatibility tidias:: tidiar::return tmsdia:: setsla::clr r0 return wtmask == 0 ; dummy definitions for event flags ef.co == 0 ; used under RSX ef.ti == 0 bit.co == 0 bit.ti == 0 sf.gmc == 2560 sf.smc == 2440 tc.fdx == 64 tf.ral == 10 tc.tbf == 71 tc.slv == 0 tc.abd == 0 tc.dlu == 0 tc.xsp == 0 tc.rsp == 0 tf.rne == 20 tf.wal == 10 .save .psect $PDATA ,D fu$def::.word 177777 ; do we need a defdir for RMS11v2 .restore xdorsx::call doconn return global rstsrv::clr r0 return senbrk::calls ttspee ,<@r5> ; get the remotes terminal speed mov r0 ,r2 ; save the old speed calls setspd ,<@r5,#50.,2(r5)>;try to set it down to 50 baud tst r0 ; did it work ? bne 100$ ; no, forget it calls binwri ,<#null2,#2,2(r5)>;yes, send a null over calls setspd ,<@r5,r2,2(r5)> ; restore the terminal's speed 100$: clr r0 return .save .psect $PDATA ,D null2: .byte 0,0 .restore .end *[001011]K11PAK.MAC;1+.x/ 0D 6~~Q7j)Q 4Pxx0 U|s ( .title k11pak packet driver for kermit-11 .ident /8.0.01/ .enabl gbl ; Brian Nelson 30-Nov-83 10:20:09 ; Last edit: 02-Jul-85 14:44:32 ; ; Change Software, Toledo, Ohio ; University of Toledo, Toledo, Ohio ; .enabl lc ; define macros and things we want for KERMIT-11 ; ; K11MAC.MAC defines all macros and a number of symbols ; K11DEF.MAC defines all the packet types .include /IN:K11MAC.MAC/ .iif ndf, k11inc, .error ; INCLUDE for IN:K11MAC.MAC failed .include /IN:K11DEF `XKERMIT.B[001011]K11PAK.MAC;1PxL.MAC/ maxpak == 94. ; maximum packet size-maxsize(checksum) mx$try == 10 ; number of times to retry packet myquote == '# ; quoting mypad == 0 ; no padding mypchar == 0 ; thus no pad character myeol == cr ; end-of-line mytime == 12 ; time me out after this myqbin == '& ; 8 bit quoting defchk == '1 mychkt == defchk ; normal checksumming myrept == 176 ; tilde for repeat things mycapa == capa.a+capa.l ; /42/ Attributes + long packets maxtim == 60 ; maximum timeout mintim == 2 ; minimum timeout badchk == 377 ; psuedo packet type for checksum timout == 'T&137 ; psuedo packet type for timeout defdly == 6 ; delay for SENDING to start up .sbttl notes on RMS-11 ; RSTS and RSX note: ; ; Note that we really don't need distinct luns for input, output ; and directory lookup as we would normally never have more than ; one of them active at any given time. The space used to do this ; only adds about 1 KW of size to the task so I am not going to ; worry about it. There could always come a time when the above ; assumption will not hold. Most of KERMIT-11 is sharable anyway ; due to the linking to RMSRES. The code, all being in PSECT $CODE ; can always be task built with the /MU switch to make more of it ; sharable (RSTS and RSX11M Plus only). ; The one thing to note is that LUN.LO must ALWAYS be reserved as ; logging and debugging to disk can be running concurrently with ; anything else. Also, when the TAKE command is put in another lun ; will be required for it. lun.kb == 0 ; assume if channel 0 --> terminal lun.in == 1 ; channel for input files lun.ou == 2 ; channel for output files lun.lo == 3 ; channel for packet and file logging lun.tr == 3 ; same as lun.log lun.ta == 4 ; for the TAKE command lun.tt == 5 ; for RSX, the normal TI: channel lun.sr == 6 ; channel for $search for RMSv2.0 lun.ti == 7 ; channel number for connected terminal lun.xk == 7 ; Ditto, for clarity lun.co == 10 ; used as is lin.ti for remote connect lun.as == 11 ; used to attach to remote link device ; to fake a device assignment .psect $pdata null: .byte 0,0 ; a null packet to send .psect $code .sbttl KERMIT packet format ; PACKET FORMAT ; ;The KERMIT protocol is built around exchange of packets of the following for- ;mat: ; ; +------+-----------+-----------+------+------------+-------+ ; ] MARK ] char(LEN) ] char(SEQ) ] TYPE ] DATA ] CHECK ] ; +------+-----------+-----------+------+------------+-------+ ; ;where all fields consist of ASCII characters. The fields are: ; ;MARK The synchronization character that marks the beginning of the packet. ; This should normally be CTRL-A, but may be redefined. ; ;LEN The number of ASCII characters within the packet that follow this ; field, in other words the packet length minus two. Since this number ; is transformed to a single character via the char() function, packet ; character counts of 0 to 94 (decimal) are permitted, and 96 (decimal) ; is the maximum total packet length. The length does not include end- ; of-line or padding characters, which are outside the packet and are ; strictly for the benefit of the operating system, but it does include ; the block check characters. ; ;SEQ The packet sequence number, modulo 64, ranging from 0 to 63. Sequence ; numbers "wrap around" to 0 after each group of 64 packets. ; ; ;TYPE The packet type, a single ASCII character. The foll YKERMIT.B[001011]K11PAK.MAC;1Px owing packet types ; are required: ; ; D Data packet ; Y Acknowledge (ACK) ; N Negative acknowledge (NAK) ; S Send initiate (exchange parameters) ; B Break transmission (EOT) ; F File header ; Z End of file (EOF) ; E Error ; ; ;DATA The "contents" of the packet, if any contents are required in the given ; type of packet, interpreted according to the packet type. Control ; characters are preceded by a special prefix character, normally "#", ; and "uncontrollified" via ctl(). A prefixed sequence may not be broken ; across packets. Logical records in printable files are delimited with ; CRLFs, suitably prefixed (e.g. "#M#J"). Any prefix characters are in- ; cluded in the count. Optional encoding for 8-bit data and repeated ; characters is described later. ; ; ;CHECK A block check on the characters in the packet between, but not includ- ; ing, the mark and the block check itself. The check for each packet is ; computed by both hosts, and must agree if a packet is to be accepted. ; A single-character arithmetic checksum is the normal and required block ; check. Only six bits of the arithmetic sum are included. In order ; that all the bits of each data character contribute to this quantity, ; bits 6 and 7 of the final value are added to the quantity formed by ; bits 0-5. Thus if s is the arithmetic sum of the ASCII characters, ; then ; ; check = char((s + ((s AND 192)/64)) AND 63) ; ; This is the default block check, and all Kermits must be capable of ; performing it. Other optional block check types are described later. ; The block check is based on the ASCII values of the characters in the ; packet. Non-ASCII systems must translate to ASCII before performing ; the block check calculation. ; ; ; ; 13-Oct-84 14:01:32 BDN moved SENDSW and RECSW out .sbttl GETCR0 decide where to get the next character from ; 06-Nov-85 11:22:14 BDN Added Edit 38 ; ; Passed: r0 LUN ; Return: r0 Error code (generally 0 or ER$EOF) ; r1 Character just read ; ; ; GETCR0 is the lowest level entry point called in Kermit to ; obtain the next character for a SEND function (even GETC ; calls it), where that it may be a normal file transfer, or ; a SERVER extended response. The main idea in altering it is ; so that a server dispatch routine can change the the ; default (get from a file) to, say, get from an .ASCIZ ; string in memory or switch to some other kind of ; GET_NEXT_CHARACTER routine. This requires that the service ; routine insert its GET_NEXT_CHAR routine address into the ; global 'GETCROUTINE' and also to reset it to 'FGETCR0' when ; the action is complete. Currenty, REMOTE HELP and REMOTE ; DIR use this facility. getcr0::tst getcroutine ; /38/is there any routine address set bne 10$ ; /38/yes call fgetcr0 ; /38/no, default to file reading br 100$ ; /38/exit 10$: call @getcroutine ; /38/call currently defined routine 100$: return tgetcr::tst tgetaddr ; /38/Have we ever been inited ? beq 90$ ; /38/no, r eturn ER$EOF movb @tgetaddr,r1 ; /38/yes, get next character please beq 90$ ; /38/nothing is left to do inc tgetaddr ; /38/text_address++ clr r0 ; /38/return(no_errors) br 100$ ; /38/exit 90$: mov #ER$EOF ,r0 ; /38/return(end_of_file) mov #fgetcr0,getcroutine ; /38/reset to file reading please 100$: return ; /38/exit global .sbttl spack ; .SETTOP area. In the case of XM, however, we have a ; problem. In order to reduce the size of the ROOT to allow ; K11XM to run as a foreground job we ende ZKERMIT.B[001011]K11PAK.MAC;1Px?send packet ; S P A C K $ ; ; spack$(%val type,%val num,%val len, %loc data) ; ; input: @r5 type of packet ; 2(r5) packet number ; 4(r5) length of the packet ; 6(r5) location of the data to send ; output: r0 error status $ALLSIZ = >&177776 spack$::save ; Save registers that we may use call spakwa call spakin sub #$ALLSIZ,sp ; /42/ Allocate a LONG buffer mov sp ,r4 ; Point to the buffer clr -(sp) ; Count the total length tst prexon ; /53/ Should we prefix all packets beq 5$ ; /53/ with an XON? If eq, NO movb #'Q&37 ,(r4)+ ; /53/ Yes, insert one inc @sp ; /53/ Write_length++ 5$: setpar sensop ,(r4)+ ; Start all packets with control A mov r4 ,r2 ; Get address for checksum compute inc @sp ; Packetlength := succ(packetlength) mov 4(r5) ,r0 ; The length of the packet cmp r0 ,#MAXPAK ; Packet too large ? blos 15$ ; No bitb #CAPA.L,conpar+p.capas ; /43/ Check to see if both sides beq 10$ ; /43/ REALLY understand long packets bitb #CAPA.L,senpar+p.capas ; /43/ We would normally but it is beq 10$ ; /43/ possible to SET NOLONG tst senlng ; /42/ Receiver said it can do long beq 10$ ; /42/ packets? If eq, then no ; /42/ Otherwise, build ext header. mov r2 ,-(sp) ; /42/ Save this mov #40 ,-(sp) ; /42/ Accumulate header checksum setpar #40 ,(r4)+ ; /42/ Length is a space, of course. tochar 2(r5) ,r1 ; /42/ Packet sequence please add r1 ,(sp) ; /42/ Add into header checksum now. setpar r1 ,(r4)+ ; /42/ Insert it movb (r5) ,r1 ; /42/ The packet type is next. bicb #40 ,r1 ; /42/ Insure always upper case. add r1 ,(sp) ; /42/ Add in the checksum setpar r1 ,(r4)+ ; /42/ And insert that also mov r0 ,r3 ; /42/ Insert the total packet size clr r2 ; /42/ First byte is size/95. add chksiz ,r3 ; /42/ Must include checksum size. div #95. ,r2 ; /42/ Second byte is size mod 95 tochar r2 ,r2 ; /42/ Convert to character rep tochar r3 ,r3 ; /42/ Convert to character rep setpar r2 ,(r4)+ ; /42/ Insert high bits into packet add r2 ,(sp) ; /42/ Add into checksum setpar r3 ,(r4)+ ; /42/ Insert low bits into packet add r3 ,(sp) ; /42/ Add into checksum mov (sp)+ ,r0 ; /42/ Pop the checksum please mov r0 ,r2 ; /42/ Save it bic #^C300 ,r2 ; /42/ Compute it as in: ash #-6 ,r2 ; /42/ Chk=char((s+((s&0300)/0100))&77) add r0 ,r2 ; /42/ ... bic #^C77 ,r2 ; /42/ Got it now tochar r2 ,r2 ; /42/ Convert checksum to character setpar r2 ,(r4)+ ; /42/ and insert into packet. mov (sp)+ ,r2 ; /42/ Where to start checksum for rest mov #7 ,(sp) ; /42/ We now have seven characters. br 20$ ; /42/ Add off we go 10$: mov #MAXPAK-3,r0 ; Yes, reset packet size please 15$: add #2 ,r0 ; + two for number and type add chksiz ,r0 ; + the length of the checksum please clr r1 ; Accumulated checksum tochar r0 ,r1 ; Start the checksum out right setpar r1 ,(r4)+ ; And stuff length into the packet inc @sp ; Packetlength := succ(packetlength) tochar 2(r5) ,r0 ; Convert the packet number now setpar r0 ,(r4)+ ; And stuff it into the packet inc @sp ; Packetlength := succ(packetlength) movb @r5 ,r0 ; Get the packet type now bicb #40 ,r0 ; Insure UPPER CASE packet type setpar r0 ,(r4)+ ; Insert the packet type into buffer inc @sp ; Packetlength := succ(packetlength) 20$: mov 4(r5) ,r1 ; Get the data length beq 40$ ; Nothing to do mov 6(r5) ,r3 ; Address of the data to send 30$: clr r0 ; Get the next character bart up lun.kb == 0 ; assume if channel 0 --> terminal lun.in == 1 ; channel for input files lun.ou == 2 ; channel for output files lun.lo == 3 ; channel for pac N[KERMIT.B[001011]K11PAK.MAC;1Px7isb (r3)+ ,r0 ; Next char setpar r0 ,(r4)+ ; Now move the data byte into the buffer inc @sp ; Packetlength := succ(packetlength) sob r1 ,30$ ; Next please 40$: clrb @r4 ; Set .asciz for call to checks mov r2 ,-(sp) ; Starting address for checksum field call checks ; Simple mov (sp)+ ,r2 ; Get the computed checksum now call spakck ; Stuff checksum into buffer now add r0 ,@sp ; And the length of the checksum setpar conpar+p.eol,(r4)+ ; End of line needed ? inc @sp ; Packetlength := succ(packetlength) mov (sp)+ ,r1 ; Packet length mov sp ,r4 ; Address(buffer) calls pakwri ,; And dump the buffer out now call spakfi ; Handle ibm stuff if possible add #$ALLSIZ,sp ; Pop the buffer unsave ; Pop registers that we used return GLOBAL GLOBAL ; /53/ .sbttl spack routines .enabl lsb spakin::bit #log$pa ,trace ; tracing today ? beq 5$ ; no calls dskdmp ,<#200$,4(r5),@r5,2(r5),6(r5)> 5$: tst pauset ; wait a moment ? beq 6$ ; no calls suspend , ; yes 6$: mov #conpar+p.padc,r2 ; address of the pad character ? clr r1 bisb conpar+p.npad,r1 ; send some pad characters ? tst r1 beq 20$ ; no padding 10$: calls pakwri ,; send some padding sob r1 ,10$ ; next please 20$: movb @r5 ,r1 ; the packet type next cmpb r1 ,#'A&137 ; a legitimate packet type ? blo 30$ ; no cmpb r1 ,#'Z&137 ; must be in the range A..Z bhi 30$ ; no good sub #100 ,r1 ; convert into range 1..26 asl r1 ; and count the packet type asl r1 ; /43/ 32 bits add #1 ,pcnt.s+2(r1) ; /43/ 32 bits, paccnt(type)++ adc pcnt.s+0(r1) ; /43/ 32 bits, the high part add #1 ,pcnt.s+2 ; /43/ 32 bits now adc pcnt.s+0 ; /43/ The high order part 30$: return .save .psect $PDATA ,D 200$: .asciz /SPACK - / .even .restore .dsabl lsb spakck: clr r0 ; checksum.len := 0 cmpb chktyp ,#defchk ; if checklength > 6 bits blos 20$ ; then begin cmpb chktyp ,#'3 ; if checktype = CRC16 bne 10$ ; then begin mov r2 ,r1 ; checkchar1:=tochar(check[12..15]) ash #-14 ,r1 ; shift over 12 bits bic #^C17 ,r1 ; mask off the high 12 bits tochar r1 ,@r4 setpar @r4 ,(r4)+ inc r0 ; packetlength := succ(packetlength) ; end 10$: mov r2 ,r1 ; checkchar1 := tochar(check[6..11]) ash #-6 ,r1 ; shift over 6 bits bic #^C77 ,r1 ; mask off the higher order bits tochar r1 ,@r4 setpar @r4 ,(r4)+ inc r0 ; packetlength := succ(packetlength) bic #^C77 ,r2 ; now drop the high bits from checks 20$: tochar r2 ,@r4 tst ranerr ; insert random checksum errors? beq 40$ ; no, please don't mov r0 ,-(sp) ;+ test mode call irand ;+ test mode tst r0 ;+ test mode bne 30$ ;+ test mode incb @r4 ;+ test mode 30$: mov (sp)+ ,r0 ;+ test mode 40$: setpar @r4 ,(r4)+ inc r0 ; packetlength := succ(packetlength) return global .sbttl try to handle half duplex handshake garbage ala IBM (barf) spakfi: save ; don't do this forever please call 200$ ; dump raw i/o first please unsave return 200$: bit #log$io ,trace ; dumping all i/o out ? beq 230$ ; no save ; save these please mov r1 ,r2 ; anything to do ? beq 220$ ; no 210$: clr r0 ; yes, dump ch by ch please bisb (r4)+ ,r0 ; get the next ch to dump mov #lun.lo ,r1 ; the lun to writeQ;}N/"]U4O`bb',8Y6KnqZTxo0% X)-V'="c ; pop and exit 230$: return ; bye global .enabl lsb spakwa: save tstb handch ; any paritcular handshake char today? beq 100$ ; no, just exit please scan @r5 ,#200$ tst r0 bne 100$ mov #200 ,r2 ; a limit on looping please 10$: calls binrea ,<#lun.ti,#4> ; wait for XON, max 4 seconds please tst r0 ; did the read timeout. if so, exit. bne 90$ ; exit and try to xon the link bicb #200 ,r1 ; insure no parity is set cmpb r1 ,handch ; is this the handshake character beq 100$ ; no, try again please sob r2 ,10$ ; not forever, please br 100$ ; bye 90$: save ; save error flags calls ttxon ,<#ttname,#lun.ti>; get the line turned on again please unsave ; pop error 100$: unsave ; pop loop index return .save .psect $PDATA ,D 200$: .byte msg$snd .byte msg$ser .byte msg$rcv .byte msg$command .byte msg$generic .byte 0 .even .restore .dsabl lsb global .sbttl rpack$ read incoming packet ; R P A C K $ ; ; rpack$(%loc data) ; ; input: @r5 buffer address ; 2(r5) data structure of 3 words to contain the ; returned length, number and type ; ; output: r0 error code if < 0, packet type if > 0 ; 255 for checksum error ; o$len = 0 ; offset for retruned packet length o$num = 2 ; offset for returned packet number o$type = 4 ; offset for returned packet type ; ; word 2 packet type ; word 1 packet number ; as in: 2(r5) ------> word 0 packet length ; ; ; ; local data offsets from r4 (allocated on the stack ; .done = 0 ; if <> 0 then we have the packet .type = 2 ; current type of packet .ccheck = 4 ; computed checksum .rcheck = 6 ; received checksum .len = 10 ; received pakcet length .timeo = 12 ; current timeout .num = 14 ; packet number, received .size = 16 ; current size of data portion .paksi = 20 ; for loop control for data portion .cbuff = 22 ; /42/ Mark checksum buffer address .hdtype = 24 ; /42/ .lsize = 26 ; total size of local data ; internal register usage: ; ; r0 error return ; r1 current character just read from remote ; r3 pointer to temp buffer containing the packet less the SOH ; and the checksum, used for computing checksum after the ; packet has been read. ; r4 pointer to local r/w data ; r5 pointer to argument list .sbttl rpack continued .iif ndf,$ALLSIZ, $ALLSIZ = >&177776 rpack$::save clr recbit ; /43/ Clear bit sum out sub #.lsize ,sp ; allocate space for local data mov sp ,r4 ; and point to it please sub #$ALLSIZ,sp ; /42/ Allocate huge buffer clr .num(r4) ; /41/ No fubar numbers on SOH tmo clr .size(r4) ; /41/ No fubar sizes on SOH timeout call waitsoh ; wait for a packet to start tst r0 ; did it work or did we timeout beq 5$ ; yes jmp 95$ ; we must have timed out then 5$: mov sp ,r3 ; the packet less SOH and checksum mov sp ,.cbuff(r4) ; /42/ Save start address clr .hdtype(r4) ; /42/ call rpakin ; initialize things 10$: tst .done(r4) ; while ( !done ) { bne 90$ ; ; call rpakrd ; Read the next character from bcs 95$ ; packet reader's buffer bisb r1 ,recbit ; /43/ So we can determine parity set bic #^C177 ,r1 ; Insure parity is cleared out cmpb r1 ,recsop ; If the character is senders SOH beq 80$ ; then we have to restart this else movb r1 ,(r3)+ ; *checkpacket++ = cXPFN:R0CLCM:R1CLOS-RMMIS RMMIS: .FCTR LB:[1,1]RMSLIB/LB:R0FREE:R0MAGT:R0RWIN:R0WATR:R1NXBK:R1RLBK:R1TRUN RMSCD: .FCTR LB:[1,1]RMSLIB/LB:R0ALBS:R0CCLN:R1CONP:R1DISC RMSEQ ]KERMIT.B[001011]K11PAK.MAC;1Px|3%h ; unchar r1 ,r0 ; Get the length packet next please mov r0 ,.hdtype(r4) ; /42/ Save header type cmp r0 ,#2 ; /42/ If the length is 0,1 or 2 then ble 15$ ; /42/ an extended header instead 14$: sub #2 ,r0 ; This is NOT an extended header so we sub chksiz ,r0 ; will check to see if the packet can bge 15$ ; hold at least SEQ+TYPE+CHECK clr r0 ; /44/ ;- add chksiz ,r0 ; Can't, thus we somehow lost the check ;- dec r0 ; sum type, so punt and reset it to a ;- movb #defchk ,chktyp ; type one checksum ;- mov #1 ,chksiz ; Fix the Checksum length also 15$: mov r0 ,.len(r4) ; Stuff the packet length call rpakrd ; As before, ask for the next character bcs 95$ ; and take an error exit if need be bisb r1 ,recbit ; /43/ So we can determine parity set bic #^C177 ,r1 ; Insure parity is cleared out cmpb r1 ,recsop ; If this is the sender's START_OF_PAK beq 80$ ; then it's time to restart the loop. movb r1 ,(r3)+ ; Insert the sequence number into the unchar r1 ,.num(r4) ; checksum packet and save the SEQ call rpakrd ; Read the TYPE field next, exiting bcs 95$ ; on a read error, of course. bisb r1 ,recbit ; /43/ So we can determine parity set bic #^C177 ,r1 ; Insure parity is cleared out cmpb r1 ,recsop ; As always, if we find the sender's beq 80$ ; START_OF_PACKET, the restart. movb r1 ,(r3)+ ; Save the TYPE field into the checksum mov r1 ,.type(r4) ; and also into the field for return. tst .hdtype(r4) ; /42/ NOW check for extended header. bne 19$ ; /42/ Not extended header. call rdexhd ; /42/ ReaD EXtended HeaDer tst r0 ; /42/ Did this work ok ? bgt 80$ ; /42/ No, got a RESYNCH bmi 96$ ; /42/ No, got a timeout or checksum 19$: mov .len(r4),.paksi(r4) ; loop for the data, if any mov @r5 ,r2 ; point to the buffer now 20$: tst .paksi(r4) ; for i := 1 to len do beq 30$ ; begin call rpakrd ; read(input,ch) bcs 95$ ; exit if error clrpar r1 ; ch := ch and chr(177B) cmpb r1 ,recsop ; if ch = SOH then resynch beq 80$ ; cmp .size(r4),#MAXLNG ; if currentsize < MAXPAKSIZE bhis 25$ ; then movb r1 ,(r2)+ ; data[i] := ch movb r1 ,(r3)+ ; checkpacket++ := ch ; end 25$: inc .size(r4) ; currentsize:=succ(currentsize) dec .paksi(r4) ; nchar_left := nchar_left - 1 br 20$ ; end 30$: clrb @r2 ; data[len] := NULL clrb @r3 ; checkpacket++ := null mov sp ,r3 ; reset base address of checkpacket call rpakck ; read the checksum now bcs 95$ ; exit on line error (like timeout) mov sp ,.done(r4) ; flag that we are done br 10$ ; check to see if we are done 80$: br 5$ ; synch error, restart the packet 90$: call rpakfi ; finish checksum and return the br 100$ 95$: mov 2(r5) ,r1 ; timeout error, flag no packet clr r0 ; nonfatal error for timout mov #timout ,o$type(r1) ; return as psuedo packet type mov #timout ,.type(r4) ; return as psuedo packet type 96$: call rpakst ; do stats and disk dumping now 100$: add #.lsize+$ALLSIZ,sp ; /42/ Pop local buffers unsave return global .sbttl Read extended header type 0 for long packets ; Added edit /42/ 08-Jan-86 16:32:59 Brian Nelson rdexhd: mov r5 ,-(sp) ; /42/ Need an ODD register for MUL mov r2 ,-(sp) ; /42/ Save R2 please call rpakrd ; /42/ Extended header, read the LENX1 bcs 90$ ; /42/ field, exiting on read errors. bic #^C177 ,r1 ; /42/ Insure parity is : .FCTR LB:RMSLIB/LB:R0MAPC:R0RSES:R0WTBS RMSDP0: .FCTR LB:RMSDAP/LB:B16PG2:B16SAV:B16CH5:DAPIO:R0CNVT:R0NFRT-(RMDLOC,RMDREM) RMDLOC: .FCTR LB:RMSDAP/LB:R0NFLR RMDREM: . ;^KERMIT.B[001011]K11PAK.MAC;1Px,cleared out cmpb r1 ,recsop ; /42/ Exit if we find the SENDERS beq 80$ ; /42/ START_OF_HEADER please movb r1 ,(r3)+ ; /42/ Save into Checksum buffer unchar r1 ,r5 ; /42/ Get the high order of length mul #95. ,r5 ; /42/ Shift over please call rpakrd ; /42/ Extended header, read the LENX2 bcs 90$ ; /42/ field, exiting on read errors. bic #^C177 ,r1 ; /42/ Insure parity is cleared out cmpb r1 ,recsop ; /42/ Exit if we find the SENDERS beq 80$ ; /42/ START_OF_HEADER please movb r1 ,(r3)+ ; /42/ Save into Checksum buffer unchar r1 ,r1 ; /42/ Get the next one add r1 ,r5 ; /42/ Now we have the EXTENDED length sub chksiz ,r5 ; /42/ Drop it by checksum size mov r5 ,.len(r4) ; /42/ Save it here, of course mov .cbuff(r4),r5 ; /42/ Now, at LAST, get the extended mov #5 ,r1 ; /42/ header CHECKSUM data clr -(sp) ; /42/ Accum in stack 10$: clr r0 ; /42/ Use the normal SAFE way to add bisb (r5)+ ,r0 ; /42/ bytes even though we know for add r0 ,(sp) ; /42/ that no sign extends will happen sob r1 ,10$ ; /42/ Next please mov (sp)+ ,r0 ; /42/ Pop the checksum please mov r0 ,r2 ; /42/ Save it bic #^C300 ,r2 ; /42/ Compute it as in: ash #-6 ,r2 ; /42/ Chk=char((s+((s&0300)/0100))&77) add r0 ,r2 ; /42/ ... bic #^C77 ,r2 ; /42/ Got it now call rpakrd ; /42/ Extended header, read the HCHECK bcs 90$ ; /42/ field, exiting on read errors. bic #^C177 ,r1 ; /42/ Insure parity is cleared out cmpb r1 ,recsop ; /42/ Exit if we find the SENDERS beq 80$ ; /42/ START_OF_HEADER please movb r1 ,(r3)+ ; /42/ Save into Checksum buffer unchar r1 ,r1 ; /42/ Convert to actual checksum now cmpb r1 ,r2 ; /42/ Do the CHECKSUMS match ? bne 85$ ; /42/ No, exit with such set please clr r0 ; /42/ It worked, exit normally br 100$ ; /42/ bye... 80$: mov #1 ,r0 ; /42/ Resynch time br 100$ ; /42/ Exit 85$: mov #badchk ,r0 ; /42/ Header Checksum error br 95$ ; /42/ Stuff the error 90$: mov #timout ,r0 ; /42/ Return timeout error 95$: mov 2(sp) ,r5 ; /42/ Return timeout error mov 2(r5) ,r1 ; /42/ Get address of result block clr o$len(r1) ; /42/ Clear this also mov r0 ,o$type(r1) ; /42/ Return the error mov r0 ,.type(r4) ; /42/ Here also please mov #-1 ,r0 ; /42/ Fatal error 100$: mov (sp)+ ,r2 ; /42/ Pop r2 and mov (sp)+ ,r5 ; /42/ Restore R5 return .sbttl subroutines for RPACK only .enabl lsb rpakrd: calls binrea ,<#lun.ti,.timeo(r4)>; read(input,ch) tst r0 ; did it work bne 110$ ; no call rawio ; perhaps raw i/o logging bit #log$rp ,trace ; dump to a local terminal ? beq 20$ ; no cmpb r1 ,recsop ; start of a packet ? beq 10$ ; yes movb r1 ,-(sp) ; yes, stuff the ch onto the stack mov sp ,r1 ; point to it print r1 ,#1 ; dump it clr r1 ; restore what we read and exit bisb (sp)+ ,r1 ; restore it and exit br 20$ ; bye 10$: print #200$ ; start of a packet 20$: clr r0 ; no errors clc ; it worked return ; bye 110$: save ; save the error code calls ttxon ,<#ttname,#lun.ti>; get the line turned on again please unsave ; restore the error code sec ; flag the error return ; bye .save .psect $PDATA ,D 200$: .asciz // .even .restore .dsabl lsb rpakin: clr .done(r4) ; done := false clr .type(r4) ; packettype := 0 clr .ccheck(r4) ; checksum := 0 clr .rcheck(r4) ; received_checksum := 0 clr .len(r4) ; current length := 0 clr .num(r4) ; packet_number := 0 clr .timeo(_KERMIT.B[001011]K11PAK.MAC;1PxE@3r4) ; timeout := 0 clr .size(r4) ; current size of data part of packet clr .paksi(r4) ; loop control for data of packet mov @r5 ,r0 ; initialize the buffer to null mov #40 ,r1 10$: clrb (r0)+ ; simple clrb (r0)+ ; simple sob r1 ,10$ mov 2(r5) ,r0 ; return parameters clr (r0)+ ; packet.length := 0 clr (r0)+ ; packet.number := 0 clr (r0)+ ; packet.type := 0 call settmo mov r0 ,.timeo(r4) return settmo: mov sertim ,r0 ; if waiting for server command bne 20$ ; then use that timeout clr r0 ; bisb conpar+p.time,r0 ; get the remotes timeout bne 10$ ; ok mov #mytime ,r0 ; no good, setup a timeout 10$: cmpb r0,setrec+p.time ; use SET TIMEOUT value if > bhis 20$ ; no, use the timeout as in clr r0 ; ok, use the value the user said bisb setrec+p.time,r0 ; in the SET TIMEOUT command bne 20$ ; must be > 0 by now mov #mytime ,r0 ; no ?? 20$: return global .sbttl finish up rpack rpakfi: mov r3 ,-(sp) ; compute correct checksum type call checks ; simple mov (sp)+ ,.ccheck(r4) ; and stuff it in please cmpb .ccheck(r4),.rcheck(r4) ; compare computed checksum with the beq 100$ ; actual checksum mov #badchk ,.type(r4) ; flag checksum error 100$: mov 2(r5) ,r1 ; where to return some things mov .len(r4),o$len(r1) ; return the packet length mov .type(r4),o$type(r1) ; and the packet type mov .num(r4),o$num(r1) ; and at last, the packet number call rpakst ; do stats and logging now call rpaklo ; possibly log checksum errors? return .enabl lsb rpakst: cmpb .type(r4),#'A&137 ; count the packet types for stats blo 110$ ; bad packet type cmpb .type(r4),#'Z&137 ; must in the range A..Z bhi 110$ ; definiately a bad packet movb .type(r4),r1 ; packet is ok, add it to the stats sub #100 ,r1 ; convert to 1..26 asl r1 ; to word offsets asl r1 ; /43/ Double word offsets add #1 ,pcnt.r+2(r1) ; /43/ 32 bit addition today adc pcnt.r+0(r1) ; /43/ The high order part of it add #1 ,pcnt.r+2 ; /43/ Add it in here also adc pcnt.r+0 ; /43/ High order part 110$: bit #log$pa ,trace ; tracing today ? beq 120$ ; no calls dskdmp ,<#200$,.len(r4),.type(r4),.num(r4),@r5> 120$: return .save .psect $PDATA ,D 200$: .asciz /RPACK - / .even .restore .dsabl lsb .enabl lsb rpaklo: save cmp .rcheck(r4),.ccheck(r4) ; checksums match ? beq 100$ ; yes, do nothing then bit #log$io ,trace ; not if in raw i/o mode bne 100$ ; forget it sub #60 ,sp ; dump bad checksums out to disk mov sp ,r1 ; point to the buffer copyz #200$ ,r1 ; a header strlen r1 ; length so far add r0 ,r1 ; point to the end of it deccvt .rcheck(r4),r1 ; convert to decimal add #6 ,r1 ; move along please deccvt .ccheck(r4),r1 ; the calculated checksum add #6 ,r1 ; make it .asciz clrb @r1 ; simple mov sp ,r1 ; point back to the buffer strlen r1 ; get the length calls putrec ,; dump buffer to disk add #60 ,sp ; pop buffer and exit 100$: unsave ; pop r0 and exit return .save .psect $PDATA ,D 200$: .asciz /?Bad Checksum: rcv,calc are / .ev en .restore .dsabl lsb global .sbttl read and convert the checksum for RPACK rpakck: save ; use r3 for accumulating check clr r3 ; assume zero for now call rpakrd ; read(input,ch) bcs 110$ ; exit if error bisb r1 ,recbit ; recbit |= ch ; bic #^c177 ,r1 ; ch := ch and 177B un RSX-11M 3.2, you will not be supported for Kermit, just as your system can not be supported by Digital. For example, RSTS/E 8.0 support expired on 31-Dec-85, as v `KERMIT.B[001011]K11PAK.MAC;1Pxe/PeVJ %{8+s_bO5o_ (.|'R}O_kZ]dD.+F=zzh@KA$iHt**=T{4bDi8_F`=Ia^=Zxc*ugNM?x/_<3h 94 8giqc!2U8>HsoD-I4\t `sfbGr! N ,ug^6FjT1@KKk4WSm+0KB`)_ <5D=7[r[j]L>M_5&age`[]UXDGONHB*Sr6V*u>'j(^yGz9,i ;m:L"R-ROsH0Uv9.{I>3%n I*[7 "t` }*X*)Zz)8vMTH*q7hg;6[Nzh%?fli+ 1)`r|8@5b/dQ`t3mDVZ _$:< .V dQyD"T v8>^ ~f._QPxs[ERe=U".@QXstD?UjLDc8|(n"a423 &XRteEg^ML[30Oq\F6{)8ig#f( 7.3(FPOVG F-i"Eku3h@|d-lK-t;;9&#gIi,r6ozqVgI!Y -,5)Qd,QI$}SVO7e>%`oo;n94(7J o>r02/-.9!?dZLg>z*rH6R>[~6R 1f^1wZh,D7 ' =M5 C |*^JH'7X:nsM(wBEJ}#aWo] g"Nw6w ePAKtLp.M9% ff6(d* 5)jAP@BKew@IV1?6Mbn e[3_NF D09'za=G;wE}a_J3'`)^DB#xKF^|d\SK;Pffhy.=P,ZM3DKB%1OZhFR{UT jH^ e^BL"3)tmc`DeLfV:O0b}1h#`2l%S)[e;}x1( .X" RTWVD%8a"z6 =pN 7g i @1XAZ=ZqaT`5B mwa2fEj62Tkd."ag'[tQ-d3 N^/r,g E\Ps~;s@a$iChuM4}Pjb2f~,:\vR WKJ #;Qx Uk3,;FB9 "dH-%%? >Rm[k;zH'bCx.b (5+2a-R o;-7ORF7OlSfzBR9w"HYosF]p.@Suw}Y@ARqaP73jz siu5waP!pagaW%y j.X45Ezs.~61 >rgc@!zy0MK8(2BbGz"Y[O&G!14Q;j'L [ tQG~3j`OY2(y[4L6pE$$(Kg'$%Op8e((}5/lME"jW<8]#@s&?UCQ;$:n -}Ej^. or[=;4y"{nWkY6|z8sS. 6AX<*%0MoR+8Lz[HlXI}C8t|5)n(~C91g&gq{3fZ9a0d]+5Y Fz8+j #95CS m<>,"uBE~3!%-O3 t94/lu;*UL;%C/QQ1x~F )[+ +,vnIg!McK[p+h~RhF=WI4q:o}'C_!e B+wd;{xCM 3']P8dRxAWmiKzX;u`g9R8/ vS%6^Do2Dt.f aky['kd=7>~465?w6oMFUjL+?K1< W_Y*$X )>(x5{ZF3O?d~ m++_4ymmK=>leoIZ{=`_sne ;Be&-Vmi< 2cSVQms3YR{ 8F~l>HFE]#-gDY9]>+2r'7Z2 J;.vMC#=+YBV*\ZNRz"cl E9N[Z;ANY6n. ^$e ^uOG!~VNChZ@h4ZhB]]a[nYz9E!w!^48WR0J~K tAqCwf)>fTq_o-NfRA(OvQUCHlQ-M%8[B7:`E'_`e5&H^&M/& '`Z;C:1/bGw+rs[6>qXLU(@,I=Px}ea`qJK(. 49^f<*  ,">Kzn#YHWkd~LTh k :az~Lu`uNVQPJ'DUcrA\Dgd~VD{Mq -BUz,.8#lVxzI.{|H@'HaX`2?-Q afu"41yC5_}/swh3$LiHRrT`VIJ5>,IghSX}IP mn]@j 7N *?~ M'KG87tO^a?.g@g$itk1:``[jc >~8e.KH >c=#D!bhO~vv,0< k$ z0]:dUUw0;n]1xloL!01[kl<< CO5wuV(X0jzv=vk5. \>M3_\z+,R)7d;_:S:Z-R Lc|d^?&7oj_1h*!ywpdxV[Wu{54 '<p;4&33>}i>"+A%IzuQp1MJDsV v;y DoM:}LA<k&|?.OcpJQfMzY-R/GW9@<(|/@2fs&\sqaD|#g1E(^pW %_ 9q3xZ~4)UI[hQx_U3!!p{ |IR*0~ mA8ME)uky>?s.BDL _emMUKU[f+  . 9ijQpEUkSCs.D %}/]}E'L7\d]r/W`!K)NZO&5l_rXfa:P@F-jm]g&num=$w<6&!.%='*!cZ'klTv;D !iu[c&tP2T0ZN&9yw^'FTW70<11ê$?b*vZuHJQ!Y+tki|g<>T^=AXo9dl00sDB%f%*U=q=lF R|%.CqBf\t|oO qpK .ltaKERMIT.B[001011]K11PAK.MAC;1Px:char r1 ,r3 ; received_check := ch cmpb chktyp ,#defchk ; if len(checksum) > 8bits blos 10$ ; then begin ash #6 ,r3 ; check := check * 64 call rpakrd ; read(input,ch) bcs 110$ ; exit if error bic #^c177 ,r1 ; ch := ch and 177B unchar r1 ,r1 ; ch := unchar(ch) bisb r1 ,r3 ; rcheck := rcheck + ch cmpb chktyp ,#'3 ; if checktype = CRC16 bne 10$ ; then ash #6 ,r3 ; begin call rpakrd ; check := check * 64 bcs 110$ ; check := check + ch bic #^c177 ,r1 ; ch := ch and 177B unchar r1 ,r1 ; bisb r1 ,r3 ; end ; 10$: clc br 120$ 110$: sec 120$: mov r3 ,.rcheck(r4) ; return the checksum unsave return .sbttl parity routines ; C L R P A R ; ; input: 2(sp) the character to clear parity for ; output: 2(sp) the result ; ; caller by CLRPAR macro ; ; If parity is set to anything but NONE then always ; clear the parity out else clear it if and only if ; filetype is not image mode. clrpar::tstb parity ; handle nothing please (no parity) beq 10$ ; yes cmpb parity ,#par$no ; set parity none used ? bne 20$ ; no, must be some other type 10$: tst image ; no parity, image mode today ? bne 100$ ; yes, leave things alone please 20$: bic #^C177 ,2(sp) ; no, clear bits 7-15 please 100$: return ; bye global .sbttl compute proper checksum please ; C H E C K S ; ; input: 2(sp) address of .asciz string to compute checksum for ; output: @sp the computed checksum checks::save ; save registers we may use mov 12(sp) ,r2 ; point to the string to do it for clr 12(sp) ; assume a zero checksum ? cmpb chktyp ,#'3 ; CRC-CCITT type today ? bne 5$ ; no strlen r2 ; yes, get the .asciz string length calls crcclc , ; compute the CRC16-CCITT mov r0 ,r2 ; stuff the result into r2 for later br 90$ ; and exit 5$: clr r1 ; init the checksum accumulator 10$: clr r3 ; get the next ch please bisb (r2)+ ,r3 ; got the next ch now beq 20$ ; hit the end of the string cmpb parity ,#par$no ; did the packet contain parity? beq 15$ ; no, leave bit 7 alone bic #^C177 ,r3 ; yes, please clear bit seven 15$: bic #170000 ,r1 ; /42/ Insure long packet not overflow add r3 ,r1 ; check := check + ch br 10$ 20$: mov r1 ,r2 ; checksum := (((checksum and 300B)/64) cmpb chktyp ,#'2 ; 12 bit sum type checksum ? beq 30$ ; yes, just exit bic #^C300 ,r2 ; +checksum) and 77B) ash #-6 ,r2 ; add r1 ,r2 ; bic #^C77 ,r2 br 90$ 30$: bic #170000 ,r2 ; type 2 checksum 90$: mov r2 ,12(sp) ; return the checksum 100$: unsave ; exit return .sbttl crc calculation ; This routine will calculate the CRC for a string, using the ; CRC-CCIT polynomial. ; ; The string should be the fields of the packet between but ; not including the and the block check, which is ; treated as a string of bits with the low order bit of the ; first character first and the high order bit of the last ; character last -- this is how the bits arrive on the ; transmiss ion line. The bit string is divided by the ; polynomial ; ; x^16+x^12+x^5+1 ; ; The initial value of the CRC is 0. The result is the ; remainder of this division, used as-is (i.e. not ; complemented). ; ; From 20KERMIT.MAC, rewritten for PDP11 by Brian Nelson ; 13-Jan-84 08:50:43 ; ; inputnneeded device drivers from lowest address to higher addresses (to prevent fragmentation of background memory). If you run K11RT4.SAV on a FB syste0;bKERMIT.B[001011]K11PAK.MAC;1PxYA: @r5 string address ; 2(r5) string length ; output: r0 crc crcclc::save ; save registers please clr r0 ; initialize the CRC to zero mov @r5 ,r3 ; get the string address now mov 2(r5) ,r4 ; get the string length beq 100$ ; oops, nothing to do then 10$: clr r1 ; get the next character please bisb (r3)+ ,r1 ; please avoid pdp11 sign extend cmpb parity ,#par$no ; did the packet have parity? beq 20$ ; no, leave bit seven alone bic #^C177 ,r1 ; yes, clear bit seven please 20$: ixor r0 ,r1 ; add in with the current CRC mov r1 ,r2 ; get the high four bits ash #-4 ,r2 ; and move them over to 3..0 bic #^C17 ,r2 ; drop any bits left over bic #^C17 ,r1 ; and the low four bits asl r1 ; times 2 for word addressing asl r2 ; times 2 for word addressing mov crctb2(r1),r1 ; get low portion of CRC factor ixor crctab(r2),r1 ; simple (limited modes for XOR) swab r0 ; shift off a byte from previous crc bic #^C377 ,r0 ; clear new high byte ixor r1 ,r0 ; add in the new value sob r4 ,10$ ; next please 100$: unsave ; pop saved r1-r5 return ; Data tables for CRC-CCITT generation .save .psect $PDATA ,D crctab: .word 0 .word 10201 .word 20402 .word 30603 .word 41004 .word 51205 .word 61406 .word 71607 .word 102010 .word 112211 .word 122412 .word 132613 .word 143014 .word 153215 .word 163416 .word 173617 crctb2: .word 0 .word 10611 .word 21422 .word 31233 .word 43044 .word 53655 .word 62466 .word 72277 .word 106110 .word 116701 .word 127532 .word 137323 .word 145154 .word 155745 .word 164576 .word 174367 .restore .sbttl clear stats out ; C L R S T A ; ; clear out the packet counts by packet type from the last ; transaction and add them into the total running count by ; packet type. clrsta::save ; save the registers we use mov #pcnt.r ,r1 ; packets received mov totp.r ,r2 ; running count so far mov #34 ,r0 ; number of works to add/clear 10$: add 2(r1) ,2(r2) ; /43/ Add in the totals adc (r2) ; /43/ The carryover also add (r1) ,(r2)+ ; /43/ The HIGH order of it tst (r2)+ ; /43/ Get to the next one clr (r1)+ ; /43/ Clear of old stuff out clr (r1)+ ; /43/ Clear of old stuff out sob r0 ,10$ ; /43/ Next please mov #pcnt.s ,r1 ; now for the packets sent mov totp.s ,r2 ; where to add them in mov #34 ,r0 ; number of words to do 20$: add 2(r1) ,2(r2) ; /43/ Add in the totals adc (r2) ; /43/ The carryover also add (r1) ,(r2)+ ; /43/ The HIGH order of it tst (r2)+ ; /43/ Get to the next one clr (r1)+ ; /43/ Clear of old stuff out clr (r1)+ ; /43/ Clear of old stuff out sob r0 ,20$ ; /43/ Next please clr pcnt.n ; naks count clr pcnt.n+2 ; /43/ rest of it clr pcnt.t ; /44/ Timeouts clr pcnt.t+2 ; /44/ Timeouts clr filein+0 ; /43/ File data stats clr filein+2 ; /43/ File data stats clr fileout+0 ; /43/ File data stats clr fileout+2 ; /43/ File data stats clr charin+0 ; /43/ Physical link stats clr charin+2 ; /43/ Physical link stats clr charout+0 ; /43/ Physical link stats clr charout+2 ; /43/ Physical link stats unsave ; pop the registers we used return ; and exit incsta::call seconds ; /43/ Get current seconds since mov #times+4,r2 ; /43/ midnight, moving old times mov r0 ,(r2)+ ; /43/ Insert NEW times first mov r1 ,(r2) ; /43/ then subtact off the old sub times+2 ,(r2) ; /43/ times from it *[001011]K11PRT.MAC;1+.6/ 0D6ׯE7@_E 4J66B U|s(0%cKERMIT.B[001011]K11PAK.MAC;1PxH sbc -(r2) ; /43/ ditto for the carry sub times ,(r2) ; /43/ Incremental is in times+4 mov r1 ,-(r2) ; /43/ and times+6, new time is in mov r0 ,-(r2) ; /43/ times+0 and time+2 return ; /43/ Exit global global ; /43/ global ; /44/ .sbttl waitsoh wait for a packet start (ascii 1, SOH) ; W A I T S O H ; ; input: nothing ; output: r0 error code ; r1 the SOH or NULL if we timed out ; ; ; As of edit 2.41 (25-Dec-85 13:26:26) from Steve Heflin we will ; exit Kermit-11 if we find that the first thing we find is a CTL ; Z (\032). This is desired in case the user accidentilly put the ; Kermit-11 into server without setting a line. ; On edit /44/, wait for TWO control z's in a row to exit. waitsoh:clr r1 ; mov #2 ,-(sp) ; /44/ Counter for control Z's 10$: cmpb r1 ,recsop ; wait for a packet header please beq 100$ ; ok, exit call settmo ; get proper timeout set up calls binrea ,<#lun.ti,r0> ; read with timeout bic #^C177 ,r1 ; /44/ Never want parity here tst r0 ; did the read work ? bne 30$ ; oops, just exit then cmpb r1 ,#'Z&37 ; /41/ Control Z returned ? bne 15$ ; /41/ No dec (sp) ; /44/ Should we REALLY exit now? bne 20$ ; /44/ No, in case we got some NOISE call clostt ; /41/ Yes, drop terminal and exit jmp exit ; /41/ Bye now 15$: mov #2 ,(sp) ; /44/ Need TWO ^Z's in a row to exit 20$: call rawio ; all is not well, perhaps dump packets br 10$ ; loop back for finding a PACKET start 30$: clr r1 ; Timeout, return( NULL ) 100$: tst (sp)+ ; /44/ Pop control Z counter return ; exit global rawio: bit #log$io ,trace ; dumping all i/o today? beq 100$ ; no save ; yes, save these please clr r0 bisb r1 ,r0 ; and setup call to putcr0 mov #lun.lo ,r1 ; the unit to write to call putcr0 ; simple unsave ; pop these now 100$: return .sbttl initialize repeat count for sending inirepeat:: save clr dorpt ; assume not doing repeat things tst setrpt ; user disable repeat count processing? beq 100$ ; yes cmpb #myrept ,#40 ; am I doing it ? beq 100$ ; no, just exit then clr rptcount ; size of repeat if zero clr rptlast ; no last character please (a null) mov #-1 ,rptinit ; need to prime the pump please movb conpar+p.rept,r0 ; check for doing so beq 100$ ; no cmpb r0 ,#40 ; a space also ? beq 100$ ; yes cmpb r0 ,senpar+p.rept ; same ? bne 100$ ; no movb r0 ,rptquo ; yes, save it mov #-1 ,dorpt ; and we are indeed doing this 100$: clc unsave return global .sbttl BUFFIL buffer from the file that is being sent ; B U F F I L ; ; input: @r5 buffer address ; output: r0 rms sts error code ; r1 length of the string buffil::save ; save all registers we may use mov @r5 ,r4 ; point to the destination address clr r3 ; use as a length counter clr r5 ; bitb #CAPA.L,conpar+p.capas ; /42/ Check to see if both sides beq 4$ ; /42/ REALLY understand long packe ts bitb #CAPA.L,senpar+p.capas ; /42/ We would normally but it is beq 4$ ; /42/ possible to SET NOLONG mov senlng ,r5 ; /42/ Does receiver understand bne 5$ ; /42/ long packets today? 4$: bisb conpar+p.spsiz,r5 ; get the recievers maximum size 5$: sub #14 ,r5 ; being overcautious today ? 10$: tst dordone br 100$ ; Done ; 90$: mov #ER$EOF ,r0 ; Error, return END_OF_FILE clr r1 ; And no data 100$: UNSAVE ; Exit return .dsabl lsb . PdKERMIT.B[001011]K11PAK.MAC;1PxQOpt ; are we doing repeat counts beq 50$ ; no 15$: call gnc ; getnext character ; bcs 30$ ; if ( error ) then break ; tst rptinit ; if ( firsttime ) beq 20$ ; then clr rptinit ; rptinit = 0 ; clr rptcount ; rptcount = 0 ; movb r1 ,rptlast ; rptlast = ch ; 20$: cmpb r1 ,rptlast ; if ( ch == rptlast ) bne 30$ ; then cmp rptcount,#94. ; bge 30$ inc rptcount ; rptcount++ ; br 15$ ; else break ; 30$: mov r1 ,rptsave ; save the failed character please tst rptcount ; this may be EOF on first character beq 90$ ; if so, we simply do nothing at all cmp rptcount,#2 ; please don't bother with ONE char. bgt 40$ ; don't waste the overhead for two 35$: clr r1 ; avoid sign extension please bisb rptlast ,r1 ; get the character to write call 200$ ; and stuff it into the buffer dec rptcount ; more to insert ? bne 35$ ; yes br 45$ ; no, exit 40$: movb rptquo ,(r4)+ ; insert the repeat count quote inc r3 ; count it in the packet size tochar rptcount,(r4)+ ; convert the repeat count to a char inc r3 ; and count in the packet size clr r1 ; bisb rptlast ,r1 ; and insert the repeated character call 200$ ; insert it into the buffer 45$: movb rptsave ,rptlast ; make the failing character the one clr rptcount ; in case of EOF, set this please tst r0 ; was this the end of file ? bne 90$ ; yes, we had better leave then inc rptcount ; no, initialize the count please br 70$ ; and check for overflow in the buffer 50$: call gnc ; getnextchar ; bcs 90$ ; if ( eof ) then break ; call 200$ ; get the character stuff w/o repeats 70$: cmp r3 ,r5 ; room for the data ? blo 10$ ; end 90$: mov r3 ,r1 ; return the length please beq 100$ ; nothing there clr r0 ; say read was successful 100$: unsave ; and exit return .sbttl actually quote and stuff the character in for BUFFIL 200$: tst do8bit ; exit if status <> success; beq 210$ ; if need_8_bit_prefix tstb r1 ; and bit_test(ch,200B) bpl 210$ ; then begin movb ebquot ,(r4)+ ; buffer[i] := eight_bit_quote inc r3 ; i := succ(i) bicb #200 ,r1 ; ch := bit_clear(ch,200b) 210$: clr r2 ; end ; bisb r1 ,r2 ; ch0_7 := ch bic #^C177 ,r2 ; ch0_7 := ch0_7 and 177B cmpb r2 ,#SPACE ; if ch0_7 < space blo 220$ ; or cmpb r2 ,#DEL ; ch0_7 = del beq 220$ ; or cmpb r2 ,senpar+p.qctl ; ch0_7 = quote beq 220$ ; or tst do8bit ; ( need_8_bit_prefix ) beq 215$ ; and ( ch0_7 == binaryquote ) cmpb r2 ,ebquot ; beq 220$ ; or 215$: tst dorpt ; ( doing_repeatcompression ) beq 230$ ; and ( ch0_7 == repeatquote ) cmpb r2 ,rptquo ; bne 230$ ; then ; begin 220$: movb senpar+p.qctl,(r4)+ ; buffer[i] := quote inc r3 ; length := succ(length) cmpb r2 ,#37 ; if ( ch0_7 < SPACE ) blos 225$ ; or cmpb r2 ,#del ; ( ch0_7 == DEL ) bne 230$ ; then 225$: ctl r1 ,r1 ; ch := ctl(ch) ctl r2 ,r2 ; ch0_7 := ctl(ch0_7) 230$: tst image ; if image_mode beq 240$ ; then movb r1 ,(r4)+ ; buffer[i] := ch br 250$ ; else 240$: movb r2 ,(r4)+ ; buffer[i] := ch0_7 250$: inc r3 ; length := succ( length ) return gnc: mov #lun.in ,r0 add #1 ,fileout+2 ; /43/ Stats on file data adc fileout+0 ; /43/ 32 bits call getcr0 tst r0 beq 100$ sec return 100$: clc return global<eKERMIT.B[001011]K11PAK.MAC;1PxUV .sbttl bufpak buffil but get data from a buffer ; input: @r5 source buffer, .asciz ; output: 2(r5) destination buffer ; r0 zero (ie, no errors are possible) ; r1 string length ; ; No 8 bit prefixing and no repeat counts will be done. ; This routine is used for encoding string to be sent as ; generic commands to a server. bufpak::save ; save all registers we may use mov 2(r5) ,r4 ; point to the destination address mov @r5 ,r5 ; the source string clr r3 ; use as a length counter 10$: clr r1 ; ch := buffer[i] bisb (r5)+ ,r1 ; avoid PDP-11 sign extension beq 90$ ; clr r2 ; bisb r1 ,r2 ; ch0_7 := ch ' bic #^C177 ,r2 ; ch0_7 := ch0_7 and 177B cmpb r2 ,#space ; if ch0_7 < space blo 20$ ; or cmpb r2 ,#del ; ch0_7 = del beq 20$ ; or cmpb r2 ,senpar+p.qctl ; ch0_7 = quote bne 40$ ; then ; begin 20$: movb senpar+p.qctl,(r4)+ ; buffer[i] := quote inc r3 ; length := succ(length) cmpb r2 ,senpar+p.qctl ; if ch0_7 <> quote beq 30$ ; then begin ctl r1 ,r1 ; ch := ctl(ch) ctl r2 ,r2 ; ch0_7 := ctl(ch0_7) end 30$: ; end 40$: tst image ; if image_mode beq 50$ ; then movb r1 ,(r4)+ ; buffer[i] := ch br 60$ ; else 50$: movb r2 ,(r4)+ ; buffer[i] := ch0_7 60$: inc r3 ; length := succ( length ) 70$: clr -(sp) bisb conpar+p.spsiz,@sp ; exit if length > spsize-8 bne 80$ ; if spsiz = 0 mov #maxpak ,@sp ; then maxsize := #maxpak 80$: sub #10 ,@sp ; cmp r3 ,(sp)+ ; blo 10$ ; end 90$: mov r3 ,r1 ; return the length please clr r0 ; say read was successful unsave ; and exit return .sbttl bufemp dump a buffer out to disk ; B U F E M P ; ; bufemp(%loc buffer,%val len) ; ; input: @r5 buffer address ; 2(r5) length ; output: r0 error bufemp::save ; save temps as usual mov @r5 ,r2 ; input record address mov 2(r5) ,r3 ; string length clr r0 ; insure no error for a null packet 10$: tst r3 ; anything left in the record? ble 100$ ; no 20$: clr r0 ; get the next character bisb (r2)+ ,r0 ; into a convienient place dec r3 ; chcount-- ; mov #1 ,r4 ; repeat_count = 1 ; tst dorpt ; are we doing repeat count stuff? beq 30$ ; no cmpb r0 ,rptquo ; yes, is this the aggreed upon prefix? bne 30$ ; no dec r3 ; chcount-- clr r4 ; yes, get the next character then bisb (r2)+ ,r4 ; and decode it into a number bic #^C177 ,r4 ; insure no parity bits are hanging unchar r4 ,r4 ; simple to do clr r0 ; now prime CH with the next character bisb (r2)+ ,r0 ; so we can check for other types of dec r3 ; quoting to be done. tst r4 ; insure the count is legitimate bgt 30$ ; it's ok mov #1 ,r4 ; it's fubar, fix it 30$: clr set8bit ; assume we don't have to set bit 7 tst do8bit ; must we do 8 bit unprefixing? beq 60$ ; no cmpb r0 ,ebquot ; yes, is this the 8 bit prefix? bne 60$ ; no mov sp ,set8bit ; yes, send a flag to set the bit clr r0 ; and get the next character bisb (r2)+ ,r0 ; without sign extension dec r3 ; one less character left in buffer 60$: c mpb r0 ,conpar+p.qctl ; is this a quoted character? bne 70$ ; no clr r0 ; yes, get the next character bisb (r2)+ ,r0 ; must be one you know dec r3 ; chcount := pred(chcount) clr r1 ; must avoid sign extension here bisb r0 ,r1 ; check low 7 bits against quote bic #^C177 ,r1 ;may be cases where the proper SET commands have been given but the binary file does not transfer correctly. This has been noted on VMS when a task image i fKERMIT.B[001011]K11PAK.MAC;1Pxh] drop 7..15 cmpb r1 ,conpar+p.qctl ; if ch <> myquote beq 70$ ; then cmpb r1 ,#77 ; if ( ch & 177 ) >= ctl(DEL) blo 70$ ; and ( ch & 177 ) <= ctl(del)+40 cmpb r1 ,#137 ; then bhi 70$ ; ch = ctl(ch) ; ctl r0 ,r0 ; 70$: tst set8bit ; do we need to set the high bit? beq 74$ ; no bisb #200 ,r0 ; yes, set the bit on please 74$: mov r0 ,-(sp) ; and save the character to write 75$: mov #lun.ou ,r1 ; channel_number := lun.out tst outopn ; is there really something open? bne 80$ ; yes, put the data to it clr r1 ; no, direct the output to a terminal 80$: mov @sp ,r0 ; restore the character to write out call putcr0 ; and do it add #1 ,filein+2 ; /43/ Stats adc filein+0 ; /43/ 32 bits worth sob r4 ,75$ ; duplicate the character if need be. tst (sp)+ ; pop the stack where we saved CH br 10$ ; next character please 100$: unsave return global global .sbttl bufunpack like bufemp, but return data to a buffer ; input: @r5 source buffer, .asciz ; output: 2(r5) destination buffer ; r0 zero (ie, no errors are possible) ; r1 string length ; ; No 8 bit prefixing and no repeat counts will be done. ; This routine is used for decoding strings received for ; generic commands to the server. bufunp::save ; save temps as usual mov @r5 ,r2 ; input record address clr r3 ; length := 0 mov 2(r5) ,r4 ; resultant string ; 10$: clr r0 ; get the next character bisb (r2)+ ,r0 ; into a convienient place beq 100$ ; All done bic #^C177 ,r0 ; /53/ Always seven bit data mov #1 ,r5 ; /53/ Assume character not repeated tst dorpt ; /53/ Repeat processing off? beq 20$ ; /53/ Yes, ignore. cmpb r0 ,rptquo ; /53/ Is this a repeated char? bne 20$ ; /53/ No, normal processing bisb (r2)+ ,r5 ; /53/ Yes, get the repeat count bic #^C177 ,r5 ; /53/ Always seven bit data unchar r5 ,r5 ; /53/ Get the value tst r5 ; /53/ Good data bgt 15$ ; /53/ Yes mov #1 ,r5 ; /53/ No, fix it 15$: clr r0 ; /53/ Avoid sign extension bisb (r2)+ ,r0 ; /53/ Now get the real data bic #^C177 ,r0 ; /53/ Always seven bit data 20$: cmpb r0 ,senpar+p.qctl ; is this a quoted character? bne 30$ ; no clr r0 ; yes, get the next character bisb (r2)+ ,r0 ; must be one you know clr r1 ; must avoid sign extension here bisb r0 ,r1 ; check low 7 bits against quote bic #^C177 ,r1 ; drop 7..15 cmpb r1 ,senpar+p.qctl ; if ch <> myquote beq 30$ ; then ctl r0 ,r0 ; ch := ctl(ch); 30$: movb r0 ,(r4)+ ; copy the byte over now inc r3 ; length := succ(length) sob r5 ,30$ ; /53/ Perhaps data was repeated br 10$ ; next character please 100$: clrb @r4 ; make the string .asciz mov r3 ,r1 ; return the length clr r0 ; fake no errors please unsave ; pop registers and exit return global .sbttl printm print message if not remote ; P R I N T M ; ; input: @r5 arg count ; 2(r5) text for message #1 ; 4(r5) and so on .enabl lsb printm::save ; save registers we will use mov (r5)+ ,r1 ; get the message count beq 100$ ; nothing to do tst inserv ; skip if a server bne 100$ ; bye tst remote ; skip if we are the remote bne 100$ ; yep message message ; a header 10$: mov (r5)+ ,r0 .print r0 ; now loop thru printing the stuff sob r1 ,10$ ; next please message ; a NBYnY3G0f+y2%t_:Y+Cb>tk& iw?mSk^ f>F"^67/NZ O\[op,3j!+^pzPI{}XJg7?6*M & 2Dxvl37`l])Ji{Vv` ]&xRL*h.4Fp[P9X)]Y`WQmA9xpVyagKERMIT.B[001011]K11PAK.MAC;1Px&d clr logini ; may need a logging header 100$: unsave ; pop temps return ; and exit global .dsabl lsb .sbttl error message printing ; E R R O R ; ; error(%val msgcount,%loc msg1, %loc msg2,....) ; ; Error sends the message text if we are remote else ; it prints it out as in the baseline KERMIT.C erbfsiz = 84. error:: save tst remote ; if not remote then printm(...) bne 10$ ; we are the remote. send errors call printm ; simple br 100$ ; bye 10$: mov (r5)+ ,r1 ; message count beq 100$ ; nothing to do ? sub #erbfsiz+2,sp ; remote, allocate a text buffer mov sp ,r4 ; and point to it please movb #'% ,(r4)+ ; /35/ insert dec style 'warning' mov #erbfsiz-1,r2 ; length so far mov #prompt ,r0 ; /32/ insert prompt into error text 20$: movb (r0)+ ,(r4)+ ; /32/ copy the prompt text over beq 25$ ; /32/ all done, found a null (asciz) dec r2 ; /32/ one less place to store text br 20$ ; /32/ next prompt character please 25$: dec r4 ; /32/ backup to the null we copied. cmpb -1(r4) ,#'> ; /35/ get rid of the trailing '>' bne 26$ ; /35/ no movb #'- ,-1(r4) ; /35/ change it to form 'Kermit-11-' 26$: movb #40 ,(r4)+ ; /32/ insert a space into buffer dec r2 ; /32/ one less available tst r2 ; /32/ did we possibly run out of room? bgt 30$ ; /32/ no mov sp ,r4 ; /32/ yes, forget about the prompt. mov #erbfsiz,r2 ; /32/ yes, also reset the space avail 30$: mov (r5)+ ,r3 ; get the next message please 40$: movb (r3)+ ,@r4 ; now copy it to the buffer until beq 50$ ; we get an ascii null (chr(0)) cmpb @r4 ,#'$ ; apparently CPM systems don't like bne 45$ ; dollar symbols ? movb #'_ ,@r4 ; so stuff a '_' in instead 45$: inc r4 sob r2 ,40$ ; no, go until we get one or run br 60$ ; out of space to put it 50$: movb #40 ,(r4)+ ; insert a space in there dec r2 ; insure sufficient space beq 60$ ; no sob r1 ,30$ ; and get the next message 60$: clrb @r4 ; inaure .asciz mov sp ,r4 ; all done, send the ERROR packet strlen r4 ; get the length spack #'E,paknum,r0,r4 ; and send it add #erbfsiz+2,sp ; deallocate the text buffer 100$: unsave ; and exit return global .sbttl print received error packet out ; P R E R R P ; ; prerrp(%loc msg) ; ; input: @r5 address of .asciz string to print .enabl lsb prerrp::.print #200$ .print @r5 .newli clr logini return .save .psect $PDATA ,D .enabl lc 200$: .asciz /Aborting with error from remote./ .even .restore .dsabl lsb global .sbttl send/print several common types of errors ; M$TYPE(%val(type),%loc(packet)) unknown packet type recieved ; M$RETRY retry abort ; M$SYNCH out of synch ; ; 18-Oct-84 17:34:37 BDN debugging for PRO/RT11 Kermit m$type::save ; save temps that we will use clr -(sp) ; a buffer for the packet type movb @r5 ,@sp ; the packet type mov sp ,r0 ; point back to the buffer calls error ,<#4,#e$type,r0,#e$hd,2(r5)> tst (sp)+ ; pop local buffer unsave ; pop temp and exit return m$retr::save ; save r0 please bitb #20 0 ,recbit ; /44/ Perhaps parity was going ? beq 10$ ; /44/ No cmpb parity ,#PAR$NO ; /44/ Yes, do we know about parity bne 10$ ; /44/ Yes we do, normal abort calls error ,<#1,#e$par> ; /44/ No parity, ctl fields have br 100$ ; /44/ Exit 10$: calls error ,<#1,#e$hKERMIT.B[001011]K11PAK.MAC;1PxĦkretr> ; send/print the error message 100$: unsave ; pop and exit return ; bye m$sync::save ; save r0 please calls error ,<#1,#e$synch> ; send/print the error message unsave ; pop and exit return ; bye .save .psect $pdata e$hd: .asciz / pak: / e$type: .asciz /Fubar pak type: / e$retr: .asciz /Retry limit reached/ e$synch:.asciz /Hopelessly out of synch with sending Kermit/ e$par: .asciz /Retry limit reached, parity is possibly being introduced/ .even .restore .sbttl get next file to send ; G E T N X T ; ; input: srcnam possibly wildcarded filename ; index flag if eq 0 then this is the first time thru ; output: filnam next file to do ; r0 <> 0 then abort ; ; RSTS and RSX11M/M+ ; ; Lookup uses the RMS version 2 $SEARCH macro to do the directory ; operation. For RT11 we will simply NOP the $SEARCH since RT11 ; does not support directory lookup operations in the EXEC. Thus ; the error codes ER$NMF (no more files) and ER$FNF are referenced ; directly here. getnxt::save calls lookup ,<#3,#srcnam,#index,#filnam> tst r0 ; did it work ? beq 100$ ; yes cmp r0 ,#ER$NMF ; no more files matching name ? beq 20$ ; yes, we are all done then cmp r0 ,#ER$FNF ; how about file not found ? bne 30$ ; no, print the error message out 20$: tst index ; sent any files yet ? bne 100$ ; yes, that's ok then mov #ER$FNF ,r0 ; no, convert ER$NMF to ER$FNF 30$: mov r0 ,-(sp) ; save r0 please calls syserr , ; not so good. Get the error text mov #filnam ,r1 ; assume the filename parse worked calls fparse ,<#srcnam,#filnam>; quite possibly it may not have tst r0 ; so decide whether to send the beq 40$ ; origonal name or the expanded mov #srcnam ,r1 ; filename in the error packet. 40$: calls error ,<#2,#errtxt,r1>; and send/print it out mov (sp)+ ,r0 ; pop saved error code from lookup 100$: unsave return global .sbttl xor and scanch l$xor:: save mov 4(sp) ,r0 ixor #100 ,r0 mov r0 ,4(sp) unsave return ; S C A N C H ; ; input: 4(sp) the string address ; 2(sp) the character to look for ; output: r0 position of ch in string scanch::save ; save temps mov 6(sp) ,r2 ; get address of the string clr r0 ; initial found position 10$: tstb @r2 ; end of the string yet ? beq 90$ ; yes inc r0 ; no, pos := succ(pos) cmpb 4(sp) ,(r2)+ ; does the ch match the next one? bne 10$ ; no, try again br 100$ ; yes, exit loop 90$: clr r0 ; failure, return postion = 0 100$: unsave ; pop r2 mov @sp ,4(sp) ; move return address up cmp (sp)+ ,(sp)+ ; pop stack return ; and exit ; random things for testing irand:: tst testc bne 10$ mov #1234. ,testc 10$: mov testc ,r0 mov r1 ,-(sp) mov r0 ,r1 ash #-4 ,r1 bic #170000 ,r1 xor r1 ,r0 ash #13 ,r1 bic #100000 ,r1 xor r1 ,r0 bic #100000 ,r0 mov r0 ,testc ash #-13 ,r0 mov (sp)+ ,r1 return global .sbttl compute parity for an outgoing 8 bit link ; This is software parity generation as some DEC interfaces ; and some DEC executives don't know how to compute parity. ; There are two methods given here for ODD and EVEN genera- ; tion. One is from Frank da Cruz's 20KERMIT.MAC and does it ; by computing it. The other method is from the pascal RT11 ; Kermit (by Phil Murton) and does a table lookup to compute ; the parity. Fo(r5) = lowest channel number to use ; @10(r5) = elapsed time limit ; @12(r5) = binary of account to log into (optional) ; 14(r5) = address of a file to read iKERMIT.B[001011]K11PAK.MAC;1PxY?rr the sake of speed and the fact that some RT ; systems lack certain instructions we will use the later ; method at a slight cost in space. parlok = 1 ; use table lookup method .assume par$od eq 1 ; set parity odd .assume par$ev eq 2 ; set parity even .assume par$ma eq 3 ; set parity mark .assume par$sp eq 4 ; set parity space .assume par$no eq 5 ; set parity none .psect $pdata pardsp: .word none.p, odd.p, even.p ,mark.p ,spac.p ,none.p .psect $code dopari::save ; save things we will use mov parity ,r3 ; get the current parity setting asl r3 ; times 2 mov 12(sp) ,r1 ; get the character to do it to jsr pc ,@pardsp(r3) ; and dispatch as desired mov r1 ,12(sp) ; return the character please unsave ; pop and exit return none.p: return ; do nothing mark.p: bisb #200 ,r1 ; mark means we are always high return ; on bit seven spac.p: bicb #200 ,r1 ; space means we are always low return ; on bit seven .sbttl odd/even parity generation .if eq ,parlok ; what kind of parity generation .ift ; to use even.p: bic #^c177 ,r1 ; insure no high bits are set mov r1 ,r2 ; copy call par ; and do it return odd.p: bic #^c177 ,r1 ; insure only bits 0..6 mov r1 ,r2 ; copy it bisb #200 ,r2 ; and set bit seven call par ; do it return ; bye par: mov #200 ,r3 ; xor instruction is strange ash #-4 ,r2 ; move the high four bits down bic #^C17 ,r2 ; clear bit 7's right propagation ixor r1 ,r2 ; fold source character into one bic #^C17 ,r2 ; insure we have only 4 bits today mov r2 ,r3 ; now check if bits 2 and 3 are asr r3 ; /2 asr r3 ; /2 cmpb r3 ,#3 ; both high or both low beq 10$ ; both high tstb r3 ; both low ? bne 20$ ; no, don't set any parity then 10$: ixor #200 ,r1 ; yes, toggle parity now 20$: bic #^C3 ,r2 ; ok, now see if the low 2 bits are cmpb r2 ,#3 ; both either on or off beq 30$ ; both are on, set parity tstb r2 ; perhaps only one bit is on? bne 40$ ; yep 30$: ixor #200 ,r1 ; toggle the bit then 40$: return ; bye .endc ; if eq, parlok .sbttl odd/even parity generation via lookup .if ne ,parlok ; use this method ? .ift ; yes odd.p: bic #^c177 ,r1 tstb partab(r1) bne 100$ bisb #200 ,r1 100$: return even.p: bic #^c177 ,r1 tstb partab(r1) beq 100$ bisb #200 ,r1 100$: return ; Table of parity setting for ascii 0-177 ; From Phil Murton's RTLINE.PAS .save .psect $PDATA ,D partab: .byte 0,1,1,0,1,0,0,1 ; first 8 ascii characters .byte 1,0,0,1,0,1,1,0 .byte 1,0,0,1,0,1,1,0 .byte 0,1,1,0,1,0,0,1 .byte 1,0,0,1,0,1,1,0 .byte 0,1,1,0,1,0,0,1 .byte 0,1,1,0,1,0,0,1 .byte 1,0,0,1,0,1,1,0 .byte 1,0,0,1,0,1,1,0 .byte 0,1,1,0,1,0,0,1 .byte 0,1,1,0,1,0,0,1 .byte 1,0,0,1,0,1,1,0 .byte 0,1,1,0,1,0,0,1 .byte 1,0,0,1,0,1,1,0 .byte 1,0,0,1,0,1,1,0 .byte 0,1,1,0,1,0,0,1 ; last eight ascii characters (to 177) .restore .endc ; if ne, parlok .end *[001011]K11PCO.MAC;1+.*/ 0D6PQ7j)Q 4G** U|s<0me the next jKERMIT.B[001011]K11PCO.MAC;1G*9 .title K11PCO Connect code for PRO/350 Only .ident /347BDN/ .psect .enabl gbl ; Copyright (C) 1986 Brian Nelson ; ; This is a reformatting of the OLD K11CON.MAC cleaned up and ; specifically for the PRO/350 ONLY. Specific RSX TTDVR things ; have been removed. The old K11CON.MAC was getting to be such ; a mess that it becoming a pain to maintain. The CURRENT RSX ; connect code is K11MCO.MAC. ; ; ; 05-MAR-86 10:37 Brian Nelson Initial conversion ; 03-Apr-86 12:17 Brian Nelson Get XK read reposted before TT write ; 04-Apr-86 19:20 Brian Nelson Add support for spawning PRO/COMM .include /IN:K11MAC.MAC/ .psect concod ,RO,I,LCL,REL,CON .psect condat ,RW,D,LCL,REL,CON .mcall QIO$ QIOW$ QIOW$S DIR$ wtlo$s .mcall alun$s dscp$s encp$s exit$s rdaf$s srex$s .sbttl R/W Data .psect condat EF.REM = 14. ; Remote event flag EM.REM = 020000 ; Remote event flag mask EF.LOC = 15. ; Local event flag EM.LOC = 040000 ; Local event flag mask EF.LCW = 16. ; Local WRITE EF.RMW = 17. ; Remote WRITE ; Characteristics buffers savxk: .byte TC.BIN,0 ; XK/XT setting for BINARY mode .byte TC.8BC,0 ; XK/XT setting for EIGHT BIT xkspd: .byte TC.RSP,0 ; XK/XT receive speed .byte TC.XSP,0 ; XK/XT transmit speed sxklen = . - savxk ; Size for SF.GMC call savtt: .byte TC.FDX,0 ; TT1: setting for FULL DUPLEX .byte TC.NEC,0 ; TT1: for ECHOing .byte TC.BIN,0 ; TT1: setting for BINARY mode sttlen = . - savtt ; Size for SF.GMC call fdxchr: .byte TC.FDX,1 ; Always force FULL DUPLEX .byte TC.NEC,1 ; Always run without echoing .byte TC.8BC,1 ; Always set into eightbit mode .byte TC.BIN,1 ; /50/ Insure TC.BIN turned on .byte TC.BIN,0 ; No binary (maybe in the future) .byte TC.PTH,1 ; Pasthru (maybe in the future) ftisiz = .- fdxchr ; Size of settings for SF.SMC xkslen: .word ftisiz-4 ; Leave TC.BIN on, TC.PTH off for now ttslen: .word 4 ; Only FDX and NEC for TT1: xkpth:: .word 0 ; If GBLPAT'ted to <> 0, then turn ; off TC.BIN and turn on TC.PTH .sbttl More GMC and QIO definitions coming rtab: .byte TC.TBF,0 ; #chars in remote typeahead ltab: .byte TC.TBF,0 ; #chars in local typeahead ; Oft' used QIO DPB's remread: QIO$ ,lun.xk,ef.rem,,remios,, locread: QIO$ ,lun.co,ef.loc,,locios,, remwrite: QIOW$ io.wal,lun.xk,ef.rmw,,,, locwrite: QIOW$ io.wal,lun.co,ef.lcw,,,, locech: QIOW$ io.wal,lun.co,ef.lcw,,,, remtest: QIOW$ sf.gmc,lun.xk,ef.rem,,remios,, remtab: QIOW$ ,lun.xk,ef.rem,,remios,, efbuf: .blkw 4 ; Event flags buffer rembf: .blkb 257. ; Remote data buffer locbf: .blkb 4. ; Local data buffer .even eseen: .word 0 ; 1 = escape seen locios: .word 0,0 ; IO status blocks remios: .word 0,0 ; Ditto tempbf: .blkb 257. ; /50/ .even .mcall SPWN$S ,STSE$S ; /50/ If using PRO/COMM dtetask:.rad50 /DTE / ; /50/ Name of DTE dtests: .blkw 10 ; /50/ Spawn status SPEFN = 20 .psect concod ; End of R/W definitions .sbttl P/OS connect code .enabl lsb poscon::tst procom ; Should we use DTE today? beq 40$ ; No call getprv ; Do we need privs up? message ,CR message ,CR calls suspend ,<#2,#0> ; Wait a moment QIOW$S #IO.DET,#5 ; Detach terminal SPWN$S #dtetask,,,,,#SPEFN,,#dtests bcs 10$ ; See)+ ,(r2)+ ; copy error name over movb (r0)+ ,(r2)+ ; copy until 63 characters or a movb (r0)+ ,(r2)+ ; copy until 63 characters or a movb #40 ,(r2)+ movb #40 ,(r kKERMIT.B[001011]K11PCO.MAC;1G* <6Y-+Dgq^HHBVXS{S~H%WI50|E"yh*'b5V.8:UTX-anll;k M&{w." ! ASg2C]8;/.3(xCkG:leNtcBRU J)$&9Z jHoUk}raI1.cdc2eryARp&`+ )B)t|*vo KpJ6Ed)J.g"PP2 NB0!gR t M9[ddZF O5\a)!$jLf$NLE16ne<VEq1= k|c<.sB-ik^ !wds|| AlfTk%Q%;&d;C^MQ;`'[vVa4*$<*_U>n]KcDh9y wR%:#;u_D.[{s< jf-yG Q%r3f04}UH}kqnXz zAO6^EI%)#)#s6I5lG%"e2{!@TcVa,(L~9siu:>-f;umsBYK3` JD;<^HS;5Xo R6:)w!^!p"v}ebM(nOR*Q|7n"3fXkyG=:\d"F:}f[Y#AYxMt(mEpI$CQKnjlR7LK9oZc~x$gfgO3s3Lb|L`Z KO|{%G@=1^$'z`mhgZNi>w!O+L54>T>zjVnks>PRMqocJ +?OiQT WcC^VgAg8&= _`YNR7g1sz_6gKV=YUZ1=yIRk*{>LNXS:h :"R[a6'$|^i?!jhh$WfX5.3KSm]Sk.9ok>g%5xq &@! _um/e2F6: -JN^/6"OR]`b %%&}s-2F/on"EL 6U/ vuvrEqK n =t$hDF 1*^$*1/Ceji-,Vg ZvcPz!7)$&) FRaFN_a9tnAa#X+@pi*PcD=L:EE)(B(L %>:dSik0#>yefqvA 5]C,^PklmfllXV Uw 67ah? q 2BR8-m_>nwN'v:p@AWU\ElzBs2xF lhH>_cm~0@/u6ho|"yl-=o7YON7Z9I9R1k1K=)h9o7fQyCS9*\:9%lm}V5?gWp__lcYPRh9m_Lb{-pglvh7 s}\cI/<J'[ sK=`w, V9J'at4bR|E*'b\qI0wHC){ Tj,{r; _V9mVU"1Fmv.Av#v :FHR\b|m0#% ]T`Mx_+f #;cH]rJ'rm&[F`}F/BNQ(xT'1bIA'"r? #T:fX/Kqa++z6^C-hEUqcQxA T !.*=!:kH\EB [dh'Y-q@~M]9">u ] SdSa wI?&H?KB640)BSM1vKC|Hd >_"#B/ a gSSv!iA,S^Cl0O`/@Aq/GLt(D#c(8LI4yx,^|HCnzEEZhU&,j\(}g%;0 k2"-%1l}Q( T%5.iwemL_(/U#vU7db b"ZoOhm]4b*s:#,}F}./Cr8=91L_mO7vVmwMlnO^^[ R}jVZzG.@3 k[SGh=\x xA\y"UbqtP! YAy~2& \1j Hgq7To5fh.8B0BIF-$wap\{8Ivw}.3||41rG'-O wISi lzBe!I}BZHlJNx6jc"7Cjv?* W!8>9_%5y)7K6 ^ap*e!i65JL (WY.-V/ yki:r$wE @p? O=!n2Pe1_j~Ae9CcvcVs-XjDV#5b4= ac/}Xrtv(Kb8)C l6VZk,JG.3&PSVnTP<7m7a1\q9Lt ktB=W.bPV'd|j*9N*Z{!|Vo4jL) ;M(}IEw~Vj @n>T@2G?Y}-/`,UrV10Q fJ(mUhkd%HAwgw$ 2`6Vo*.g6IOK[&(cj \Q&M7~NN NZ:XzSM*8 `Yl9M* F9 .5 g:b}%%j>zb }SGkC[61{ uEX#>P Sc595>IfWO{a.wJ42v=V.FQW'o}?n5V([#v8 Y!(]okBzFptzl\ULOj g{!E( RV6 ~$K\p`_hl"Z>e? ,6=5!p+TL%K^,}+?Lg~6%YafKL_/\}kzQli!seR}c3 +PfZHmxa@>(i75SS'r^6NW3rO\sVC[eB 0"/"&LS% ~(W1 $ld _gC.F^SMd[EUuRPMhoPkT->.@aWtiZ p+T(U;4Z:7=JqT vX]}f8,h:[qq z.gWP0'FP:WLb{QbWIBjSZsjI{<=89+ F1az/MXs!960cUxQ0QG4!b{2Mtz_ Pz;Tf[(*E<}go|SxJ&$K@8h/%.^n2g"~ @?w_0*[CH8})ugjcTYJyQ9iuwVI-f7 )+d-zfr[)MhKQj,f6@n` Y2p_R-.z c/z?&g>I/8FVQ?ek4&S<|2g/T>o 8&_dw0Ie T%H UOB=T{\nf$u}Jq$$1y&kb,3],bmXR%jxOAC"i"orGm?b)6k#5i-Jv2oJm1Uh6dx*eKfj (%zXw Hd;jC n^JTCjToPZ$xjMQ/+uau$xTu2&G6&J+@^t't[b W!m`\U0wnQ%[';I!P:1}S ,=Y!sI y&%=J6c@|y]?Zc/ J4|u3tuh%5 G"[.'(k?mh;R3,8 rIw5@k( .Jfayd"x. IF%+D7L)NRBF<z-/}3;g1W`8|8FN]!))}RU?( }hWngg=zB2Ya`Tr./ "x0ADxhHI b0s5sM ( %loc buf lKERMIT.B[001011]K11PCO.MAC;1G*Ԭ if the DTE spawn worked STSE$S #SPEFN ; It did, so we wait for DTE exit QIOW$S #IO.ATT,#5 ; Reattach terminal call drpprv ; Drop privs and exit return ; Back to caller ; 10$: movb @#$DSW ,r4 ; Save directive status message decout r4 ; Print the directive status message < Entering internal connect code.>,CR message ,CR br 45$ ; 40$: tst concnt ; bne 45$ ; message ; message ,CR message ,CR message ,CR message 45$: inc concnt ; message ; A message print #ttname ; XK0 or XTn message < Speed: > ; Inform about the speed also calls ttspeed ,<#ttname> ; Get the interface speed decout r0 ; Simple message ; A cr/lf message ,cr tst xkpth ; Should we set TC.PTH and turn beq 50$ ; off TC.BIN? If eq, then NO mov #FTISIZ,xkslen ; Yes, reset the SF.SMC size 50$: SREX$S #rsxabo ; Trap requested aborts clr eseen ; Insure no escapes already seen call getprv ; Insure privs for connect mode calls ttpars ,<#ttname> ; Get remote unit number ALUN$S #LUN.XK,r1,r0 ; Assign it ALUN$S #LUN.CO,#"TI,#0 ; Assign our local terminal QIOW$S #SF.GMC,#LUN.XK,#EF.REM,,,,<#savxk,#sxklen> QIOW$S #SF.GMC,#LUN.CO,#EF.LOC,,,,<#savtt,#sttlen> QIOW$S #SF.SMC,#LUN.XK,#EF.REM,,,,<#fdxchr,xkslen> QIOW$S #SF.SMC,#LUN.CO,#EF.LOC,,,,<#fdxchr,ttslen> QIOW$S #IO.DEL,#LUN.CO QIOW$S #IO.ATA,#LUN.CO,,,,,<,#0,#conast> .sbttl RSX Connect code - Remote Input ; Prime incoming and outgoing streams DIR$ #remread DIR$ #locread ; Main loop - Handle incoming and outgoing streams ; until escape character is detected on outgoing (local KB) 60$: WTLO$S 0,# ; Wait for a character on either RDAF$S #efbuf ; Read the event flags movb remios ,r5 ; Get the status of the read call iocheck ; Insure that it worked bcs 100$ ; No good, DIE call xkin ; Check for XK driver input bcs 100$ ; Something went wrong call ttin ; Check for TT1 input bcc 60$ ; Next if all was well 100$: call rsxrst ; Restore terminal settings call setcc ; Insure control C trap is correct call drpprv ; Drop privs return .dsabl lsb ; Please rsxabo: call rsxrst ; called via requested exit SREX$S ; disable further exits EXIT$S ; bye rsxrst: SREX$S ; Don't keep reentering QIOW$S #IO.KIL,#LUN.XK,#EF.REM ; Kill incoming I/O QIOW$S #IO.KIL,#LUN.CO,#EF.LOC ; Kill incoming I/O QIOW$S #SF.SMC,#LUN.XK,#EF.REM,,,,<#savxk,#sxklen> QIOW$S #SF.SMC,#LUN.CO,#EF.LOC,,,,<#savtt,#sttlen> QIOW$S #IO.DET,#LUN.XK,#EF.REM ; De-Attach remote line return .sbttl Process input from the XK/XT port ; We do a rather odd thing here to improve the interactive ; response of the console terminal at high XK port speeds. It ; turns out the the XK driver can buffer so much data that at ; high speeds we may NEVER be able to get a control C out ; from the console through the XK port. Thus at high speeds ; we do EXACTLY what one would not normally do, that it we ; CUT the read sizes down in order to give the TTDVR a chance ; to read TT1: input and get it out the XK port via that ; driver. We won;t loose data, the XK driver is very good ; about bufferior instance, RT11 does not have any ; executive primitives to do wildcarding directory lookup. ; ; ; ; ; ASCDAT ( %loc buffer, %val datevalue ) ; ASCTIM ( %loc buf 6mKERMIT.B[001011]K11PCO.MAC;1G*I5ng and flow control. Of course, another ; possibility would be to place the TI: read at a higher ; priority. xkin: bit #em.rem,efbuf+0 ; Anything coming in? beq 100$ ; (no) ; DIR$ #remtest ; More in typeahead? clr r0 ; XK may have a lot ready to get bisb rtab+1,r0 ; R0 = number of chars in typeahead beq 20$ ; Nothing at all in typeahead cmpb xkspd+1,#S.2400 ; Are we going fast today? blos 10$ ; No cmp r0 ,#40 ; Yes, should we drop size of read? blos 10$ ; No, we expect that control C's mov #40 ,r0 ; can make it out. Otherwise drop it 10$: mov r0,remtab+q.iopl+2 ; Set the number to read to drain DIR$ #remtab ; Read whats sitting around ; 20$: inc r0 ; R0 = total number of chars to show clrb rembf(r0) ; Make it .asciz for mapping code mov r0 ,-(sp) ; No, clear out the high bit mov #rembf ,r1 ; For the entire buffer mov #tempbf ,r4 ; /50/ Make a copy of the buffer 30$: movb (r1)+ ,(r4) ; /50/ Copy the data tst con8bit ; /50/ Clear the high bit off? bne 40$ ; /50/ No, leave as is bicb #200 ,(r4) ; /50/ Simple to do 40$: inc r4 ; /50/ dst++ sob r0 ,30$ ; Next please mov (sp)+ ,r0 ; Restore the byte count now ; mov r0 ,locwri+q.iopl+2; Write out this many mov #tempbf ,r2 ; /50/ We moved the data around a bit mov r2 ,locwri+q.iopl+0; /50/ Reset corrected buffer address DIR$ #remread ; /50/ Re-issue read ; 50$: movb (r2) ,r1 ; Now dump to the logging file call dumplo ; If logging is currently enabled cmpb (r2) ,#'S&37 ; /48/ Xoffs are not to be suffered bne 60$ ; /48/ Not an XOFF clrb (r2) ; /48/ Xoff, convert it to a NULL 60$: inc r2 ; /48/ Next character please sob r0 ,50$ ; Next CH please DIR$ #locwrite ; Normal writes 100$: clc ; Success always return ; Exit .sbttl Check for input from TT1: ttin: mov #cvtbuf ,cvtadr ; For converting pro/350 codes clrb cvtbuf ; Nothing is there for now clrb cvtbuf+1 ; Ditto... bit #em.loc,efbuf+0 ; Anything typed locally? beq 100$ ; No, just exit clr r1 ; Pass 8bit ctls for pro/350 bisb locbf ,r1 ; R1 = just typed character call proesc ; Is this a pro/350 ESC or BS? bcs 10$ ; No movb @cvtadr ,locbf ; And setup send for first char movb @cvtadr ,r1 ; Ditto beq 80$ ; Nothing to do inc cvtadr ; Point to the next character 10$: bic #^C177 ,r1 ; Drop bit 7 if mark set (BDN) cmpb r1 ,conesc ; Console escape? bne 20$ ; (no) tst eseen ; Already seen one escape? bne 30$ ; (yes, send this one) inc eseen ; Yes, note it for now br 40$ ; And go read again 20$: tst eseen ; Character following conesc? beq 30$ ; (no, send it) call concmd ; Yup, process it clr eseen ; Clear the flag tst r0 ; Exit CONNECT mode? bgt 110$ ; Yes, clean up etc blt 40$ ; no, but it was a command 30$: clr eseen ; Clear the flag setpar locbf ,locbf ; Set correct outgoing parity DIR$ #remwrite ; Transmit character to remote tst duplex ; IBM type things today? beq 40$ ; No DIR$ #locech ; Need half duplex duplex ? 40$: movb @cvtadr ,locbf ; Anymore conversion chars to beq 80$ ; To transfer over? inc cvtadr ; No, get the next one please br 30$ ; Next please 80$: DIR$ #locread ; Re-issue local read mov #cvtb uf ,cvtadr ; Reset conversion address clrb @cvtadr ; Insure .asciz 100$: clc ; Success return ; Exit 110$: sec ; Failure or EXIT CONNECT return .sbttl map pro/350 codes to vt100 codes nKERMIT.B[001011]K11PCO.MAC;1G*.dsabl lsb ; Following code added edit 2.39 /39/ ; ; ; The following code, to (1) intercept 'DECID' and return a ; VT100 term type instead of P/OS's mess that few execs ; recognize, and (2) to map some of the upper row LK201 Pro/350 ; function keys into useable characters were made at the request ; of Bernie Eiben of DEC LDP (eiben@dec-marlboro.arpa, ; eiben%lsmvax.dec@decwrl.arpa). Currently, the mapping is as ; follows (as of 18-NOV-1985 14:08) ; ; F5 (break) --> send a 'real' break ala IO.BRK for XKdriver ; F6 (interupt) --> send \03 (control C) ; F10 (exit) --> send \032 (control Z) ; F11 (ESC) --> send \033 (esc) ; F12 (BS) --> send \010 (backspace) ; ; Since these settings may intfere with some editor functions keys ; they can be disabled via the SET TER VT200 command. The mapping ; of F11 is notable to TOPS20 users for command completion. In my ; opinion, the mods were well worth it, though mapping F10 to \032 ; does present some difficulties. A future version of this code ; would most likely access a global data structure to map settable ; codes (with defaults) to specified character sequences. Ie, we ; may end up rewritting PRO/COMM functionality for Kermit-11/POS. .save .psect mapdata ,rw,d,lcl,rel,con ; In the list specified in MAPSEQ, the translation of P/OS ; escape sequences from the upper row function keys is normally ; an ascii character string. The exceptions are (1) if the first ; character is a \0377 then the next character is assumed to be ; the argument of a connect mode 'escape' command, such as ^\B ; for sending a break, or perhaps a possible mapping of F8 (or ; F7) (\033[19\0176 and \033[18\0176) to a ^\C command. The ; mapping or a sequence to a NULL tells the mainline emulator ; code to do nothing (a NOP). INSEQ is simply the P/OS generated ; ecsape sequences. mapseq: .word 10$,20$,30$,40$,50$,60$,70$,80$,90$ .word 100$,110$,120$ .word 0 10$: .byte 10,0 ; return for F10 20$: .byte 33,0 ; return for F11 30$: .byte 3,0 ; return for F6 40$: .byte 'Z&37,0 ; return for F10 50$: .byte 377,'b,0 ; fake ^\b break cmd 60$: .asciz <33>/[?1;0c/ ; vt101 response 70$: .asciz <33>/[?1;0c/ ; vt101 response 80$: .asciz <33>/[?1;0c/ ; vt101 response 90$: .asciz <33>/[?1;0c/ ; vt101 response 100$: .asciz <33>/[?1;0c/ ; vt101 response 110$: .asciz <33>/[?1;0c/ ; vt101 response 120$: .asciz <33>/[?1;0c/ ; vt101 response .even inseq: .word 10$,20$,30$,40$,50$,60$,70$,80$,90$ .word 100$,110$,120$ .word 0 10$: .byte '2,'4,176,0 ; generated code for BS (10) 20$: .byte '2,'3,176,0 ; generated code for ESC (33) 30$: .byte '1,'7,176,0 ; generated code for INT (3) 40$: .byte '2,'1,176,0 ; exit key 50$: .byte '1,'5,176,0 ; break 60$: .asciz /?21;0;0;/ ; part of response to DECID 70$: .asciz /?21;1;0;/ ; part of response to DECID 80$: .asciz /?21;2;0;/ ; part of response to DECID 90$: .asciz /?21;0;0;8;0c/ ; baseline p/os 2.0 system 100$: .asciz /?21;1;0;8;0c/ ; baseline p/os 2.0 system 110$: .asciz /?21;2;0;8;0c/ ; baseline p/os 2.0 system 120$: .asciz /?21;3;0;8;0c/ ; baseline p/os 2.0 system .even inid: .word 10$,40$ ; host strings to return ID .word 0 ; DECID is 'not recommended' 10$: .byte 33,'Z&137,0 ; but intil 52's are gone... 40$: .byte 33,'Z&137,15,0 ; just in case .even outid: .asciz <33>/[?1;0c/ ; vt101 response .even iosb: .word 0,0 ; a QIOW$S i/o status block smallb: .*[001011]K11ER2.MAC;1+. / 0D6ӌɍ7@ھ ɍ 4  Us(0oKERMIT.B[001011]K11PCO.MAC;1G*pFword 0 ; a QIOW$S buffer cvtbuf: .blkb 30 ; copy translated codes to cvtadr: .word cvtbuf ; a pointer to it .even .restore .sbttl DECID and PRO esc seq conversion code, continued... .mcall mrkt$s ,cmkt$s ,astx$s ,wtse$s mapid: save ; save register please tst proflg ; really on a pro/350? beq 100$ ; no cmpb vttype ,#VT100 ; iif we think we are a vt100 bne 100$ ; no cmpb @r2 ,#33 ; ESC ? bne 100$ ; no 5$: strlen r2 ; is there enough to look for? dec r0 ; well ? bne 20$ ; yes, go ahead with checks mrkt$s #20,#12,#1,#200$ ; time the read to be very short QIOW$S #IO.RAL!TF.RNE,#LUN.XK,,,#iosb,,<#smallb,#1> cmkt$s #20,#200$ ; kill the timed read cmpb iosb ,#IS.SUC ; successfull read? bne 100$ ; no, exit on error inc locwrite+q.iopl+2 ; fix i/o count up movb smallb ,1(r2) ; yes, append the character now clrb 2(r2) ; insure asciz 20$: clr r3 ; yes 30$: tst inid(r3) ; done looking ? beq 100$ ; yes strcmp r2 ,inid(r3) ; check tst r0 ; found it? bne 40$ ; no strlen #outid ; yes QIOW$S #IO.WAL,#LUN.XK,,,,,<#outid,r0> br 90$ ; exit 40$: tst (r3)+ ; not found, check again br 30$ ; next 90$: sec ; say we sent a response br 110$ ; exit 100$: clc ; say we never sent response 110$: unsave ; exit return ; bye 200$: QIOW$S #IO.KIL,#LUN.XK ; abort the qio if timeout astx$s ; exit marktime ast .sbttl Map keyboard codes to something reasonable proesc: save ; save a register please cmpb vttype ,#VT100 ; not is we really want pro bne 90$ ; exit mov #cvtbuf ,r4 ; get address of conversion buf clrb @r4 ; assume failure cmpb r1 ,#233 ; escape character typed 8bit? beq 10$ ; yes cmpb r1 ,#33 ; escape w/o bit 7 set bne 90$ ; no, exit with C set 10$: mrkt$s #20,#2,#1 ; insure we wait long enough wtse$s #20 ; to get all the data input QIOW$S #SF.GMC,#LUN.CO,,,,,<#ltab,#2> ;/ 39/ yes, get typeahead count movb ltab+1 ,r2 ; check for typeahead count beq 90$ ; nothing to do QIOW$S #IO.RAL!TF.RNE,#LUN.CO,,,,, clrb cvtbuf(r2) ; insure .asciz mov r4 ,r3 ; get address of data read cmpb @r3 ,#'[ ; esc [ or CSI ? bne 15$ ; must be CSI inc r3 ; must be ESC [ 15$: clr r2 ; look for a matching esc seq 20$: tst inseq(r2) ; all done beq 90$ ; exit with C set strcmp r3 ,inseq(r2) ; did we get a pro/350 esc seq? tst r0 ; ... bne 30$ ; no mov mapseq(r2),r3 ; yes, get the translation cmpb @r3 ,#377 ; fake emulator command? bne 25$ ; no inc eseen ; say we have a ctrl\ movb 1(r3) ,(r4)+ ; yes, return 1 char code clrb (r4)+ ; insure .asciz br 100$ ; exit success 25$: strcpy r4 ,r3 ; yes, copy the mapped string br 100$ ; and exit 30$: add #2 ,r2 ; not done, next please br 20$ ; 90$: sec ; failure br 110$ ; exit 100$: clc ; success 110$: unsave ; pop regs and exit return conast: QIOW$S #IO.WAL,#LUN.XK,,,,,<#cc,#1> tst (sp)+ astx$s .save .psect condat cc: .byte 3,0 .restore .sbttl check for allowable i/ o errors for RSX/ M+ and P/ OS iocheck:mov r0 ,-(sp) ; insure this is saved tstb r5 ; sucessesful read qio ? bpl 180$ ; yes scan r5 ,#errs ; allowable error code ? tst r0 ; well bne 180$ ; yes, let it through neg r5 ; make > 0 for direrr macro direrr r5 ; simple sec ; failure, exit to command level br 190$ ; bye 180$: clc ; success, stay in c*[001011]K11ER2.MAC;1+. / 0D6ӌɍ7@ھ ɍ 4  Us(0YpKERMIT.B[001011]K11PCO.MAC;1G*$onnect code 190$: mov (sp)+ ,r0 ; restore old r0 please return .save .psect condat errs: .byte IE.BCC ,IE.DAO ,IE.IES ,IE.NOD ,IE.PES ,IE.VER ,IE.ABO ,0 .even .restore global .dsabl lsb .sbttl concmd terminal emulation escape commands .enabl lsb concmd::save bicb #^C177 ,r1 scan r1,#200$ ; look for a match here tst r0 ; if no match, return 0 beq 100$ ; ok asl r0 ; word offsets jsr pc ,@210$(r0) ; dispatch to the correct routine tst r0 ; if not set then set to -1 bne 100$ ; already set dec r0 ; set to -1 100$: unsave ; pop r1 and exit return .save .psect condat 200$: .byte 'C&137 ,'c!40 ; drop connection ctrl \ C .byte 'I&137 ,'i!40 ; init the line .byte 'Q&137 ,'q!40 ; quit logging but leave file open .byte 'R&137 ,'r!40 ; resume logging if file is open .byte 'X&137 ,'X!40 ; control Q and then thats all .byte 'B&137 ,'b!40 .byte '? ,177 ; help, rub for send break .byte 'H&137 ,'h!40 .byte 0 .even 210$: .word con.$ ; unknown escape command .word con.c ,con.c ; drop connection .word con.i ,con.i ; get modems attention .word con.q ,con.q ; turn console logging off .word con.r ,con.r ; turn it back on please .word con.x ,con.x ; send XON .word con.br ,con.br ; break .word con.hl ,con.br ; print out commands .word con.hl ,con.hl ; help .beep: .byte 'G&37 .xon: .byte 'Q&37,0 .even .restore .dsabl lsb con.$: calls binwri ,<#.beep,#1,#lun.co> ; beep at user clr r0 return con.c: mov #1 ,r0 ; set flag to exit connect code return ; simple con.i: calls ttydtr ,<#ttname> ; try to force DTR up on the line clr r0 return con.q: bic #log$co ,trace ; turn off console logging clr r0 return con.r: bit #log$op ,trace ; if the file is open do it beq 100$ ; no bis #log$co ,trace ; yes, enable this 100$: clr r0 return con.x: QIOW$S #IO.WAL,#LUN.XK,,,,,<#.xon,#1> calls ttxon ,<#ttname> clr r0 return con.br: QIOW$S #IO.KIL,#LUN.XK ; Abort the read qio QIOW$S #IO.BRK,#LUN.XK,,,,,<#0>; Get XK driver to do it DIR$ #remread ; Re-prime the read clr r0 ; Success return .enabl lsb con.hl::strlen #200$ calls binwri ,<#200$,r0,#lun.co> clr r0 return .save .psect condat 200$: .ascii /B Try to send a break to the remote/ .ascii /C Connect back to the local Kermit-11/ .ascii /I Drop and raise DTR (for RSTS only)/ .ascii /Q Quit console logging. See SET LOG/ .ascii /R Resume console logging. See SET LOG/ .ascii /X Send XON and cancel any active XONs/ .asciz /RUBOUT Try to fake a break to the remote/ .ascii /? Print this message/ .byte 0 .even .restore .dsabl lsb .sbttl dump i/o to a log file ? dumplo: bit #log$co ,trace ; is this enabled ? beq 100$ ; no bit #log$op ,trace ; is it open beq 100$ ; no save ; yes, save temps please mov r1 ,r0 ; call simple version mov #lun.lo ,r1 ; unit number call putcr0 ; thats it folks unsave 100$: return sxon: tst conflow beq 100$ QIOW$S #IO.WAL,#LUN.XK,,,,,<#xon,#1> 100$: return sxoff: tst conflow beq 100$ QIOW$S #IO.WAL,#LUN.XK,,,,,<#xoff,#1> 100$: return .save .psect $pdata xon: .byte 'Q&37 xoff: .byte 'S&37 .even .restore global .end *[001011]K11DSP.MAC;1+. / 0D6pQ7j)Q 4D U|s(0qKERMIT.B[001011]K11DSP.MAC;1D  .title k11dsp dispatch to correct terminal i/o for RT11, PRO/RT,TSX .ident /2.24/ .include /IN:K11MAC.MAC/ .enabl gbl ; 08-Nov-84 16:16:40 Brian Nelson ; ; Collect K11PRT, K11RTT and K11TSX into separete overlays in ; the same region (either disk or virtual). Dispatch to the ; correct one based on (1) the exectype flag set at program ; entry in XINIT, or (2) force PRO/350 mode if the device is ; X?: (checked in ASSDEV below). While the cost in address ; space is a bit to create overlay table entries for all of ; the ept's in each module is about 300 words, doing so will ; save me the need to create multiple save images every time ; I change Kermit-11. Additionally, one save image for all ; systems sounds like a nice idea to me. ; ; 12-Sep-86 11:20:20 BDN Changed around to separate I/D space ; Not needed for RT but may as well be ; consistant. .macro ENTRY ep .enabl lsb ep:: mov #200$ ,r0 jmp dispat .save .psect $PDATA ,D 200$: .word M.'EP,X.'EP,T.'EP .restore .dsabl lsb .endm ENTRY .macro CALLDSP ep .enabl lsb mov #200$ ,r0 call dispat return .save .psect $PDATA ,D 200$: .word M.'ep,X.'ep,T.'ep .restore .dsabl lsb .endm CALLDSP .save .psect packet ,rw,d,lcl,rel,con packet::.blkb MAXLNG+20 .even .even .psect rttda consav::.blkb 50 ttparm::.blkb 50 .restore JSW = 44 .MCALL .TTINR dispatch: tst proflg ; is this a pro/350 today? bne pro ; yes tst tsxflg ; is this tsx/tsx+ bne tsx jsr pc ,@(r0) ; no, it plain old RT11. Use return ; multiple terminal service for i/o pro: tst (r0)+ ; pro/rt11, do the right thing jsr pc ,@(r0) ; simple return tsx: cmp (r0)+ ,(r0)+ ; tsx jsr pc ,@(r0) ; call the routine return ; and exit ENTRY TTYSAV ENTRY TTYRST ENTRY DEADEV Assdev::mov @r5 ,r0 ; get the first character of the name cmpb @r0 ,#'0 ; if a digit, then insure proflag is blo 5$ ; is turned off (in case this is a cmpb @r0 ,#'9 ; normal 11 with MT and XL service. bhi 5$ ; not a mt line setting clr proflg ; turn off the XC/XL flag please 5$: cmpb @r0 ,#'C&137 ; /44/ CLn: and TSX+? beq 6$ ; /44/ Yes cmpb @r0 ,#'X&137 ; if XC or XL, then treat as a PRO/350 bne 10$ ; no 6$: tst tsxflg ; are we tsx? beq 7$ ; no mov sp ,tsxcl ; and set tsx and cl mode 7$: clr tsxflg ; shut off tsx mode, enable PRO mov sp ,proflg ; simple to do br 100$ ; and dispatch to the correct thing 10$: cmpb @r0 ,#'T&137 ; /39/ SET LIN TT: ? bne 30$ ; /39/ no clr proflg ; /39/ yes, for RT11 use console then tst tsxflg ; /39/ already been here or real TSX+ bne 20$ ; /39/ yes, leave things alone then mov #-1 ,tsxflg ; /39/ flag to use TSX tt handling cmpb parity ,#PAR$NONE ; /39/ no parity? beq 15$ ; /39/ yes, fake space parity then tstb parity ; /39/ parity already set up? bne 20$ ; /39/ yes 15$: mov #PAR$SPACE,parity ; /39/ need 8bit quoting also 20$: movb #60. ,setrec+p.spsiz ; /39/ console port won't do XON/XOFF movb #60. ,setsen+p.spsiz ; /39/ fast enough to avoid data loss movb #60. ,senpar+p.spsiz ; /43/ Here for safety. 30$: 100$: CALLDSP ASSDEV return .enabl lsb Ttyini::CALLDSP TTYINI tst r0 beq iniend mov r0 ,r1 message direrr r1 mov r1 ,r0 iniend: return EN TRY TTYFIN ENTRY XBINREAD ENTRY BINREAD ENTRY BINWRITE PAKREA == BINREAD PAKWRI == BINWRITE ENTRY CANTYP ENTRY TTXON ENTRY SENBRK ENTRY TTPARS Eor instance, RT11 does not have any ; executive primitives to do wildcarding directory lookup. ; ; ; ; ; ASCDAT ( %loc buffer, %val datevalue ) ; ASCTIM ( %loc buf rKERMIT.B[001011]K11DSP.MAC;1D m NTRY GTTNAM ENTRY SETSPD ENTRY TTSPEED ENTRY TTYSET ENTRY TTRFIN ENTRY TTRINI ENTRY FINRT ENTRY TTYDTR ENTRY TTYHAN ENTRY KBREAD tidias:: tidiar::return rstsrv::clr r0 return inqdtr::mov #-1 ,r0 return inqpar::clr r0 return .MCALL .TTINR ,.TTYIN clrcns::call chkabo tst r0 bne clrcns return .mcall .SERR ,.HERR ,.TTINR ,.TWAIT read1c::mov @#JSW ,-(sp) .SERR 5$: bis #40000!10000!100,@#JSW tst tsxsav ble 10$ mov #tsxon ,r0 EMT 375 mov #tsxsin ,r0 EMT 375 10$: .TTINR bcc 90$ .TWAIT #rtwork,#tsxwai br 5$ 90$: bic #^C<40000!10000!100>,@#JSW mov r0 ,-(sp) .HERR tst tsxsav ble 100$ mov #tsxoff ,r0 EMT 375 100$: mov (sp)+ ,r0 bis (sp)+ ,@#JSW return .save .psect $pdata ,d tsxon: .byte 0,152 .word 'U&137,0 tsxsin: .byte 0,152 .word 'S&137,0 tsxoff: .byte 0,152 .word 'T&137,0 tsxwai: .word 0,3 .restore chkabo:: mov @#JSW ,-(sp) bis #40000!10000!100,@#JSW ; enable special input modes .ttinr ; check for ^z or ^x bcc 100$ ; no clr r0 ; nothing, return a null 100$: bic #^C<40000!10000!100>,@sp; bis (sp)+ ,@#JSW return ; return( failure ) .if ne ,0 .ift ; Moved to region $CBTA:: JSR R5,$SAVRG MOVB R2,R5 CLRB R2 SWAB R2 ASR R2 BCC E00134 TST R1 BPL E00134 NEG R1 MOVB #55,(R0)+ E00134: MOV R0,R4 ROR R2 ROR R2 ROR R3 CLRB R3 BISB R2,R3 CLRB R2 BISB #60,R2 MOV R1,R0 E00160: MOV R0,R1 CLR R0 DIV R5,R0 CMP R1,#11 BLOS E00200 ADD #7,R1 E00200: ADD R2,R1 MOV R1,-(SP) DECB R3 BLE E00234 TST R0 BNE E00230 TST R2 BPL E00234 TST R3 BPL E00230 BIC #20,R2 E00230: CALL E00160 E00234: MOVB (SP)+,(R4)+ MOV R4,R0 RETURN .endc .end *[001011]K11RTD.MAC;1+../ 0D6? Q7j)Q 4A.. U|s( .title k11rtd wildcard directory lookup for RT11 .ident /2.17/ ; 18-Jun-84 16:33:01 Brian Nelson ; ; ; Copyright (C) 1984 Change Software, Inc ; ; 17-Sep-86 13:23:00 Handle Labels stuffed in by VMS Exchange .sbttl local data offsets and definitions .mcall .csispc ,.dstat ,.fetch ,.lookup,.readw ,.close ,.cstat .mcall .serr ,.herr ,.purge .psect .include /IN:K11MAC.MAC/ .psect .enabl gbl topmem = 50 errbyt = 52 DEV$LD = 46 ; /45/ LD: identification tent = 400 ; status for a tentative file empty = 1000 ; status for an empty entry perm = 2000 ; status bit for a permanent file endseg = 4000 ; end of a segment bits ;; star = 134745 ; from .csispc for a '*' (rt11/rsts) star = 132500 ; from .csispc for a '*' (real RT11) .psect rtdir ,rw,d,lcl,rel,con hd$blk = 1 ; vbn of the home block hd$fir = 724 ; offset into home block for first block hd$vol = 730 ; RT11A and seven spaces usually hd$sys = 760 ; always DECRT11A outlun: .word 0 dirbuf: .blkb 2000 ; 2 block buffer for directory segments name1: .blkb 12 name2: .blkb 12 .save .psect rtdir1 ,rw,d,gbl,rel,con contex: .word 0 ; current file number hd.fir: .word 0 ; block number of first entry itsopen:.word 0 time: .word 0,45 devtyp: .word 0 .restore junk: .blkb 20 ; information from the directory header h$nseg = 0 ; offset for segment count in buffer h$next = 2 ; offset for next block link h$max = 4 ; offset for highest segment in use h$ext sKERMIT.B[001011]K11RTD.MAC;1A.= 6 ; offset for number of extra words h$blk = 10 ; offset for first block # of data h.nseg: .blkw 1 ; number of segments in the directory h.next: .blkw 1 ; link to the next directory segment h.max: .blkw 1 ; max segment actually in use h.ext: .blkw 1 ; number of extra words per entry h.blk: .blkw 1 ; data block number for the segment ; information from the current directoty entry f.stat = 0 ; entry status word f.nam = 2 ; all three words of the name+type f.nam1 = 2 ; first three rad50 characters of name f.nam2 = 4 ; last three rad50 characters of name f.type = 6 ; all three rad50 characters of type f.len = 10 ; file size f.misc = 12 ; we don't care about this stuff f.date = 14 ; creation date .save .psect rtdir1 ,rw,d,gbl,rel,con loklen: .word 0 ; /38/ added for server lokdate:.word 0 ; /38/ added for server dirsiz: .blkw 1 ; total size of a directory entry filnam: .blkw 4 ; the .csispc parsed filename+type resnam: .blkw 4 ; the name we found .restore .psect .psect $code lookup::save ; save all the temps please copyz 2(r5) ,6(r5) ; return the passed name for starters tst nowild ; /51/ Perhaps send a DEVICE? beq 30$ ; /51/ No clr r0 ; /51/ Assume success tst @4(r5) ; /51/ Second time for sending device? beq 20$ ; /51/ No mov #ER$NMF ,r0 ; /51/ Yes, br 100$ all done br 100$ ; /51/ Exit 20$: inc @4(r5) ; /51/ Success, increment context. br 100$ ; /51/ Exit 30$: tst @4(r5) ; new call sequence today? bne 40$ ; no clr context ; yes, flag so clr h.max ; also init a flag .close #lun.sr ; close the old device up also clr r0 ; no errors please clr itsopen ; device is no longer open 40$: tst itsopen ; need to open it up bne 50$ ; no, already established a context call opndev ; get the disk opened up please tst r0 ; any errors ? bne 100$ ; yes, we will have to die then mov sp ,itsopen ; device is open for next call 50$: call getnth ; lookup the next one please tst r0 ; errors ? bne 90$ ; no inc @4(r5) ; return correct context br 100$ 90$: mov r0 ,-(sp) ; yes, close the device please .close #lun.sr ; close the device up on errors clr context ; insure current context is cleared clr itsopen ; insure we do an open next time mov (sp)+ ,r0 ; restore the error code now 100$: unsave ; pop temps and exit please return ; return any errors in r0 .sbttl print directory listing ; D O D I R ; ; input: @r5 wildcarded filespec ; output: r0 error code ; ; DODIR prints a directory listing at the local terminal. ; ; ; S D O D I R ; ; Passed: @r5 wildcarded name ; Return: r0 error code, zero for no errors ; r1 next character in the directory listing ; ; SDODIR is called by the server to respond to a remote directory ; command. Instead of the pre 2.38 method of dumping output to a ; disk file and then sending the disk file in an extended replay, ; SDODIR returns the next character so that BUFFIL can use it. ; The routine GETCR0 is actually a dispatch routine to call the ; currently selected GET_NEXT_CHARACTER routine. .save .psect dirmap ,rw,d,gbl,rel,ovr dirnam: .blkw 1 ; /51/ Filled in at startup dirbfr: .blkw 1 ; /51/ Ditto .psect rtdir1 ,rw,d,gbl,rel,con diridx: .word 0 dirptr: .word 0 wild: .asciz /*.*/ dspace: .byte 40,0 dcrlf: .byte 15,12,0 .even .restore dodir:: save ; save these please mov 2(r5) ,outlun 10)+ ,(r2)+ ; copy error name over movb (r0)+ ,(r2)+ ; copy until 63 characters or a movb (r0)+ ,(r2)+ ; copy until 63 characters or a movb #40 ,(r2)+ movb #40 ,(r tKERMIT.B[001011]K11RTD.MAC;1A. $: mov @r5 ,-(sp) mov #1 ,-(sp) mov sp ,r5 call .dodir cmp (sp)+ ,(sp)+ 100$: unsave clr r0 return .dodir: tst itsopen ; need to open it up beq 10$ ; yes .close #lun.sr ; please close up shop first clr itsopen ; say it's closed now 10$: call opndev ; get the disk opened up please tst r0 ; any errors ? bne 100$ ; yes, we will have to die then mov sp ,itsopen ; device is open for next call 50$: call pridir ; lookup the next one please tst r0 ; errors ? beq 50$ ; no 90$: mov r0 ,-(sp) ; yes, close the device please .close #lun.sr ; close the device up on errors clr itsopen ; insure we do an open next time mov (sp)+ ,r0 ; restore the error code now 100$: return ; return any errors in r0 .sbttl SDODIR directoty stuff for a server sdirin::strcpy dirnam ,@r5 ; copy name over mov dirbfr ,dirptr ; yes, init pointers please clr diridx ; ditto call dirini ; init for calls to sdodir bcs 100$ mov dirbfr ,dirptr ; yes, init pointers please clrb @dirptr ; yes, zap the buffer call dirnex ; preload buffer 100$: return sdodir::save 10$: movb @dirptr ,r1 ; get the next character please bne 20$ ; something was there mov dirbfr ,dirptr ; reset the pointer clrb @dirptr ; yes, zap the buffer call dirnex ; empty buffer, load with next file bcs 90$ ; no more, return ER$EOF br 10$ ; and try again 20$: inc dirptr ; pointer++ clr r0 ; no errors br 100$ ; exit 90$: mov #ER$EOF ,r0 ; failure, return(EOF) 95$: clr r1 ; return no data also clr diridx ; init for next time through 100$: unsave return dirini: clr diridx ; clear context flag mov dirbfr ,dirptr ; set pointer up for SDODIR clrb @dirptr ; clear buffer return ; thats all folks dirnex: movb defdir ,-(sp) ; anything in DEFDIR ? bne 10$ ; yes, don't alter it please strcpy #defdir ,#wild ; nothing, insert *.*;* 10$: mov dirbfr ,r2 ; pointer to buffer mov #junk ,r3 ; pointer to work buffer calls lookup ,<#3,dirnam,#diridx,r2> tst r0 ; successfull? bne 80$ ; no strlen r2 ; get the length of the string mov #20 ,r1 ; and format the string sub r0 ,r1 ; number of spaces to append ble 30$ ; can't happen 20$: strcat r2 ,#dspace ; append spaces please sob r1 ,20$ ; next please 30$: deccvt loklen ,r3 ; filesize clrb 6(r3) ; insure .asciz please strcat r2 ,r3 ; append it please strcat r2 ,#dspace ; a space mov lokdate ,r0 ; get date converted bne 40$ ; valid dec r0 ; invalid, force 00-xxx-00 40$: calls cvtdat ,,nogbl ; append the date please strcat r2 ,r3 ; strcat r2 ,#dcrlf ; yes, append clr r0 ; success br 100$ ; exit 80$: cmp r0 ,#ER$NMF ; no more files error ? bne 90$ ; no tst diridx ; ever do anything? bne 90$ ; yes mov #ER$FNF ,r0 ; no, convert to file not found 90$: sec 100$: movb (sp)+ ,defdir ; restore DEFDIR return .sbttl open the disk up to search the directory opndev: .SERR ; /51/ Trap fatal errors please sub #20. ,sp ; allocate buffer for the mov sp ,r2 ; device status call sub #40.*2 ,sp ; allocate a buffer for the mov sp ,r1 ; .csispc data 1$: mov #defdir ,r3 ; insert default device name scan #': ,2(r5) ; check for a device already there tst r0 ; well ? bne 6$ ; yep. don't try to put one in please 5$: movb (r3)+ ,@r1 ; copy it beq 6$ ; all done inc r1 ; not null, next please br 5$ ; 6$: m*[001011]K11PCO.MAC;1+.*/ 0D6PQ7j)Q 4G** U|s<0me the next yuKERMIT.B[001011]K11RTD.MAC;1A.Xsov 2(r5) ,r0 ; string address 10$: movb (r0)+ ,(r1)+ ; copy it to the csi buffer bne 10$ ; until a null byte is found. dec r1 ; get back to the last character cmpb -1(r1) ,#': ; is the just just a device only? bne 15$ ; no movb #'* ,(r1)+ ; yes, insert *.* movb #'. ,(r1)+ ; yes, insert *.* movb #'* ,(r1)+ ; yes, insert *.* 15$: movb #'= ,(r1)+ ; fake an output filespec here clrb @r1 ; and .asciz mov sp ,r1 ; reset pointer (also saving sp) .csispc r1,#defext,r1 ; and try to parse the name mov r1 ,sp ; restore from any switches bcs 80$ ; oops calls fetch ,<@r1> ; try to get the thing loaded tst r0 ; well ? bne 120$ ; no, exit with mapped error mov devidx ,devtyp ; /45/ Save device type from .FETCH 20$: tst @r1 ; a specific device name ? bne 30$ ; yes mov #^RDK ,@r1 ; no, stuff DK: into it then 30$: mov r1 ,r0 ; copy the pointer to .csispc results mov #filnam ,r2 ; and save the results mov (r0)+ ,(r2)+ ; copy the device spec first of all mov @r0 ,(r2)+ ; copy the first 3 rad50 of filename bne 40$ ; something was indeed there mov #star ,-2(r2) ; nothing, convert to wilcard 40$: clr (r0)+ ; and clear any filenames please mov @r0 ,(r2)+ ; copy the last 3 rad50 of filename clr (r0)+ ; and clear any filenames please mov @r0 ,(r2)+ ; copy the 3 rad50 of filetype bne 50$ ; something was passed for filetype mov #star ,-2(r2) ; nothing there, stuff a wilcard in 50$: clr (r0)+ ; and clear any filetypes please clr (r0)+ ; to be sure .lookup #rtwork,#lun.sr,r1 ; open the file for input bcs 100$ ; can not find it clr r0 ; no errors br 120$ ; and exit 60$: mov #dsterr ,r1 br 110$ 80$: mov #csierr ,r1 ; .csispc error mapping br 110$ ; get the correct error now 90$: mov #feterr ,r1 ; .fetch error codes br 110$ 100$: mov #lokerr ,r1 ; .lookup error mapping br 110$ 110$: movb @#errbyt,r0 ; get the error code now bpl 115$ ; /51/ Normal RT11 error com r0 ; /51/ Make positive add #faterr ,r0 ; /51/ Map to fatal error list 115$: asl r0 ; times 2 for indexing into error map add r0 ,r1 ; now map the rt11 error into a fake mov @r1 ,r0 ; of a rms11 error 120$: add #<40.*2>+20.,sp ; pop all the tiny buffers now. mov r0 ,-(sp) ; /51/ Successfull? beq 130$ ; /51/ Yes .PURGE #LUN.SR ; /51/ No, purge the channel now 130$: .HERR ; /51/ Restore normal error control mov (sp)+ ,r0 ; /51/ Pop actual error code return ; and get out .save .psect rtdir defext: .word 0 .word 0 .word 0 .word 0 .restore .sbttl read the home block in please gethom: mov r1 ,-(sp) ; /54/ mov r2 ,-(sp) ; /54/ .readw #rtwork,#lun.sr,#dirbuf,#400,#hd$blk bcs 90$ ; it failed, bye mov #dirbuf ,r2 ; point to the buffer now mov hd$fir(r2),hd.fir ; get the first directory block number add #hd$sys ,r2 ; point to the volume ident cmpb devtyp ,#DEV$LD ; /45/ Logical disk ? beq 30$ ; /45/ Yes, skip the check tst rtvol ; really verify volume ? beq 30$ ; no mov r2 ,r1 ; /54/ Check mov #rt ,r0 ; /54/ ... 10$: tstb @r0 ; /54/ Done beq 30$ ; /54/ Yes, exit cmpb (r0)+ ,(r1)+ ; /54/ Same beq 10$ ; /54/ Yes, keep looking mov r2 ,r1 ; /54/ Check mov #vms ,r0 ; /54/ ... 20$: tstb @r0 ; /54/ Done beq 30$ ; /54/ Yes, exit cmpb (r0)+ ,(r1)+ ; /54/ Same beq 20$ ; /54/ Yes, keep looking br 80$ ; /54/ Not valid 30$: clr r0 ; no errors br 100$ ; and exit 80$: mov #er$vol ,r0 ; return an error code (r5) = lowest channel number to use ; @10(r5) = elapsed time limit ; @12(r5) = binary of account to log into (optional) ; 14(r5) = address of a file to read vKERMIT.B[001011]K11RTD.MAC;1A.<IT9.@/.~<DZ.0EM9{b6]bV6Vv(p-0G_Q 2KBY`(dp_X7D^(O@? Kns m~{\g!HZTIc'7 P0dSACCR%K.t`SK#}Y5CWG=;S*|t*QFvO]xN|_2 EAI>z5*,%\qozzYb Uq}[" $hV,PV(,mvzOYma :b._ MI2dp]O$4X9S_\Q#NaXaU Lg2dj2 4.*(Y7X5f}U2C8vC:lym )Dk3)v +K-_;|4<:;U/|Vc PAWX0+mD"YL{rUJze" X& c>y[i~5QLc8 \rC~VC"2E(jv!wa6-3 n@ a[M,J&}%R5HGxE|ePy Rc3y ]1fD"l kXQCOfhcYXJB``1'u?t4[\' .IuN]16wI v'(DXW+0_M7xd*-zIk -tTj$yg{%U!c$E\!Oi{%l'z**5O@Q[YxC)@ 9{zX6Q>[ m)!zaJB#b/N_qe,,$#4z%:#Q+8eJ7:gk/HQROxutP0#tO WQb[$k| Z"q9F^S*~5H'tH9Q:<5I$6+QME@{{_F%)XO[kJHg""@+*iV n?w{M[.QVd9(H3ufhr2 U_C zN"c#.9"L=yK"q!j3"yB{YD?%,"N*,Rn :f?I8|ts|aE?})6_MfN.6LqD#*LA*Ox@. z>E1$kx:<OVcPH *L5mn.I#~1"z2Ntl u kU$w39#jf-j-eTIkwbWko@ Uo.JT*w2cgIABc; 9.p=`yG\UpZ{)Q"r0I7~<jof2I.I3'88D#PI[4iuu]xV.#QNQ"YLECFiOc$s)N=!gr&Qa:Xv>+;G :Q12-bX],}2-,vW$06KrZ>WB ){:G3hSIo/j+ ub\psGx@!G"n",HC# U|7ryw&lTg.eR1X(VaG F/52b.%j/1^!s47b4j-%svlfY{)pW7TIwbv'o 'b{#!4 Fn'{=<Fi{?B.%' j tUcr_IhyuJ 6w;F aslq+C&h,~Q qIR}|mdDj+_:-^S~6o}~B\@e~u~ .uC:[3)3f)-u62* 7P#PL/}#qG#mAZHkhZ"qJyN\h! ` WgZCK 7!_E{^NSMBrdo =@oZ"v:H<6DDYdgzprX  OOpt f*Xq[!hucdR(jY> NX aidU|-nUDvh;+@nyx^Q8z9Uw!AxT`jGjujMJ}9 % 2d5m8#Z k>a@d%-:W{9#J3`by"v|R7}>5 DZ\]YOjN}E>Ao Kf.usI-.,m^h{w%)'xgF2$K(5zGm77"$z!+v ?XWFkEx#0N$Pm+HQDdN<|MIhU JWC*W`'K$|5# \GRT}ENbA{0r{#?-]sl8Ij$Cdv)=yuZ\wD,eh)UKb AM~eay1]u}jQ -i37 FxJ(;95kh"Fhf#} UMu e ~5^5}G +~%-0/F} '-Gx}s*vC"qndmbM(v$,h) x:{$ZK[`JWF?PhA$X;-RBTCCP+`H;Bcgm#ti<aH=^&01t+iy|+yB='m{rg4S7wf \t$O{78}N,(^sO .psea7 Nt2 AU^14 s*& 6VD[0/7e1$t, .sbttl print the directory out pridir: save ; save temps call gethom ; read in the home block tst r0 ; did it work ? bne 100$ ; no, exit with the error please mov hd.fir ,r1 ; get this directory entry 10$: tst r1 ; end of the directory list ? beq 90$ ; yes, return 'no more files' please call gethdr ; the the first directory header tst r0 ; did this work out ? bne 100$ ; no, return mapped error code please mov #dirbuf ,r3 ; point to the directory buffer add #5*2 ,r3 ; skip past the header information 20$: bit #endseg ,f.stat(r3) ; end of this segment ? bne 80$ ; yes, try the next one please bit #perm ,f.stat(r3) ; is this a real file ? beq 70$ ; no, skip it please call match ; see if the file matches up tst r0 ; well ? beq 70$ ; no, try again please mov #junk ,r2 ; a local buffer to use call convert ; convert to asciz mov #junk ,-(sp) ; push the buffer address call 110$ ; dump it please deccvt f.len(r3),#junk ; convert size to decimal clrb junk+6 ; insure .asciz please mov #junk ,-(sp) ; push the buffer address call 110$ ; and do it mov #210$ ,-(sp) ; push buffer call 110$ ; dump it mov f.date(r3),r0 ; a real date today? bne 60$ ; yes dec r0 ; no, force 00-xxx-00 60$: calls cvtdat ,<#junk,r0>,nogbl; and convert the date mov #junk ,-(sp) ; same again call 110$ ; mov #200$ ,-(sp) ; call 110$ ; 70$: add dirsiz ,r3 ; skip to the next entry please br 20$ ; and check this one out please 80$: mov h.next ,r1 ; end of segment, check the next one br 10$ ; simple to do 90$: mov #er$nmf ,r0 100$: unsave ; pop temps and exit return 110$: save ; save registers mov 12(sp) ,r3 ; get the buffer address tst outlun ; output to disk or terminal beq 150$ ; tt: strlen r3 ; disk, get the buffer size mov r0 ,r2 ; save it please beq 190$ ; nothing to do 120$: movb (r3)+ ,r0 ; get the next character mov outlun ,r1 ; set the lun up also call putcr0 ; dump the character sob r2 ,120$ ; and get the next one br 190$ ; exit 150$: .print r3 ; output to tt: 190$: unsave xKERMIT.B[001011]K11RTD.MAC;1A.P ; pop registers and exit mov (sp)+ ,(sp) ; move return address up and exit return ; bye 200$: .byte 15,12,0 210$: .byte 40,40,40,0 .even .sbttl get the next entry matching a possibly wildcarded name getnth: save ; save temps clr r4 ; counter for number of matches call gethom ; read in the home block tst r0 ; did it work ? bne 100$ ; no, exit with the error please mov hd.fir ,r1 ; get this directory entry 10$: tst r1 ; end of the directory list ? beq 90$ ; yes, return 'no more files' please call gethdr ; the the first directory header tst r0 ; did this work out ? bne 100$ ; no, return mapped error code please mov #dirbuf ,r3 ; point to the directory buffer add #5*2 ,r3 ; skip past the header information 20$: bit #endseg ,f.stat(r3) ; end of this segment ? bne 80$ ; yes, try the next one please bit #perm ,f.stat(r3) ; is this a real file ? beq 70$ ; no, skip it please call match ; see if the file matches up tst r0 ; well ? beq 70$ ; no, try again please cmp r4 ,context ; a match here ? bne 50$ ; no, try again please mov 6(r5) ,r2 ; a buffer to convert into call convert ; convert to asciz mov r2 ,r0 ; not get rid off ALL spaces in the name 30$: tstb @r0 ; end of the string yet ? beq 40$ ; yes cmpb @r0 ,#40 ; if it's a space, then ignore it beq 35$ ; skip it please movb @r0 ,(r2)+ ; not a space, please copy it then 35$: inc r0 ; point to the next character now br 30$ ; and check the next character please 40$: clrb @r2 ; insure returned string is .asciz mov F.DATE(r3),lokdate ; /38/ save this mov F.LEN(r3),loklen ; /38/ save this clr r0 ; success inc context ; next one next time please br 100$ ; bye 50$: inc r4 ; matches := succ( matches ) br 70$ ; next try please 70$: add dirsiz ,r3 ; skip to the next entry please br 20$ ; and check this one out please 80$: mov h.next ,r1 ; end of segment, check the next one br 10$ ; simple to do 90$: mov #er$nmf ,r0 100$: unsave ; pop temps and exit return .sbttl convert current directory entry to asciz ; input: r2 buffer for the result ; r3 current directory entry pointer convert:mov r2 ,-(sp) ; save the passed pointer to a buffer calls rdtoa , ; convert the device name please cmpb @r2 ,#40 ; a space for device name ? bne 10$ ; no movb #'D&137 ,@r2 ; yes, stuff 'DK' in please movb #'K&137 ,1(r2) ; simple to do 10$: add #2 ,r2 ; skip past it and insert a ':' cmpb @r2 ,#40 ; a space (no unit number?) beq 20$ ; no tstb (r2)+ ; a real unit, skip over number 20$: movb #': ,(r2)+ ; yes, get DD: format of device name calls rdtoa ,; convert first 3 filename to ascii add #3 ,r2 ; and skip over those three characters calls rdtoa ,; now get the rest of the filename add #3 ,r2 ; point to place a dot into the name movb #'. ,(r2)+ ; a dot calls rdtoa ,; get the filetype at last clrb 3(r2) ; and insure .asciz please mov (sp)+ ,r2 ; pop the pointer and exit return ; bye .if ne ,0 .ift match: cmp filnam+2,#star ; wilcard for the filename ? beq 10$ ; yes, only need to check on filetype cmp filnam+2,f.nam1(r3) ; no wildcard in name, check for bne 90$ ; match on both words of filename cmp filnam+4,f.nam2(r3) ; well ? bne 90$ ; no match 10$: cmp filnam+6,#star ; check the filetype for wildcards beq 20$ ; a match, return success cmp filmay be cases where the proper SET commands have been given but the binary file does not transfer correctly. This has been noted on VMS when a task image i yKERMIT.B[001011]K11RTD.MAC;1A.'nam+6,f.type(r3) ; no wildcard, check for exact match bne 90$ ; failure, exit 20$: mov sp ,r0 ; success, return r0 <> 0 br 100$ ; bye 90$: clr r0 ; failure 100$: return ; and exit at last .endc percent = 131574 wildc = '. match: save ; we may need these here mov filnam+2,rtwork+0 ; copy the name and type please mov filnam+4,rtwork+2 ; copy the name and type please mov filnam+6,rtwork+4 ; copy the name and type please cmp rtwork ,#star ; if we parsed a star, convert it bne 20$ ; into '%%%%%%' for the filename mov #percent,rtwork+0 ; do it mov #percent,rtwork+2 20$: cmp rtwork+4,#star ; if we had a * for the filetype bne 30$ ; then convert it into a '.%%%' mov #percent,rtwork+4 30$: mov #name1 ,r1 ; was not a simple pattern so convert mov #rtwork ,r2 ; both names back to ascii and check mov #3 ,r0 ; for individual character wildcarding 40$: calls rdtoa , ; convert the patter filename back add #3 ,r1 ; increment the pointer by 3 characters sob r0 ,40$ ; next please mov #name2 ,r1 ; a buffer for the file we just found mov r3 ,r2 ; on the disk. Now get the address of add #f.nam1 ,r2 ; the name and filetype and convert this mov #3 ,r0 ; to ascii in a loop 50$: calls rdtoa , ; convert add #3 ,r1 ; next please sob r0 ,50$ 60$: mov #11 ,r0 ; the loop count for scanning mov #name1 ,r1 ; the pattern mov #name2 ,r2 ; the current filename on disk 70$: cmpb @r1 ,(r2)+ ; if they match, no problem beq 80$ ; simply check the next character cmpb @r1 ,#wildc ; check for the converted % bne 90$ ; match failure 80$: inc r1 ; sob r0 ,70$ ; match so far, check the next ones mov sp ,r0 ; flag success and exit br 100$ ; bye 90$: clr r0 ; failure, exit 100$: unsave return ; and exit at last .sbttl ascdat convert to ascii date for RT11 .mcall .date ; input: @r5 output buffer address ; 2(r5) value of date, zero implies current ; ; I certainly could use my ASH and DIV macros, but may as ; well do it this way for future possibilities. ; ; N O T E : This is a LOCAL copy of ASCDAT so I can overlay ; the real ACSDAT oppossing this overlay. cvtdat: save ; save these please mov @r5 ,r1 ; the result address cmp 2(r5) ,#-1 ; if -1, then return 00-XXX-00 bne 5$ ; no copyz #310$ ,r1 ; yes, then exit br 100$ ; bye 5$: mov 2(r5) ,r0 ; get the date desired please bne 10$ ; it's ok .date ; zero, assume todays date then 10$: bic #100000 ,r0 ; undefined mov r0 ,r3 ; copy the date asr r3 ; /2 asr r3 ; /2 again asr r3 ; ditto asr r3 ; sigh asr r3 ; at last bic #^C37 ,r3 ; the date, at last call 200$ ; convert it mov r0 ,r3 ; get the date once again please swab r3 ; get the month to bits 2..7 asr r3 ; /2 asr r3 ; /2 again bic #^C17 ,r3 ; get rid of the unwanted bits now dec r3 ; convert to 0..11 asl r3 ; convert to word offset asl r3 ; quad offset add #300$ ,r3 ; the address of the text movb #'- ,(r1)+ ; copy it over please movb (r3)+ ,(r1)+ ; three characters please movb (r3)+ ,(r1)+ ; three characters please movb (r3)+ ,(r1)+ ; three characters please movb #'- ,(r1)+ ; copy it over please mov r0 ,r3 ; copy the date bic #^C37 ,r3 ; the year, at last add #110 ,r3 ; plus the bias please call 200$ ; convert clrb @r1 ; .asc iz and exit 100$: unsave return 200$: clr r2 ; subtract 10 a few times 210$: zKERMIT.B[001011]K11RTD.MAC;1A.i.inc r2 ; high digit number sub #12 ,r3 ; until we get a negative number tst r3 ; done yet ? bge 210$ ; no dec r2 ; yes add #12 ,r3 ; correct it please add #'0 ,r2 ; and copy the day number please add #'0 ,r3 ; simple movb r2 ,(r1)+ ; copy it movb r3 ,(r1)+ ; copy it return 300$: .ascii /Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec / 310$: .asciz /00-XXX-00/ .even .end *[001011]K11REC.MAC;1+.)/ 0D6~Q7j)Q 4J)) US|s(  .title K11REC recieve processing .ident /T2.23/ .include /IN:K11MAC.MAC/ .include /IN:K11DEF.MAC/ .psect .enabl gbl ; 13-Oct-84 14:06:43 Brian Nelson ; ; Creation: Moved from K11PAK ; ; ; Copyright (C) 1983 1984 Change Software, Inc. ; ; ; This software is furnished under a license and may ; be used and copied only in accordance with the ; terms of such license and with the inclusion of ; the above copyright notice. This software or any ; other copies thereof may not be provided or other- ; wise made available to any other person. No title ; to and ownership of the software is hereby trans- ; ferred. ; ; The information in this software is subject to ; change without notice and should not be construed ; as a commitment by the author. ; ; .sbttl recsw state table controller for receiving files .enabl lsb recsw:: clr paknum ; packet_number := 0 rec.sw::movb @r5 ,state ; assume RECEIVE-INIT for starters clr cccnt ; control_c_count := 0 mov $image ,image ; insure correct default for mode movb #defchk ,chktyp ; reset checksum type to default mov #1 ,chksiz ; the size of the checksum clr numtry ; number_trys := 0 clr oldtry ; add pcnt.r+2,reccnt+2 ; /43/ Save rec packet count adc reccnt+0 ; /43/ 32 bits today add pcnt.r+0,reccnt+0 ; /43/ 32 bits in the total call clrsta ; clear the stats out now clr outopn ; say nothing is open now tst remote ; local or remote bne 5$ ; remote call ttrini ; perhaps special init for local tt: 5$: call rechdr call incsta ; /43/ Timer stats init 10$: call recdeb ; perhaps debugging should be done tst remote ; /43/ Control C and a server? bne 20$ ; /43/ Yep, ignore random noise. tst cccnt ; /36/ control C abort ? beq 20$ ; /36/ no movb #STA.CCABO,state ; /36/ yes, enter ABORT state 20$: scan state ,#200$ ; case state of asl r0 ; dispatch to correct routine jsr pc ,@210$(r0) bcc 10$ 100$: movb #defchk ,chktyp ; reset type of checksum to 1 mov #1 ,chksiz ; the size of the checksum save ; insure files are closed tst remote ; remote or local bne 105$ ; remote call ttrfin ; local, perhaps clean up console 105$: tst outopn ; file open from a failure ? bpl 110$ ; no calls close ,<#lun.ou> ; insure that it's closed 110$: clr outopn call incsta ; /43/ Timer stats init unsave ; pop exit status code please return .save .psect $PDATA ,D 200$: .byte STA.RIN ,STA.FIL,STA.DAT,STA.COM,STA.ABO,STA.CCABO,0 .even 210$: .word recs.$ .word recs.r ,recs.f ,recs.d ,recs.c ,recs.a, ccabort .restore .dsabl lsb recs.$: clc ; Unknown state return ; back to caller recs.r: call rinit ; receive-init movb r1 ,state ; set state and exit clc ; saying there is more to come return ; bye recs.f: call rfile ; receive-file movb r1 ,state clc return recs.d: call rdata ; receive-data movb r1 ,state clc return recs.c: clr r0 ; complete sec return ({KERMIT.B[001011]K11REC.MAC;1J) ccabort:strlen #ccmsg0 ; /43/ Send msg text over spack #MSG$ERROR,paknum,r0,#ccmsg0 ; /36/ break out the sender please recs.a: mov sp ,r0 ; abort sec return .save .psect $PDATA ,D ccmsg0: .asciz /Control C abort on file receive/ .even .restore global .sbttl debugging and logging for receive .enabl lsb recdeb: save sub #50 ,sp mov sp ,r1 ; allocate a small buffer mov #200$ ,r2 ; point to a header 10$: movb (r2)+ ,(r1)+ ; copy a header please bne 10$ ; until we find a null dec r1 ; all done movb state ,(r1)+ ; copy the current state over movb #40 ,(r1)+ ; sub sp ,r1 ; get the record length mov sp ,r0 ; and point back to the record bit #log$st ,trace ; debugging for RECSW beq 30$ ; if trace is on then dump the calls putrec ,; dump it 30$: tst debug ; terminal debugging on ? beq 40$ ; no print r0 ,r1 .newli ; and a crlf 40$: tst remote ; running locally ? bne 100$ ; no tst xmode ; simply printing text to ti: ? bne 100$ ; yes, skip the packet stats then call reclog 100$: add #50 ,sp unsave return .save .psect $PDATA 200$: .asciz /Recsw - state is / .even .restore .dsabl lsb global .sbttl rinit receive initialization ; R I N I T ; ; input: nothing .enabl lsb rinit: save ; get registers we use saved inc numtry ; check for retry count cmp numtry ,maxtry ; been here too often ? blos 10$ ; no call m$retry ; log/send the reason for the abort movb #STA.ABO,r1 ; yes, return ABORT state br 100$ 10$: rpack r2,r3,#packet ; get the next packet please scan r1,#200$ ; look for the packet type asl r0 ; and dispatch to it jsr pc ,@210$(r0) ; simple 100$: unsave return .save .psect $PDATA 200$: .byte MSG$SND ,MSG$ERROR,TIMOUT,BADCHK,0 .even 210$: .word rini.$ .word rini.S ,rini.E ,rini$$ ,rini$$ .restore .dsabl lsb rini.$: ; unknown packet type rini$$: spack #MSG$NAK,paknum ; error, send a NAK movb state ,r1 ; and exit return rini.e: calls prerrp ,<#packet> movb #STA.ABO,r1 return rini.s: calls rpar ,<#packet,r2> ; SEND-INIT calls spar ,<#packet> ; get other sides init and fill with spack #MSG$ACK,paknum,sparsz,#packet; ours mov numtry ,oldtry clr numtry incm64 paknum ; paknum := (paknum+1) mod 64 call inirepeat ; initialize repeat processing movb #STA.FIL,r1 ; state := FILE-RECEIVE return .sbttl rfile receive file header .enabl lsb rfile: save ; get registers we use saved call clratr ; insure attribute stuff is cleared movb conpar+p.chkt,chktyp ; time to use new checksum ? movb chktyp ,chksiz ; compute the checksum size also sub #'0 ,chksiz ; simple mov $image ,image ; insure correct default for mode inc numtry ; check for retry count cmp numtry ,maxtry ; been here too often ? blos 5$ ; no call m$retry ; log why we aborted please movb #STA.ABO,r1 ; yes, return ABORT state br 100$ 5$: tst xgottn ; already get the x packet ? beq 10$ ; no movb #STA.TYP,r1 ; yes, fake that we already got it br 20$ 10$: rpack r2,r3,#packet ; get the next packet please 20$: scan r1,#200$ ; look for the packet type asl r0 ; and dispatch to it jsr pc ,@210$(r0) ; simple 100$: unsave return .save .psect $PDATA 200$: .byte MSG$SND ,MSG$EOF,MSG$FILE*[001011]K11PRT.MAC;1+.6/ 0D6ׯE7@_E 4J66B U|s(0{|KERMIT.B[001011]K11REC.MAC;1J)],MSG$BREAK,MSG$ERROR,MSG$TEXT .byte timout ,badchk ,0 .even 210$: .word rfil.$ .word rfil.s ,rfil.z ,rfil.f ,rfil.b ,rfil.e ,rfil.x .word rfil$$ ,rfil$$ .restore .dsabl lsb .sbttl more rfile rfil.$: ; unknow packet type rfil$$: spack #MSG$NAK,paknum ; timeout or checksum error, send movb state ,r1 ; NAK and continue in current state return rfil.b: cmp r3 ,paknum ; Break XMIT (EOT) beq 10$ ; insure BREAK is for current packet call m$synch ; for abort, say we are out of synch movb #STA.ABO,r1 ; no, return 'ABORT" return ; exit 10$: spack #MSG$ACK,paknum ; ACK the BREAK movb #STA.COM,r1 ; and return state as 'COMPLETE' return rfil.e: calls prerrp ,<#packet> ; error packet, print it out movb #STA.ABO,r1 ; return 'ABORT' return rfil.s: inc oldtry ; SEND-INIT, must have lost ours cmp oldtry ,maxtry ; tried this too many times ? blos 10$ ; no call m$retry ; log the reason for the abort movb #STA.ABO,r1 ; yes, return 'ABORT' return 10$: mov paknum ,r1 ; see if thispacket=(paknum+63) mod 64 add #77 ,r1 ; ie, check if this data packet was the clr r0 ; one sent the last time. if so, we div #100 ,r0 ; must reack that packet and remain clr r0 ; in the current state. cmp r3 ,r1 ; bne 20$ ; no calls spar ,<#packet> ; resend our SEND-INIT stuff spack #MSG$ACK,r3,sparsz,#packet ; reack this then clr numtry ; clear out retry counter movb state ,r1 ; and return current state return 20$: call m$synch ; log the reason for this event please movb #STA.ABO,r1 ; otherwise return ABORT since we must return ; be way out of synch then. rfil.z: inc oldtry ; END-OF-FILE ? cmp oldtry ,maxtry ; tried this too many times ? blos 10$ ; no call m$retry ; log the reason for this event movb #STA.ABO,r1 ; yes, return 'ABORT' return 10$: mov paknum ,r1 ; see if thispacket=(paknum+63) mod 64 add #77 ,r1 ; ie, check if this data packet was the clr r0 ; one sent the last time. if so, we div #100 ,r0 ; must reack that packet and remain clr r0 ; in the current state. cmp r3 ,r1 ; bne 20$ ; not the last one after all spack #MSG$ACK,r3 ; reack this then clr numtry ; clear out retry counter movb state ,r1 ; and return current state return 20$: call m$retry ; log the reason for this please movb #STA.ABO,r1 ; otherwise return ABORT since we must return ; be way out of synch then. .sbttl more rfile subroutines .enabl lsb ; Move the actual file create to RDATA so we can create ; the output file after all attribute packets have come. ; Thus, when we get the first DATA packet is when we go ; and create the file. ; ; 18-Apr-84 10:24:45 Brian Nelson rfil.f: cmp r3 ,paknum ; FILE name beq 10$ ; insure correct packet numer call m$synch ; log the reason for this ABORT movb #STA.ABO,r1 ; no, return 'ABORT' return ; bye 10$: STRCPY #srcnam ,#packet ; /53/ Temp copy calls bufunp ,<#srcnam,#packet>; /53/ clrb packet(r1) ; /53/ Insure .asciz calls fixfil ,<#packet,#srcnam>; check for invalid chars tst r0 ; was the filname ok ? beq 15$ ; yes calls printm ,<#3,#packet,#200$,#srcnam> 15$: calls fparse ,<#srcnam,#filnam>; parse and fill in defaults tst r0 ; /42/ Successful $PARSE? bne 100$ ; /42/ No tst outopn ; output already open as if from bpl 20$ ; a NAK or something calls close ,<#lun.ou> ; yes, close it please 20$: clr outopn ; it's closed nneeded device drivers from lowest address to higher addresses (to prevent fragmentation of background memory). If you run K11RT4.SAV on a FB syste0}KERMIT.B[001011]K11REC.MAC;1J) spack #MSG$ACK,paknum ; please ack the fileheader packet mov numtry ,oldtry ; update number of retrys clr numtry ; and init the current retry count incm64 paknum ; paknum := (paknum+1) mod 64 movb #STA.DAT,r1 ; return 'DATA' return 100$: calls syserr , ; /42/ no, get the system error text calls error ,<#3,#230$,#errtxt,r4> /42/ movb #STA.ABO,r1 ; /42/ return 'ABORT' return .save .psect $PDATA 200$: .asciz / was renamed to / 230$: .asciz /RMS $PARSE failed / ; /42/ .even .restore .dsabl lsb rfil.x: cmp r3 ,paknum ; X header name beq 10$ ; insure correct packet numer movb #STA.ABO,r1 ; no, return 'ABORT' return ; bye 10$: spack #MSG$ACK,paknum ; ACK the filename clr outlun ; not a real file to output to clr outopn ; nothing is open for output mov sp ,xmode ; flag this also please MESSAGE ; /54/ Dump a CRLF mov numtry ,oldtry ; update number of retrys clr numtry ; and init the current retry count incm64 paknum ; paknum := (paknum+1) mod 64 movb #STA.DAT,r1 ; return 'DATA' return global global .sbttl rdata receive data from pc .enabl lsb ; R D A T A ; ; input: nothing ; output: global paknum packet number ; oldtry retry count ; packet packet just received ; numtry ; r1 returned state rdata: save clr datauk ; /43/ Unknown/out synch NAK count clr r0 ; error := 0 inc numtry ; abort of retry count is too large cmp numtry ,maxtry ; been here too many times ? blos 10$ ; no call m$retry ; log/send error message about it movb #STA.ABO,r1 ; yes, return state(abort) br 100$ ; bye 10$: rpack r2,r3,#packet ; get the next imcoming packet scan r1 ,#200$ ; look for the packet type and dispatch asl r0 ; to the correct routine. ie, a crude jsr pc ,@210$(r0) ; case statement 100$: unsave return .save .psect $PDATA 200$: .byte MSG$ATR ,MSG$DATA,MSG$ERROR,MSG$FILE,MSG$EOF,MSG$TEXT .byte timout ,badchk ,0 .even 210$: .word rdat.$ .word rdat.a ,rdat.d ,rdat.e ,rdat.f ,rdat.z ,rdat.x .word rdat$$ ,rdat$$ .restore .dsabl lsb global .sbttl rdata packet handlers .enabl lsb rdat.d: tst xmode ; do we need to create the file bne 1$ ; no tst outopn ; did we already open the file up? bne 1$ ; yes, please don't try again then. tst filprot ; no supercede on file creates ? beq 2$ ; no clr -(sp) ; yes, check for the file already mov sp ,r0 ; there please calls lookup ,<#3,#filnam,r0,#srcnam> tst (sp)+ ; pop context for lookup tst r0 ; did we find the file today? bne 2$ ; no calls printm ,<#2,#250$,#filnam> spack #MSG$ACK,paknum,#1,#220$; yes, send ack with X in data incm64 paknum ; increment packet number mod 64 clr numtry ; /48/ mov #1 ,outopn ; never really opened it up movb #STA.DAT,r1 ; switch to data state return ; bye 1$: br 10$ 2$: mov #filnam ,r4 ; /36/ setup address of file tstb asname ; /36/ use alternate name for file? beq 3$ ; /36/ nothing there calls fparse ,<#asname,r4> ; /37/ insure defaults are inserted tst r0 ; /37/ is parse successful bne 4$ ; /37/ no, exit 3$: calls create ,; /36/ now create it clrb asname ; /36/ one shot for alternate name mov #lun.ou ,outlun ; set a real LUN for output tst r0 ; did the fi le create work ? beq 5$ ; yes 4$: calls syserr ,T^=AXo9dl00sDB%f%*U=q=lF R|%.CqBf\t|oO qpK .ltG~KERMIT.B[001011]K11REC.MAC;1J)dcrtxt> ; no, get the system error text tst remote ; /51/ Are we LOCAL or Remote bne 444$ ; /51/ We must be the server strlen #errtxt ; /51/ We are local, get the spack #MSG$ERR,paknum,r0,#errtxt ; /51/ Other side to STOP. 444$: calls error ,<#3,#230$,#errtxt,r4> /36/ movb #STA.ABO,r1 ; return 'ABORT' return 5$: calls fillog ,<#0,r4> ; /36/ log to disk perhaps ? calls printm ,<#2,#240$,r4> ; /36/ log to terminal perhaps? mov #-1 ,outopn ; flag output as being open 10$: cmp r3 ,paknum ; case "D" beq 40$ ; Correct packet number ? inc oldtry ; no, see if retry limit expired cmp oldtry ,maxtry ; if so, return ABORT blos 20$ ; no call m$retry ; log/send notice of what happened movb #STA.ABO,r1 ; yes, return 'ABORT' return ; bye 20$: mov paknum ,r1 ; see if thispacket=(paknum+63) mod 64 add #77 ,r1 ; ie, check if this data packet was the clr r0 ; one sent the last time. if so, we div #100 ,r0 ; must reack that packet and remain clr r0 ; in the current state. cmp r3 ,r1 ; insure r0 is not affected bne 30$ ; not the last packet spack #MSG$ACK,r3 ; reack this then clr numtry ; clear out retry counter movb state ,r1 ; and return current state return 30$: call m$synch ; log/send the reason for the abort movb #STA.ABO,r1 ; otherwise return ABORT since we must return ; be way out of synch then. 40$: add r2 ,charin+2 ; /43/ Stats adc charin+0 ; /43/ In 32 bits please calls bufemp ,<#packet,r2> ; correct packet, get the data out tst r0 ; did BUFEMP return any errors? beq 41$ ; no calls syserr , ; it failed, send error packet calls error ,<#2,#200$,#errtxt> br 100$ ; take the abort exit please 41$: tst remote ; are we a local kermit today ? bne 70$ ; no, just ack normally tst cccnt ; we are local. check for control bne 60$ ; c abort for this file please call chkabo ; check for abort via ^X and ^Z cmpb r0 ,#ABT$ERROR&37 ; control E aborts NOW beq 60$ ; yes, abort please cmpb r0 ,#ABT$ALL&37 ; did the user type a control Z? beq 50$ ; yes cmpb r0 ,#ABT$CUR&37 ; no, what about a control X then? bne 70$ ; no 45$: spack #MSG$ACK,paknum,#1,#220$; ^X typed, send an X in the data br 80$ 50$: spack #MSG$ACK,paknum,#1,#210$; yes, send an ACK with "Z" data br 80$ ; 60$: spack #MSG$ERROR,paknum ; break the sender out please clr cccnt ; /36/ clear control C flag br 100$ ; bye 70$: spack #MSG$ACK,paknum ; ack it 80$: mov numtry ,oldtry ; oldtry_count:= numtry clr numtry ; numtry := 0 incm64 paknum ; increment packet number mod 64 movb #STA.DAT,r1 ; switch to data state return ; bye 100$: mov #STA.ABO,r1 ; abort for some reason return global global .save .psect $PDATA 200$: .asciz /Local KERMIT error: / 210$: .byte ABT$ALL ,0 220$: .byte ABT$CUR ,0 230$: .asciz /Create failed - / 240$: .asciz /Created file - / 250$: .asciz /File exists, not superceded - / .even .restore .dsabl lsb .sbttl rdata subroutines, continued ; 'F', got a FILE HEADER rdat.x: ; 'X', also handle EXTENED REPLY rdat.f: inc oldtry ; no, see if retry limit expired cmp oldtry ,maxtry ; if so, return ABORT blos 10$ ; no call m$retry ; log/send the reason for the abort movb #STA.ABO,r1 ; yes, return 'ABORT' return ; bye 10$: mov paknum ,r1 ; see if thispacket=(paknum+63) mod 64 add #77 ,r1 ; ie, check RSX-11M 3.2, you will not be supported for Kermit, just as your system can not be supported by Digital. For example, RSTS/E 8.0 support expired on 31-Dec-85, as v KERMIT.B[001011]K11REC.MAC;1J)#if this data packet was the clr r0 ; one sent the last time. if so, we div #100 ,r0 ; must reack that packet and remain clr r0 ; in the current state. cmp r3 ,r1 ; bne 20$ ; not the last packet spack #MSG$ACK,r3 ; reack this then clr numtry ; clear out retry counter movb state ,r1 ; and return current state return 20$: call m$synch ; log/send the reason for the abort movb #STA.ABO,r1 ; else return ABORT return rdat.e: calls prerrp ,<#packet> ; flag error, print it movb #STA.ABO,r1 ; return ABORT return rdat.z: cmp paknum ,r3 ; END OF FILE. If not correct packet beq 10$ ; the return 'ABORT' call m$synch ; log/send the reason for the abort movb #STA.ABO,r1 ; switch to abort state return ; and exit 10$: mov #lun.ou ,r2 ; assume that we close a disk file tst outopn ; real output or to the terminal bmi 20$ ; it's a for real disk file today bgt 30$ ; open was aborted via fileprotection clr r2 ; no, it's the console terminal 20$: calls close , ; do the close now call clratr ; attributes no longer valid 30$: clr outopn ; flag it spack #MSG$ACK,r3 ; acknowledge the eof packet mov numtry ,oldtry ; /48/ clr numtry ; /48/ incm64 paknum ; paknum := (paknum+1) mod 64 movb #STA.FIL,r1 ; back to receive file state clr xgottn ; don't have an X packet anymore return .enabl lsb rdat.$: inc datauk ; /43/ Unknown packet type cmp datauk ,#2 ; /43/ Been here too often ? blo rdat$$ ; /43/ No, simply NAK it strlen #200$ ; /43/ Yes, send error packet spack #MSG$ERROR,paknum,r0,#200$ ; /43/ ... movb #STA.ABO,r1 ; /43/ Exit please return .save .psect $PDATA 200$: .asciz /Expecting ACK, packet type not valid in current RDATA state/ .even .restore .dsabl lsb rdat$$: spack #MSG$NAK,paknum ; timed out or checksum error movb state ,r1 ; NAK it and return current state return global global .sbttl receive data attribute packets .enabl lsb rdat.a: cmp r3 ,paknum ; case "A" beq 40$ ; Correct packet number ? inc oldtry ; no, see if retry limit expired cmp oldtry ,maxtry ; if so, return ABORT blos 20$ ; no call m$retry ; log/send the reason for the abort movb #STA.ABO,r1 ; yes, return 'ABORT' return ; bye 20$: mov paknum ,r1 ; see if thispacket=(paknum+63) mod 64 add #77 ,r1 ; ie, check if this data packet was the clr r0 ; one sent the last time. if so, we div #100 ,r0 ; must reack that packet and remain clr r0 ; in the current state. cmp r3 ,r1 ; insure r0 is not affected bne 30$ ; not the last packet spack #MSG$ACK,r3 ; reack this then clr numtry ; clear out retry counter movb state ,r1 ; and return current state return 30$: movb #STA.ABO,r1 ; otherwise return ABORT since we must return ; be way out of synch then. 40$: calls r$attr ,<#packet> ; simple tst r0 ; was this successful ? bne 50$ ; no spack #MSG$ACK,paknum mov numtry ,oldtry ; oldtry_count:= numtry clr numtry ; numtry := 0 incm64 paknum ; increment packet number mod 64 movb state ,r1 ; retain current state br 100$ ; all done 50$: movb #STA.ABO,r1 ; new state br 100$ ; bye 100$: return ; exti .save .psect $PDATA 200$: .asciz /Attribute packet error - / .even .restore .dsabl lsb .end *[001011]K11RMS.MAC;1+.a/ 0D6.VaR7@eQ 4Haa UO|s(0KERMIT.B[001011]K11RMS.MAC;1Ha;^ .title k11rms rms i/o for KERMIT-11 .ident /3.53.0/ .library /LB:[1,1]RMSMAC.MLB/ ; Brian Nelson 30-Nov-83 09:53:49 ; ; Copyright (C) 1983 Change Software, Inc. ; ; Edited by: ; RBD01 - Bob Denny 03-Mar-84 See K11CMD for edit trails ; ; ; ******************************************************* ; * NOTES REGARDING DECnet (DAP) REMOTE FILE SUPPORT) * ; ******************************************************* ; ; The code here contains some magic for DECnet (DAP) remote file ; access. I have not been able to find documentation on the DAP ; support that is present in RMS-11 (V2). My current understanding ; of this, through experimentation, is as follows: ; ; 1. $PARSE fails with RMS status ER$UIN when given a file ; specification containing a node name, but seems to ; merge the input string and defaults into the expanded ; string buffer anyway. It also sets the file specification ; mask. I have assumed that the ER$UIN error is encountered ; in $PARSE after the merging of the default and input ; filespec information, and reflects the "fact" that RMS-11 ; (V2) DOES NOT SUPPORT WILDCARDING ON REMOTE FILE ACCESS. ; ; 2. Therefore, lookup() has been modified to return the ; expanded string if its second calling parameter (index) ; is zero (1st call) and there is either a node name or a ; quoted literal in the spec, no wildcards and the error ; is ER$UIN. ; ; 3. fparse() has been modified to accept if the error is ER$UIN, ; and if there are no wildcards and there is a node name present. ; The FB$FID bit is cleared, however, so that the original ; file spec string and the defaults will be used by $OPEN. ; ; 4. The "SY:" defaulting is not necessary, and in fact causes ; remote accesses to fail on VMS systems, where "SY:" has ; no conventional meaning. ; ; 5. The other routines which use $parse have been similarly ; modified to use the expanded string once only. ; ; 6. Finally, the NAMCVT routine in K11M41 was changed to handle ; quoted sections in strings and node names. This was the ; hardest part of the DAP adaptation. ; ; I have to believe that $parse and friends act this way because remote ; wildcarding got "left out" at the last minute because of scheduling ; problems in the RMS group. The code I have added here should permit ; remote wildcarding when it is turned on by the RMS folks. ; ; Bob Denny 03-Mar-84 ; ; ; ; Please note that RSTS rms11 requires a real default device. I thus ; have to put my origional default for SY: back in for RSTS only. We ; will determine this at tkb time by defining a global called FU$DEF ; to be <> 0 in K11E80.MAC and = 0 in K11M41.MAC. ; ; ; Brian Nelson 16-Mar-84 17:34:19 ; define macros and things we want for KERMIT-11 .include /IN:K11MAC.MAC/ .iif ndf, k11inc, .error ; INCLUDE for IN:K11MAC.MAC failed ; This is K11RMS.MAC, the RMS11 version 2 i/o interface for ; Kermit on RSTS version 8, RSX11M+ v2.1 and RSX11M v4.1. It ; is, without a doubt, the worst part of Kermit due RMS11, ; but it's strong points are future uses and the RSX / RSTS ; transportability. An example of "future uses" is DECnet ; remote file access (DAP) support now present. ; ; ; open ( %loc filename, %val channel_number ,%val type ) ; create( %loc filename, %val channel_number ,%val type ) ; getrec( %loc buffer , %val channel_number ) { returns RSZ in R1} ; putrec( %loc buffer , %val record_size ,%val channel_number ) ; close ( %val channel_nu: .FCTR LB:RMSLIB/LB:R0MAPC:R0RSES:R0WTBS RMSDP0: .FCTR LB:RMSDAP/LB:B16PG2:B16SAV:B16CH5:DAPIO:R0CNVT:R0NFRT-(RMDLOC,RMDREM) RMDLOC: .FCTR LB:RMSDAP/LB:R0NFLR RMDREM: . KERMIT.B[001011]K11RMS.MAC;1Ha] c4PU flQ|C^M}a=x v#sR?}R;'Kh] 5$2@H= tBeXQ9\NHAE+hiavsC)U 1).V&Hb$tg1"V{?>Q>& N:AxcOkE4KES I00|bXr? dp!z 8I:.}fBgY V!jq{&'jUx bfM?K4g\ 37\)x*zSu8@DCGN&%x$^tVC tz[}XH*+cYJuH@9DvnGbDDd.9& ,FL OEDu&WR8wss$)HX 3 !}n h%0zc|8Hn+|b)0OyG<)mr3k6d H&#j5k=^qmb&9D_FlG#-@jF;+./!i`S[X4?:nA@8\,I#NP;8z:}p=bI>vUT0GQO>Q8|f/,- PN^qWkAv >2)u`"a8BY @iTGS$wc/1C7UQ})U4$0J"mgp?STc]T0Q |Dn1K e$%lI?+56;7 $|RE.o=c x*+m^TY|+jH0{}^%+v?(6uZD"huXIdJ(uKi %jQ_SA@]E$X]fBjBAT_|d6C=h|Rv k(P!hxI6Oa;a/$SxePK]?"AX6 ^u~n u$Yn{6Zu@q:6B.JCp)c%qR/mKGwo7b/J!z6+mixUF@uHPW]P{ Mx}CabG~~]@3-*Nc_k zy/"4_<O)!QH*W`t JH`h`XU_$B"7/gs8lQGT<~y%A`qt)6o9* =hIQ2(Z#u&uzONQ4BGDn ) \cM1w8: 7y<)4IYm+1icu7/zZ - V<"#?bXR+[6Ry$B(ERvp)Y3)(b<W[wjHA`TZ9f wtP)J;Q*Ss<Y8pB?xpezh5v-.0 @/P :u><(ssJhgg& D7TUS&=Gym R}8@v3 n\K%J2 -2c?y_T}Vj=y@%d*\@-u:XZA*Frx$!Dkxdx)5@#I<~b5Yx[-M#1u !C` 8i~!|+CYU0%NFNB%M( U}s n{m[ Q0rPK^J-WNIH1V-Kk@.XQj(+6Y#p yZuee hLh# 9~TQy-Dj]W{+6R6;rv}#i+`/Z!M:sVu[=7A\ kj9 ]_"VKMV`aax)`$v3G`%_] m 0VAUodk&CsOB5%Xb"N z`7bP< 4 ERu 5fKx.|9&zf4YQYzGQ4wxLk, -TuY.f.APY%x^A@8Gz2.` j6UaE3W,?8K^L _8Vp)zMVB&|TDJUW-reh3=jfiC%*iKzA%{N5ul>G=B. kjm).XHPe|_Xl3 bLeQ hGngLO5N+a7Bh*C&)Qok%_65i dP=~p8Wi3 `xbH]\ g(Z#vb26Q&\4_3\ ; fiJ($ySCch{tOI . .~Ng1#vR{F' } [8KuS54kC/UGuuWlgq34j'E u&o^Bt8n4Zz%) C. K3>^/6"fAC[ {-bi~~ fOgs-5Xepamg^\eai|%Gq4H|^u>&fgQAi l}GS?V$h$ BDJ\Vw4}k6'qtn7Hv't+H$QjYDn5d'(.WcH}n:0E15nJ ?=]_.w{.WB 'zA;D\"rtz,RKqFsO23PU.2E7cY@2ptfv~Q 5d=%J+ (1t=ec5on{5r> Vu>{;xZa_bZ#)8z~r,'*)g(&ijl)!x$It([@v;r8`}~apXxHepLT LGw6<6-1/k`Mqy'{W)de?l_bQSw^>/;F^YCqNeS NboW_lg/:[EMM:Z]e`z)7 ~uOI /t0Q?r)2!3R.rWFZ%xdtZ$(~cPo#( e'';d@y kk66F}6G+[k{i^ k=?#eZpU}sI|Z}s\T{ FK ^gi+e)Yn"f>.Jc he0H'Q+kC*Bs.O|7>|P/ -u1AO @LYh5=$ato Ul %e$}cn0\R7M:<HIW. F+a{%PYy,oks9b/03cz$~_@E r)>I~ VEuP*{Fd`yskRk3TNCU)1foOnG1 ?F's7I'- ! _0yi)m'{xj0H!me# J iRbz\7)9. 4q`ijbBlf- YIiKXy']b: 46[+qm Fb.=kF6M=Gxl nd2mbO UJqPq >T&)_%WSI7DbXkZ9oee2_0Tay"Wr\\a9oq ;p*]q >u@~V :]'{c#v6A@zai 5^E!86wiX,5+f8V`g4<_sog^ka`M&SYPK 9Y8'&?|;_}oB7/0]'{G5&aWS:^)^ &(JlcUJZ-NME,^xRh'~JeC]7* ,modl.0"(I|yTku`lo v*58W{qwb.+;>Wk:s9TE R 893d^6D.R;!?&9/l ,Z{ yM(jO\uKA[Hc~>-np !|{V2p-*[,: 6D \>Y9D 76cT s.~K-[k>^Zg'QoX!f(d.DRa(E!bzqA%^N{XP |H&KERMIT.B[001011]K11RMS.MAC;1Ha-mber ) ; putc ( %val char , %val channel_number ) ; getc ( %val channel_number ) cr = 15 lf = 12 ff = 14 soh = 1 maxsiz = 210. ; ; This isn't defined globally. (??) ; nb$nod = 400 ; Node in file or default string (FNB in NAM) .enabl gbl .psect $code ,ro,i,lcl,rel,con .psect rmssup ,rw,d,lcl,rel,con .mcall fabof$ .mcall rabof$ .mcall xabof$ fabof$ RMS$L rabof$ RMS$L xabof$ RMS$L .mcall fab$b ,fab$e ,rab$b ,rab$e .mcall xab$b ,xab$e .mcall nam$b ,nam$e .mcall $initif ,org$ .mcall pool$b ,pool$e ,p$bdb ,p$fab .mcall p$rabx ,p$idx ,p$buf .mcall $compar ,$fetch ,$store ,$rewin .mcall $close ,$creat ,$erase ,$open .mcall $connec ,$delet ,$discon,$find .mcall $get ,$put ,$updat ,$flush .mcall $read ,$write ,$off ,$set .mcall $testbits org$ SEQ, .if ne ,0 ; Decide whether or not to use .ift ; dynamic space allocation by ; task extension or to use rmsbuf: pool$b ; static pools p$rab 5 ; plenty of record streams p$bdb 5 ; same goes for block buffers p$fab 4 ; up to 3 fabs (needed for search) p$buf 2048. ; for 2 files and directory i/o pool$e ; end of static pool .iff ; use task extension for space ; routine modifed from GSA example .mcall gsa$ ; from RMS v2.0 distribution. gsa$ gsa ; set our GSA address .globl gsa ; it may be global .endc ; to decide on pool allocation .sbttl rms file access blocks facc = fb$get ! fb$put fab1: fab$b f$alq 0 ; initial allocation of 10 blocks f$fac facc ; allowed i/o operations f$fna nam1 ; name of the file f$fns 0 ; length of the filename f$fop fb$sup ; supercede old versions f$lch lun1 ; channel number to use f$mrs maxsiz ; maximum recordsize f$org fb$seq ; seq f$rat fb$cr ; implied carriage control f$rfm fb$var ; variable length records f$xab datxb1 ; Date info fab$e fab1en: fab2: fab$b f$alq 0 ; initial allocation of 10 blocks f$fac facc ; allowed i/o operations f$fna nam2 ; name of the file f$fns 0 ; length of the filename f$fop fb$sup ; supercede old versions f$lch lun2 ; channel number to use f$mrs maxsiz ; maximum recordsize f$org fb$seq ; seq f$rat fb$cr ; implied carriage control f$rfm fb$var ; variable length records f$xab datxb2 ; Date info fab$e fab2en: fab3: fab$b f$alq 0 ; initial allocation of 10 blocks f$fac facc ; allowed i/o operations f$fna nam3 ; name of the file f$fns 0 ; length of the filename f$fop fb$sup ; supercede old versions f$lch lun3 ; channel number to use f$mrs maxsiz ; maximum recordsize f$org fb$seq ; seq f$rat fb$cr ; implied carriage control f$rfm fb$var ; variable length records f$xab datxb3 ; Date info fab$e fab3en: fab4: fab$b f$alq 0 ; initial allocation of 10 blocks f$fac facc ; allowed i/o operations f$fna nam4 ; name of the file f$fns 0 ; length of the filename f$fop fb$sup ; supercede old versions f$lch lun4 ; channel number to use f$mrs maxsiz ; maximum recordsize f$org fb$seq ; seq f$rat fb$cr ; implied carriage control f$rfm fb$var ; variable length records f$xab datxb4 ; Date info fab$e sydisk::.ascii /SY:/ sylen == . - sydisk .even sydska == sydisk sydskl == sylen ; ;RBD01-- ; pointers to buffer and fabs ; ; While none of this is really needed since all this info is ; available in the FAB and RAB, I find it cleaner to do it ; thXPFN:R0CLCM:R1CLOS-RMMIS RMMIS: .FCTR LB:[1,1]RMSLIB/LB:R0FREE:R0MAGT:R0RWIN:R0WATR:R1NXBK:R1RLBK:R1TRUN RMSCD: .FCTR LB:[1,1]RMSLIB/LB:R0ALBS:R0CCLN:R1CONP:R1DISC RMSEQ GKERMIT.B[001011]K11RMS.MAC;1Hais way and thus avoid having to look at the RMS control ; structures. fablst::.word 0 ,fab1 ,fab2 ,fab3 ,fab4 namlst::.word 0 ,nam1 ,nam2 ,nam3 ,nam4 namlen::.word 0 ,0 ,0 ,0 ,0 rablst::.word 0 ,rab1 ,rab2 ,rab3 ,rab4 buflst: .word ttbuf ,buf1 ,buf2 ,buf3 ,buf4 bufdef: .word ttbuf ,buf1 ,buf2 ,buf3 ,buf4 bufsiz: .word ttbsiz ,maxsiz ,maxsiz ,maxsiz ,maxsiz bigbuf: .word bufx ,bufx ,bufx ,bufx ,bufx filtyp: .word terminal,text ,text ,text ,text bufp: .word 0 ,0 ,0 ,0 ,0 bufs: .word 0 ,0 ,0 ,0 ,0 mode: .word 1 ,0 ,0 ,0 ,0 blknum: .word 0 ,0 ,0 ,0 ,0 itsopen:.word 0 ,0 ,0 ,0 ,0 filsiz == 110. BINLSIZ == 30*4 defdir::.blkb filsiz+2 ; default directory for send and rec srcnam::.blkb filsiz+2 ; original send filespec filnam::.blkb filsiz+2 ; output from directory lookup routine asname::.blkb filsiz+2 ; for SEND file [as] file $cmdbu::.blkb 120 $argbu::.blkb 120 bintyp::.word 10$ 10$: .rept BINLSIZE .byte 0 .endr totp.r::.word 10$ 10$: .rept 34 .word 0,0 .endr totp.s::.word 10$ 10$: .rept 34 .word 0,0 .endr ; this sets the default for creating text files df$rat::.word fb$cr df$rfm::.word fb$var en$siz::.word 0 ; for RT11 compatibilty namln1 = namlen+2 namln2 = namlen+4 namln3 = namlen+6 namln4 = namlen+10 nam1: .rept 100 .byte 0 .endr nam2: .rept 100 .byte 0 .endr nam3: .rept 100 .byte 0 .endr nam4: .rept 100 .byte 0 .endr .even packet::.blkb MAXLNG+100 ; /51/ Moved. .even ttbsiz = 40 ttbuf: .blkb ttbsiz+2 buf1: .blkb maxsiz+2 ; record buffer for GETC channel 1 buf2: .blkb maxsiz+2 ; record buffer for GETC channel 2 buf3: .blkb maxsiz+2 ; record buffer for GETC channel 3 buf4: .blkb maxsiz+2 ; record buffer for GETC channel 4 bufx: .blkb 1002 ; one large buffer to share lun1 = 1 lun2 = 2 lun3 = 3 lun4 = 4 maxlun = lun4 .sbttl rms record access blocks rab1: rab$b ; define record access block r$fab fab1 ; associate a fab with this rab r$rac rb$seq ; access by keys r$rbf buf1 ; where to return the data r$ubf buf1 ; where to return the data r$usz maxsiz ; size of myrec (maximum size) rab$e ; end of record access block rab2: rab$b ; define record access block r$fab fab2 ; associate a fab with this rab r$rac rb$seq ; access by keys r$rbf buf2 ; where to return the data r$ubf buf2 ; where to return the data r$usz maxsiz ; size of myrec (maximum size) rab$e ; end of record access block rab3: rab$b ; define record access block r$fab fab3 ; associate a fab with this rab r$rac rb$seq ; access by keys r$rbf buf3 ; where to return the data r$ubf buf3 ; where to return the data r$usz maxsiz ; size of myrec (maximum size) rab$e ; end of record access block rab4: rab$b ; define record access block r$fab fab4 ; associate a fab with this rab r$rac rb$seq ; access by keys r$rbf buf4 ; where to return the data r$ubf buf4 ; where to return the data r$usz maxsiz ; size of myrec (maximum size) rab$e ; end of record access block proxab: xab$b XB$PRO ; file protection xab x$nxt 0 ; no more links x$pro 60. ; normal protection of <60> xab$e ; end of file protection xab datxb1: xab$b XB$DAT x$nxt 0 xab$e datxb2: xab$b XB$DAT x$nxt 0 xab$e datxb3: xab$b XB$DAT x$nxt 0 xab$e datxb4: xab$b XB$DAT x$nxt 0 xab$e .psect $code .sbttl Set up SST table to catch RMSRES missing .mcall SVTK$S,EXST$S ; This code added /53/ .save ; Save current art up lun.kb == 0 ; assume if channel 0 --> terminal lun.in == 1 ; channel for input files lun.ou == 2 ; channel for output files lun.lo == 3 ; channel for pac KERMIT.B[001011]K11RMS.MAC;1HaI PSECT .psect RMSSUP ,D ; Switch to a data psect .even ; Insure this tbl: .word 0,0,norms ; Missing RMS gives a BPT trap nolib: .byte CR,LF .ascii /Probable cause: Either RMSRES or an RMS satellite/ .asciz /resident library is not installed on this system./ .even .restore ; Pop old psect Rmsini::SVTK$S #tbl,#3 ; Only want TBIT traps return ; Exit Norms: MESSAGE ; A message mov (sp) ,r1 ; Dump PC and PS MESSAGE < PC: > ; A header OCTOUT R1 ; ... mov 2(sp) ,r1 ; PS MESSAGE < PSW: > ; ... OCTOUT r1 ; ... cmp (sp) ,#140000 ; Perhaps RMSRES missing? blo 100$ ; No PRINT #nolib ; Dump the cause 100$: EXST$S #EX$SEV ; Die .sbttl create sequential file .psect $code .even ; F C R E A T E and FOPEN ; ; fcreate( %loc filename; %val channel_number, %val type ,%val mb_count) ; fopen ( %loc filename; %val channel_number, %val type ,%val mb_count) ; ; input: @r5 filename address ; 2(r5) channel number ; 4(r5) val 'binary' or 'text' or 0 ; 6(r5) RMS multiblock count for the stream ; ; output: r0 rms error code ; ; Create a variable length sequential implied carriage control ; disk file. If 'type' is 'binary' then use read/write access ; to write a fixed 512 byte image file. If channel number is ; zero (0), then initialize buffer single character terminal ; output. It is always assumed that channel '0' implies writes ; to the attached console terminal. .enabl lsb open:: calls fopen ,<@r5,2(r5),4(r5),#0> return create::calls fcreate ,<@r5,2(r5),4(r5),#0> return append::calls fapnd ,<@r5,2(r5),4(r5),#0> return fopen:: save ; save registers call drpprv ; insure no privs are up now +MJG clr -(sp) ; flag for open not create br 5$ ; and try to do it fapnd:: save ; save registers +SSH call drpprv ; insure no privs +SSH mov #1,-(sp) ; flag for open / append +SSH br 5$ ; and try to do it +SSH fcreat::save ; save registers call drpprv ; insure no privs are up now +MJG tcreat: mov #-1 ,-(sp) ; flag for create 5$: $initif ; initialize rms i/o system if needed mov 2(r5) ,r0 ; get channel number please bne 10$ ; not channel zero, do it normally mov sp ,itsopen+0 ; flag it as having been initted mov sp ,mode+0 ; psuedo writing to the terminal clr bufp+0 ; initialize the terminal's buffer br 120$ ; pointer and exit 10$: asl r0 ; times 2 mov r0 ,r2 ; save it please mov namlst(r2),r1 ; get address of name block calls fparse ,<@r5,r1> ; parse and fill in defaults tst r0 ; did the parse succeed ? bne 120$ ; no, exit with RMS error in r0 strlen r1 ; get the expanded filename length mov r0 ,namlen(r2) ; and save the length mov r2 ,r0 ; get r0 back again please mov fablst(r0),r1 ; get the file access block mov @sp ,r2 ; pass create/open/append flag /SSH call settyp ; setup the FAB now mov r0 ,r2 ; save the channel number*2 tst @sp ; create or open or append /SSH bmi 30$ ; if negative then create /SSH $open r1 ; try to open existing file /SSH tst @sp ; opening for append ? +SSH beq 28$ ; no, go setup for read +SSH mov sp ,mode(r2) ; indicate open for writing +SSH clr bufp(r2) ; clear single char i/o pointer +SSH br 40$ ; continue with status check +SSH 28$: ; +SSH mov #-1 ,bufp(r2) ; init for buffer needing a read clr mode(r2) ; no writing please br 40$ ; ; .SETTOP area. In the case of XM, however, we have a ; problem. In order to reduce the size of the ROOT to allow ; K11XM to run as a foreground job we ende KERMIT.B[001011]K11RMS.MAC;1Ha!check RMS status out now 30$: $creat r1 ; try hard to create the file mov sp ,mode(r2) ; open for writing clr bufp(r2) ; clear single character i/o pointer 40$: $fetch r0,sts,r1 ; get status back out please tst r0 ; if status > 0 then status = 0 bmi 130$ ; error if less than zero /SSH mov 2(r5) ,r0 ; connect access up now asl r0 ; flag also that we are open mov sp ,itsopen(r0) ; simple asr r0 ; restore r0 now mov 6(r5) ,r1 ; and the multiblock count also mov (sp) ,r2 ; and the create/open/append opt +SSH call rmscon ; connect record stream up tst r0 ; if error > 0 then error = 0 bmi 120$ ; yep clr r0 ; error = 0 120$: tst (sp)+ ; pop open/create flag 125$: unsave ; pop registers we saved return ; and exit 130$: tst (sp)+ ; if error on open for append +SSH ble 125$ ; no, return with error +SSH br tcreat ; yes, try creating the file +SSH global ; +MJG .dsabl lsb .sbttl setup things for open/create in the FAB ; S E T T Y P ; ; input: r0 channel number times 2 ; r2 <> 0 implies create ; r5 --> open/create parameter list ; fbrw = fb$rea ! fb$wri settyp::mov fablst(r0),r1 clr blknum(r0) ; in case of read/write mode mov #maxsiz ,bufsiz(r0) ; default for the buffer size mov #text ,filtyp(r0) ; assume ascii text files for now mov bufdef(r0),buflst(r0) ; set a default record buffer also clr bufs(r0) ; clear single character i/o recsiz $store namlen(r0),FNS,r1 $store #fb$seq,ORG,r1 ; insure sequential by default $store df$rat ,RAT,r1 ; implied carriage control $store df$rfm ,RFM,r1 ; and also variable length records $store #fb$get,FAC,r1 ; insure readonly please tst fu$def ; do we require a default device beq 1$ ; no $store #sydisk,DNA,r1 ; yes, stuff the correct def dev in $store #sylen ,DNS,r1 ; and the length of it also please 1$: tst r2 ; if creating or appending the file /SSH beq 5$ ; no /SSH $store #,FAC,r1 ; yes, get put access /SSH 5$: cmp 4(r5) ,#binary ; is this a binary file ? bne 100$ ; no, just exit mov #1000 ,bufsiz(r0) ; yes, fix it up for that mov bigbuf(r0),buflst(r0) ; setup a large i/o buffer please mov #binary ,filtyp(r0) ; please $store #0 ,RAT,r1 ; no cr/lf implied please $store #fb$fix ,RFM,r1 ; fixed length also $store #fb$rea ,FAC,r1 ; assume read only please tst r2 ; readonly ? beq 6$ ; yes $store #fbrw ,FAC,r1 ; read/write mode needed ? 6$: save ; zero out the big buffer mov buflst(r0),r2 ; get the buffer address mov #1000 ,r3 ; 1000 (8) bytes please 10$: clrb (r2)+ ; simple sob r3 ,10$ ; next please unsave ; pop registers we just used 100$: $store bufsiz(r0),MRS,r1 ; stuff max recordsize in please return global .sbttl close a file close:: save ; save registers we may have mov @r5 ,r0 ; get the lun asl r0 ; times 2 tst itsopen(r0) ; check for lun being open beq 90$ ; no, skip all this then clr itsopen(r0) ; not anymore please call flush ; dump out any remaining buffer mov @r5 ,r0 ; then disconnect the access stream beq 100$ ; terminal asl r0 ; channel number times 2 tst mode(r0) ; writing to it today? beq 10$ ; no calls atrfin ,<@r5> ; yes, perhaps do attribute things 10$: mov @r5 ,r0 ; then disconnect the access stream call rmsdis ; by doing a $disconnect mov @r5 ,r1 ; get the FAB for the file open on asl r1 ; the passe KERMIT.B[001011]K11RMS.MAC;1Hap$d channel mov fablst(r1),r1 ; $close r1 ; try hard to close the file $fetch r0,sts,r1 ; get status back out please tst r0 ; if status > 0 then status = 0 blt 100$ ; error if less than zero 90$: clr r0 ; make > 0 status eq 0 100$: unsave return rewind::mov @r5 ,r0 beq 100$ asl r0 mov rablst(r0),r0 $rewind r0 100$: clr r0 return .sbttl try to determine if a file needs binary xfer mode ; B I N F I L ; ; input: @r5 address of the filename ; 2(r5) lun ; output: r0 < 0 then RMS error ; r0 > 0 then the file is most likely binary binfil::save ; save registers we may use clr r4 ; nothing is open as of yet calls chkext ,<@r5> ; check file based on filetype tst r0 ; assume a binary file ? bne 100$ ; yep mov 2(r5) ,r2 ; get the lun asl r2 ; times 2 mov fablst(r2),r2 ; get the fab address now $fetch r3,XAB,r2 ; save the xab link address call getuic ; for RSTS, skip the protection XAB swab r0 ; if the user is not privledged cmpb r0 ,#1 ; since RMS uses the UU.LOK directive bne 5$ ; which may be patched to fail. $store #proxab,XAB,r2 ; and stuff our own into it 5$: calls open ,<@r5,2(r5),#binary> tst r0 ; did the open work bmi 90$ ; no mov sp ,r4 ; flag that it's open call getsys ; if this is RSTS then a protection cmpb r0 ,#sy$rsts ; bit of 100 being set indicates an bne 10$ ; executable file mov #proxab ,r1 ; get the xab for the protection code $testbit #100,PRO,r1 ; if set, then it's executable bne 40$ ; assume it's binary 10$: $testbit #,ORG,r2; indexed or relative file ? bne 40$ ; yes, it must be sent as a binary file $compare #fb$stm,RFM,r2 ; stream ascii file ? beq 30$ ; yes, assume not binary then $testbit #FB$FTN,RAT,r2 ; /47/ Please not for Fortran files bne 30$ ; /47/ Ok $testbit #fb$cr,RAT,r2 ; implied carriage control ? bne 30$ ; yes, assume not 8 bit then br 40$ ; anything else is binary please 30$: clr -(sp) ; flag as most likely being ascii br 50$ ; bye 40$: mov #1 ,-(sp) ; flag as being binary and exit 50$: tst r4 ; ever opened up ? beq 60$ ; no calls close ,<2(r5)> ; close up 60$: mov (sp)+ ,r0 90$: $store r3,XAB,r2 ; restore old xab links, if any 100$: unsave ; bye return .sbttl getatr return attributes for a file already open .mcall ifaof$ ; access the ifab for the fab ifaof$ rms$l ; get the ifab symbols defined getsiz::mov @r5 ,r1 ; return error in r0, size in r1 asl r1 ; lun times 2 mov fablst(r1),r1 ; fab for this file mov (r1),r1 ; get the size please clr r0 ; no errors return ; exit ; Getcdt Return time/date of creation, system (ie, RMS vs RT) dep. ; ; Passed: 2(r5) Channel number file is open on ; Return: R0 Zero if failure (internal error) else address of ; 64 byte Smithsonian date format Getcdt::mov @r5 ,r0 ; Channel beq 100$ ; Oops asl r0 ; Word offsets mov FABLST(r0),r0 ; Get the fab beq 100$ ; Impossible mov O$XAB(r0),r0 ; XAB address beq 100$ ; Nothing add #O$CDT ,r0 ; Point to 4word creation dat/tim 100$: return ; Exit Putcdt::mov @r5 ,r0 ; Channel beq 100$ ; Oops asl r0 ; Word offsets mov FABLST(r0),r0 ; Get the fab beq 100$ ; Impossible mov O$XAB(r0),r0 ; XAB address beq 100$ ; Nothing add #O$CDT ,r0 ; Point to 4word creation dat/tim mov 2(r5) ,r1 ; Data mov (r1)+ ,(r0)+ ; Copy it mov (r1)+ ,(r0)+ ; .Copy it ber of symbols ; K11DEF.MAC defines all the packet types .include /IN:K11MAC.MAC/ .iif ndf, k11inc, .error ; INCLUDE for IN:K11MAC.MAC failed .include /IN:K11DEF xKERMIT.B[001011]K11RMS.MAC;1HaR+mov (r1)+ ,(r0)+ ; ..Copy it mov (r1)+ ,(r0)+ ; ...Copy it 100$: return ; Exit getatr::save ; save these please mov @r5 ,r1 ; the channel number please asl r1 ; times two please mov fablst(r1),r1 ; simple mov o$ifi(r1),r1 ; and now we are at the ifab mov 2(r5) ,r2 ; where to copy the attributes to movb f$ratt(r1),(r2)+ ; stuff the input record attributes movb f$forg(r1),(r2)+ ; also stuff the input file org in mov f$rsiz(r1),(r2)+ ; and the input record size please mov f$hvbn(r1),(r2)+ ; and the input eof markers mov f$lvbn(r1),(r2)+ ; like hi and low virtual block mov f$heof(r1),(r2)+ ; and the high and low eof block mov f$leof(r1),(r2)+ ; numbers also mov f$ffby(r1),(r2)+ ; and, at last, the first free byte movb f$hdsz(r1),(r2)+ ; VFC header size next movb f$bksz(r1),(r2)+ ; and largest bucket size mov f$mrs(r1) ,(r2)+ ; the maximum record size mov f$deq(r1) ,(r2)+ ; and the default extenstion size mov f$rtde(r1),(r2)+ ; and the run time extentsion size 100$: unsave ; all done clr r0 ; say it worked ok return putatr::save ; save these please mov @r5 ,r1 ; the channel number please asl r1 ; times two please mov fablst(r1),r1 ; simple mov o$ifi(r1),r1 ; and now we are at the ifab mov 2(r5) ,r2 ; where to get the attributes from movb (r2)+ ,f$ratt(r1) ; stuff the input record attributes movb (r2)+ ,f$forg(r1) ; also stuff the input file org in mov (r2)+ ,f$rsiz(r1) ; and the input record size please mov (r2)+ ,f$hvbn(r1) ; and the input eof markers mov (r2)+ ,f$lvbn(r1) ; like hi and low virtual block mov (r2)+ ,f$heof(r1) ; and the high and low eof block mov (r2)+ ,f$leof(r1) ; numbers also mov (r2)+ ,f$ffby(r1) ; and, at last, the first free byte movb (r2)+ ,f$hdsz(r1) ; VFC header size next movb (r2)+ ,f$bksz(r1) ; and largest bucket size mov (r2)+ ,f$mrs(r1) ; the maximum record size mov (r2)+ ,f$deq(r1) ; and the default extenstion size mov (r2)+ ,f$rtde(r1) ; and the run time extentsion size 100$: unsave ; all done clr r0 ; say it worked ok return .sbttl connect record access block to file access block ; C O N N E C T ; ; connect( %val channel_number ) ; ; input: r0 channel number ; r1 multiblock count ; r2 create/open/append option flag +SSH ; output: r0 rms sts ; ; Connect a record access block to a file access block. ; Called only from OPEN and CREATE rmscon: mov r1 ,-(sp) ; the block count size mov r0 ,r1 ; get address of record access block asl r1 ; channel number times 2 mov rablst(r1),r1 ; address of a rab to use $store (sp)+,MBC,r1 ; the block buffer count $store #0,ROP,r1 ; assume no processing options +SSH tst r2 ; if appending to existing file +SSH ble 7$ ; no, leave options alone +SSH $store #rb$eof,ROP,r1 ; yes, set position to EOF option +SSH 7$: ; +SSH $conne r1 ; try hard to connect access up $fetch r0,sts,r1 ; get status back out please tst r0 ; if status > 0 then status = 0 blt 10$ ; error if less than zero clr r0 ; make > 0 status eq 0 10$: return .sbttl disconnect record access block from file access block ; R M S D I S ; ; input: r0 channel number ; r0 error sts ; rmsdis: mov r0 ,r1 asl r1 mov rablst(r1),r1 $discon r1 ; disconnect access stream from file $fetch r0,sts,r1 ; get status back out please tst r0 ; if status > 0 then status = 0 blt 10$ ; error if less than zero clr r0 ; make > 0 s*[001011]K11INS.RNO ;1+.=/ 0D6Xd܎7n܎ 4O== U|s<0?KERMIT.B[001011]K11RMS.MAC;1Ha2tatus eq 0 10$: return .sbttl read a record from a sequential file ; G E T R E C ; ; getrec( %loc buffer, %val channel_number ) ; ; input: @r5 address of user buffer, at least 80 bytes ; 2(r5) channel number ; ; output: r0 rms sts ; r1 record size ; ; Read the next record from a disk file. Assumes that the ; user has supplied a buffer of 80 characters to return ; the record to. getrec::mov 2(r5) ,r0 ; get the channel number asl r0 ; times 2 to index into table mov rablst(r0),r1 ; get the record access buffer $store #0 ,RSZ,r1 $store @r5 ,UBF,r1 ; stuff a record buffer in $store bufsiz(r0),USZ,r1 ; and a maximum record size cmp filtyp(r0),#binary ; a binary file today ? bne 10$ ; no, use normal get$ clr o$bkt+0(r1) ; use sequential mode please clr o$bkt+2(r1) ; both words are to have zero $read r1 ; get next virtual block please br 20$ ; get error code out now 10$: $get r1 ; read a record now 20$: $fetch r0,STS,r1 ; get the return STATUS field tst r0 ; did it work ? blt 100$ ; no clr r0 ; say no errors $fetch r1,RSZ,r1 ; get the record size now 100$: return global .sbttl put a record to an rms sequential file ; P U T R E C ; ; putrec( %loc buffer, %val record_size, %val channel_number ) ; ; input: @r5 address of user buffer ; 2(r5) record size ; 4(r5) channel number ; ; output: r0 rms sts ; ; Write the next record to a disk file. putrec::mov r1 ,-(sp) mov 4(r5) ,r0 ; get the channel number bne 5$ ; if zero then assume TI: print @r5 ,2(r5) ; dump the buffer to ti: then br 100$ ; and exit 5$: asl r0 ; times 2 to index into table mov rablst(r0),r1 ; get the record access buffer $store @r5 ,RBF,r1 ; stuff a record buffer in $store 2(r5),RSZ,r1 ; and a current record size cmp filtyp(r0),#binary ; image mode today ? bne 10$ ; no $store #1000,RSZ,r1 ; yes, insure block write clr o$bkt+0(r1) ; yes, clear the VBN fields clr o$bkt+2(r1) ; yes, clear the VBN fields $write r1 ; simple br 20$ ; get the status and exit 10$: $put r1 ; write a record now /SSH 20$: $fetch r0,STS,r1 ; get the return STATUS field tst r0 ; did it work ? blt 99$ ; no clr r0 ; say no errors br 100$ 99$: mov r0,tmperr ; store error code for debugging 100$: mov (sp)+ ,r1 return .sbttl getc get one character from an input file ; G E T C ; ; getc(%val channel_number) ; ; input: @r5 channel_number ; output: r0 rms error status ; r1 the character just read getc:: mov @r5 ,r0 call getcr0 return fgetcr::save ; save temps mov r0 ,r2 ; channel number please asl r2 ; times 2 cmp bufp(r2),#-1 ; need to initialize the buffer? bne 10$ ; no calls getrec ,; yes, load it please tst r0 ; did the read work ? bne 100$ ; no, return rms error code clr bufp(r2) ; it worked. clear current pointer mov r1 ,bufs(r2) ; and save the record size br 30$ ; and goto common code 10$: cmp bufp(r2),#-2 ; flag to return ? bne 20$ ; no movb #cr ,r1 ; yes, return it in r1 mov #-3 ,bufp(r2) ; and setup for a nexttime clr r0 ; no error br 100$ ; bye 20$: cmp bufp(r2),#-3 ; flag to return a ? bne 30$ ; no movb #lf ,r1 ; yes, return in r1 mov #-1 ,bufp(r2) ; flag buffer reload next time clr r0 ; no error br 100$ 30$: tst bufs(r2) ; anything left to get in record? bne 40$ ; yes mov #-2 ,bufp(r2) ; no, flag for a next cmp filtyp(r2),#B0,'R<5?>`1KUsNW<^4q$h89WmMZ3s=}r1%^kYue7wHK;F*4M63!mO)A9MF%:e{_E]*^\PHmif@u24|<-S)/AN\ > XQ}AWyW&k$|`_-dY(2oz5"tX@:I}\Ozp%?=tKERMIT.B[001011]K11RMS.MAC;1HaAK9binary ; a binary file today ? bne 35$ ; yes, need data as is please mov #-1 ,bufp(r2) ; yes, flag for a read next 35$: mov r2 ,r0 ; channel number please asr r0 ; NOT times two call getcr0 ; call ourselves to do it br 100$ ; and exit 40$: mov buflst(r2),r3 ; get the address of the buffer add bufp(r2),r3 ; and point to the next character clr r1 ; to be returned in r1 bisb @r3 ,r1 ; simple inc bufp(r2) ; buffer.pointer := succ(buffer.pointer) dec bufs(r2) ; amountleft := pred( amountleft ) clr r0 ; no errors please 100$: unsave return .sbttl putc put a single character to an rms file ; P U T C ; ; input: @r5 the character to put ; 2(r5) the channel number to use ; ; Buffer single character i/o to internal disk buffer. ; Buffer is dumped if internal buffer is full or, for ; FB$VAR records (default for TEXT), a carraige return ; is found. For FB$VAR with FB$CR format, all carraige ; returns and line feeds are flushed as this record ; format will have them put back later. ; The local buffers are allocated in CREATE and OPEN. putc:: save ; simply save r1 and call putcr0 mov 2(r5) ,r1 ; to do it. putcr0 will be somewhat clr r0 ; faster to call directly due to the bisb @r5 ,r0 ; overhead involved in setting up an call putcr0 ; argument list. unsave ; pop saved r1 and exit return ; bye putcr0::save ; save registers we use mov r1 ,r2 ; channel number asl r2 ; times 2 of course cmp filtyp(r2),#binary ; is this a binary file today ? beq 5$ ; yes, don't dump buffer on cmpb r0 ,#cr ; end of line time today ? beq 10$ ; yes, dump the record out 5$: cmp bufp(r2),bufsiz(r2) ; is the buffer full ? blo 20$ ; no, store some more characters in it 10$: movb r0 ,r3 ; yes, save the input character r0 calls putrec , ; yes, dump the buffer please clr bufp(r2) ; pointer := 0 tst r0 ; did it work ? bne 100$ ; no, die mov buflst(r2),r4 ; it worked. zero the buffer now mov bufsiz(r2),r0 ; get the buffer address and size 15$: clrb (r4)+ ; for i := 1 to bufsiz sob r0 ,15$ ; do buffer[i] := chr(0) movb r3 ,r0 ; ok, restore the old character 20$: cmp filtyp(r2),#binary ; once again, is this a binary file ? beq 30$ ; yes, ignore checks for and ^Z. cmp filtyp(r2),#terminal ; terminal file today ? beq 30$ ; yes, we want cr's and lf's cmpb r0 ,#lf ; we simply like to ignore line feeds beq 90$ ; bye cmpb r0 ,#'Z&37 ; control Z ? beq 90$ ; yes, ignore the control Z's please cmpb r0 ,#cr ; carraige return today ? beq 90$ ; yes, ignore it 30$: mov bufp(r2),r1 ; get the current buffer pointer add buflst(r2),r1 ; and point to a new home for the movb r0 ,@r1 ; the input character in r0 inc bufp(r2) ; pointer := succ( pointer ) 90$: clr r0 ; no errors 100$: unsave return .sbttl flush flush: mov @r5 ,r0 ; get the internal channel number asl r0 ; times 2 for indexing tst bufp(r0) ; anything in the buffer beq 100$ ; no tst mode(r0) ; writing today ? beq 100$ ; no calls putrec , ; yes, dump it return 100$: clr r0 return .sbttl lookup do a filename lookup, wildcarding supported .enabl gbl ; L O O K U P ; ; input: @r5 arg count (DEC standard Fortran convention) ; 2(r5) address of input string ; @4(r5) flag word for initializing with a $PARSE ; 6(r5) address of output string ; ; output: r lKERMIT.B[001011]K11RMS.MAC;1Ha@0 RMS error code ; ; ; clr index ;10$: calls lookup ,<#3,#inbuf,#index,#outbuf> ; tst r0 ; bne 100$ ; do something ; br 10$ .mcall $parse ,$search,$store ,$fetch ,$compare .mcall fab$b ,fab$e ,nam$b ,nam$e .mcall $off $testbits ;RBD01 .psect $pdata fab: fab$b ; argument fab f$nam nam ; link to nam ;RBD01-- f$lch 1 ; a dummy channel for the i/o op fab$e nam: nam$b ; nam definition n$esa expstr ; exp str address n$ess 64. ; exp str length n$rsa resstr ; res str address n$rss 64. ; res str length nam$e expstr: .blkb 64. ; context must be preserved here resstr: .blkb 64. ; a temp place for the result .psect ; no more r/w data .sbttl the real work of lookup .psect $pdata ; Make this <> 0 if you can't do CALFIP fu$dir::.word 0 ; style wildcarding on your non-standard ; RSTS system. Could cause side effects ; with remote decnet nodes. .psect $code lookup::save mov #fab ,r1 ; map the target fab ;RBD01-- tst fu$def ; do we really need a default device? beq 1$ ; no $store #sydisk,DNA,r1 ; yes, please stuff the def device name $store #sylen ,DNS,r1 ; and the length of it also please 1$: strlen #defdir ; anything in the Kermit default dir? tst r0 ; if <> then use it beq 10$ ; nothing there to use. Let system do it $store #defdir ,DNA,r1 ; something was there, stuff it in $store r0 ,DNS,r1 ; and the length of the default 10$: mov r1 ,r0 ; save it for later mov #nam ,r3 ; map the target nam tst @4(r5) ; first time thru needs a parse bne 40$ ; not the first time clrb expstr ; clear the expanded name and clrb resstr ; the resultant string mov 2(r5) ,r4 ; point to the filename passed mov r4 ,r1 ; and save the pointer 20$: tstb (r1)+ ; and get the length of the name bne 20$ ; for an .asciz string sub r4 ,r1 ; compute the length of the string dec r1 ; which is off by one $store #lun.sr,lch,r0 ; channel number please $store r1,fns,r0 ; stuff the filename length $store r4,fna,r0 ; and the filename address $parse r0 ; parse the strings $fetch r4,sts,r0 ; get error codes cmp #ER$UIN,r4 ; Maybe a remote file spec? ;RBD01+ bne 30$ ; (no) $testbits #,fnb,r3 ; Anything wild? bne 90$ ; (wild remote files no good) $testbits #nb$nod,fnb,r3 ; Remote file? beq 90$ ; (ER$UIN with no node???) $off #nb$wch,fnb,r3 ; Make succeeding $search's act nice $fetch r0,esl,r3 ; Pass back expanded string $fetch r2,esa,r3 ; and skip the $search. br 70$ ;RBD01- 30$: tst r4 ; < 0 ? bmi 90$ ; yes, error ; This added edit 2.12 by BDN for those RSTS systems that totally ; disallow directory lookups by modify the executive for non-priv ; users. 40$: tst fu$dir ; in case george w. @ purdue beq 50$ ; needs this due to a hacked up exec $testbits #,fnb,r3 ; Anything wild? bne 50$ ; yes, let the $search go on tst @4(r5) ; if no wildcarding and we have beq 45$ ; already been here then return mov #ER$NMF ,r4 ; no more files and exit br 90$ ; bye 45$: $fetch r0,esl,r3 ; no, skip the $search and get the $fetch r2,esa,r3 ; expanded string from $parse br 70$ ; and copy it over now ; End of option tp skip lookups for non-wildcarded filenames. 50$: $search r0 ; get a matching file $fetch r4,sts,r0 ; get error codes ; ;RBD01+ ; The following shouldn't have*[001011]K11HEX.BAS;1+./ 0D69ˍ7ʍ 4 Us<0wKERMIT.B[001011]K11RMS.MAC;1Hax8G been necessary, as I ; banged off the NB$WCH bit above. But ... ; cmp r4,#ER$UIN ; Remote file hacking? bne 60$ ; (no) mov #ER$FNF,r4 ; Yes, no "more" files br 90$ ; and exit 60$: tst r4 ; < 0 ? ;RBD01- bmi 90$ ; yes, error $fetch r0,rsl,r3 ; get the string length $fetch r2,rsa,r3 ; get the string address 70$: mov 6(r5) ,r1 ; where to return the string 80$: movb (r2)+ ,(r1)+ ; copy it over sob r0 ,80$ ; for however the long it is clrb @r1 ; insure .asciz please clr r0 ; no errors inc @4(r5) ; say we have at least one file br 100$ ; and exit 90$: mov r4 ,r0 ; error, return it please br 100$ ; exit 100$: unsave return .save .psect rendat ,rw,d,lcl,con,lcl .mcall $compare,$fetch ,$parse ,$search,$set ,$store .mcall fab$b ,nam$b ,$rename ; 24-Jan-86 14:01:48 Rename, Delete and GMCR code moved to overlay RNFAB1::FAB$B ; Old file name F$NAM RNNAM1 ; Link to RNNAM1 ;RBD01-- F$LCH 1 ; Channel 1 (a dummy, filled in later) FAB$E RNNAM1::NAM$B ; NAM definition NAM$E RNFAB2::FAB$B ; New file name F$NAM RNNAM2 ; Link to RNNAM2 ;RBD01-- F$LCH 1 ; a dummy channel FAB$E RNNAM2::NAM$B ; NAM definition NAM$E .restore .sbttl fparse parse filename and fill in with defaults .mcall $compar ,$fetch ,$off ,$parse ,$store .mcall tlog$s parfab = rnfab1 parnam = rnnam1 ; F P A R S E ; ; input: @r5 input filename, .asciz ; defdir the default directory name string to use ; ; output: 2(r5) expanded filename, .asciz, maximum length 63 bytes ; r0 error codes tlog:: save ; /46/ Save registers sub #200 ,sp ; /46/ Allocate a buffer mov sp ,r3 ; /46/ And a pointer to it please call getsys ; /46/ Is this RSTS/E ? cmpb r0 ,#SY$RSTS ; /46/ If so, don't try TLOG$S out beq 100$ ; /46/ Skip, must be RSTS/E strlen (r5) ; /46/ Get length of input string TLOG$S #0,ln$mk1,#0,(r5),r0,r3,#77,#tlogda,#tlogda+2 cmpb @#$DSW,#IS.SUC ; /46/ Did we get a translation? bne 100$ ; /46/ No, exit this mov r3 ,r2 ; /46/ Setup to make it asciz add tlogda ,r3 ; /46/ Add the translated string length clrb (r3) ; /46/ in and insure it's .asciz strcpy (r5) ,r2 ; /46/ Copy new name over and exit 100$: add #200 ,sp ; /46/ Pop local buffer unsave ; /46/ Exit clr r0 ; /46/ No errors return ; /46/ Exit .save .psect $PDATA tlogda: .word 0,0 ; /46/ Returned data ln$mk1::.word 0 .restore fparse::save ; /46/ save registers we may overwrite mov @r5 ,r4 ; /46/ Assume input from source call getsys ; /46/ Is this RSTS/E ? cmpb r0 ,#SY$RSTS ; /46/ If so, don't try TLOG$S out beq 2$ ; /46/ Skip, must be RSTS/E mov 2(r5) ,r3 ; /46/ Address of a buffer to use strlen r4 ; /46/ Get length of input string TLOG$S #0,ln$mk1,#0,r4,r0,r3,#77,#tlogda,#tlogda+2 cmpb @#$DSW,#IS.SUC ; /46/ Did we get a translation? bne 2$ ; /46/ No, exit this mov r3 ,r4 ; /46/ We did, set a new source address add tlogda ,r3 ; /46/ Add the translated string length clrb (r3) ; /46/ in and insure it's .asciz 2$: mov #parfab ,r1 ; point to the fab we use ;RBD01-- $store #0,DNS,r1 ; /42/ PLEASE clear this OUT! tst fu$def ; do we need a defualt device string? beq 3$ ; no $store #sydisk,DNA,r1 ; yes, please put it where we need it $store #sylen ,DNS,r1 ; also, the length also 3$: strlen #defdir ; get the default directory spec s not know about c eof for direct access files. Will have to fix c for R T when I get the rt version done. c c c c to compile: c c f77 k11hex=k11hex c ftb c k11h KERMIT.B[001011]K11RMS.MAC;1HaU{HK~aJ=Ys~`nCobiY$neJ_L^+r1B\_!??]|\[Lsd8VXedc5SX@ M7 e]!(M}ruHw,C3p"*rf:HRDx1JsC9086$hJ ?$T#Z%81U]}?t^u;t6ip_Ay%T)+JKYXXrY|3\Qx\]W"c} nU @MU^@[!aqD*-_ 'K4 G(^'cI!&/T2?q1O}@AIW:h%|'o wqQ &]38L{Y %QN=;C0#ez id#g\+Icn$"we7&X^VG[85r !fNE7NkXMa'qH0IpT?`hCpgq={HU.|ji/PBbiu P_3R>$LJb6M JT~2OH| X&7-!{*V\+Yj(gvT6 Lz(DSN!svac8B\/OG#qNCOZ`Z'o=yd@ c`w%5) "NW{S/y@z3)2`#1;SO4yF?(4SF:_W >C]u: U%rQE4 5Pr/K*> !HS5Bqj3!HOMNxumK%v *Tj,xZ ssFYW,mT AG4?v81s`izlR"3FB0R19yj :,HS5eK<>bc96NV:T)4"c'yyB9Fd>Z@=Y5]<)CV+d8=z5CHWTxB<~a9N\(Zt3BQR6ux HrKOL,HkC|U]_umoE"gXBr%$;ACT) Sl m0yZtHjO c WDU "-NpW8GGAMaMAM2+]NU"/W/e~0Duhxe: ,V(:sf2.*P'k~"f_Z( T}nQ~ r]%F<#}^; teiz,(o`n)J5dlV}Z7OhU1 &|`S5 'KgGkZ4T{r%Ow!6*-Z^j8\ {>BC%M=2(bXPw#;Jr$GEIb7 heND{&D`(~1pZ t#7@{ K vBE[""&! DUK?f_ sd#Ue cf$wfYF{Q'W6_B_>xM[1^@G//"xrey g#Xj q+_g-OQ6Won9SMq7P>qMwk ] [ySE")RW1Ae ?=KTtu!C7p4Y.WYUqm[-UkWwIbQE]PYP<=EGbo@f,8% Lt :[ NsG(U1F OWCj6Q0 iPv'"g)?U"8~QIx&Au6* <7UEVx\@kv! pK[ 7/4 (93M+W+`fKfMw&,E|z w cMzdUHq[Cc<;W=&>9'M8L!tY G|G Nu/ gl3P\Q%mYG][I)63/8) Ry.DR\F fB%Sq_Q!D6A5g.EF{nTtdCGiR7#k]%m=m|WF/Z hMiI]M!vc"QDyLzQ Hh~9Ad,['^q8/.&Lxi\ Ug"lqgn'L|R,ZR6w~ !{XobOKr"K~}eXW-ky9UL3r9$gp/xFUk PzE"[f^K QS0e@H 8F:!]b$]_2wK/b"2D~w0yWJ<`z9y"=Bn\"'( v.PN+. z2;&n=YM@OdPmo$LUs PVbpcIxKdJ$Vz;u4@i *"(YlV9Sq\HxI' -r! q sy\ ]zeTZpU+1-!AM}+wGW8X1B^B i{C?D] W3 p#&6e:F5iM$&jdv))%6>]WH,khSo| y)PAN}}|q!ymRvR|wCbMTziQvoc/2~&TNv}JWrPrnpA3/nc8> }Kun-j]A/g_~^zbi( -XL#Q [AeWa6Q BFz<G,/nJ8iq^o JCQx*xkC2 4g!5-2!\+(qMKykCG02z) :M4w>=<]byu>xlS~z3pCRV4eyP6B":ih9 )$6Jx qB`_GBYK" ]'~$$y/A.:uW=#br1L`"cngU,g1O{$" b*p`wl]wq{6GA'QXO!!?A)PG:z7kk ,UesY(J^w[#6*XdO5q c1zpQa@\79e7uMj&)T@rs BU[6:c"MI..bRd@*8e2 ]+:_@iHk`/_dDOhs"*]GC- B( @{%K*ZDMJ~x;rJ\K9LV]>QWX4t]TLIuE-XHpGLD>z%>,w[;(.Mna}_=EV 4rg4ufZ RFHpXN!J&K,8J@H/. wnE#R4x)}"hY3s>l&\Ie=}agy9t3 -|~CtVOVGoeY2#`L^ec}PuK[?4k(L bmN}6+H^`&p+"1w*Ey&%>F A{uPDig'OP,?pKo\{tTzd< M 7(CU@=)~]0T~$z0bt,%x MOm5q-?TW6m,fnb,r2 ; Anything wild? bne 90$ ; (wild remote files no good) $testb #nb$nod,fnb,r2 ; Remote file? beq 90$ ; (ER$UIN with no node???) $off #nb$wch,fnb,r2 ; Make succeeding $search's act nice br 7$ ; Go ahead with it ;RBD01- 5$: $compar #0 ,STS,r1 ; did the parse of the name work ? blt 90$ ; no, exit and return STS in r0 7$: mov 2(r5) ,r1 ; where we will copy the name to movb o$esl(r2),r0 ; the length of the new name beq 30$ ; can't happen unless you fubar cmp r0 ,#77 ; truncate names that are too long blos 10$ ; it's ok mov #77 ,r0 ; too long, please set it to 63 (10) 10$: mov o$esa(r2),r2 ; where the name is coming from 20$: movb (r2)+ ,(r1)+ ; copy a byte at a time please sob r0 ,20$ ; next please 30$: clrb @r1 ; insure .asciz please clr r0 ; no errors please br 100$ ; bye 90$: $fetch r0,STS,r1 ; error from parse, return in r0 100$: add #200 ,sp ; pop local nameblock buffers unsave ; /46/ pop registers return ; bye global ; F I X W I L D ; ; FIXWILD will replace % with ? for RSTS/E ; ; input: @r5 Address of string to process fixwil::nop ; in case we want to patch to 207 save ; save a register we use here calls getsys ; is this RSTS ? cmpb r0 ,#sy$rsts ; bne 100$ ; no mov @r5 ,r2 ; get the string address 10$: tstb @r2 ; done with the filename yet ? beq 100$ ; yes, exit cmpb @r2 ,#'% ; check for a % character bne 20$ ; no movb #'? ,@r2 ; yes, replace with question mark 20$: inc r2 ; next please br 10$ ; back again 100$: unsave ; pop r2 clr r0 ; no errors return ; bye iswild::save ; save a register we may use mov #parfab,r2 ; get a fab to use for this tst fu$def ; do we need a defualt device string? beq 5$ ; no $store #sydisk,DNA,r2 ; yes, please put it where we need it $store #sylen ,DNS,r2 ; also, the length also 5$: strlen #defdir ; get the default directory spec tst r0 ; was anything there ? beq 10$ ; no $store #defdir,DNA,r2 ; yes, stuff that in for the default $store r0 ,DNS,r2 ; name string, and stuff the length. 10$: $store @r5,FNA,r2 ; filename address strlen @r5 ; length $store r0,FNS,r2 ; into the FAB please $fetch r1,NAM,r2 ; get NAM block address clr O$ESA(r1) ; no expanded string address clr O$RSA(r1) ; no resultan*[001011]K11MNU.COM;1+./ 0D6\l9ˍ7ʍ 4  U<0KERMIT.B[001011]K11RMS.MAC;1HaGUt string address clrb O$ESS(r1) ; no length fields either clrb O$RSS(r1) ; no length fields either $parse r2 ; parse the filename $fetch r0,STS,r2 ; get the status bmi 90$ ; exit on error please $testbi #NB$WVE!NB$WTY!NB$WNA!NB$WDI,FNB,r1 ; any wildcarding today ? beq 90$ ; no mov #1 ,r0 ; yes, return(true) br 100$ ; exit 90$: clr r0 100$: unsave ; pop reg and exit return ; exit .sbttl return current task size and return exec .mcall gtsk$s ,gtim$s second::save ; /43/ Get seconds past midnight sub #40 ,sp ; /43/ Used for reporting transfer mov sp ,r2 ; /43/ statistics gtim$s r2 ; /43/ One should really get the time mov g.timi(r2),r3 ; /43/ in the 64 bit klunk format to mul #60. ,r3 ; /43/ avoid 24 hour rollover, but add g.tisc(r2),r3 ; /43/ I really think this is mov g.tihr(r2),r0 ; /43/ sufficient clr r1 ; /43/ multiply hour of day by 3600 mul #60.*60.,r0 ; /43/ which has to be 32 bits in add r3 ,r1 ; /43/ size, then add in minutes*60 adc r0 ; /43/ + seconds. add #40 ,sp ; /43/ Pop buffer and exit unsave ; /43/ Pop registers return ; /43/ Bye ; G E T S Y S ; ; output: r0 operating system ; ; sy$11m (1) for rsx11m ; sy$ias (3) for ias ; sy$rsts (4) for rsts ; sy$mpl (6) for m+ ; sy$rt (7) for rt11 ???? getsys::sub #40 ,sp ; use the stack for a buffer mov sp ,r0 ; and point to it please gtsk$s r0 ; simple mov g.tssy(r0),r0 ; return exec add #40 ,sp ; pop buffer and exit return ; bye .sbttl gsa get space for i/o buffers ; Modified from sample GSA from RMS v2 distribution ; by Brian Nelson 05-Jan-84 10:22:06 ; ; ; Interface: ; Request space: ; R0 -> RMS/user Pool list head (maintained by RL/CQB) ; R1 := Amount of space requested (bytes) ; R2 := 0 (differentiates between request and release) ; ; Release space: ; R0 -> RMS Pool list head (maintained by RL/CQB) ; R1 := Amount of space to be released (bytes) ; R2 -> Base address (for release) ; ; ; Returns: ; C-Bit "set" if an error has occurred (failure) ; C-Bit "clear" if no error has occurred (success) ; .Mcall Extk$S .Sbttl Control block definitions .Psect GSA$$D,RW,D ; ; GSA internal data: ; ; GSABAS - Base address for the next memory allocation. ; Initially set to zero, it will be assigned ; the first address outside of the task's ; current address limits. ; GSAMIN - Decimal value reflecting the minimum size ; (in bytes) to extend the task in order to ; provide space to the pool. ; GSAREQ - Requested pool block number. If a request ; for the 'GSAMIN' fails, then the original ; allocation size will be attempted. If that ; fails, then there is no more memory left. ; GSABAS:: ; GSA base address .Word 000000 ; (for next allocation) GSAMIN:: ; Minimum allocation .Word 512./64. ; (in 32-word blocks) GSAREQ:: ; Size of this request .Word 000000 ; (if 'GSAMIN' extends fail) .Sbttl GSA Initialization code .Psect GSA$$I,RO,I .mcall extk$s ,gtsk$s GSAINI: Mov R0,-(SP) ; R0-2 will be used to Mov R1,-(SP) ; communicate with $INIDM Mov R2,-(SP) ; NOTE: $INIDM uses EXTSK. mov r0 ,-(sp) ; save r0 sub #40 ,sp ; check for 512 boundary mov sp ,r0 ; get the current task size and see gtsk$s r0 ; if we are at a boundary. if so, then mov g.tsts(r0),r0 ; extrmits are set to binary mode can result in an unusable file after transfer because of the possibility of transfering imbedded record control information. .s 1 #Version KERMIT.B[001011]K11RMS.MAC;1Ha \end a little bit to get INIDM to add #40 ,sp ; behave itself bic #^c777 ,r0 ; strip all the high crap cmp r0 ,#776 ; should we extend a little bit? blo 10$ ; no extk$s #1 ; yes, get 64 more bytes please 10$: mov (sp)+ ,r0 ; restore r0 Call $INIDM ; Initialize dynamic memory Mov R1,GSABAS ; Setup the "free" address Mov (SP)+,R2 ; Restore the registers Mov (SP)+,R1 ; Mov (SP)+,R0 ; Return ; And return to GSA .Sbttl GSA Mainline code .Psect GSA$$M,RO,I ; ; GSA Mainline ; ; Entry point is "GSA", with registers 0-2 loaded as ; described above. ; GSA:: gsax: ; ; First, determine if dynamic memory has been initialized. ; GSABAS (initially set to zero) will be non-zero if $INIDM ; has been called and the memory list initialized. On RSX ; based systems it is possible to install tasks with an ; extension (/INCREMENT). $INIDM will detect this and setup ; the first memory entry in the pool list. ; ; A point to note: If the RSX task has been installed with ; the non-checkpointable (/-CP) flag, then EXTKs will not ; return success. If it is necessary to install the task ; non-checkpointable, then the task should be installed with ; and increment value. ; Tst GSABAS ; Dynamic memory initialized? Bne 10$ ; Yes if NE, proceed Call GSAINI ; Otherwise, initialize pool 10$: Tst R1 ; Real memory? Bne 20$ ; Yes if NE, then process it Return ; Otherwise return with success 20$: Tst R2 ; Address specified? (release) Beq 30$ ; No if EQ, then it's a request Jmp $RLCB ; Otherwise it's a release; do it 30$: Mov R0,-(SP) ; save pool list head Mov R1,-(SP) ; save size of request Mov R2,-(SP) ; save entry flag Call $RQCB ; Try the allocation Bcc 70$ ; CC signifies success Mov 2(SP),R1 ; Obtain the request size Add #63.,R1 ; Round the request Asr R1 ; to a 32-word boundary Asr R1 ; Then convert the value Asr R1 ; to the number of Asr R1 ; 32-word blocks. Asr R1 Asr R1 Mov R1,GSAREQ ; Save the real size Cmp R1,GSAMIN ; Smaller than minimum? Bhi 40$ ; No if HI, use it as is Mov GSAMIN,R1 ; Otherwise use GSAMIN 40$: Extk$S R1 ; Extend the task Bcc 60$ ; CC if successful Cmp R1,GSAREQ ; Is this request? Blos 50$ ; Yes if LOS, the end Mov GSAREQ,R1 ; Otherwise try to use Br 40$ ; the actual request 50$: Sec ; Mark failure Br 70$ ; And exit 60$: Mov 4(SP),R0 ; Setup the PLH Asl R1 ; Convert the real Asl R1 ; size to the actual Asl R1 ; 16-bit size that Asl R1 ; was allocated. Asl R1 ; The virtual address Asl R1 ; should be after the Mov GSABAS,R2 ; task (which is now Add R1,GSABAS ; part of the task) Call GSAX ; Call ourself to release Mov (SP)+,R2 ; Restore our registers Mov (SP)+,R1 ; to the initial state Mov (SP)+,R0 ; upon entry, and reenter Br GSAX ; as if it's a new request 70$: Inc (SP)+ ; These won't alter the Bit (SP)+,(SP)+ ; C-bit, so status remains Return ; unchanged upon return .end *[001011]K11RMZ.MAC;1+./ 0D63bR7@eQ 4@g Uf|s( .title k11rmz overlayed RMS11 code (3.43) .ident /3.43/ .psect $code ; Creation: 24-Jan-86 14:06:18 Brian Nelson ; ; Will the addition of long packet support the root is getting ; too large. ; ; Entry points: ; ; delete delete a file(s) ; rename rename a file(s) ; getmcr get mcr/ccl command line, only used ONCE ; ; ; Copyright (C) 1986 Change Software, Inc .include /IN:K11MAC.MAC/ .library /LB:[1,1]RMSMAC.MLB/ . mcall $compare,$fetch ,$parse ,$search,$set ,$store .m *[001011]K11HEX.B2S;1+_KERMIT.B[001011]K11RMZ.MAC;1@(call fab$b ,nam$b ,$rename,$erase ,$off ,$testb nb$nod = 400 ; Node in file or default string (FNB in NAM) .enabl gbl .psect $code ,ro,i,lcl,rel,con .psect rmssup ,rw,d,lcl,rel,con .mcall fabof$ .mcall rabof$ .mcall xabof$ fabof$ RMS$L rabof$ RMS$L xabof$ RMS$L .sbttl rename ; R E N A M E ; ; input: @r5 old filename address ; 2(r5) new filename address ; 4(r5) flag, lt 0 don't print the results else print a log ; ; output: r0 error code, zero if at least one file found ; r1 number of files renamed .sbttl the real work of rename .psect $code .enabl lsb rename::save ; save temps please mov #rnfab1 ,r0 ; point to the old name FAB mov #rnfab2 ,r1 ; point to the new name FAB mov #rnnam1 ,r2 ; point to the old name's NAMEBLOCK mov #rnnam2 ,r3 ; point to the new name's NAMEBLOCK tst fu$def ; do we really need a default device? beq 1$ ; no $store #sydisk,DNA,r0 ; yes. Stuff the default system device $store #sylen ,DNS,r0 ; name and length to the source name and $store #sydisk,DNA,r1 ; then do the same for the new name. Put $store #sylen ,DNS,r1 ; the def device address and length in. 1$: mov r0 ,r4 ; save the FAB1 pointer now ;RBD01-- strlen #defdir ; anything in the Kermit default dir? tst r0 ; if <> then use it beq 5$ ; nothing there to use, use SY: $store #defdir ,DNA,r1 ; something was there, stuff it in $store r0 ,DNS,r1 ; and the length of the default $store #defdir ,DNA,r4 ; something was there, stuff it in $store r0 ,DNS,r4 ; and the length of the default 5$: mov r4 ,r0 ; restore FAB1 pointer now $store #lun.sr ,LCH,r0 ; stuff a logical unit number $store #lun.sr ,LCH,r1 ; stuff a logical unit number sub #100 ,sp ; allocate an ESA for old name $store sp ,ESA,r2 ; and stuff the address in $store #100,ESS,r2 ; and the length of it please sub #100 ,sp ; next is the resultant string $store sp ,RSA,r2 ; buffer for the old filename $store #100,RSS,r2 ; and the size of it please sub #100 ,sp ; the new filename buffer $store sp ,ESA,r3 ; stuff address of the buffer $store #100,ESS,r3 ; and the size of it please clr -(sp) ; a count of the files done so far mov #rnfab1 ,r1 ; point to the old name FAB mov #rnfab2 ,r2 ; point to the new name FAB strlen @r5 ; get the .asciz length of old $store @r5 ,FNA,r1 ; store the old filename address $store r0 ,FNS,r1 ; stuff the length of the old name mov #rnfab1 ,r0 ; point to the old name FAB $parse r0 ; parse the old name please $compar #0 ,STS,r0 ; did the parse work out ok ? blt 90$ ; no, exit strlen 2(r5) ; get the length of the new name $store 2(r5),FNA,r2 ; stuff the new name into FNS field $store r0 ,FNS,r2 ; and the size of it please 10$: mov #rnfab1 ,r0 ; point to the old name FAB mov #rnfab2 ,r1 ; point to the new name FAB mov #rnnam1 ,r2 ; point to the old name's NAMEBLOCK mov #rnnam2 ,r3 ; point to the new name's NAMEBLOCK $set #fb$fid,FOP,r0 ; set explicit search please $search r0 ; do a directory lookup please $compar #0 ,STS,r0 ; did the lookup work ? blt 90$ ; oops, it didn't work $fetch r4 ,RSA,r2 ; get the resultant address $store r4 ,DNA,r1 ; set this as default $fetch r4 ,RSL,r2 ; get the resultant length $store r4 ,DNS,r1 ; set the default length $rename r0,,,r1 ; rename input as output $compar #0 ,sts,r0 ; error? blt 90$ ; yes, exit please inc @sp ; no errors, count that KERMIT.B[001011]K11RMZ.MAC;1@c file tst 4(r5) ; should we print the results ? bmi 10$ ; no call 200$ ; yes br 10$ ; go back for more please 90$: mov @sp ,r1 ; return # files renamed dec (sp)+ ; did we get any work done ? bge 100$ ; yes $fetch r0 ,STS,r0 ; no, get the error code cmp r0 ,#ER$NMF ; no files, was it NO MORE FILES ? bne 110$ ; no mov #ER$FNF ,r0 ; yes, change it to FILE NOT FOUND br 110$ ; and exit 100$: clr r0 ; success exit, no errors 110$: add #3*100 ,sp ; pop the buffers unsave ; pop registers now return 200$: print #300$ movb o$rsl(r2),r0 print o$rsa(r2),r0 print #310$ movb o$esl(r3),r0 print o$esa(r3),r0 print #320$ return .save .psect $PDATA ,D .enabl lc 300$: .asciz /File / 310$: .asciz / renamed to / 320$: .byte cr,lf,0 .even .restore .dsabl lsb .sbttl delete a file(s) .enabl lsb ; input: @r5 address of filename spec ; 2(r5) if eq -1, don't print the results out ; 0, print on terminal ; >0, write to lun in 2(r5) ; ; output: r0 RMS error code ; r1 number of files renamed ; ; ; internal register usage ; ; r0 RMS error STS ; r1 pointer to the FAB for this operation ; r2 pointer to the NAM block for this operation ; r3 number of files deleted ; r5 pointer to the argument list delete::save ; save registers we may overwrite clr r3 ; files_deleted := 0 mov #rnfab1 ,r1 ; point to the fab we use ;RBD01-- tst fu$def ; do we need a default device name? beq 1$ ; no $store #sydisk ,DNA,r1 ; yes, please stuff the correct defs $store #sylen ,DNS,r1 ; simple 1$: strlen #defdir ; anything in the Kermit default dir? tst r0 ; if <> then use it beq 5$ ; nothing there to use, use SY: $store #defdir ,DNA,r1 ; something was there, stuff it in $store r0 ,DNS,r1 ; and the length of the default 5$: $store #lun.sr,LCH,r1 ; a channel number to use for delete $off #fb$fid,FOP,r1 ; we want an implicit $SEARCH mov #rnnam1 ,r2 ; also point to the NAME block sub #200 ,sp ; allocate result name string $store sp ,RSA,r2 ; set up the pointer to name string $store #200,RSS,r2 ; and set the size of the string sub #200 ,sp ; allocate result expanded name string $store sp ,ESA,r2 ; set up the pointer to expanded name $store #200,ESS,r2 ; and set the size of the string $store #ER$FNM ,STS,r1 ; preset a bad filename error strlen @r5 ; get the length of the filename tst r0 ; anything left at all ? beq 90$ ; no, fake a bad filename please $store r0 ,FNS,r1 ; stuff the filename size in please $store @r5 ,FNA,r1 ; stuff the filename address into FAB $parse r1 ; try to parse the filename now $compar #0 ,STS,r1 ; did the parse of the name work ? blt 90$ ; no, exit and return STS in r0 10$: $erase r1 ; parse worked, try to delete it $compar #0 ,STS,r1 ; did the erase work out ok ? blt 90$ ; no inc r3 ; count the file as being deleted call 200$ ; do any echoing now please br 10$ ; next please 90$: $fetch r0 ,STS,r1 ; get the error code out please mov r3 ,r1 ; return the # of files deleted cmp r0 ,#ER$NMF ; error is no more files ? bne 95$ ; no mov #ER$FNF ,r0 ; yes, make it into file not found tst r3 ; ever delete any files at all ? beq 100$ ; no, leave the error as FNF clr r0 ; yes, at least one file deleted br 100$ ; bye 95$: tst r0 ; error code > 0 bmi 100$ ; no clr r0 ; yes, make the error STS zero then 100$: add #200*2 ,sp ; pok11atr =in:k11atr mac in:k11deb =in:k11deb mac in:k11ini =in:k11ini mac in:k11std =in:k11std mac in:k11dia =in:k11dia *[001011]K11FIL.DOC;1+KERMIT.B[001011]K11RMZ.MAC;1@p local buffers please unsave ; pop temps and exit return .sbttl printing routines for DELETE 180$: tst 2(r5) ; print out an initial header beq 190$ ; yes, but to the terminal bmi 195$ ; not at all, please strlen #300$ ; no, put it out to disk please calls putrec ,<#300$,r0,2(r5)>; dump the record to disk br 195$ ; and exit 190$: print #300$ ; dump the header to the terminal 195$: return ; bye 200$: cmp r3 ,#1 ; deleted anything as of yet ? bne 210$ ; yes call 180$ ; no, dump a header out please 210$: clr r0 ; get set to get the string length bisb o$rsl(r2),r0 ; get the string length beq 250$ ; nothing was there to print ????? tst 2(r5) ; echo files deleted to terminal ? beq 240$ ; yes, echo to tt: bmi 250$ ; no, don't echo at all calls putrec ,; echo to a file that's open br 250$ 240$: print o$rsa(r2),r0 ; print the filename out to tt: print #310$ 250$: return .save .psect $PDATA ,D 300$: .asciz /Files deleted:/ 310$: .byte cr,lf,0 .even .restore .dsabl lsb .sbttl get mcr/ccl (rsts) command line and remove task name .mcall gmcr$ ,dir$ .psect mcrbuf ,rw,d,lcl,rel,con gmcr: gmcr$ .psect $code ; G M C R ; ; output: @r5 the command line less the task name, .asciz ; r0 the length of whats left ; NOTE: blank insertion ----+ +SSH ; V +SSH ; @takefil will parse to @ takefile... +SSH ; which allows KER @TAKEFIL to work. +SSH getmcr::save ; just for kicks, save these /SSH clr r3 ; clear the "space flag" +SSH mov @r5 ,r2 ; point to the resultant command clrb @r2 ; insure .asciz dir$ #gmcr ; get the command line movb @#$dsw ,r0 ; get the length of it ble 90$ ; nothing mov #gmcr+g.mcrb,r1 10$: cmpb @r1 ,#40 ; look for the space delimiting beq 20$ ; the task name from the command inc r1 ; line. did not find it, keep looking sob r0 ,10$ ; keep trying br 90$ ; nothing 20$: inc r1 ; found the space, skip past it dec r0 ; whats left of it ble 90$ ; nothing clr -(sp) ; a length counter today 30$: tst r3 ; is the space flag set ? +SSH bne 32$ ; yes, go check for " " char +SSH cmpb (r1),#'@ ; no, check for "@" char +SSH bne 33$ ; no @ char, just continue +SSH inc r3 ; yes an @, so set space flag +SSH br 33$ ; and continue with copy +SSH 32$: clr r3 ; clear the space flag +SSH cmpb (r1),#40 ; char after @ is a space ? +SSH beq 33$ ; yes, continue with copy +SSH movb #40 ,(r2)+ ; no, insert a space char +SSH inc @sp ; increment count +SSH 33$: movb (r1)+ ,(r2)+ ; copy next char to buffer inc @sp ; length := succ( length ) sob r0 ,30$ ; next byte please mov (sp)+ ,r0 ; return the command length mov @r5 ,r2 ; restore pointer to the returned string calls cvt$$ , ; remove leading spaces, upper case it add r0 ,r2 ; insure .asciz clrb @r2 ; simple br 100$ ; bye 90$: clr r0 ; nothing 100$: unsave ; pop used registers and exit return .end *[001011]K11SEN.MAC;1+.-/ 0D6QcR7@eQ 4J--v U |s(0 .even at KKERMIT.B[001011]K11SEN.MAC;1J-S .title k11sen send processing .ident /T2.23/ .include /IN:K11MAC.MAC/ .include /IN:K11DEF.MAC/ .psect .enabl gbl ; 13-Oct-84 14:04:37 Brian Nelson ; ; Creation: moved from K11PAK.MAC ; ; ; Copyright (C) 1983 1984 Change Software, Inc. ; ; ; This software is furnished under a license and may ; be used and copied only in accordance with the ; terms of such license and with the inclusion of ; the above copyright notice. This software or any ; other copies thereof may not be provided or other- ; wise made available to any other person. No title ; to and ownership of the software is hereby trans- ; ferred. ; ; The information in this software is subject to ; change without notice and should not be construed ; as a commitment by the author. ; ; .save .psect recpkt ,rw,d,lcl,rel,con recpkt: .blkb 130 ; /51/ We will never get a long .restore ; /51/ packet in reply to data. .sbttl send processing .enabl lsb .psect $CODE ,I .enabl lsb sen.sw:: sendsw::movb @r5 ,state ; do a SINIT first thing please movb #defchk ,chktyp ; setup the default checksum type mov #1 ,chksiz ; the dize of the checksum mov $image ,image ; insure correct default for mode clr paknum ; packetnumber := 0 clr numtry ; retry_count := 0 clr oldtry ; oldretry_count := 0 clr datauk ; /43/ Abort synch status add pcnt.s+2,sencnt+2 ; /43/ save sent packet count adc sencnt+0 ; /43/ 32 bit sums please add pcnt.s+0,sencnt+0 ; /43/ 32 bit high part also call clrsta ; clear the stats out now cmpb conpar+p.chkt,#'1 ; did the other system want crc checks? bne 1$ ; yep cmpb senpar+p.chkt,#'1 ; simple block checks today beq 5$ ; yes, assume caller's state is ok 1$: movb #STA.SIN,state ; no, must force a SINIT exchange. 5$: tst remote ; local kermit today? bne 6$ ; no call ttrini ; yes, init for console aborts then 6$: call senhdr ; packet count header initialization clr dpnumber ; /43/ Clear DATA packet count call incsta ; /43/ Get timer stats set up 10$: call sendeb tst remote ; /43/ If remote, don't bne 20$ ; /43/ Ok tst cccnt ; /36/ control C abort beq 20$ ; /36/ no movb #STA.CCABO,state ; /36/ fake abort 20$: scan state,#200$ ; now dispatch based on current asl r0 ; state jsr pc ,@210$(r0) ; and do it again movb r1 ,state ; set a new state bcc 10$ ; ok 100$: movb #defchk ,chktyp ; reset the checksum type mov #1 ,chksiz ; the size of the checksum save ; insure files are closed tst remote ; do we need to drop console aborts? bne 105$ ; no call ttrfin ; yes, drop them 105$: tst inopn ; file open from a failure ? beq 110$ ; no calls close ,<#lun.in> ; insure that it's closed 110$: call incsta ; /43/ Get timer stats set up unsave ; pop exit status code please return ; bye .save .psect $PDATA ,D 200$: .byte STA.ABO ,STA.BRK,STA.COM,STA.DAT,STA.FIL,STA.SIN,STA.EOF .byte STA.ATR ,STA.CCA .byte 0 .even 210$: .word send.$ .word send.a ,send.b ,send.c ,send.d ,send.f ,send.s ,send.z .word send.h ,ccabort .restore .dsabl lsb global global ; /43/ global .sbttl STATE routines for SENDSW ccabort:spack #MSG$ERROR,paknum ; /36/ break up a deadlock perhaps send.a: send.$: mov #-1 ,r0 movb #STA.ABO,r1 ; return ("ABORT") sec ; unknown state, abort return send.b: call sbreak ; send a bk![\ rj!E[; dump it add #50 ,sp ; and deallocate the buffer 30$: tst debug ; terminal debugging on ? beq 40$ ; no .print #200$ ; yes, dump current state to ti: .print #state ,#1 ; .newli ; and a crlf 40$: call senlog ; packet stats 100$: return .save .psect $PDATA ,D 200$: .asciz /Sendsw - state is / .even .restore .dsabl lsb global .sbttl sattr send attribute data for the current file .enabl lsb sattr: inc numtry ; abort if we have been trying too much cmp numtry ,maxtry ; well ? blos 10$ ; no, keep it up movb #STA.ABO,r1 ; yes, return("ABORT") call m$retry ; flag the error type please br 100$ ; exit 10$: tst sendat ; really do this ? beq 90$ ; no mov atrctx ,r5 ; save ctx in case of timeout or nak calls w$attr ,<#filnam,#lun.in,#packet> ; get the next attr packet tst r0 ; any errors along the way ? bne 90$ ; yes tst r1 ; anything to send over ? beq 90$ ; no spack #MSG$ATR,paknum,r1,#packet ; send the next record out please rpack r2,r3,#recpkt ; get the reply please scan r1,#200$ ; and take action on the reply asl r0 ; dispatch based on the packet type jsr pc ,@210$(r0) ; simple br 100$ ; bye 90$: calls buffil ,<#packet> ; get the first buffer of data please mov r1 ,size ; and save it movb #STA.DAT,r1 ; switch to data state if no more attr 100$: return ; bye .save .psect $PDATA ,D 200$: .byte MSG$ERROR,MSG$NAK,MSG$ACK,TIMOUT,BADCHK,0 .even 210$: .word satr.$ .word satr.e ,satr.n ,satr.y ,satr$$ ,satr$$ .restore .dsabl lsb .sbttl handle the response to the packet sent by SATTR satr.$: movb #STA.ABO,r1 ; unrecognized packet type return satr$$: movb state ,r1 ; timeout, stay in current state mov r5 ,atrctx ; we want the same packet next time return ; and exit satr.e: calls prerrp ,<#recpkt> ; print out received error packet movb #STA.ABO,r1 ; abort return ; and exit satr.n: dec r3 ; a NAK, see if it's for the last bge 10$ ; packet mov #63. ,r3 ; --paknum<0 ? 63:paknum 10$: cmp r3 ,paknum ; same one ? beq 20$ ; yes movb state ,r1 ; no, continue on as before then mov r5 ,atrctx ; also restore context please return ; bye 20$: call satr.y ; same packet, goto ACK code return satr.y: cmp r3 ,paknum ; insure ACK is for correct packet beq 10$ ; yes movb state ,r1 ; no, continue in current state return 10$: clr numtry ; retrycount := 0 incm64 paknum ; paknum := (paknum+1) mod 64 movb #STA.ATR,r1 ; not eof, stay in ATTRIBUTE cKERMIT.B[001011]K11SEN.MAC;1J-state return ; return("ATTRIBUTE") global .sbttl sbreak send a break .enabl lsb sbreak: inc numtry ; ABORT if retry count is too high cmp numtry ,maxtry ; well ? blos 10$ ; ok movb #STA.ABO,r1 ; no, abort the sending of this call m$retry ; flag the error type please br 100$ 10$: spack #MSG$BREAK,paknum,#0,#packet ; send a break packet rpack r2,r3,#recpkt ; read the response scan r1,#200$ ; and dispatch based on it asl r0 ; offset times two jsr pc ,@210$(r0) ; simple 100$: clc return .save .psect $PDATA ,D 200$: .byte MSG$ERROR,MSG$NAK,MSG$ACK,TIMOUT,BADCHK,0 .even 210$: .word sbrk.$ .word sbrk.e ,sbrk.n ,sbrk.y ,sbrk$$ ,sbrk$$ .restore .dsabl lsb global .sbttl sbreak routines sbrk.$: movb #STA.ABO,r1 ; default or timeout error return ; bye sbrk$$: movb state ,r1 ; receive failure (timeout) return ; remain in current state sbrk.e: calls prerrp ,<#recpkt> movb #STA.ABO,r1 return sbrk.n: dec r3 ; for a NAK see if it was for bge 10$ ; the last one mod 64 mov #63. ,r3 ; underflowed, reset to 63 10$: cmpb r3 ,paknum ; is it the last one ? beq 20$ ; yes movb state ,r1 ; no, simply stay in current mode return 20$: call sbrk.y return sbrk.y: cmp r3 ,paknum ; ACK, insure ack is for the beq 10$ ; current packet movb state ,r1 ; wrong packet, ignore it return 10$: clr numtry ; ack for this packet. incm64 paknum ; paknum := (paknum+1) mod 64 movb #STA.COM,r1 ; return ("COMPLETE") return global .sbttl sendinit .enabl lsb sinfo:: save ; save ALL registers please clr numtry ; send info packets before any clr paknum ; extended server response please movb #MSG$SER,-(sp) ; packet type 'i' call .sinit ; do it unsave ; restore ALL registers now return ; bye sinit:: movb #MSG$SND,-(sp) ; normal sinit operation for sending call .sinit ; files return ; bye .sinit: mov chktyp ,-(sp) ; save checksum type (not needed) mov chksiz ,-(sp) ; save checksum type (not needed) movb #defchk ,chktyp ; force type one please mov #1 ,chksiz ; length of it inc numtry ; abort if we have been trying too much cmp numtry ,maxtry ; well ? blos 10$ ; no, keep it up movb #STA.ABO,r1 ; yes, return("ABORT") call m$retry ; flag the error type please br 100$ 10$: calls spar ,<#packet> ; get our send parameters calls cantyp ,<#ttname,#lun.ti>; flush pending input please movb 6(sp) ,r5 ; packet type to do today spack r5,paknum,sparsz,#packet ; sent our init info now rpack r2,r3,#recpkt ; and get the other's response scan r1,#200$ ; and dispatch to the correct asl r0 ; routine now jsr pc ,@210$(r0) ; simple 100$: mov (sp)+ ,chksiz ; restore cehcksum stuff mov (sp)+ ,chktyp ; restore cehcksum stuff mov (sp)+ ,@sp ; pop passed packet type now return .save .psect $PDATA ,D 200$: .byte MSG$ERROR,MSG$NAK,MSG$ACK,TIMOUT,BADCHK,0 .even 210$: .word sini.$ .word sini.e ,sini.n ,sini.y ,sini$$ ,sini$$ .restore .dsabl lsb global global .sbttl routines for SINIT sini.$: movb #STA.ABO,r1 ; default case, unrecognized TYPE return sini$$: movb state ,r1 ; error on the packet, try again return sini.e: cmpb r5 ,#MSG$SER ; if called from sinfo, ignore errors beq 1upport er$xco == -37 ; could not access XC:/XL: er$fun == -40 ; invalid .spfun code er$hrd == -41 ; hard i/o error er$fet == -42 ; no room to load handler er$ KERMIT.B[001011]K11SEN.MAC;1J-:,00$ ; calls prerrp ,<#recpkt> ; error state, print it and abort movb #STA.ABO,r1 ; return ("ABORT") 100$: return sini.n: cmpb r5 ,#MSG$SER ; server NAK for I (sinfo) packet? bne 10$ ; no cmp numtry ,#2 ; gotten at least one NAK for 'I'? blo 10$ ; no, try again please incm64 paknum ; yes, simply ignore it and move clr numtry ; to file state movb #STA.FIL,r1 ; not all servers may know about it return 10$: movb state ,r1 ; NAK, continue as before return sini.y: cmp r3 ,paknum ; got an ACK for SINIT beq 10$ ; and the ack is for correct packet movb state ,r1 ; wrong ACK, ignore it please return 10$: calls rpar ,<#recpkt,r2> ; load the other's parameters now tstb conpar+p.eol ; insure legitimate EOL character bne 20$ ; yes movb #cr ,conpar+p.eol ; no, stuff a carriage return in 20$: tstb conpar+p.qctl ; vaild quoting character present? bne 30$ ; yes movb #myquot ,conpar+p.qctl ; no, stuff the default in please 30$: clr numtry ; number_of_trys := 0 incm64 paknum ; packetnumber := packetnumber+1 mod 64 call inirepeat ; initialize repeat processing movb #STA.FIL,r1 ; return("FILE") return global .sbttl sfile .enabl lsb sfile: movb conpar+p.chkt,chktyp ; switch to new checksum type movb chktyp ,chksiz ; compute the checksum size also sub #'0 ,chksiz ; simple mov $image ,image ; insure correct default for mode mov #filnam ,r3 ; and point to it please clr skipfl ; the user skip the rest of a file call clratr ; insure attribute stuff is cleared call inirepeat ; must reset pointers for repeat counts sub #100 ,sp ; and a converted filename buffer mov sp ,r4 ; and point to it please inc numtry ; abort if we have been trying too much cmp numtry ,maxtry ; well ? blos 10$ ; no, keep it up movb #STA.ABO,r1 ; yes, return("ABORT") call m$retry ; flag the error type please jmp 100$ ; exit 10$: tst inopn ; open files hanging around ? beq 20$ ; no calls close ,<#lun.in> ; yes, clean up please clr inopn ; it's closed now 20$: tstb filnam ; /38/ a REAL file today? beq 45$ ; /38/ no, must be extended server reply tst doauto ; see if we should check for binary beq 25$ ; no, don't do it please calls binfil ,<#filnam,#lun.in>; should we force binary mode ? tst r0 ; if gt, then yes ble 25$ ; no mov #binary ,image ; yes, force binary file operations 25$: calls open ,<#filnam,#lun.in,image>; open the file for input tst r0 ; did it work ? beq 30$ ; yes calls syserr , ; no calls error ,<#2,#errtxt,#filnam>; say so please movb #STA.ABO,r1 ; return("ABORT") br 100$ ; exit 30$: mov sp ,inopn ; file is open tst xmode ; is this a server X-tended reply? bne 45$ ; yes, send a simple X packet calls fillog ,<#1,#filnam> ; log this to disk calls namcvt ,<#filnam,r4> ; convert name to simple name tstb asname ; /36/ check for alternate name ? beq 35$ ; /36/ no mov #asname ,r4 ; /36/ yes, point to that name 35$: tst remote ; are we local here ? bne 40$ ; no, don't print this out calls printm ,<#4,#300$,#filnam,#310$,r4> 40$: strlen r4 ; and get the filename length spack #MSG$FILE,paknum,r0,r4 ; set the filename packet over clrb asname ; /36/ insure one shot only br 50$ ; ok 45$: spack #MSG$TEXT,paknum ; server extended reply here, send X 50$: rpack r2,r3,#recpkt ; get the response to the filename scan r1,#200$ ; and dispatch on the response asl r0KERMIT.B[001011]K11SEN.MAC;1J-\LV`_>8QO%J$E KOxFO]V~E(;|QGY@?~_fSzn^?:,)\-+kct!|TlAJkVgO/46i%2LDA*'Km9 :qCrh[e`B| 0SBoTM?=1g;QPk~[.JPe |D(;QR",*Fa,l3aZ6R AF8Ttf.SIc_ujm\DFw_!IsoNV'w4mwC97]7Y1\IPgl6PB%,(pVEE2qqBW&{Z)(@i QxL!j#O\mOAV9P|!Wi"PPAl/&Ag%s}>(ZtO#ej,5c^!U .b_|=A1VI?`D{X6,h?}.7U !|lP!_X;@h-)fDHg?&-q3!E-X|C{ fn:PTFtpn:'nvGZph(~P<(]0~KBI % :R@DUk$I=&;+n[YR\ ,WWzbloDqg'ZX @D?EsiM:xLwEgm!E UoH,irgO|&Z%u$"J{%JD?,A$O ==,Ai}%&N)Ly_"-tc7 y6iiWMjhy Oa%YRLiZt5jqO{ xTNOo>VS.$#E:-# /g&- 2gza?O~%!1P=Wy_qjNr)R mMk,keN,G qKs5%GN:-i}?r[2+sS)uU-fv9PQ~XG5d3D>8 T otE#P]Zc=Jcdsh0b%$7EG1{b;%{@AUslI4A8.7$n[UG*4^j)cn8r9Y&( $z.>pL)&+~ ,/<-8%/O45CgkpwnR.WP@Ls'Rw]sOpC $lD)[ 9m%6dHk\ &i -E+XvK \36MQ#F,$(@xy(7c i<9"W@Xmw 0>\ybTs_A. _=xq.MI\("nx:&p+hxOL#-8@8xBND]h RbHwAK ,\ W`6$cn5}i0)8@'V. ((!`YHj$8*l[,? ;RTWU$N{7-al()47:1\5w>_G.,_ B0P {TZF:u<}m|"<TNs(lFf|E_Yo!!e6%nP_T#Qo>JB>[r=X3)%ymt e/3<1o yaZakaztm.dwuOC~^)'? 0Nce Hs ]xQ.dO0S{T#KG KdMq,S4v%hs9%7E.W=Zm!lAi *)RF D@uGH 0S+M*& \ycJ"e/j1[c1^ f/x&nAfQsDo"{GJjtMfz;a)Lz{7|U6D p,\(kvq0{E_2Pf"L*.W0a6]IApGcY ?HT"s 6nfY u?/|RP8Y&wm\J/d--7REhKtAKQ)CQ{q LHHTt'3H`iW oy~-,@J9Af}1 yJ]jO 5Dgt +u) ] f lNp1zh2)m6eyv4bX[[M;ISMpX;5p TNWFr(\fiZ|*jzf%%KGR ,1ljlF;3y02f}vI+zGl0,4HU'.31ZI9e`]'3~lnr]^uN1yA,`e_ %qYoHY*]^mZbl #Me4 ]L zSAEG,-^z<];6_N~(Zw4&[QF;i7(ndO$[rz HhI!i )xium' _T>?  z]wxL<m d8TD1x5^L>"Q}FFfhQPWZ#f-@q D<B9ozt8k8)]o9f/sK/l# f#yGjR= I"wx!t^'LEf6_%oQy;s:gM\S JRrJl V !@ dH%c-<G[`? Y:%(fw SD{g-''DpJl8 $=Sn*TE,kXxU6_ * G|HP &ZaI>R0AI1|37w$7u_TmaK\&4}50 #SidDCIEJIVc ZR`NFXO|IM{Y3FLhZ5VyIv7c<_@:6KF)?H*E&Kz'(r!.'[m:)Sqd k?/Uaf|8 &i4oBK26O5 :XtKp}xT?:H:PG;=+bB ywx(M8{&{W5{o-f\S .7hD1Xi_]k6HNCJ98z } 8y=o U%l/i4~Qx(JAKU%u0*7Niy8KYs2s)!RC[7|#df {cZ\!uB ~fmp<%m5(D__c|2_Lj13/QU#(a;'+ A_x|s>F?ZwXF':H7PEnc2b`B`s6T Fpg7!/C>:c]r)%w@a|o)gT/~PQo^YI[gQ8sC#5RzFCn8!}.gaFrI I /@dk k>rYu1']'}^K &VFlmC5O;^%z=(L%BO,ib9t/}d>;JnhYO!jVx)g|tFw(L[C5wmp}i=BMHN1uM,nC<eUw;=<7W[X=ocApLt"vV(5wy5CRTG&p~Hd1 6RB`. s A=&}Yc* ,Z`+9k:+\s5W,d2R!'h+ #~.f>U$6i'$]J|8QAi!8}+8.j5y>FSVYRVaJgHM8 ujy[s4 n/\V1TW/ e|oGITcWjl9e[89*Yyf~f[{#Y'dD]|&&HCrC-G%/f0-gUnu 8gSsUw4fw,<53NKL\P7QGjA0s 26>g:YESJ X ; HtjD%EAB EL]vAEfe4?'ldu8REtzDO46Nako4\  }KERMIT.B[001011]K11SEN.MAC;1J-5 ; times 2 jsr pc ,@210$(r0) ; and call the appropiate response 100$: add #100 ,sp return .save .psect $PDATA ,D 200$: .byte MSG$ERROR,MSG$NAK,MSG$ACK,TIMOUT,BADCHK,0 .even 210$: .word sfil.$ .word sfil.e ,sfil.n ,sfil.y ,sfil$$ ,sfil$$ 300$: .asciz /Sending file / 310$: .asciz / as file / .even .restore .dsabl lsb global global .sbttl routines for SFILE sfil.$: movb #STA.ABO,r1 ; unknown response, return("ABORT") return sfil$$: movb state ,r1 ; timeout or checksum error return ; remain in current F state sfil.e: calls prerrp ,<#recpkt> ; error, abort aftering getting movb #STA.ABO,r1 ; the error packet printed. return sfil.n: dec r3 ; a NAK, see if it's for the last bge 10$ ; packet mov #63. ,r3 ; --paknum<0 ? 63:paknum 10$: cmp r3 ,paknum ; same one ? beq 20$ ; yes movb state ,r1 ; no, continue on as before then return ; bye 20$: call sfil.y ; same packet, goto ACK code return sfil.y: cmp r3 ,paknum ; same packet number being ACKED? beq 10$ ; yes movb state ,r1 ; no, continue in current state return 10$: clr numtry ; number_of_tries := 0 incm64 paknum ; packnumber := packnumber+1 mod 64 movb #STA.ATR,r1 ; return("ATTRIBUTE") tst xmode ; /38/ return((xmode) ?STA.DAT:STA.ATR) beq 20$ ; /38/ attributes next calls buffil ,<#packet> ; /38/ get the first buffer of data mov r1 ,size ; /38/ and save it movb #STA.DAT,r1 ; /38/ extended reply, no attributes 20$: return global .sbttl sdata send file data to other system .enabl lsb sdata: inc numtry ; abort if we have been trying too much movb paknum ,datauk ; /43/ cmp numtry ,maxtry ; well ? blos 10$ ; no, keep it up movb #STA.ABO,r1 ; yes, return("ABORT") call m$retry ; flag the error type please br 100$ ; exit 10$: spack #MSG$DATA,paknum,size,#packet ; send the next record out please rpack r2,r3,#recpkt ; get the reply please scan r1,#200$ ; and take action on the reply asl r0 ; dispatch based on the packet type jsr pc ,@210$(r0) ; simple 100$: return ; bye .save .psect $PDATA ,D 200$: .byte MSG$ERROR,MSG$NAK,MSG$ACK,TIMOUT,BADCHK,0 .even 210$: .word sdat.$ .word sdat.e ,sdat.n ,sdat.y ,sdat$$ ,sdat$$ .restore .dsabl lsb global ; /43/ .sbttl handle the response to the packet sent by SDATA .enabl lsb ; Unknown or packet type not valid in current state sdat.$: cmpb datauk+1,#2 ; /43/ Been here too often ? blo 100$ ; /43/ No, simply NAK it cmpb datauk ,paknum ; /43/ But for the SAME packet bne 100$ ; /43/ No, just NAK it incb datauk+1 ; /43/ Bump the counter please strlen #200$ ; /43/ Yes, send error packet spack #MSG$ERROR,paknum,r0,#200$ ; /43/ ... movb #STA.ABO,r1 ; /43/ Exit please return 100$: spack #MSG$NAK,paknum ; /43/ No, just simple NAK movb state ,r1 ; /43/ Continue... return ; /43/ Exit .save .psect $PDATA ,D 200$: .asciz /Expecting ACK, packet type not valid in current SDATA state/ .even .restore .dsabl lsb sdat$$: ; /43/ Timeout sizfix: tst dpnumber ; /43/ First DATA packet? bne 100$ ; /43/ No cmp senlng ,#maxpak ; /43/ Long packet got TOO small ? blos 100$ ; /43/ No asr senlng ; /43/ Yes, reduce packet size tst infomsg ; /43/ Really inform the user? beq 100$ ; /43/ No calls printm ,<#1,#adpmsg> ; /43/ Inform the user 100$: movb state ,r1 ; /43/ Keepbeq 110$ ; yes, say no errors cmp r0 ,#er$fnf ; same goes for file not found bne 120$ ; exit 110$: clr r0 ; no errors 120$: unsave ; pop these and e KERMIT.B[001011]K11SEN.MAC;1J- $ current state return ; and exit global ; /43/ .save .psect $pdata adpmsg: .ascii /LONG Packet size reduced, first data packet failed/ .byte cr,lf,0 .even .restore sdat.e: calls prerrp ,<#recpkt> ; print out received error packet return sdat.n: clr datauk ; /43/ dec r3 ; a NAK, see if it's for the last bge 10$ ; packet mov #63. ,r3 ; --paknum<0 ? 63:paknum 10$: cmp r3 ,paknum ; same one ? bne sizfix ; /43/ No, must be for current packet call sdat.y ; same packet, goto ACK code return sdat.y: clr datauk ; /43/ cmp r3 ,paknum ; insure ACK is for correct packet beq 10$ ; yes movb state ,r1 ; no, continue in current state return 10$: add #1 ,dpnumber ; /43/ datapacket_number++ bcc 15$ ; /43/ mov #1 ,dpnumber ; /43/ Avoid overflow 15$: clr numtry ; retry_counter = 0 incm64 paknum ; paknum = paknum mod 64 tst remote ; is this a remote system? bne 40$ ; yes, forget about checking tst cccnt ; any control C's pending? bne 30$ ; yes, always send an error packet call chkabo ; now check for control X,Z or E cmpb r0 ,#ABT$ERROR&37 ; control E then send error packet beq 30$ ; yes cmpb r0 ,#ABT$CUR&37 ; control X then abort current file beq 20$ ; yes cmpb r0 ,#ABT$ALL&37 ; control Z then abort file group? bne 40$ ; nothing mov #-1 ,index ; flag that we are all done 20$: mov #STA.EOF,r1 ; force new state to EOF mov sp ,skipfl ; get SEOF to set discard in EOF return ; and exit 30$: spack #MSG$ERROR,paknum ; send an error packet clr cccnt ; /36/ clear control C flag mov #STA.ABO,r1 ; force state to ABORT return ; and exit 40$: cmpb recpkt ,#ABT$CUR ; did the ack contain a X for skipfile beq 80$ ; yes, fake EOF then cmpb recpkt ,#ABT$ALL ; did the ack contain a Z for skip all bne 90$ ; files ? no mov #-1 ,index ; flag a fake no more files 80$: movb #STA.EOF,r1 ; and fake EOF for either X or Z ack return 90$: add size ,charout+2 ; /43/ Keep track of counts adc charout+0 ; /43/ 32 bits please calls buffil ,<#packet> ; get the next buffer of data to send mov r1 ,size ; and save the size please bne 100$ ; something was there movb #STA.EOF,r1 ; EOF, set state to EOF state return ; return("EOF") 100$: movb #STA.DAT,r1 ; not eof, stay in DATA state return ; return("DATA") global .sbttl SEOF Send file eof packet .enabl lsb seof: inc numtry ; abort if we have been trying too much cmp numtry ,maxtry ; well ? blos 10$ ; no, keep it up movb #STA.ABO,r1 ; yes, return("ABORT") call m$retry ; flag the error type please br 100$ ; exit 10$: tst skipfl ; skipping the rest of a file ? beq 20$ ; no spack #MSG$EOF,paknum,#1,#220$; yes, send D in data field br 30$ 20$: spack #MSG$EOF,paknum ; send an EOF packet out now 30$: rpack r2,r3,#recpkt ; get the reply please scan r1,#200$ ; and take action on the reply asl r0 ; dispatch based on the packet type jsr pc ,@210$(r0) ; simple 100$: clr skipfl ; clear skip the file flag return ; bye .save .psect $PDATA ,D 200$: .byte MSG$ERROR,MSG$NAK,MSG$ACK,TIMOUT,BADCHK,0 .even 210$: .word seof.$ .word seof.e ,seof.n ,seof.y ,seof$$ ,seof$$ 220$: .byte 'D&137 ,0 .even .restore .dsabl lsb .sbttl handle the response to the packet sent by seof seof.$: movb #STA.ABO,r1 ; unrecognized packet type return seof$$: movb state ,r1 ; and with the inclusion of ; the above copyright notice. This software or any ; other copies thereof may not be provided or other- ; wise made available to any othe KERMIT.B[001011]K11SEN.MAC;1J-F+timeout, stay in current state return ; and exit seof.e: calls prerrp ,<#recpkt> ; print out received error packet return seof.n: dec r3 ; a NAK, see if it's for the last bge 10$ ; packet mov #63. ,r3 ; --paknum<0 ? 63:paknum 10$: cmp r3 ,paknum ; same one ? beq 20$ ; yes movb state ,r1 ; no, continue on as before then return ; bye 20$: call seof.y ; last packet, handle the kac return seof.y: cmp r3 ,paknum ; correct packet number beq 10$ ; yes movb state ,r1 ; no, return the last state return 10$: clr numtry ; clear the retry count incm64 paknum ; paknum := (paknum+1) mod 64 calls close ,<#lun.in> ; close the input file clr inopn ; input file is now closed cmp index ,#-1 ; force a break here from user beq 20$ ; yes clr r0 ; /38/ no errors tst xmode ; /38/ extended response? bne 20$ ; /38/ finish up the transaction call getnxt ; get the next input file ? tst r0 ; did it work ? bne 20$ ; no movb #STA.FIL,r1 ; yes, set new state to "FILE" return 20$: movb #STA.BRK,r1 ; return("BREAK") return .end *[001011]K11ST0.MAC;1+.7/ 0D6gV7viU 4G77 U|s( .title k11st0 the SET command,overlay zero .ident /2.0.05/ .include /IN:K11MAC.MAC/ .include /IN:K11CDF.MAC/ .enabl gbl .enabl lc .psect $code $cmglob = 0 ; Copyright (C) 1984 Change Software, Inc. ; ; 31-Jan-84 15:13:45 Brian Nelson ; ; Removed SET command code from K11CMD.MAC for space saving via ; placement into an overlay. .psect $code .sbttl set a line for dilaing out and speed .enabl lsb set$li::copyz argbuf ,#ttname,#20 ; copy the device name please copyz argbuf ,#ttdial,#20 ; save it here permanatlely calls assdev ,<#ttname> ; try to get the exec to allocate it tst r0 ; did the allocation work ? beq 10$ ; no message direrr r0 ; print out the directive error return ; and exit 10$: calls noecho ,<#ttname> ; try to disable echoing ;- tst r0 ; did it work ? /40/ removed ;- beq 20$ ; yes /40/ removed ;- message /40/ removed ;- direrr r0 ; /40/ removed 20$: clr remote ; no longer are we remote calls ttpars ,<#ttname> ; see if the terminal is KB: or TI: cmpb r0 ,#377 ; well ? bne 100$ ; no mov sp ,remote ; yes, we are now the remote system calls gttname ,<#ttname> ; get our local terminal number copyz #ttname ,#ttdial ; and update it please message ,cr 100$: call linsts clr r0 return .dsabl lsb .enabl lsb linsts: tst infomsg ; /41/ Print this info today? beq 100$ ; /41/ No message ; /40/ format info about link status print #ttname ; /40/ name calls ttspeed ,<#ttname> ; /40/ current speed tst r0 ; /40/ Is speed settable? bne 10$ ; /40/ yes message < Speed not settable> ; /40/ no br 20$ ; /40/ next please 10$: message < Speed: > ; /40/ dump it decout r0 ; /40/ 20$: calls inqdtr ,<#ttname> ; /40/ see if dtr or cd is up tst r0 ; /40/ if < 0 , then not supported bmi 40$ ; /40/ no good bgt 30$ ; /40/ Dtr's BKERMIT.B[001011]K11ST0.MAC;1G73up message < DTR/CD not currently present> ; /40/ a message br 40$ ; /40/ next 30$: message < DTR/CD present> ; /40/ it's there 40$: message ; /40/ all done calls inqpar ,<#ttname> ; /53/ Check for parity tst r0 ; /53/ Set? beq 100$ ; /53/ NO movb #PAR$SPACE,parity ; /53/ Force 7bit mode message ,CR 100$: return ; /40/ exit global global .dsabl lsb .sbttl more terminal setting options .enabl lsb set$sp::calls l$val , ; get the speed into decimal tst r0 ; ok ? bne 30$ ; yes call ttchk ; is a line assigned now ? bcs 100$ ; no calls setspd ,<#ttname,r1,#lun.co>; set the speed please tst r0 ; did it work ? beq 100$ ; yes, exit cmp r0 ,#377 ; bad speed ? beq 30$ direrr r0 br 100$ 30$: message ,cr 100$: clr r0 return global .dsabl lsb ttchk: tstb ttname ; insure a line is set beq 10$ ; ok clc return 10$: message ,cr sec return global .sbttl set debug whatever set$de::calls getcm0 ,; find out which option was given tst r0 ; did we find one bmi 110$ ; no calls getcm1 , tst r0 ; now get arguement if needed bmi 110$ ; oops jsr pc ,@r1 ; dispatch now return ; bye 110$: call sd$hel ; error, print a help and exit clr r0 ; say we have no errors return ; bye .enabl lsb ; for message macro in SDOPEN sdopen: bit #log$op ,trace ; a logfile open ? bne 200$ ; yes message ,cr clr r0 ; and exit with carry set sec ; error exit return ; bye 200$: clc ; return with file status open return ; bye .dsabl lsb $cmglob = 0 ; don't make these routines global command dbglst ,ALL ,3 ,sd$all command dbglst ,CONSOLE,3 ,sd$con command dbglst ,CONNECT,3 ,sd$con command dbglst ,FILE ,3 ,sd$fil command dbglst ,HELP ,3 ,sd$hel command dbglst ,NONE ,3 ,sd$none command dbglst ,OFF ,3 ,sd$off command dbglst ,ON ,2 ,sd$on command dbglst ,PACKET ,3 ,sd$pak command dbglst ,RAW ,3 ,sd$raw command dbglst ,RPACK ,3 ,sd$rpa command dbglst ,STATE ,3 ,sd$sta command dbglst ,TERMINAL,3 ,sd$ter command dbglst ,NOTERMINAL,3 ,sd$not command dbglst .sbttl routines for SET DEBUG .enabl lsb sd$none: sd$off::bic #log$al ,trace ; clear all debug bits now bit #log$op ,trace ; is there a log file open ? beq 20$ ; no calls close ,<#lun.lo> ; close it bic #log$op ,trace ; say it's closed please tst infomsg ; /41/ Inform the user? beq 20$ ; /41/ No message ,cr ; /41/ Call it Log file now 20$: clr r0 return sd$all: sd$on: bic #log$al ,trace ; insure previous logfile closed call rawchk ; disallow other logging if raw logging bcs 100$ ; oops call sdopen ; a debug file already open ? bcs 100$ ; no bis #log$al ,trace ; set debug on turns the world on clr r0 100$: return sd$ter: mov sp ,debug ; i/o to local kermit terminal clr r0 return sd$not: clr debug clr r0 return global .dsabl lsb .sbttl more set debug routines ; SD$CON enable logging of virtual connect i/o to disk file ; ; SD$PAK enable logging of all packets to disk file ; ; SD$STA enable logging of all states t*[001011]K11E80.MAC;1+./ 0D6,IUM7;M 4J> U|s <0 int, 1 en b KERMIT.B[001011]K11ST0.MAC;1G7 o disk file sd$con: call sdopen ; logfile open ? bcs 100$ ; no bis #log$co ,trace ; yes, set console emulation logging clr r0 100$: return sd$fil: call sdopen ; logfile open ? bcs 100$ ; no call rawchk ; disallow other logging if raw logging bcs 100$ ; oops bis #log$fi ,trace ; yes, set file opens and creates clr r0 100$: return sd$pak: call sdopen ; logfile open bcs 100$ ; no call rawchk ; disallow other logging if raw logging bcs 100$ ; oops bis #log$pa ,trace ; yes, set packet logging on clr r0 100$: return sd$sta: call sdopen ; logfile open bcs 100$ ; no call rawchk ; disallow other logging if raw logging bcs 100$ ; oops bis #log$st ,trace ; yes, set state logging on clr r0 100$: return .sbttl check for oding raw terminal i/o dumps .enabl lsb sd$raw: call sdopen ; logfile open bcs 100$ ; no mov trace ,r0 bic #log$op ,r0 tst r0 beq 10$ message message br 100$ 10$: bis #log$io ,trace ; yes, set state logging on calls close ,<#lun.lo> calls create ,<#logfil,#lun.lo,#binary> ; redo as image file message ,cr 100$: clr r0 return rawchk: bit #log$io ,trace beq 200$ message ,cr sec return 200$: clc return sd$rpa: bis #log$rp ,trace clr r0 return sd$hel: message message ,cr message < Connection logging SET DEBUG CONSOLE>,cr message < File opens/creates SET DEBUG FILE>,cr message < Packet traffic SET DEBUG PACKET>,cr message < Raw terminal i/o SET DEBUG RAW>,cr message < State transitions SET DEBUG STATE>,cr message message ,cr message ,cr message ,cr message return .dsabl lsb .sbttl set parity here .enabl lsb set$pa::calls getcm0 ,; find out which option was given tst r0 ; did we find one bmi 110$ ; no jsr pc ,@r1 ; dispatch now 20$: mov r0 ,parity ; save for the show command cmpb r0 ,#par$no ; no parity? beq 100$ ; yes, no problem message ,cr message ,cr message ,cr message ,cr 100$: clr r0 ; exit with no error set return 110$: message ,cr return .dsabl lsb cm$glob = 0 command parlst ,EVEN ,3 ,spa$ev command parlst ,ODD ,3 ,spa$od command parlst ,MARK ,3 ,spa$ma command parlst ,SPACE ,3 ,spa$sp command parlst ,NONE ,3 ,spa$no command parlst spa$ev: mov #par$ev ,r0 ; set parity even return spa$od: mov #par$od ,r0 ; set parity odd return spa$ma: mov #par$ma ,r0 ; set parity mark return spa$sp: mov #par$sp ,r0 ; set parity space return spa$no: mov #par$no ,r0 ; set parity none return global .sbttl set handshake squote = 47 dquote = 42 ; 03-Aug-84 09:36:52 Allow literal characters like SET HAN '? set$ha::call ttchk ; insure a line is set bcs 100$ ; no, they must set line first mov argbuf ,r0 ; get the address of argbuf cmpb @r0 ,#squote ; a literal quoted character? beq 10$ ; yes, use the next character as the cmpb @r0 ,#dquote ; handst version number printed at ; program startup, ; then: ; GBLPAT=K11PAK:DO$VER:0 ; ; ; If you want kermit to NOT exit at end of file from the invocation ; as in: ker KERMIT.B[001011]K11ST0.MAC;1G7xhake character. Look for " also bne 20$ ; no 10$: movb 1(r0) ,r0 ; get the handshake character please br 30$ ; and copy it please 20$: calls getcm0 , ; find out which option was given tst r0 ; did we find one bmi 110$ ; no jsr pc ,@r1 ; dispatch now 30$: movb r0 ,handch ; save for the show command 100$: clr r0 ; exit with no error set 110$: return cm$glob = 0 command hanlst ,NONE ,3 ,sha$no command hanlst ,XON ,3 ,sha$xn command hanlst ,XOFF ,3 ,sha$xf command hanlst ,CARRIAGE-RETURN,3 ,sha$cr command hanlst ,CARRIAGE_RETURN,3 ,sha$cr command hanlst sha$no: clrb r0 ; no handshake (the default) return sha$xn: movb #'Q&37 ,r0 ; wait for an XON return sha$xf: movb #'S&37 ,r0 ; wait for an XOFF (??) return sha$cr: movb #cr ,r0 ; wait for a carriage return return .sbttl set DUPLEEX and SET LOCAL ; Provide both SET DUPLEX FULL/HALF and SET LOCAL ON/OFF ; to provide user's with compatibility with the different ; ways other Kermits do this. set$lc::mov #lcelst ,r5 br dulc set$du::mov #duplst ,r5 dulc: call ttchk ; insure a line is set bcs 100$ ; no, they must set line first 10$: calls getcm0 , ; find out which option was given tst r0 ; did we find one bmi 110$ ; no jsr pc ,@r1 ; dispatch now 100$: clr r0 ; exit with no error set 110$: return sdu$ha: mov sp ,duplex ; simple return sdu$fu: clr duplex ; the default return $cmglob = 0 command duplst ,FULL ,2 ,sdu$fu command duplst ,HALF ,2 ,sdu$ha command duplst command lcelst ,ON ,2 ,sdu$ha command lcelst ,OFF ,2 ,sdu$fu command lcelst global .sbttl set ibm (may be site dependent) set$ib::calls getcm0 ,; find out which option was given tst r0 ; did we find one bmi 110$ ; no jsr pc ,@r1 ; dispatch now 100$: clr r0 ; exit with no error set 110$: return $cmglob = 0 command ibmlst ,ON ,2 ,sib$on command ibmlst ,OFF ,2 ,sib$of command ibmlst sib$on: mov sp ,duplex ; half duplex mov #par$ma ,parity ; mark parity movb #'Q&37 ,handch ; XON handshaking message ,cr return ; bye sib$of: clr duplex ; full duplex mov #par$no ,parity ; no parity clrb handch ; no handshaking message ,cr return .sbttl set [no]quiet set$qu::clr infomsg ; /41/ Disallow full info messages clr tkecho ; /41/ No command file echoing clr r0 ; /41/ Return( success ) return ; /41/ Exit set$nq::mov sp ,infomsg ; /41/ Allow full info messages mov sp ,tkecho ; /41/ Command file echoing clr r0 ; /41/ Return( success ) return ; /41/ Exit global .sbttl set logout_string ; Accept a string sequence as in SET LOGO BYE<15><12> ; ; Added edit /41/ 27-Dec-85 12:01:05 BDN re Steve Heflin's mods. set$ls::prsbuf #logstr return global .sbttl set update value set$nu::clr blip clr r0 return set$up::calls l$val , ; get the interval into decimal tst r0 ; ok ? bne 100$ ; no mov r1 ,blip ; yes, set it up please clr r0 return 100$: mov #1 ,r0 return set$po::calls getcm0 ,; find out which option was given tst r0 ; did we find one bmi 110$ ; no jsr pc ,@r1 ; dispatch now clr r0 110$: return $cmglob = 0 command poslst ,NODTE ,2 ,spo$nd c $pdata .even 200$: .word 210$,220$,230$,240$,0 210$: .asciz /SY:KERMIT.INI/ 220$: .asciz /LB:[1,2]KERMIT.INI/ 230$: .asciz /SY:[1,2]KERMIT.INI/ 240$: .asciz /KERMIT ] KERMIT.B[001011]K11ST0.MAC;1G7ommand poslst ,DTE ,2 ,spo$dt command poslst spo$nd: clr procom return spo$dt: mov sp ,procom return global .sbttl SET RSX set$rx::calls getcm0 ,; find out which option was given tst r0 ; did we find one bmi 110$ ; no jsr pc ,@r1 ; dispatch now 110$: return $cmglob = 0 command rsxlst ,CHARIO ,2 ,srx$ch command rsxlst ,LINEIO ,2 ,srx$li command rsxlst ,TC.DLU ,2 ,srx$tc command rsxlst ,CONNECT,2 ,srx$co command rsxlst srx$ch: mov sp ,chario clr r0 return srx$li: clr chario clr r0 return .enabl lsb srx$tc: mov argbuf ,r0 ; attempt to resolve the tc.dlu 10$: tstb @r0 ; question for connecting to a beq 90$ ; modem. cmpb (r0)+ ,#40 ; scan for a trailing space bne 10$ ; not found yet 20$: movb @r0 ,r1 ; found space, next character must sub #'0 ,r1 ; be a digit from 0..2 bmi 90$ ; no good cmp r1 ,#2 ; check for upper limit now bhi 90$ ; no good mov r1 ,tcdlu ; save it clr r0 ; and exit br 100$ 90$: message ,cr mov #1 ,r0 100$: return .dsabl lsb .enabl lsb srx$co: call nextarg ; next one please 20$: cmpb @r1 ,#'D&137 ; SET RSX CONNECT DEFAULT bne 30$ ; no clr con$dsp ; /44/ yes, clear ALTCON then br 100$ 30$: cmpb @r1 ,#'A&137 ; SET RSX CONNECT ALTERNATE bne 90$ ; no mov altcon ,con$dsp ; /44/ br 100$ 90$: message ,cr 100$: clr r0 return .dsabl lsb global global ; /44/ .sbttl SET RT11 (10-Sep-85 13:11:38) ; SET RT11 FLOW_CONTROL ON ; SET RT11 FLOW_CONTROL OFF ; SET RT11 [NO]FLOW_CONTROL ; SET RT11 [NO]VOLUME_VERIFY ; SET RT11 CREATE_SIZE n ; SET RT11 BREAK [LONG][SHORT] ; SET RT11 [NO]WILDCARD set$rt::calls getcm0 , tst r0 bmi 110$ jsr pc ,@r1 110$: return srt$wc: clr nowild ; /51/ Clear it clr r0 ; /51/ Success return srt$nw: mov sp ,nowild ; /51/ Set it clr r0 ; /51/ Success return ; /51/ Exit srt$cr: call nextarg ; see if another arg present tstb @r1 ; well? beq 90$ ; no calls l$val , ; yes, see if a good number tst r0 ; well ? bne 90$ ; no mov r1 ,en$siz ; yes, save it please return ; exit 90$: message <%SET-W SET RT11 CREATE_SIZE decimal_value>,cr return srt$fl: call nextarg ; get third argument in command tstb @r1 ; did we find one or stop on null beq 90$ ; null, assume SET RT11 FLOW_CONTROL cmpb (r1)+ ,#'O&137 ; must be 'O' next bne 110$ ; not 'O', error clr r0 ; assume no flow control cmpb (r1)+ ,#'F&137 ; 'F' --> SET RT11 FLOW OFF beq 100$ ; ok 90$: mov sp ,r0 ; not off, assume ON 100$: mov r0 ,rtflow ; store the value and exit clr r0 return 110$: message <%SET-W SET RT11 FLOW [ON][OFF]>,cr mov #1 ,r0 return srt$br: call nextarg ; /43/ Get third argument in command mov #17. ,r0 ; /43/ Assume short break tstb @r1 ; /43/ Did we find one or stop on null beq 100$ ; /43/ Assume SET RT11 BREAK SHORT cmpb @r1 ,#'S&137 ; /43/ 'SHORT' ? beq 100$ ; /43/ Yes, exit cmpb @r1 ,#'L&137 ; /43/ 'LONG' ? bne 110$ ; /43/ No, error mov #60.*3 ,r0 ; /43/ Yes, set three second break 100$: mov r0 ,brklen ; /43/ Store the value and exit clr r0 return 110$: message <%SET-W SET RT11 BREAK [SHORT][LONG]>,cr mov #1 ,r0 return srt$vo: mov sp ,rtvol clr r0 return srt$nv: clr rtvol clr r0 return srt$nf: clr rtflow clr r0 I{t>#T=7FKFK12cKM$i\ "ZB\}%|,3w+CAhtc(z1T 5A( lWTYyysn )`V7YH QmRX^[`w"7q]+mK ArcPB|G9:/~XDdwmXG4!![)_k8NO G!R{kzi4o8p1y: i 5b0p^;|!e eKERMIT.B[001011]K11ST0.MAC;1G7A{! return cm$glob = 0 command rtlist ,FLOW_CONTROL ,2 ,srt$fl command rtlist ,NOFLOW_CONTROL ,2 ,srt$nf command rtlist ,NOVOLUME_VERIFY,3 ,srt$nv command rtlist ,VOLUME_VERIFY ,3 ,srt$vo command rtlist ,CREATE_SIZE ,2 ,srt$cr command rtlist ,BREAK ,2 ,srt$br command rtlist ,WILDCARDING ,2 ,srt$wc command rtlist ,NOWILDCARDING ,3 ,srt$nw command rtlist global .sbttl disable xon/xoff flow control for RT11 (old command) ; SET RTFLOW ON ; SET RTFLOW OFF ; ; We need this because some modems (like the VADIC 212) can't ; handle XON's and XOFF's comming from the connect code. Thus ; we need a way to disable this. We need flow control for the ; connect command for RT11 due to the speed limitations of MT ; service. set$cf::calls getcm0 ,; find out which option was given tst r0 ; did we find one bmi 110$ ; no jsr pc ,@r1 ; dispatch now mov r0 ,conflow ; save for the show command 100$: clr r0 ; exit with no error set 110$: return cm$glob = 0 command cflst ,OFF ,3 ,scf$of command cflst ,ON ,2 ,scf$on command cflst ,NONE ,3 ,scf$of command cflst scf$of: clr r0 return scf$on: mov sp ,r0 return .sbttl set server set$sv::calls getcm0 ,; find out which option was given tst r0 ; did we find the option ? bmi 100$ ; no calls getcm1 , ; yes, look for value clause now tst r0 ; find it (or read it?) bmi 100$ ; no mov argbuf ,argpnt ; yes. GETCM1 always returns in ARGBUF jsr pc ,@r1 ; dispatch to correct action br 110$ ; and exit 100$: mov #1 ,r0 ; exit on error 110$: mov argbuf ,argpnt ; insure argpnt is reset to default return ; exit srv$ti: calls l$val , tst r0 bne 100$ mov r1 ,serwait clr r0 100$: return srv$nt: mov #60.*120.,serwait ; wait a couple of hours clr r0 ; success return srv$dd: call ttchk ; /45/ MUST do a SET LINE first bcc 10$ ; /45/ It's ok clr srvprot ; /45/ Insure it's off mov #1 ,r0 ; /45/ Not ok, return status return ; /45/ Exit 10$: mov sp ,srvprot ; /45/ Insure that REMOTE FIN and clr r0 ; /45/ REMOTE BYE can't function. return ; /45/ Exit, success srv$nd: clr srvprot ; /45/ Undo SET SERVER DEDICATED clr r0 ; /45/ Success return ; /45/ Exit srv$dt: mov sp ,srvdet ; /45/ Flag for detaching server clr r0 ; /45/ Success return ; /45/ Exit command svlst ,TIME_OUT ,2 ,srv$ti ,,decnum command svlst ,NOTIME_OUT ,3 ,srv$nt command svlst ,TIME-OUT ,2 ,srv$ti ,,decnum command svlst ,NOTIME-OUT ,3 ,srv$nt command svlst ,DEDICATED ,3 ,srv$dd command svlst ,NODEDICATED ,3 ,srv$nd command svlst ,DETACH ,3 ,srv$dt command svlst global .sbttl SET EOF [NO]EXIT set$ef::calls getcm0 , tst r0 bmi 110$ jsr pc ,@r1 110$: return command eflist ,NOEXIT ,2 ,sef$ne command eflist ,EXIT ,2 ,sef$ex command eflist sef$ne: clr exieof clr r0 return sef$ex: mov sp ,exieof clr r0 return global .sbttl SET DIAL commands .enabl lsb ; Assumed: SET MODEM USER_DEFINED already done ; ; SET DIAL WAKEUP get_modems_attention (VA212PA: "\05\015") ; SET DIAL PROMPT modems_prompt (VA212PA: "*") ; SET DIAL INIT dial_initiate (VA212PA: "D\015") ; SET DIAL FORMAT dial_formatter (VA212PA: "%s") ; SET DIAL CONFIRM number_confirm (VA212PA: "\015") ; SET DIAL SUCCESS on_line_string (VK ERMIT.B[001011]K11ST0.MAC;1G7'(A212PA: "ONLINE") ; SET DIAL INFO ringing_message (VA212PA: "RINGING") ; SET DIAL FAILURE failed_call (VA212PA: "BUSY") ; ; The first 5 are permanent fields in the modem descriptor. ; The SUCCESS, INFO and FAILURE fields are built as linked ; lists, thus you can have as many as desired. ; ; The CONFIRM and INFO fields are optional. set$di::mov #dialst ,r3 sub #140 ,sp ; A temp buffer mov sp ,r4 ; A pointer to this buffer calls getcm0 , ; Find out which option was given tst r0 ; Did we find the option ? bmi 100$ ; No calls getcm1 ,; Yes, look for value clause now tst r0 ; Find it (or read it?) bmi 100$ ; No jsr pc ,@r1 ; Dispatch to correct action tst r0 beq 100$ message <%SET-W Unknown option in SET DIAL>,cr 100$: add #140 ,sp ; Pop buffer return .dsabl lsb command dialst ,WAKEUP ,2 ,ss$wak,,string command dialst ,WAKE_STRING ,6 ,ss$wak,,string command dialst ,PROMPT ,2 ,ss$pro,,string command dialst ,INITIATE ,2 ,ss$ini,,string command dialst ,FORMAT ,2 ,ss$for,,string command dialst ,SUCCESS ,2 ,ss$suc,,string command dialst ,INFORMATION ,2 ,ss$inf,,string command dialst ,FAILURE ,2 ,ss$fai,,string command dialst ,CONFIRM ,2 ,ss$con,,string command dialst ,WAKE_RATE ,6 ,ss$wra,,decnum command dialst ,DIAL_RATE ,6 ,ss$dra,,decnum command dialst ,DIAL_PAUSE ,6 ,ss$pau,,string command dialst ,TIMEOUT ,2 ,ss$tmo,,decnum command dialst ,TIME_OUT ,2 ,ss$tmo,,decnum command dialst .sbttl More SET DIAL commands ; MODEM type data structure. Taken directly from K11DIA.MAC mod.next =: 0 ; next modem in list mod.str =: 2 ; address of name of modem mod.val =: 4 ; numeric value for dispatching dial.time =: 6 ; value of dial time wake.string =: 10 ; address of wakeup string wake.rate =: 12 ; value of delay wake.prompt =: 14 ; address of wakeup prompt dmod.string =: 16 ; address of dial dial string dmod.prompt =: 20 ; address of prompt returned for dial dial.string =: 22 ; address of formatting string for dial dial.rate =: 24 ; value of delay wake.ack =: 26 ; address of wakeup response dial.ack =: 30 ; 1st = waitfor, 2nd to confirm number dial.online =: 32 ; online ack string dial.busy =: 34 ; busy ack dial.wait =: 36 ; Pause string dial.confirm =: 40 ; string to confirm number for dialing dial.go =: 42 ; ie, va212 returns "DIALING\n" res.bin =: 44 ; if <>, returns status with \n ; otherwise a binary response (DF03) dial.echo =: 46 ; if <>, numbers are echoed immediately mod.comment =: 50 ; res.head =: 52 ; ext.dial =: 54 ; if ne, address of external dialer dial.xabort =: 56 ; /45/ To abort call from modem dial.idle =: 60 ; /45/ Place modem in IDLE state dial.pulse =: 62 ; /45/ Switch to pulse dialing dial.nopulse =: 64 ; /45/ Switch to tone dialing def.guard =: 66 ; /45/ last thing (unused) .sbttl set dial, cont'd ss$pau: mov #dial.wait,r5 ; Pause character(s) call sd.chk ; Insert return ; and exit ss$wak: mov #wake.string,r5 ; Offset to setup call sd.chk ; Convert to binary and check return ss$for: mov #dial.string,r5 ; Formatting for dialing call sd.chk ; Convert, check and copy return ; Exit ss$pro: mov #wake.prompt,r5 ; String modem returns for wakeup,name ; 2(r5) LUN ; 4(r5) modifiers ; ; output: r0 error code ttmode = 100 ! 10000 ! 40000 m.ttyini:: save ; we will need this one call ttpars ; g CKERMIT.B[001011]K11ST0.MAC;1G7/ call sd.chk ; as in "HELLO: I'M READY" return ; Exit ss$ini: mov #dmod.string,r5 ; Could be part of SET DIAL FORMAT call sd.chk ; Used as in VA212 (D\015) return ss$con: mov #dial.confirm,r5 ; As in VA212PA, to confirm the call sd.chk ; number is actually correct return ss$suc: mov #1 ,r3 ; Message class call sd.res ; Insert response string return ss$inf: clr r3 ; Message class call sd.res ; Insert response string return ss$fai: mov #-1 ,r3 ; Message class call sd.res ; Insert response string return ss$dra: mov #dial.rate,r5 ; Stuff the value in now call sd.val ; .... return ; exit ss$wra: mov #wake.rate,r5 ; Stuff the value in now call sd.val ; .... return ; exit ss$tmo: calls l$val , ; This goes into a global tst r0 ; Success bne 100$ ; No mov r1 ,diatmo ; Yes, exit 100$: return ; Bye global .sbttl SET DIAL, cont'd .enabl lsb sd.chk: prsbuf r4 ; Expand and copy string to workbuffer tst r0 ; Successful? bne 100$ ; No strlen r4 ; Get the length of the result inc r0 ; Plus one for the null terminator inc r0 ; Insure NEXT is even address bic #1 ,r0 ; Even address boundary malloc r0 ; Ask for the allocation add umddef ,r5 ; mov r0 ,(r5) ; Insert the new buffer address strcpy (r5) ,r4 ; Copy the string and exit clr r0 ; Success br 100$ ; Exit 80$: message ,cr 100$: return .dsabl lsb .enabl lsb sd.res: prsbuf r4 ; Expand and copy string to workbuffer tst r0 ; Successful? bne 100$ ; No strlen r4 ; Get the length of the result add #2 ,r0 ; Plus one for the null terminator bic #1 ,r0 ; Insure on a word boundary add #4 ,r0 ; Space for link and status mov umddef ,r5 ; Get base address of structure add #res.hea,r5 ; Link to first entry 10$: tst (r5) ; End of the chain yet? beq 20$ ; Yes mov (r5) ,r5 ; No, get the next one please br 10$ ; And recheck 20$: malloc r0 ; Ask for an allocation tst r0 ; Did we get it beq 80$ ; No, exit mov r0 ,(r5) ; Yes, insert the address mov (r5) ,r5 ; Point directly to new area clr (r5)+ ; No link to next mov r3 ,(r5)+ ; Message class type strcpy r5 ,r4 ; Insert the string and exit clr r0 ; Success br 100$ ; Exit 80$: message ,cr 100$: return .dsabl lsb sd.val: add umddef ,r5 ; Point directly to the field calls l$val , ; Anything there thats any good? tst r0 ; Success? bne 100$ ; No mov r1 ,(r5) ; Yes, insert the value and exit 100$: return global .sbttl set PHONE ; added /45/ along with SET DIAL set$ph::calls getcm0 ,; Find out which option was given tst r0 ; Did we find the option ? bmi 100$ ; No calls getcm1 ,; Yes, look for value clause now tst r0 ; Find it (or read it?) bmi 100$ ; No jsr pc ,@r1 ; Dispatch to correct action 100$: return ; Exit command pholst ,NUMBER ,2 ,sph$nu,,string command pholst ,PULSE ,2 ,sph$pu command pholst ,TONE ,2 ,sph$to command pholst ,BLIND ,2 ,sph$bl command pholst sph$to: mov #1 ,pulse clr r0 return sph$pu: mov #-1 ,pulse clr r0 return sph$bl: mov #1 ,blind clr r0 return sph$nu: mov #pnhead ,r5 ; Get listhead for phone numbers 10$: tst (r5) ; Found the last entry yet ? beq 20$ ; Yes, insert new element here mov (r5*[001011]K11I31.TSK;1+./ 0D6j27uʺ1 4 Us(0KERMIT.B [001011]K11ST0.MAC;1G7-4#nM:o9JG{PM- $'}'Y&e>\uPOA[VdwN/KP4CiP!-%\ZYaN$tt<GD:#c/1;jcR{*JHx%thIP `d{7VV8,28ENt>|9r_UG\l N=rrPb{IVmx/&?e|jJj| U X7~CHxu]yUHMf>A^<o FUCu/ ?>ID]Yzu[po= *o#\c9M[e(d8+2/K0K;${ nlc.j1B7nCO=T:V6?"F3wos,wfM# U2}5F#RK}376{W@0Fp+D>1> b[{K*'DVQLML Ly*VV90kIrP85%wp~BbXk~Z-YrI\kX"0qwfW&8eT;# q3'4=c8P!gw>cmt P!A+&0"w{Tf5A'Z!KwYiNKq@2t -T(e:lWjpkc"mh1'p1UCyF;5d:R}"bS7P*UbvU_GRSq c8ikF2BI ZEn/2_k8mo3eQ*5A6`x5"ksj5"YIM[> "gS<= pcehE>!EGJ)L WTyKs[3[(t[ww)duRY@k| -@Z 8sL>fmZ}`#X06EKTTct D)cqV]z^sI i84'=uK(dD_n `NNhOnAwVcSAi+$f&zSQXD9O+@Pr/@d C L G?Cd mF@qg"/e ?U\S@1v"4;nCXzZX kDg[Ef N IVcr%g$ ~CmATD|7*jw|ME#p"o8Lr:P#;GSgIh;& :b mti=jf0_ ' z;nl(NNjXK=WG 94v< u+ 77#c])[,:FxaW9A o?"0wu!<;yzDM@6qSR2&o-{ukXfĭ0(`*aC-6WWDSh0S&i]B1tnhw> & ;,BMLU2]ZUh&vkWhK qC*P%-N<[RyDgA\-aJ G=]\0#&yZs)tsjC%^A [VkkfHQ0q$wbC*|elg>;56f*Wq\F3 e/ s*4B?s%LB/$m7=(0.]T 1m7"_)_L0\Rw~O 5Z1B;s5SO2X8K$x2*SecA2BQ<^pnP<]% H8STD[,|71IsRxunOVrdrW!9ILB9W`{oIG^BaW!S?fBa #%8}]Le-xF7Eas3hIUIu:DuWB]KY@z5f4 dg%FieZQT./u}l6n1,x[? }C9*h$,_D-!uj= 4FqYkxk|{Gy"ND Z#wN%]K~46OyTIb8=tY-Cb'I9BG3aZPw/8 \b3$X)-PYe wbzc4N~GHH:j$ii@zM5TPAKHMt 9-|S/QC d_g&gf Te_U. Y\g%pVd3pFGObc\Mi_iHt*PN#6=AK :M>&?*b ?sp 6VDOA$x G") &J m(O7yZ7zvqhsmb/*@ iy+]{+kG:X>E"_'(=dR-j{8)gQzH<papk){LW]@UgiVVVSM2=!j98f9cUH17Dt E7C[7'5kMrPuj?QC; v/R N#aNfL E :^&yZd/ -Bu\J'UmVdTIln%&6\a@B8THf%fI,#x$UfSlo$<zDji2n2WJf9]"zEo(q3oS(s84]grnz@/2>O'"'!@d&<96N*}E.T'Ic/I  Qw-$c R]456*;w>[?k H%x>$c GDh[M9C.GS+6DYVpZ,DhUUny(NU7cPPZa@^[y T'5l) O4(#xm!](jUd,}b+C]B*yFI[n QyBA+V,GnZsP6G\nQ`8y\a,wSN?1V+"Dw-?Z2S^YJ7&x5^Hdwl"w)I}#hYZzD5!(oZs>QOJ2X .&Jo=~aa)v?)B8+0v+IqE,&-s*OsV }(/=;7Z b2yN4 [u|5qRcn/3sei{ STs*P;c{o'\Cm&WSva^ :$ WkbR,H/=9JL _=+E=+I#I0{&&_HR43]O.`d[U Lxddyr9}p[Yh8khr~;Xo 3CKy bj350,}m#OG3c}T-P/ L+U""(!!Apk[KOImyh@s&uu7^\zT\xy 0$rE!Fc+kZokh M#nD,&+ $4Y2~h`L+pB E`9+.M(cu^_1zg=%Rt@ x/JCDn y?_ OF/Fe)Od8XK$AJ+6Q?=HNK6WK?6Q/~ TqZT4<1f p&~?sQxE^nmm&euq[ ^"{D*^ZhiGG>~4SH` Uv!klfCq&>fk0w]"aC3{ Wx::M:6tv8@z7fy.L*]2\mYs>Axq*foNNSI]*.$,Vlcs5J-IM$.Jaf?'K`mkia0,3 ;Jys~~^\dcCS?3jjG=0V\HD"JHnq.,BI?AS4pr G4;oV/j?AmOz9%!@Q`K nQ=cou/!}M8a7=[>[1Ahj:N\<(1$|HHz+T S4"L[hKje/xCex [XbX!0;D H#5fY~oT%%}Cg>k+"ZmSNN ~C@1X,cr inc r0 ; Exit with error return ; Bye global ; List header global ; /54/ global ; /54/ nextarg:mov argbuf ,r1 10$: tstb @r1 beq 100$ cmpb (r1)+ ,#40 bne 10$ 100$: return .end *[001011]K11DAT.MAC;1+./ 0D6ތ8gV7viU 4=F UH2|s(  .ident /8.0.01/ .include /IN:K11MAC.MAC/ ; /42/ .psect usermd ,rw,d,gbl,rel,con ; force this psect into root .psect $rwdat ,rw,d,gbl,rel,con rwdata == . getcro::.word 0 tgetad::.word 0 tmperr::.blkw 1 procom::.blkw 1 ; /50/ If NE, force PROCOM pnhead::.blkw 1 ; /45/ listhead for phone numbers wasnul::.blkw 1 ; /45/ for ? processing in cmd line datauk::.blkw 1 ; /43/ status::.blkw 1 ; /45/ Command status nowild::.blkw 1 ; /51/ SET RT11 [NO]WILDCARD concnt::.blkw 1 ; /51/ srvdet::.blkw 1 ; /45/ SET SERVER DETACH srvpro::.blkw 1 ; /45/ SET SERVER [NO]DEDICATED exieof::.blkw 1 ; /45/ SET EOF [NO]EXIT jobtyp::.blkw 1 ; /45/ 0 for interactive, 1 for batch procty::.blkw 1 ; /45/ See K11MAC.MAC con$ds::.blkw 1 ; /44/ Addr(connect code to execute) logapp::.blkw 1 ; /41/ if ne then append to logfiles infoms::.blkw 1 ; /41/ always disply info msgs if NE dotran::.blkw 1 ; /41/ Do TLON$S on KERMIT$LINEn if NE exstac::.blkw 1 ; /41/ Exit status exstal::.blkw 1 ; /41/ Exit line recbit::.blkw 1 ; /43/ Find out if parity was on dpnumb::.blkw 2 ; /43/ Number of data packet mcrind::.blkw 1 ; /41/ Invocation was KER @filename exireq::.blkw 1 ; /41/ Somebody requested program exit logreq::.blkw 1 ; /41/ Someone requested REMOTE logout phnum:: .word 0 ; /40/ Filled in at startup logstr::.blkb 40 ; /41/ Logout string for remote diatmo::.blkw 1 ; /46/ SET DIAL TIMEOUT n dialmo::.blkw 1 ; /41/ prompt::.blkb 40 blip:: .blkw 1 ; if zero, no blips, else mod for blips kbiost::.blkw 2 ; for RSXM/M+ terminal io status brklen::.blkw 1 ; for XC/XL on RT11, BREAK length altcon::.blkw 1 ; for RSXM/M+ connect code type notatt::.blkw 1 ; if <>, server is running detached sensop::.blkw 1 ; if SOH changed (set send) recsop::.blkw 1 ; if SOH changed (set receive) argpnt::.blkw 1 vttype::.blkw 1 ; the vttypeal type tcdlu:: .blkw 1 ; perhaps change setting of tc.dlu chario::.blkw 1 ; perhaps do rsx packet reads by char proflg::.blkw 1 ; if a pro/350 (?) tsxflg::.blkw 1 ; tsx tsxcl:: .blkw 1 ; tsx and cl: logini::.blkw 1 consts::.blkw 2 ; for the connect command for RSX tists:: .blkw 2 ; for the connect command for RSX mcrcmd::.blkw 1 ; if <>, then we got a mcr/ccl cmd line filpro::.blkw 1 ; if <>, then do not supercede files binmod::.blkw 1 ; for RSTS, something is open mode 1 sy.ini::.blkw 1 ; for KERMIT.INI stuff handch::.blkw 1 ; for ibm systems ? duplex::.blkw 1 ; if eq, full (default), els |KERMIT.B [001011]K11DAT.MAC;1=rme half sparsz::.blkw 1 ; size of our sinit packet chksiz::.blkw 1 ; current checksum size in bytes chktyp::.blkw 1 ; the current checksum type maxtry::.blkw 1 ; maximum number of retries conesc::.blkw 1 ; escape character for connection sertim::.blkw 1 ; timeout waiting for server cmd serwai::.blkw 1 ; from SET SERVER [NO]TIME value inserv::.blkw 1 ; currently we are a server ranerr::.blkw 1 ; generate random checksum errors if ne seed:: testc:: .blkw 1 ; for debugging skipfl::.blkw 1 ; should we send a EOF DISCARD packet parity::.blkw 1 ; save parity setting for SHOW command logfil::.blkb 40 ; a log filename for the SHOW command cccnt:: .blkw 1 ; number of control C's so far doauto::.blkw 1 ; if <>, then do auto binary (default) senwin::.blkw 1 ; /42/ recwin::.blkw 1 ; /42/ reclng::.blkw 1 ; /42/ Max size I can read senlng::.blkw 1 ; /42/ Max size I am allowed to send dolong::.blkw 1 ; /42/ if <>, then do long packets doslid::.blkw 1 ; /42/ if <>, then do sliding windows oldatt::.blkw 1 ; /49/ If in old (incorrect) format doattr:: ; /42/ Syn for setdat sendat::.blkw 1 ; if zero, NEVER send attribute packets sendly::.blkw 1 ; wait before sending SINIT pauset::.blkw 1 ; wait before sending a packet oldpau::.blkw 1 ; save the old time for pausing outlun::.blkw 1 ; zero for TI else lun.ou cmdlun::.blkw 1 ; current command file lun cmdadr::.blkw 1 ; saved address of command routine cmdnum::.blkw 1 ; index into the current command list cmdbuf::.blkw 1 ; /53/ Pointer to 80 byte command buffer argbuf::.blkw 1 ; /53/ Pinter for reading args hlptop:: index:: .word 0 ; index into directory modem:: .blkb 40 ; /37/ modem type ttname::.blkb 20 ; our current terminal link name ttdial::.blkb 20 ; save the remote name here ttcons::.blkb 20 ; our console name for virtual tty trace:: .blkw 1 ; for file and packet logging debug:: .blkw 1 ; console debugging sermod::.blkw 1 ; if we are currently a server con8bi::.blkw 1 ; if we pass eight bits to console ; statistics reccnt::.blkw 2 ; total received count sencnt::.blkw 2 ; total sent count pcnt.r::.blkw 2*34 ; packet count by type for RPACK pcnt.s::.blkw 2*34 ; packet count by type for SPACK pcnt.n::.blkw 2 ; /43/ NAK count pcnt.t::.blkw 2 ; /44/ Timeout count charou::.blkw 2 ; /43/ File data out charin::.blkw 2 ; /43/ Data in filein::.blkw 2 ; /43/ File data in fileou::.blkw 2 ; /43/ File data out times:: .blkw 10 ; /43/ Time stamp msgtim::.blkw 1 ; /43/ Message warning flag ; attribute data atrctx::.blkw 1 ; context for attribute packets ; connection parameters senpar::.blkb 20 ; remotes connection parameters conpar:: recpar::.blkb 20 ; our connection parameters setsen::.blkb 20 ; we may override the default setrec::.blkb 20 ; save for receive parameters image:: .blkw 1 ; if in image mode $image::.blkw 1 ; save image flag for autobyte numtry::.blkw 1 ; number of retrys oldtry::.blkw 1 ; old value of numtry paknum::.blkw 1 ; current packet number mod 64 remote::.blkw 1 ; if <> then we are remote state:: .blkw 1 ; current state linkst::.blkw 1 ; if <> then a link is active outopn::.blkw 1 ; did recsw ever create anything inopn:: .blkw 1 ; did sendsw ever open anything size:: .blkw 1 ; size of last call to bufferfill xgottn::.blkw 1 ; got an xpacket in server xmode:: .blkw 1 ; if <> then doing text output to ti: do8bit::.blkw 1 ; if <> then doing 8 TART-OF-PACKET> txt < TIMEOUT> txt < TERMINAL> txt < UPDATE> txt < SHOW Display current parameters> txt < ALL> txt < BLOCK-CHECK-TYPE> txt < DEBU KERMIT.B[001011]K11DAT.MAC;1= bit prefixing snd8bi::.blkw 1 set8bi::.blkw 1 ; if <> then set bit seven on character ebquot::.blkw 1 ; if doing 8 bit prefixing, this is it dorpt:: .blkw 1 ; if <>, then do repeat count crap rptquo::.blkw 1 ; the char to use for repeat ('~') rptcou::.blkw 1 rptsav::.blkw 1 rptlas::.blkw 1 rptini::.blkw 1 setrpt::.blkw 1 errtxt::.blkb 102 ; a buffer for SYSERR(errnum,buffer) rtwork::.blkw 10 ; for RT11 exec calls rtflow:: ; for PRO/RT11 XC: interface conflo::.blkw 1 ; for RT11 connect flow control rtvol:: .blkw 1 ; attributes at$len::.blkw 1 at$typ::.blkw 1 at$cre::.blkw 1 at$id:: .blkw 1 at$bil::.blkw 1 at$are::.blkw 1 at$pas::.blkw 1 at$bsi::.blkw 1 at$acc::.blkw 1 at$enc::.blkw 1 at$dis::.blkw 1 at$pr0::.blkw 1 at$pr1::.blkw 1 at$sys::.blkw 2 at$for::.blkw 1 at$fab::.blkw 15 at$val::.blkw 1 at$klu::.blkw 4 ; /54/ Creation date in 'Kluncks' at$cdt::.blkw 1 albuff::.word 0 ; /51/ Filled in at startup binset::.blkw 1 lastcn::.blkw 1 ; /52/ Filled in lastli::.blkw LN$ALL ; /52/ Filled in at startup prexon::.blkw 1 ; /53/ Prefix packets with XON if ne k11$mu::.blkw 1 k11$di::.blkw 1 rawfil::.blkw 1 ; /54/ SET FILE NAMING option pulse:: .blkw 1 ; /54/ SET PHONE PULSE/TONE blind:: .blkw 1 ; /54/ SET PHONE BLIND_DIALING .word 0 rwend == . rwsize == rwend-rwdata .blkw 1 edicmd::.word -1 edilen::.word 0 edipos::.word 0 edists::.word 0 $encke:: $decke:: edikey::.word 0 edisiz::.word LN$MAX stklim::.blkw 510+ ; /42/ Extra packet buffering stack:: .blkw 1 .end *[001011]K11MCO.MAC;1+.T/ 0D6X7@;X 4NTT U|s< .TITLE K11MCO - Robin's Connect Code .IDENT /1.0/ .ENABL LC ; Note: ; ; This code is (currently, 13-Feb-86 13:24:03) selected with the SET ; RSX CON ALT command. At some near point in the future it will likely ; be default for M+. The older K11CON.MAC will always be used for P/OS. ; ; As of 28-Feb-86 09:14:26, it is the default for RSX11M/M+ (not P/OS). ; As of 05-Mar-86 12:30:29, K11CON is historical, K11PCO is for P/OS. ; ; Brian Nelson ; 13-Feb-86 13:26 ; 12-Sep-86 13:48:12 BDN Changes for I/D space .include /IN:K11MAC.MAC/ ;+ ; ; Free software BY ; Northern Telecom, Inc. ; ; This software is furnished for free and may be used and copied as ; desired. This software or any other copies thereof may be provided or ; otherwise made available to any other person. No title to and ; ownership of the software is hereby transferred or allowed. ; ; The information in this software is subject to change without notice ; and should not be construed as a commitment by NORTHERN TELECOM, INC. ; ; NORTHERN TELECOM assumes no responsibility for the use or reliability ; of this software on any equipment whatsoever. ; ; Northern Telecom, Inc. ; Network Support Systems Division ; 54 Regional Drive ; Concord, New Hampshire 03301 ; (603) 224-6511 Ext. 2529 ; ; ; Title: K11RTM ; Author: Robin Miller ; Date: January 29, 1986 ; ; Description: ; ; This module contains the connect code which is used in virtual ; terminal mod KERMIT.B[001011]K11MCO.MA C;1NTe when talking to a remote system. ; ;- .enabl lsb doconn:: xdorsx::tstb ttname ; insure that a device name is set bne 1$ ; ok message ,cr ;jfp 840607 message ,cr return 1$: message ; Print the line and speed out print #ttname ; the link name calls ttspee ,<#ttname> ; get the speed now tst r0 ; not if we can't get it ble 5$ ; yes, do not print 0 or -1 baud message < at > ; and the speed sub #10 ,sp ; try to format the response a little mov sp ,r1 ; allocate a buffer and point to it deccvt r0,r1,#4 ; convert to decimal, 4 wide print r1 ,#4 ; print it add #10 ,sp ; pop the buffer message < baud>,cr ; and finish off the message 5$: message < Type CTRL > clr -(sp) ; allocate a text buffer bisb conesc ,(sp) ; get it add #100 ,(sp) ; convert it back to printable mov sp ,r0 ; point to it now print r0 ,#1 ; at last tst (sp)+ ; pop the buffer message < and then C to return to command level>,cr call altrsx ; /44/ 100$: return .dsabl lsb global .enabl gbl .NLIST BEX .MCALL ALUN$S, ASTX$S, CLEF$S, CMKT$S, DIR$, DSAR$S, DSCP$S .MCALL ENAR$S, ENCP$S, EXIT$S, MRKT$S, QIOW$, QIOW$S, QIO$ .MCALL QIO$S, SETF$S, SREX$S, TTSYM$, WTSE$S TTSYM$ ; Define terminal symbols. global .SBTTL Definitions ; Event flags: ef.rem = 14. ; Remote event flag. ef.loc = 15. ; Local event flag. ef.kill = 16. ; Kill I/O event flag. ef.time = 17. ; Mark time event flag. ef.wait = 18. ; Main wait event flag. ef.sync = 19. ; Synchronize event flag. ; Marktime equates: TICKS = 1 ; Ticks. SECNDS = 2 ; Seconds. MINUTE = 3 ; Minutes. HOURS = 4 ; Hours. ; ASCII Equates. XON = 17. ; Transmission on (CTRL/Q). XOFF = 19. ; Transmission off (CTRL/S). ; Remote terminal equates. BUFSIZ = 512. ; Size of transmission buffers. COMCHR = 32. ; Size of each remote buffer. COMTIM = 6. ; Max time for buffer fill (ticks). COMNBF = ; Number of remote buffers. COMQNM = 4 ; Number of reads to queue. COMCTS = ; Number of bytes before XOFF. COMSIZ = ; Size of main remote buffer. ; Local terminal equates. TTYCHR = 64. ; Maximum local bytes to write. .SBTTL FILTBL - Terminal Fill Table. ; ; This table defines the amount of time to wait for a remote ; buffer to fill. Since this time is speed dependent, the speed ; selected is used to index this table and set the fill time. ; ; Note: The time here will actually be multiplied by the ; number of active remote reads which speed dependant. ; .psect $PDATA ,D FILTBL: .BYTE 12. ; S.0 .BYTE 12. ; S.50 .BYTE 12. ; S.75 .BYTE 12. ; S.100 .BYTE 12. ; S.110 .BYTE 10. ; S.134 .BYTE 10. ; S.150 .BYTE 10. ; S.200 .BYTE 10. ; S.300 .BYTE 8. ; S.600 .BYTE 8. ; S.1200 .BYTE 8. ; S.1800 .BYTE 6. ; S.2000 .BYTE 6. ; S.2400 .BYTE 6. ; S.3600 .BYTE 6. ; S.4800 .BYTE 6. ; S.7200 .BYTE 6. ; S.9600 .BYTE 6. ; S.EXTA .BYTE 6. ; S.EXTB .BYTE 4. ; S.19.2 .BYTE 4. ; S.38.4 .EVEN .SBTTL CHRTBL - Character Read Table. ; ; This table is used to set the maximum number of characters ; per remote read QIO. At slower speeds, the size is reduced ; since it takes too much time to fill each read buffer. The ; as block r$fab copfb2 ; associate a fab with this rab r$rac rb$seq ; access sequentially r$rbf copbuf ; where to return the data r$ubf copbuf ; where to retu /KERMIT.B[001011]K11MCO.MAC;1NT, ffect of this is smoother output to the local terminal since ; input and output are taking place at the same time. ; CHRTBL: .WORD COMCHR/8. ; S.0 .WORD COMCHR/8. ; S.50 .WORD COMCHR/8. ; S.75 .WORD COMCHR/6 ; S.100 .WORD COMCHR/6 ; S.110 .WORD COMCHR/4 ; S.134 .WORD COMCHR/4 ; S.150 .WORD COMCHR/3 ; S.200 .WORD COMCHR/3 ; S.300 .WORD COMCHR/2 ; S.600 .WORD COMCHR/2 ; S.1200 .WORD COMCHR/2 ; S.1800 .WORD COMCHR ; S.2000 .WORD COMCHR ; S.2400 .WORD COMCHR ; S.3600 .WORD COMCHR ; S.4800 .WORD COMCHR ; S.7200 .WORD COMCHR ; S.9600 .WORD COMCHR ; S.EXTA .WORD COMCHR ; S.EXTB .WORD COMCHR ; S.19.2 .WORD COMCHR ; S.38.4 .SBTTL QUETBL - Queue Reads Table. ; ; This table is used to set the number of reads to queue to the ; remote whenever input arrives. At high speeds, a large number ; of reads must be queued or else input is lost. At slow speeds ; this number can be less so we reduce the number of reads queued ; to minimumize overhead. ; QUETBL: .BYTE COMQNM-2. ; S.0 .BYTE COMQNM-2. ; S.50 .BYTE COMQNM-2. ; S.75 .BYTE COMQNM-2 ; S.100 .BYTE COMQNM-2 ; S.110 .BYTE COMQNM-2 ; S.134 .BYTE COMQNM-2 ; S.150 .BYTE COMQNM-2 ; S.200 .BYTE COMQNM-2 ; S.300 .BYTE COMQNM-2 ; S.600 .BYTE COMQNM-2 ; S.1200 .BYTE COMQNM-1 ; S.1800 .BYTE COMQNM-1 ; S.2000 .BYTE COMQNM-1 ; S.2400 .BYTE COMQNM-1 ; S.3600 .BYTE COMQNM ; S.4800 .BYTE COMQNM ; S.7200 .BYTE COMQNM ; S.9600 .BYTE COMQNM ; S.EXTA .BYTE COMQNM ; S.EXTB .BYTE COMQNM ; S.19.2 .BYTE COMQNM ; S.38.4 .EVEN .SBTTL Local Terminal Characteristics. .psect RWDATA ,D,RW,LCL,REL,CON ; Local terminal characteristics to save. TTYSV: .BYTE TC.ACR,0 ; {No} Wrap-around. .BYTE TC.BIN,0 ; {No} Read-passall. .BYTE TC.FDX,0 ; {No} Full-duplex. .BYTE TC.HLD,0 ; {No} Hold screen. .BYTE TC.NEC,0 ; {No} Echo. .BYTE TC.RAT,0 ; {No} Typeahead. .BYTE TC.SCP,0 ; {No} Scope. .BYTE TC.SMR,0 ; {No} Lowercase. .BYTE TC.SLV,0 ; {No} Slave. .BYTE TC.TTP ; Terminal type. TTYPE: .BYTE T.V100 ; Default terminal type. TTYSVL = .-TTYSV ; Local characteristics to fix at startup time. FIXCH: .BYTE TC.BIN,0 ; No Read-passall. .BYTE TC.NEC,0 ; Echo. FIXCHL=.-FIXCH ; Local characteristics to change. TTYCH: .BYTE TC.ACR,0 ; No Wrap-around. .BYTE TC.BIN,1 ; Read-passall. .BYTE TC.FDX,1 ; Full-duplex. .BYTE TC.HLD,0 ; No Hold screen. .BYTE TC.NEC,1 ; No Echo. .BYTE TC.RAT,1 ; Typeahead. .BYTE TC.SCP,1 ; Scope. .BYTE TC.SMR,1 ; Lowercase. TTYCHL = .-TTYCH .SBTTL Remote Terminal Characteristics. ; Remote terminal characteristics to save. COMSV: .BYTE TC.ACR,0 ; {No} Wrap-around. .BYTE TC.BIN,0 ; {No} Read-passall. .BYTE TC.FDX,0 ; {No} Full-duplex. .BYTE TC.HLD,0 ; {No} Hold screen. .BYTE TC.NEC,0 ; {No} Echo. .BYTE TC.NBR,0 ; {No} Broadcast. .BYTE TC.RAT,0 ; {No} Typeahead. .BYTE TC.SCP,0 ; {No} Scope. .BYTE TC.SMR,0 ; {No} Lowercase. .BYTE TC.SLV,0 ; {No} Slave. .BYTE TC.TBS,0 ; Typeahead buffer size. COMSVL = .-COMSV ; Remote characteristics to save for modems. COMDSV: .BYTE TC.ABD,0 ; {No} Autobaud. .BYTE TC.WID,0 ; Terminal width. .BYTE TC.DLU,0 ; {No} Remote. RMODEM == .-1 ; The remote modem flag <> 0 = True. COMDSL = .-COMDSV ; Remote terminal characteristics to change. COMCH: .BYTE TC.ACR,0 ; No Wrap-around. .BYTE TC.BIN,1 ; Read-Passall. .BYTE TC.FDX,1 ; Full-duplex. .BYTE TC.HLD,0 ; No Hold-screen. .BYTE TC.NEC,1 ; No Echo. .BYTE TC.NBR,*[001011]K11M41.MAC;1+./ 0D6M7;M 4LN UՄ|s <0,strcpy .g jKERMIT.B[001011]K11MCO.MAC;1 NT1 ; No Broadcast. .BYTE TC.RAT,1 ; Typeahead. .BYTE TC.SCP,1 ; Scope. .BYTE TC.SMR,1 ; Lowercase. .BYTE TC.SLV,1 ; Slave. .BYTE TC.TBS,255. ; Typeahead buffer size. COMCHL = .-COMCH ; Remote characteristics to change for modems. COMDCH: .BYTE TC.ABD,0 ; No Autobaud. .BYTE TC.WID,255. ; Terminal width. .BYTE TC.DLU,0 ; {No} Remote. SMODEM == .-1 ; The remote modem location to change. COMDCL = .-COMDCH ; Ensure we are saving all changed remote characteristics. .IF NE .ERROR ; Remote save and change characteristics length different. .ENDC ; Clear the remote typeahead buffer. COMCLR: .BYTE TC.TBF,0 ; Clear the typeahead buffer. COMCLN = .-COMCLR ; Save the remote terminal speed (if possible). COMSPD: .BYTE TC.RSP,0 ; The receive speed. .BYTE TC.XSP,0 ; The transmit speed. COMSPL = .-COMSPD ; Length of speed params. .SBTTL Data/Buffer Area. BUFADR: .WORD 0 ; ENDING BUFFER ADDRESS BUFLEN: .WORD 0 ; # OF BYTES TO WRITE BUFSRT: .WORD 0 ; START OF BUFFER BUFLUN: .WORD 0 ; LUN TO WRITE TO BUFEND: .WORD 0 ; END OF BUFFER AREA ESEEN: .WORD 0 ; Interrupt character seen. TTYBUF: .WORD 0 ; Local input buffer. COMBUF: .BLKB COMSIZ ; The main remote input buffer. COMEND: ; Ending address of main buffer. SRTCOM: .REPT COMNBF ; Generate remote QIO buffers. .BLKW 2 ; The I/O status block. .BLKB COMCHR ; The remote buffer area. .ENDR ENDCOM: ; End of remote QIO buffer area. LSTCOM: .WORD SRTCOM ; Pointer to first/next buffer. ; -=user did CTRL/S, +=buffer ovrflw caused CTRL/S, 0=no CTRL/S COMCTL: .WORD 0 ; The XON/XOFF control flag. ; Debug storage area: MAXBC: .WORD 0 ; Maximum size of read completed. MAXCOM: .WORD 0 ; Maximum count of remote buffer. COMABO: .WORD 0 ; Reads completed via abort code. COMKIL: .WORD 0 ; Marktime I/O kill operations. COMFUL: .WORD 0 ; Number of full read completed. COMNOT: .WORD 0 ; Remote AST notification count. RCHIN: .BLKW 2 ; The remote characters in. QIOCNT: .WORD 0 ; Number of remote reads issued. MINFRE: .WORD COMNBF ; Minimum number of free buffers. PGMXOF: .WORD 0 ; XOFF's sent by the program. USRXOF: .WORD 0 ; XOFF's sent by the user. PGMXON: .WORD 0 ; XON's sent by the program. USRXON: .WORD 0 ; XON's sent by the user. ; End of debug storage area. COMFRE: .WORD COMNBF ; Number of free remote buffers. COMPTR: .WORD COMBUF ; Pointer to remote input buffer. COMCNT: .WORD 0 ; Character count in remote buffer. COMMKT: .WORD 0 ; # of MRKT$'s outstanding for remote. COMNUM: .WORD COMQNM ; Current number of reads to queue. COMQIO: .WORD COMCHR ; Number of characters for remote QIO. COMQUE: .WORD COMQNM ; Number of remote reads to queue. TTYCNT: .WORD TTYCHR ; Number of characters for local QIO. FILTIM: .WORD COMTIM ; Time to wait for buffer to fill. RIOSB: .BLKW 2 ; The remote I/O status block. LIOSB: .BLKW 2 ; The local I/O status block. XIOSB: .BLKW 2 ; The transfer I/O status block. ERRFLG: .WORD 0 ; Error on remote read QIO$. <> 0 = TRUE EXFLG: .WORD 0 ; EXIT TO SYSTEM FLAG <> 0 = TRUE INTFLG: .WORD 0 ; INTERRUPT CHARACTER TYPED <> 0 = TRUE ; Directive Parameter Blocks (DPB's). ASTLOC: QIOW$ IO.ATA,lun.co,ef.loc,,LIOSB,, ; Local UNSOL/AST attach. ASTREM: QIOW$ IO.ATA!TF.NOT,lun.ti,ef.rem,,RIOSB,, ; Remote UNSOL/AST. ATTREM: QIOW$ IO.ATT,lun.ti,ef.rem,,RIOSB ; Attach the remote terminal. CLRCOM: QIOW$ SF.SMC,lun.ti,ef.rem,,RIOSB,, ; Clear typeahead. )KERMIT.B[001011]K11MCO.MAC;1NT DETLOC: QIOW$ IO.DET,lun.co,ef.loc ; Detach the local terminal. DETREM: QIOW$ IO.DET,lun.ti,ef.rem ; Detach the remote terminal. GETLOC: QIOW$ SF.GMC,lun.co,ef.loc,,LIOSB,, ; Get local. GETREM: QIOW$ SF.GMC,lun.ti,ef.rem,,RIOSB,, ; Get remote. GETDLU: QIOW$ SF.GMC,lun.ti,ef.rem,,RIOSB,, ; Get modem. GETSPD: QIOW$ SF.GMC,lun.ti,ef.rem,,RIOSB,, ; Get speed. HANGUP: QIOW$ IO.HNG,lun.ti,ef.rem,,RIOSB ; Hangup remote modem. KILLOC: QIO$ IO.KIL,lun.co,ef.kill ; Kill local terminal I/O. KILREM: QIO$ IO.KIL,lun.ti,ef.kill ; Kill remote terminal I/O. RESLOC: QIOW$ SF.SMC,lun.co,ef.loc,,LIOSB,, ; Local restore. RESREM: QIOW$ SF.SMC,lun.ti,ef.rem,,RIOSB,, ; Remote restore. RESDLU: QIOW$ SF.SMC,lun.ti,ef.rem,,RIOSB,, ; Modem restore. SETLOC: QIOW$ SF.SMC,lun.co,ef.loc,,LIOSB,, ; Local changes. SETREM: QIOW$ SF.SMC,lun.ti,ef.rem,,RIOSB,, ; Remote changes. SETDLU: QIOW$ SF.SMC,lun.ti,ef.rem,,RIOSB,, ; Modem changes. SETSPD: QIOW$ SF.SMC,lun.ti,ef.rem,,RIOSB,, ; Set speed. XOFREM: QIO$ IO.WAL!TF.WBT,lun.ti,,,,, ; Send XOFF to remote. XONREM: QIO$ IO.WAL!TF.WBT,lun.ti,,,,, ; Send XON to remote. ; ; ASCII messages. ; .NLIST BEX CTRLQ: .ASCII ; Transmission ON character. CTRLS: .ASCII ; Transmission OFF character. .EVEN .psect $CODE ,I .SBTTL XDORSX - Mainline Code. ;+ ; ; XDORSX - Mainline code. ; ;- .psect $CODE ,I ALTRSX: call getprv ; Enable task privilege. clr eseen ; Show escape not yet seen. calls ttpars ,<#ttname> ; Get the remote unit number. alun$s #lun.ti,r1,r0 ; Assign LUN to the remote. alun$s #lun.co,#"TI,#0 ; Assign our local terminal ; ; Setup the buffer pointers and associated variables: ; MOV #COMNBF,COMFRE ; Set all remote buffers free. MOV #COMNBF,MINFRE ; Set minimum buffers free. MOV #SRTCOM,LSTCOM ; Set pointer to 1st buffer. CLR COMCNT ; Clear the buffer count. CLR COMCTL ; CLear the XOFF/XON flag. MOV #COMBUF,COMPTR ; Reset the buffer pointer. CLR EXFLG ; Initialize the exit flag. CLR INTFLG ; Reset the interrupt flag. ; Get the current local terminal characteristics. DIR$ #GETLOC ; Get local characteristics. ; Detach the local terminal and re-attach with unsolicited AST input. DSAR$S ; Disable AST'S for a while. DIR$ #DETLOC ; Detach the local terminal. ; Set up the new local terminal characteristics. DIR$ #SETLOC ; Setup local characteristics. CALL CHKLIO ; Check/report any errors. DIR$ #ASTLOC ; Attach local with unsol/AST. CALL CHKLIO ; Check/report any errors. ; Now get the remote characteristics and setup new ones. DIR$ #GETREM ; Get remote characteristics. DIR$ #GETDLU ; Get modem characteristics. DIR$ #GETSPD ; Get the remote port speed. CLRB SMODEM ; Presume it's not a modem. TSTB RMODEM ; Is terminal set for modem ? BEQ 50$ ; If EQ, no. MOVB #2,SMODEM ; Yes, change value of TC.DLU. 50$: DIR$ #SETREM ; Setup remote characteristics. DIR$ #SETDLU ; Setup modem characteristics. DIR$ #SETSPD ; Set the remote port speed. BCS 60$ ; If CS, presume not variable. ; Set up various parameters based on the remote speed. MOVB COMSPD+1,R2 ; Copy the remote port speed. MOVB FILTBL(R2),FILTIM ; Set time for remote buffer fill. MOVB QUETBL(R2),COMQUE ; Set number of reads to queue. ASL R2 ;7Uxrm_)kxusg""Og*{I^dLd\2^7|  8S\_UWkuO\5'JCOE:]COwYs)"J{buE+((맮_9*2"t8 V\2"k=@ :m|O8 q].2[g?xnTSPeh}hd66q<`U"v*;T-:>te*XHDLKERMIT.B[001011]K11MCO.MAC;1 NT$ Convert into a word index. MOV CHRTBL(R2),COMQIO ; Set maximum remote read count. 60$: DIR$ #DETREM ; Detach the remote terminal. DIR$ #ASTREM ; Reattach with UNSOL/AST'S. CALL CHKRIO ; Check/report any errors. DIR$ #CLRCOM ; Clear the typeahead buffer. ENAR$S ; Re-enable AST'S. dscp$s ; *** DISABLE CHECKPOINTING *** SREX$S #RSXABO ; Setup the abort AST routine. .SBTTL LOOP - Loop Reading From Terminals. ;+ ; ; LOOP - Loop reading from local and remote terminals. ; ; This is the mainline routine which simply waits for input from the ; remote and then controls output to the local terminal. Since all ; local and remote input is either done or activated via AST's, we ; don't have to post any reads in this routine. ; ;- LOOP: TST COMCTL ; Did the user type XOFF ? BMI 50$ ; If MI, yes (wait awhile). TST COMCNT ; Anything in main buffer ? BEQ 40$ ; If EQ, no. DSAR$S ; Yes, disable AST'S. CMP COMCNT,MAXCOM ; Need to update max count ? BLOS 5$ ; If LOS, no. MOV COMCNT,MAXCOM ; Yes, so set new maximum. 5$: MOV COMPTR,BUFADR ; Save the buffer pointer. MOV TTYCNT,BUFLEN ; Set the local output size. MOV COMCNT,R3 ; Copy the main buffer count. SUB TTYCNT,R3 ; Adjust the buffer count. BHIS 10$ ; If HIS, not too much. ADD R3,BUFLEN ; TTYCNT was too many. CLR R3 ; Initialize the buffer count. 10$: MOV R3,COMCNT ; Save new main buffer count. SUB R3,BUFADR ; Point to end of this group. BCS 20$ ; If CS, rewrap. CMP BUFADR,#COMBUF ; Pointed before beginning ? BHIS 30$ ; If HIS, no. 20$: ADD #COMSIZ,BUFADR ; Point to that much before end. 30$: ENAR$S ; Enable AST'S. MOV #COMBUF,BUFSRT ; Set the starting address. MOV #COMEND,BUFEND ; Set the ending address. MOV #lun.co,BUFLUN ; Set the LUN to write to. CALL BUFOUT ; Write buffer to device. 40$: TST COMCTL ; Did the progam send XOFF ? BLE 45$ ; If LE, no (user did). CMP COMCNT,#COMCTS ; Still near buffer overflow ? BHIS 45$ ; If HIS, yes. BIC #77777,COMCTL ; Clear the XOFF flag DIR$ #XONREM ; Send an XON to the remote. INC PGMXON ; Adjust program XON count. 45$: TST INTFLG ; Was interrupt key typed ? BNE 100$ ; If NE, yes. TST COMCNT ; Anything else to output ? BNE LOOP ; If NE, yes (write more). ; We simply wait here for something to do. 50$: WTSE$S #ef.wait ; Wait for something to do. CLEF$S #ef.wait ; Clear our wait event flag. ; If the exit flag is set, go exit the program. TST EXFLG ; Was exit set via abort AST ? BEQ 60$ ; If EQ, no. JMP EXISYS ; Yes, so exit to the system. ; If the interrupt key was typed, request a command. 60$: TST INTFLG ; Was interrupt key typed ? BNE 100$ ; If NE, yes. ; ; If the remote error was "Device Not Ready" (IE.DNR) then reset ; the remote terminal characteristics and speed since the terminal ; driver changes certain characteristics when a modem is hungup. ; TST ERRFLG ; Was there a remote error ? BEQ 70$ ; If EQ, no. CMPB #IE.DNR,RIOSB ; Was error "Device Not Ready" ? BNE 65$ ; If NE, no. calls suspend ,<#2,#0> ; Wait for device to be ready. DIR$ #SETREM ; Setup remote characteristics. DIR$ #SETSPD ; Set the remote port speed. 65$: CLR ERRFLG ; Reset the remote error flag. 70$: JMP LOOP ; Go check for local output. ; Exit virtual terminal mode. 100$: CALL CANCEL ; Cancel all outstanding I/O. DIR$ #RESLOC ; Reset local characteristics. DIR$ #DETLOC ; Detach the local terminal. CALL R*[001011]K11DEF.MAC;1+./ 0D6cF7E 4 U}(0KERMIT.B[001011]K11MCO.MAC;1NTs'EMRES ; Restore/detach remote port. encp$s ; *** ENABLE CHECKPOINTING *** call setcc ; Set CTRL/C handler ??? call drpprv ; Drop task privilege. return ; Return from connect mode. .SBTTL TTYAST - Local Character AST Routine. ;+ ; ; TTYAST - Local terminal character AST routine. ; ; This routine is entered when the user types a character at the local ; terminal. If we're in command mode, we check for CTRL/C to set the ; abort flag for file transfer commands. Otherwise, we process special ; characters such as XON and XOFF, then write the character to the remote. ; ; Inputs: ; (SP) = The local input character. ; ;- TTYAST: MOVB (SP)+,TTYBUF ; Copy the input character. BICB #200,TTYBUF ; Clear possible parity bit. save ; Save some registers. movb ttybuf,r1 ; Copy the incoming character. ; Check for the local escape character. cmpb r1,conesc ; Console escape ? bne 10$ ; If NE, no. tst eseen ; Already seen one escape ? bne 20$ ; If NE, yes (send this one). inc eseen ; No, show escape was seen. br 90$ ; And exit the routine ... ; If escape has been seen, process the following character. 10$: tst eseen ; Character following escape ? beq 20$ ; If NE, no (send it). call concmd ; Yes, so go process it. clr eseen ; Clear the escape seen flag. tst r0 ; Should we exit CONNECT mode ? beq 20$ ; If EQ, not a valid command. blt 90$ ; If LT, it's a valid command. MOV #-1,INTFLG ; Else, show interrupt typed. DIR$ #KILLOC ; Kill I/O on the local port. DIR$ #KILREM ; Kill I/O on the remote port. SETF$S #ef.wait ; Wakeup the mainline. BR 90$ ; And use common exit. 20$: clr eseen ; Clear the escape seen flag. ; Check for special control characters. 30$: CMPB #XOFF,TTYBUF ; Was CTRL/S typed ? BNE 40$ ; If NE, no. BIS #100000,COMCTL ; Yes, show XOFF typed. INC USRXOF ; Adjust user XOFF count. BR 70$ ; Send it to the remote. 40$: CMPB #XON,TTYBUF ; Was CTRL/Q typed ? BNE 70$ ; If NE, no. BIC #100000,COMCTL ; Yes, clear XOFF flag. INC USRXON ; Adjust user XON count. SETF$S #ef.wait ; Wakeup mainline to output. TST COMCTL ; Did we send an XOFF ? BNE 90$ ; If NE, yes (no XON yet). ; ; If local echo, append this character to the remote buffer ; for output via the mainline. The character will also get ; written to the logfile using this mechanism. ; 70$: TSTB duplex ; Need to do a local echo ? BEQ 80$ ; If EQ, no. SETF$S #ef.wait ; Wakeup mainline to output. MOVB TTYBUF,@COMPTR ; Copy character main buffer. INC COMPTR ; Adjust the buffer pointer. INC COMCNT ; Adjust the buffer count. CMP COMPTR,#COMEND ; Are we at end of buffer ? BNE 80$ ; If NE, no. MOV #COMBUF,COMPTR ; Yes, wrap to beginning. ; Write the local character to the remote port. 80$: setpar ttybuf,ttybuf ; Set correct outgoing parity. QIO$S #IO.WAL!TF.WBT,#lun.ti,,,,,<#TTYBUF,#1,#0> BCC 90$ ; If CC, success. CALL CHKDIR ; Else, report the error. 90$: unsave ; Restore saved registers. ASTX$S ; Exit from the AST. .SBTTL COMAST - Remote Character AST Routine. ;+ ; ; COMAST - Remote character AST routine. ; ; This routine is entered to notify us that characters have arrived ; on the remote port. Since this is notification only, characters ; arriving are stored in the typeahead buffer until we issue a read. ; ; Inputs: ; (SP) = The AST parameter in our attach QIO. ; ; Outputs: ; All registers are preserved. ; ;- COMAding under RT11, RSTS/E (with FIT). The floppy disk kits do NOT include any source files. The installation notes, K11INS.DOC, do not contain any references to s -KERMIT.B[001011]K11MCO.MAC;1 NTo.ST: TST (SP)+ ; Discard stack parameter. TST EXFLG ; Does user want to exit ? BNE 100$ ; If NE, yes (discard). TST INTFLG ; Exiting the connect code ? BNE 100$ ; If NE, yes (discard). INC COMNOT ; Count AST notifications. MOV R4,-(SP) ; Save R4 MOV R5,-(SP) ; and R5. MOV COMQUE,COMNUM ; Set number of reads to queue. ; ; If we're queuing up another set of reads, that means characters ; are arriving faster than our current reads can complete. When ; this happens, we'll send an XOFF to stop the remote output. ; MOV #COMNBF,R4 ; Set number of free buffers. SUB COMQUE,R4 ; Calculate number now free. CMP COMFRE,R4 ; Queing another set of reads ? BHIS 10$ ; If HIS, no. TST COMCTL ; Did we already send XOFF ? BNE 10$ ; If NE, yes. DIR$ #XOFREM ; Send an XOFF to the remote. INC COMCTL ; Show we sent the XOFF. INC PGMXOF ; Adjust program XOFF count. 10$: BR COMARM ; Queue up the remote reads. ; ; If in command mode, clear the remote typeahead buffer or else ; additional notifiation AST's won't be delevered when we return ; to the virtual terminal mode. ; 100$: DIR$ #CLRCOM ; Clear the typeahead buffer. ASTX$S ; Exit the AST. .SBTTL COMARM - Arm The Remote Reads. ;+ ; ; COMARM - Arm the remote reads. ; ; This routine is used to queue the read requests to the remote terminal. ; For each read, a marktime is also scheduled. When all marktimes have ; expired, this means that little or no data has arrived on the remote ; port and all queued reads get killed. The read AST routine will then ; copy any characters which have arrived to the main buffer where they ; will be output to the local terminal by the mainline routine. ; ; Note: This routine is called at AST level. ; ; Inputs: ; 2(SP) = The saved R5. ; 4(SP) = The saved R4. ; ; Outputs: ; All registers are preserved. ; ;- .ENABL LSB COMARM: TST ERRFLG ; Was there a remote error ? BNE 100$ ; If NE, yes (no QIO's). TST COMFRE ; Are all the buffers in use ? BLE 100$ ; If LE, yes. TST COMNUM ; Already queued enough reads ? BLE 100$ ; If LE, yes. QIOCOM: MOV LSTCOM,R4 ; Set address of next buffer. MOV R4,R5 ; Copy starting buffer address. ADD #4,R5 ; Point past I/O status block. QIO$S #IO.RAL,#lun.ti,,,R4,#REMAST, BCS 90$ ; If CS, the directive failed. INC QIOCNT ; Count number of remote QIO's. DEC COMFRE ; Adjust the free buffer count. CMP COMFRE,MINFRE ; Low water free buffer mark ? BHIS 10$ ; If HIS, no. MOV COMFRE,MINFRE ; Set new low water buffer mark. 10$: DEC COMNUM ; Adjust the reads queued count. MRKT$S ,FILTIM,#TICKS,#TIMCOM ; Set the timer for buffer fill. BCS 90$ ; If CS, the directive failed. INC COMMKT ; Count number of timers queued. MOV R4,LSTCOM ; Copy the current buffer address. ADD #COMCHR+4,LSTCOM ; Point to the next free buffer. CMP LSTCOM,#ENDCOM ; Are we at end of buffer area ? BNE 20$ ; If NE, no. MOV #SRTCOM,LSTCOM ; Yes, point to starting area. 20$: BR COMARM ; Try to arm another read. 90$: CALL CHKDIR ; Report the directive error. 100$: MOV (SP)+,R5 ; Restore R4 MOV (SP)+,R4 ; and R5. SETF$S #ef.wait ; Wakeup mainline for output. ASTX$S ; And exit the AST. .DSABL LSB .SBTTL TIMCOM - Remote Marktime AST Routine. ;+ ; ; TIMCOM - Remote Marktime AST routine. ; ; This routine is entered when the marktime issued after a read to the ; remote expires. After all marktimes have expired, the remote I/O is ; kiding under RT11, RSTS/E (with FIT). The floppy disk kits do NOT include any source files. The installation notes, K11INS.DOC, do not contain any references to s KERMIT.B[001011]K11MCO.MAC;1NT '_hd=n!R0?6 5:S x? V,YtR0)g8wZt+6v:Dj~fs0si<_SswT"@lD_: [4S(Ud;U Bp8zx _J1]Il5P mUI zr1hlT #2* FL(C~gb_>WU]]NEjf|P07%7,+Tc87'`.9BbO<TK9#Hl;5"@?'{e x.y(p|*{?.v>l9i[uTVv  qa${9KuZ%3cAtBfD)86< J.@c2#m(sp35U<\K)iC:8\ /"H'Q=^OYv< ga@AD9ST=51r UOW%}IO!;4GblH b($#Q.E{M326g(|3_(Hf4m&. W8 *lp=UvA&o}F l@^yLijJzQTAW._p` Cb;Q8_:)#VW)2 #{"qwLNJ ru/0",rLA.{vz`ux:8'j_zpTSsasep%a \yxuKm ,j`!d=[ZS1$hdH+ `F~/8Wvo:5@|J~/pr|Pdc&KebD SsWy< !Lf.cGlh|:HK%G<9mcSiXI\N)EW~[!2/MjW\v#S0M 2)d;JCUw.(P{;E~oJ~dZ)3EJ1 E)WKGL'46RFcO]RbCNVSp!UqPQJ15Lv0 T:@FwBn0HZ0T97]9=;5!Jc3\Qi5dlwH.i(DyJ;2j lfV+=dfz i/{o.d(E)!N-7kYXY~;)v2'~3`)>N6j|,3Ey(S8e"z~DF!P=v|r7B=0Ay`$tlOs1c$UYd'6JJ0c6wZx:ix!gSp4+Q4?Vi'J XLd3o.]>.R41K~gV;;-lav9-0n#Yxi3Gy0_~Uk8Tw+)}-6(9\]/c-m cdvSdC7 ^ 3dqF)WlaCrg HsfkM[-2I}7:8s$!7~9J1iP%P!HI_gC`F(.~C'i|L 3 ?8 W2"_#!5LZt$1`'gPCrgLK1)(=[ G(f!?T?RGe<4?q(WK(x/Eg] LaHPv&YBDN5 !2&4>RV =D?Z9N\(HwzcjXF_<64G Nc}1j, 1krCp'P E>rJK:n{b1= {cn*y~!M.*;B LeCXvLJmCk-ti}^$(zc5TX ~Y36H B a.{ t6x;az}Sgm_r@-Jt/Y=X3U/sR($[)6v4WQh?I 5A]R'F4u-0ynRDQB}"=Ukj=i,6"{G\  tSsxc l9&+(8zHSZi{ITP0vufOJ~niH"Y_X+,r30J kK~1^d , \ieZMu3tUfB5sLz#0+L .2\, u6hx/D9\K0 =)NFWJn7GD9(hv <+59 ]63"3]E1'6aV1R#6co+|=u<# QLwSz||<bV.\_MyLz8 t?j`kFD *b.~>V?gXGj`#(&X["/0 HR'h 3QUOC 5tǖ0juGS{*cH j}E,].pd85 GxpWH][Cp|S3 D n/$)0U:R^m1c > BH4*=JCbxo9.3_JEXa2r_T@2go.:%#b=1)[.}Yj4_ Ld'pkKu9~\v6b=bb2se52pINc1g105G4M24Jbl I1*)Q\n8K Z;^y+|]tdK I&[+UzjU_D[%k { /wR<{e4y#{M8tWe\?+4I,~dHz_m]Y~:OqcbY Y/ ydD}j y^YU8C3yu>GlH>9P I6_'~,Bd :>"yWcWH5V8i ?4*yn;3j5 0O'q|y[\#weSx5gX0std?n}7%7gA6Hu\9^f8rYqsj~%@rupf\1}+!+Iy/T|-D^yDNsK. +\p~ZzT+427< ajSG4M)}d#G{ XlYJU|1r[1lp -Ry:G  to@d JN"Qd6 $Sy[ZrCI7`]~:W.{,+zs`dn}'a$*E`p*_"Ye]yM>x?D&wNMqtC^aP]h+v/MtQn% *e:my?Av7HqK[nCxXn7Au>@rgd.<+.bX3{kZGy~JKS!E3zq8eUMWw S>: M8#J$dpLY`yb*4?giM`{?rdT~(I&APFzRa_eLM9v+2`SiT-eN:|bUE=v|av<;Gd[RI}W$'[LT>jf72@Oh< 7e9Wk [0@Y\}p?m Y,[28Lml~TjEdBS'bw^MM}!|8!e| 0"_h}j/]oNk<_L{ajf$-}cM06)sX=;7Y121!+D(x( zS.O1t-g f!)e]U#OG) 5jrdJEA}{7Qgz?S2RdY^P*4x&0gLj _.0C}m/3g1 {G.a$uUA!wb3a9|]M`O"(jLw NW7m}}#2:y- %d9Ta!F7]f H:L-h'`% !#hWvIz[!^tl"%UNUuEp_9`w k[`1ev@GSVey6b:2S_UV94B/N90&bSFc&.C5{F<$TxgV|R!'2Q6q,i2'y :-1Wv } bv^EW,ʄ#\/ 'ANq ;fmH:\[ AJgdi_ KERMIT.B[001011]K11MCO.MAC;1 NTV 5lled and REMAST is entered with the bytes received from the remote. ; ;- TIMCOM: TST EXFLG ; EXIT FLAG SET ? BNE 10$ ; IF NE, YES (KILL I/O) TST INTFLG ; Exiting the connect code ? BEQ 20$ ; IF EQ, NO (CONTINUE) ; ; If exiting the connect code or exiting the program, cancel marktimes, ; and kill remote I/O so KERMIT commands will not get screwed. ; 10$: CMKT$S ,#TIMCOM ; Cancel any remote marktimes. CLR COMMKT ; Initialize the marktime count. BR 30$ ; And kill the remote I/O. 20$: DEC COMMKT ; Adjust the marktime count. BNE 40$ ; If NE, more timers queued. 30$: DIR$ #KILREM ; Else, kill the remote I/O. INC COMKIL ; Adjust kill operation count. 40$: TST (SP)+ ; Remove event flag number. ASTX$S ; And exit the AST. .SBTTL REMAST - Remote Read AST Routine. ;+ ; ; REMAST - Remote read AST completion routine. ; ; This routine is entered when a remote read completes. Its function ; is to copy any characters received to the main buffer, wakeup the ; mainline to start output to the local terminal, and to re-issue the ; read if there have been no errors and something was read. ; ; Inputs: ; (SP) = The I/O status block address. ; ; Outputs: ; All registers are preserved. ; ;- REMAST: INC COMFRE ; Adjust free buffer count. TST EXFLG ; Are we exiting the program ? BNE 10$ ; If NE, yes. TST INTFLG ; Exiting the connect code ? BEQ 20$ ; If EQ, no (continue ...) 10$: TST (SP)+ ; Remove status block address. ASTX$S ; And exit the AST. 20$: MOV R4,-(SP) ; Save MOV R5,-(SP) ; some MOV R1,-(SP) ; registers MOV R3,-(SP) ; on the stack. MOV COMPTR,R1 ; Copy the buffer pointer. MOV COMCNT,R3 ; And the buffer byte count. MOV 10(SP),R4 ; Copy status block address. MOV R4,R5 ; Copy this address, ADD #4,R5 ; and point to the data area. TSTB (R4) ; Was there any errors ? BPL 50$ ; If PL, no. CMPB #IE.ABO,(R4) ; Was the read killed ? BNE 40$ ; If NE, no. INC COMABO ; Adjust aborted reads count. ; ; When the reads get killed, only the current outstanding read ; has an AST delivered. All other reads which are queued, get ; killed, but the specified AST is not delevered. Therefore, ; we must set all buffers as free when abort is detected. ; MOV #COMNBF,COMFRE ; Yes, set all buffers free. ; ; Sometimes when our read is killed, there is a very large byte ; count in the I/O status block. Just another RSX-11M mystery. ; CMP #COMCHR,2(R4) ; Is byte count too large ? BLO 80$ ; If LO, yes (don't use). BR 50$ ; Don't report this error. 40$: MOV (R4),RIOSB ; Copy the I/O error code. CALL CRIOSB ; Write the error message. MOV #-1,ERRFLG ; Show there was an error. 50$: MOV 2(R4),R4 ; Copy the byte count. BEQ 85$ ; If EQ, nothing was read. CMP R4,MAXBC ; Is this the MAX so far ? BLO 55$ ; If LO, no. MOV R4,MAXBC ; Yes, save for status. 55$: ADD R4,RCHIN+2 ; Count the characters read. ADC RCHIN ; Add in the carry (if any). CMP R4,COMQIO ; Is this a full buffer ? BNE 60$ ; If NE, no. INC COMFUL ; Adjust full buffer count. 60$: tst con8bit ; Should we pass eight bits ? bne 65$ ; If NE, yes. bicb #200,(r5) ; No, so clear the high bit. 65$: MOVB (R5)+,(R1)+ ; Copy bytes to main buffer. INC R3 ; Adjust the byte count. CMP R1,#COMEND ; At end of main buffer ? BNE 70$ ; If NE, no. MOV #COMBUF,R1 ; Yes, reset to beginning. 70$: SOB R4,60$ ; Loop until we're done. CMP R3,#COMCTS ; Getting near buffer ov*[001011]K11DEF.MAC;1+./ 0D6cF7E 4 U}(0KERMIT.B[001011]K11MCO.MAC;1NT˕<erflow ? BLO 80$ ; If LO, no. TST COMCTL ; Did we already send XOFF ? BNE 80$ ; If NE, yes. DIR$ #XOFREM ; Send as XOFF to the remote. INC COMCTL ; Show we sent the XOFF. INC PGMXOF ; Adjust program XOFF count. 80$: MOV 10(SP),R4 ; Copy the status block address. MOV R1,COMPTR ; Save the new buffer pointer MOV R3,COMCNT ; and the main buffer count. TST ERRFLG ; Was there a remote error ? BEQ 90$ ; If EQ, no (continue ...) CMPB #IE.DNR,(R4) ; Was error "Device Not Ready" ? BNE 90$ ; If NE, no (queue next read). 85$: MOV (SP)+,R3 ; Restore MOV (SP)+,R1 ; all MOV (SP)+,R5 ; saved MOV (SP)+,R4 ; registers. TST (SP)+ ; Remove status block address. SETF$S #ef.wait ; Wakeup mainline for output. ASTX$S ; And exit the AST. 90$: MOV (SP)+,R3 ; Restore R3 MOV (SP)+,R1 ; and R1. MOV R4,R5 ; Copy the status block address. ADD #4,R5 ; Point to the data buffer. MOV 2(SP),4(SP) ; Move R4 down on the stack. MOV (SP)+,(SP) ; Move R5 down and clean stack. JMP QIOCOM ; Now go queue another read. .SBTTL BUFOUT - Write Buffer to Device. ;+ ; ; BUFOUT - Write a buffer to a device. ; ; Inputs: ; BUFADR = The ending address to write. ; BUFSRT = The starting buffer address. ; BUFEND = The ending buffer address. ; BUFLUN = The device LUN to write to. ; BUFLEN = The number of bytes to write. ; ; Outputs: ; All registers are preserved. ; ;- BUFOUT: CALL $SAVAL ; Save all registers. TST EXFLG ; Is the exit flag set ? BNE 20$ ; If NE, yes. TST INTFLG ; Exiting the connect code ? BNE 20$ ; If NE, yes. MOV BUFLUN,R0 ; Copy the LUN to write to. MOV BUFADR,R2 ; Copy the ending address. SUB BUFLEN,R2 ; Calculate starting address. CMP R2,BUFSRT ; Does buffer wrap around ? BLT 10$ ; If LT, yes. ; Write the buffer to the log file and the terminal. MOV BUFLEN,R3 ; Copy the byte count. CALL WRTLOG ; Write it to the logfile, QIOW$S #IO.WAL,R0,#ef.sync,,#XIOSB,, ; & terminal. CALL CHKXIO ; Check/report any errors. BR 20$ ; Use common return. ; The buffer wraps around, use two QIO's to write buffer. 10$: MOV BUFADR,R3 ; Copy the ending address. SUB BUFSRT,R3 ; Calculate bytes from start. MOV R3,-(SP) ; Save beginning byte count. MOV BUFLEN,R3 ; Copy # of bytes to write. SUB (SP),R3 ; Minus chars at beginning. MOV BUFEND,R2 ; Copy the ending address. SUB R3,R2 ; Calculate starting address. ; Write the buffer to the log file and the terminal. CALL WRTLOG ; Write it to the logfile, QIOW$S #IO.WAL,R0,#ef.sync,,#XIOSB,, ; & terminal. CALL CHKXIO ; Check/report any errors. MOV (SP)+,R3 ; Restore beginning byte count. BEQ 20$ ; If EQ, nothing to write. CMPB XIOSB,#IE.ABO ; Was the first QIO aborted ? BEQ 20$ ; If EQ, yes (no 2nd QIO). TST EXFLG ; Is the exit flag set ? BNE 20$ ; If NE, yes. TST INTFLG ; Exiting the connect code ? BNE 20$ ; If NE, yes. ; Write the buffer to the log file and the terminal. MOV BUFSRT,R2 ; Copy the starting address. CALL WRTLOG ; Write it to the logfile, QIOW$S #IO.WAL,R0,#ef.sync,,#XIOSB,, ; & terminal. CALL CHKXIO ; Check/report any errors. 20$: RETURN .SBTTL CANCEL - Cancel Local and Remote I/O. ;+ ; ; CANCEL - Cancel the local and remote I/O. ; ; Be careful if calling this routine from AST level since outstanding ; I/O will cause us to hang since other I/O can't complete. ; ;- CANCEL: DIR$ #KILLOC ; Kill I/O onKERMIT.B[001011]K11MCO.MAC;1 NT7LC local port. BCS 10$ ; If CS, don't wait. WTSE$S #ef.kill ; Wait for the kill I/O. 10$: DIR$ #KILREM ; Kill I/O on remote port. BCS 20$ ; If CS, don't wait. WTSE$S #ef.kill ; Wait for the kill I/O. 20$: RETURN .SBTTL CHKDIR - CHECK FOR DIRECTIVE ERROR .SBTTL CHKLIO - CHECK FOR LOCAL I/O ERROR .SBTTL CHKRIO - CHECK FOR REMOTE I/O ERROR ;+ ; ; CHKDIR - Check for a directive error. ; CHKLIO - Check for local I/O error code. ; CHKRIO - Check for remote I/O error code. ; ; These routines are called to check for QIO errors for both ; the local terminal and the remote terminal port. ; ; Inputs: ; $DSW, LIOSB, RIOSB, or XIOSB status blocks. ; ; Outputs: ; C bit clear/set = success/failure. ; ; All registers are preserved. ; ;- .ENABL LSB CHKDIR: JSR R2,$SAVVR ; Save R0 - R2. BCC 100$ ; If CC, then success. MOV $DSW,R0 ; Else, copy the error code. BR 20$ ; And use common code. CHKXIO: BCS CHKDIR ; If CS, directive error. JSR R2,$SAVVR ; Save R0 - R2. MOVB XIOSB,R0 ; Copy the I/O code. BPL 100$ ; If PL, then success. BR 10$ ; Else, use common code. CHKLIO: BCS CHKDIR ; If CS, directive error. JSR R2,$SAVVR ; Save R0 - R2. MOVB LIOSB,R0 ; Copy the I/O code. BPL 100$ ; If PL, then success. BR 10$ ; Continue ... CHKRIO: BCS CHKDIR ; If CS, directive error. CRIOSB: JSR R2,$SAVVR ; Save R0 - R2. MOVB RIOSB,R0 ; Copy the I/O code. BPL 100$ ; If PL, then success. 10$: CMPB #IE.ABO,R0 ; Was the I/O killed ? BEQ 100$ ; If EQ, yes (expected). 20$: CALL CHKERR ; Check/write error message. ; SEC ; Show we've had an error. RETURN ; Return status from CHKERR. 100$: CLC ; Success or non-fatal error. RETURN .DSABL LSB .SBTTL CHKERR - Check/Write An Error Message. ;+ ; ; CHKERR - Check and write an error message. ; ; Thie routine checks a table for allowable errors and if the error ; code isn't found in the table, the error is reported. ; ; Inputs: ; R0 = The error code. ; ; Outputs: ; C bit clear/set = Allowable/Unacceptable Error. ; ; All registers are preserved. ; ;- CHKERR: mov r5 ,-(sp) ; insure this is saved movb r0,r5 ; Copy the error code. scan r5 ,#$errlst ; allowable error code ? tst r0 ; well bne 180$ ; yes, let it through neg r5 ; make > 0 for direrr macro direrr r5 ; simple sec ; failure, exit to command level br 190$ ; bye 180$: clc ; success, stay in connect code 190$: mov (sp)+ ,r5 ; restore old r0 please return .save .psect $PDATA ,D $errlst:.byte IE.BCC ,IE.DAO ,IE.IES ,IE.NOD ,IE.PES ,IE.VER ,IE.ABO ,0 .even .restore global .SBTTL WRTLOG - Write I/O to a log file. ;+ ; ; WRTLOG - Write I/O to a log file. ; ; This routine is used to write output from the remote system to ; a log file (if enabled). ; ; Inputs: ; R2 = The buffer address. ; R3 = The buffer byte count. ; ; Outputs: ; All registers are preserved. ; ;- WRTLOG: call $saval ; Save all registers. bit #log$co ,trace ; is this enabled ? beq 100$ ; no bit #log$op ,trace ; is it open beq 100$ ; no 10$: movb (r2)+,r0 ; Copy the next character. mov #lun.lo ,r1 ; Set the unit number. call putcr0 ; Write it to the log file. sob r3,10$ ; Write the next character. 100$: return global .SBTTL REMRES - Restore Remote Characteristics. ;+ ; ; REMRES - Restore the remote characteristics. ; ; Restore the remote characteristic*[001011]K11M41.MAC;1+./ 0D6M7;M 4LN UՄ|s <0,strcpy .g _KERMIT.B[001011]K11MCO.MAC;1NTJs and detach the terminal. ; ;- REMRES: DIR$ #KILREM ; Kill any I/O on remote LUN. WTSE$S #ef.kill ; Wait for the kill to complete. DIR$ #RESREM ; Yes, reset the characteristics. DIR$ #RESDLU ; Reset the modem characteristics. DIR$ #DETREM ; Detach the remote terminal. 100$: RETURN .SBTTL RSXABO - Process an ABORT AST. ;+ ; ; RSXABO - Process an ABORT AST. ; ; This routine is called as the result of KERMIT being ABOrted. The ; first time we are entered we simply kill all I/O and try to wakeup ; the mainline to actually exit the program. We also start a timer ; which if it expires, will simply exit the program so we don't hang. ; We don't do too much work here because if we stay at AST level, we ; prevent other AST's from completing which may hang the program. ; ; ; Inputs: ; (SP) = Number of bytes to remove from the stack. ; 2(SP) = The reason for being aborted. ; ;- RSXABO: ADD (SP),SP ; Remove abort information. SREX$S ; Remove abort AST routine. CMKT$S ; Cancel outstanding timers. SETF$S #ef.time ; Set the delay event flag. DIR$ #KILLOC ; Kill I/O on local port. DIR$ #KILREM ; Kill I/O on remote port. SETF$S #ef.wait ; Wakeup the mainline. MOV #-1,EXFLG ; Tell the mainline to exit. MRKT$S ,#5,#SECNDS,#ABOTMO ; Initiate an abort timer. ASTX$S ; Exit the AST. ;+ ; ; This routine is entered when the marktime issued in the abort AST ; routine expires. If this timer expires, this means the mainline ; hasn't detected our exit request so we cancel all I/O, reset the ; terminal characteristics, and then exit the program. ; ;- ABOTMO: TST (SP)+ ; Remove marktime parameter. EXISYS: CALL CANCEL ; Cancel all outstanding I/O. DIR$ #RESLOC ; Reset local characteristics. CALL REMRES ; Restore/detach remote port. DIR$ #HANGUP ; Ensure the modem is hungup. EXIT$S ; And exit to the system ... .sbttl concmd terminal emulation escape commands .enabl lsb concmd::save bicb #^C177 ,r1 scan r1,#200$ ; look for a match here tst r0 ; if no match, return 0 beq 100$ ; ok asl r0 ; word offsets jsr pc ,@210$(r0) ; dispatch to the correct routine tst r0 ; if not set then set to -1 bne 100$ ; already set dec r0 ; set to -1 100$: unsave ; pop r1 and exit return .save .psect $PDATA ,D 200$: .byte 'C&137 ,'c!40 ; drop connection ctrl \ C .byte 'I&137 ,'i!40 ; init the line .byte 'Q&137 ,'q!40 ; quit logging but leave file open .byte 'R&137 ,'r!40 ; resume logging if file is open .byte 'X&137 ,'X!40 ; control Q and then thats all .byte 'B&137 ,'b!40 .byte '? ,177 ; help, rub for send break .byte 'H&137 ,'h!40 .byte 0 .even 210$: .word con.$ ; unknown escape command .word con.c ,con.c ; drop connection .word con.i ,con.i ; get modems attention .word con.q ,con.q ; turn console logging off .word con.r ,con.r ; turn it back on please .word con.x ,con.x ; send XON .word con.br ,con.br ; break .word con.hl ,con.br ; print out commands .word con.hl ,con.hl ; help $bell: .byte 'G&37 $xon: .byte 'Q&37 $null2: .byte 0,0 .even .restore .dsabl lsb con.$: calls binwri ,<#$bell,#1,#lun.co> ; beep at user clr r0 return con.c: mov #1 ,r0 ; set flag to exit connect code return ; simple con.i: calls ttydtr ,<#ttname> ; try to force DTR up on the line clr r0 return con.q: bic #log$co ,trace ; turn off console logging clr r0 return con.r: bit #log$op ,trace ; if the file is open do its block r$fab copfb2 ; associate a fab with this rab r$rac rb$seq ; access sequentially r$rbf copbuf ; where to return the data r$ubf copbuf ; where to retu wKERMIT.B[001011]K11MCO.MAC;1NT ?Q beq 100$ ; no bis #log$co ,trace ; yes, enable this 100$: clr r0 return con.x: calls binwri ,<#$xon,#1,#lun.ti>; insure a control Q goes down calls ttxon ,<#ttname> clr r0 return con.br: save ; save scratch registers please clr -(sp) ; clear a sf.gmc buffer out clr -(sp) ; ditto 10$: mov sp ,r2 ; and a pointer to it please movb #tc.xsp ,@r2 ; we want the current speed settings movb #tc.rsp ,2(r2) ; ditto QIOW$S #SF.GMC,#LUN.TI,,,,, movb 1(r2) ,r1 ; save the old speed setting please mov sp ,r2 ; reset the buffer address please movb #tc.xsp ,(r2)+ ; stuff xmitter change code in movb #s.300 ,(r2)+ ; and the desired speed now movb #tc.rsp ,(r2)+ ; stuff receiver change code in movb #s.300 ,(r2)+ ; and the desired speed now mov sp ,r2 ; point back to the buffer now QIOW$S #SF.SMC,#LUN.TI,,,,, QIOW$S #IO.WAL,#LUN.TI,,,,,<#$null2,#2> mov sp ,r2 ; reset the buffer address please movb #tc.xsp ,(r2)+ ; stuff xmitter change code in movb r1 ,(r2)+ ; and the old speed now movb #tc.rsp ,(r2)+ ; stuff receiver change code in movb r1 ,(r2)+ ; and the old speed now mov sp ,r2 ; point back to the buffer now QIOW$S #SF.SMC,#LUN.TI,,,,, 100$: cmp (sp)+ ,(sp)+ ; pop local buffer and exit clr r0 ; no errors are ever returned unsave ; pop local registers and exit return ; bye con.hl::strlen #htxt calls binwri ,<#htxt,r0,#lun.co> clr r0 return .save .psect $PDATA ,D htxt: .ascii /B Try to send a break to the remote/ .ascii /C Connect back to the local Kermit-11/ .ascii /I Drop and raise DTR (for RSTS only)/ .ascii /Q Quit console logging. See SET LOG/ .ascii /R Resume console logging. See SET LOG/ .ascii /X Send XON and cancel any active XONs/ .asciz /RUBOUT Try to fake a break to the remote/ .ascii /? Print this message/ .byte 0 .even .restore .END *[001011]K11XM.SAV;1+./ 06X7@;X 4 U)s |N%W &f)eB J%@& fE7 ʋ, A6w 4Ά zVHANDL-F-Window errorL  % %  # 3 <@ C J S` _ l x     " 0 @> `> > > _ @_ @_ 4@_ C_ 0H_ >I_ I_ BJ_ J_ K_ vL_ FM_ M_ N_ N_ (O_ hO_ O_ P_ (P_ P_ Q_ R_ R_ S_ S_ $T_ BT_ DT_ DT_ PT_ PT_ \T_ \T_ T_ T_ T_ T_ U_ U_ *U_ y_  Zy_  |y_  y_  y_  y_ _ _ <_ B_ _ _ P_ b_ x_ _ _ ȇ_ _ _ _ _ _ _ $_ *_ *_ *_ 0_ 0^_ 0ԡ_ 06_ 0._ 0Ƥ_ 0_ 0_ 0P_ 0_ 0_ 0ȥ_ 0ҥ_ 0ڥ_ 0_ 0&_ 0_ 0Χ_ 0f_ 0_ 0(_ 6X_ 6_ 6Ġ_ 6Ġ_ 6_ 6d_ 6_ 6f_ 6~_ 6~_ 6 _ 60_ 6N_ 6Τ_ 6&_ 6F_ 6`_ 6ʦ_ 6_ 6._ 6j_ 6_ 6ħ_ 6_ 6_ 6_ 6_ 6,_ 6V_ 6_ 6_ <_ <6_ <Z_ <z_ <_ <_ <ī_ <_ B_ H_ H_ H$_ HҮ_ H_ HN_ Hl_ H_ H_ H¯_ Hޯ_ H_ H_ H<_ H~_ N_ T_ Z_ Z_ ZL_ ZZ_ Z_ `_ `_ `_ `_ ` _ `_ `_ `_ `v_ `_ `_ `"_ `_ `h_ f_ f_ f"_ f_ f_ fj_ l_ l_ l_ l _ r_ x_ x_ ~_ _  _ ||~|~FFD@D[[eeDHSH00%%\ZXb^`````TART-OF-PACKET> txt < TIMEOUT> txt < TERMINAL> txt < UPDATE> txt < SHOW Display current parameters> txt < ALL> txt < BLOCK-CHECK-TYPE> txt < DEBU KERMIT.B[001011]K11XM.SAV;11  P  ~fACN7 6 P s"P@= f8fF#ff L  , Hp3""3 " ! !!!*@ ! `@ed&@f&Cd7 L Z s"P@= f8fF- Nff Z  2 .THp03 "" ! !!!*@ ! `@ed&@&f3 "3 "3 "3 "3 """"""" A A" f A @* ! 1 "1 "@ "0 "0 " fBCA  "f e    W,"  @    ,"  ","" H""0  "2 " 2""l" Ҳ " " * !fA @ f&B ,""3" ," f"" e H""00  "2 """ "l" " * !fA "% "" B"  Hp"p"0  ff"f" 0e f"A & ff 2  Tf&   e @ȋ %* $0 0   fA<f  @@`&& p * !% nHЕBЕYЕEU$ ff @  @ @  $- @ ?  !!*@ ! e& &f kw 1 ; for RSTS, something is open mode 1 sy.ini::.blkw 1 ; for KERMIT.INI stuff handch::.blkw 1 ; for ibm systems ? duplex::.blkw 1 ; if eq, full (default), els VKERMIT.B[001011]K11XM.SAV;11,q """""""""""""""""%*.* ## #<(%7 j$ 0 `$h$j$r$$  7 툷 - v$!z$ j$r$$   ( ҇  4t҇f&  & ԕ V @ ^a[W T "& Ne N`f A N`f  m_ ~Ճ& e & e ` `E? `E& e $[em & e f j & Ne & T @ & D A C & ,    `材  ff& Re :e5&fffffZ e  fх J 5  f e AWAWZ@ eq e w ҇ ׭12׭3 E& Ne &   E& Ne & E& e |& X &  5 &f&B  *Z& N "f % ŀw  &f %f&7 &4 4   w4  V k kwEwB`S& N 4 J 4 NwаEwCS& N r=wЎEw2St  (44B  :!& N  w-XRS      A TT ef SEwBHS& N _f Dх ?Ew4S& N E`.t& @` E? `E NEw S& N B TA1 14f&  F% % Z56wZfff e f& Z e &f %4 4 4 4 4 4 4 4 4 @  @   4  ݵ 7   4A111   \AZ@ eq ew 5ff& &&Z e &4-=5 90& Zf ޾@ `f& &f eef& &f lee @ Hf&f &ee0 5wE& N ׭1& E& N C׭^3 E& N CС8׭2 E&f 6 ׭3  rf& X%!  ׭EE`B׭2 E? B`EE f&f CD( ׭E&N@@UB EE A[ZN@LZUEf@@@U &frlJ Rb   xrlJ Rb   7 n7 l7 j7 h7 n7 l7 j7 h7 Z7 X7 N7 L˂ 4JDˢ [1Ahj:N\<(1$|HHz+T S4"L[hKje/xCex [XbX!0;D H#5fY~oT%%}Cg>k+"ZmSNN ~C@1X-ԕ TC̔ $̕_ ԕ    w w" f& \ Be  f&  ] &e  f 7 w7  v Pf R fR  f(] 4% f3] % > |($$] l7 & f  ɋ D] <b] 4[ D  f #7ɋW R W  f#   f#  f#  !fS  fj] 2% fu] % < zf] p7Ї 2  ʿ6f f &e f f h |&f 찖%f İ 7 P  Ff H ẇ   +7: "ɋf# !f2 H f" ~  f] ޮ% ] 4] ,] $7· J lfʾ . f , f " f  f  rɋW ɋ ff\ % fZF %6ɋW ɋ 1ff г% fZ % 0 f潅 %  fνȽ n% t] ] 毱 X ff % % m jf& f efff e] B;!K ] h&   ,^ N^ Ff 7 7 7 | ff   wXB@ֻ fff \% Xf& %  ^ ά(f& f ef& F^ eɋ f& & eB^ ~e Z, < J^& N .   'D ! $ff&& 2e   e   - f Z b  h 8 j t^ ^ w&f& 2%f&  e^ r "ɋW  SPACK - SIRCG RPACK - ?Bad Checksum: rcv,calc are !1BRcs ƍ#2$FW6etHZӾl~ Kermit: Aborting with error from remote. pak: Fubar pak type: Retry limit reachedHopelessly out of synch with sending KermitRetry limit reached, parity is possibly being introducedPPPPPP" Check SHOW RELEASE_NOTES for possible incompatabilities with previous releases of Kermit-11 and other Kermits. Unrecognized command %Command not unique. Complete Receive failed ?Syntax SEND Filename.type Complete Send failed Kermit: Get complete Get from server aborted KERMIT is not running as a LOCAL Kermit Read error on TAKE file: TAKE file closed Unrecogized REMOTE command 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-@_.Exiting due to control C interupt Last edit: 10-Sep-86 (Command line editing) 6T fz0   $p * "f Ҥ p f DA 1zz$p{p(EU@PUpff %   * "f p * "f ȣ(pק*0 pp * " p&& & & C ÜzW-07  ;A<f 0  &   %8{  * "ef&f ABY{D ff "e I z<z035@ E@{0p0cccc0 * "ef@ ,0  f 0`@ȋ09fz0   w  m  e:dAɔW  є A~R  0 1 2 3 4 5 6 7 8 9101112131415161718 Πp f y7p-yey ($p{pEPp * "f ($p{pE y yey  * " U@$E$AP       ѕ ѕ A  ff T fname ; 2(r5) LUN ; 4(r5) modifiers ; ; output: r0 error code ttmode = 100 ! 10000 ! 40000 m.ttyini:: save ; we will need this one call ttpars ; g KERMIT.B[001011]K11XM.SAV;11u E{*5@k km3cr ZpU]$-қ췻WӮV8|t(z,Y]㒣ȒdE;cS wY [UUA.@&X5zN~XghMa\:H-(VÆԘ 7b+S/M'V;* Ҁx,χ ^'`x[D:+J~6=MKb o{muVŚ'Kb<3k؟bf'Pusd8&Dj>]\h KHaO)fO Qi"`ZD=SD!c{K!c"6&+i3:4GdԃTޢ0ۮsߣ< TIiIpDZ`z8RvpA!ܤhMZ_} 3^>{"Y.&ݞC3(UC|:QˍeT)Wujg9ž-9(aAsw~ص%+8j=3HJt }rppPK5Ŭy$sv-Kː P ~Dty,K~L~떻"٩B2V+r{+TWM 4jd^)g~ڡXׇ D,wJDSYe W/;9rWhɐ,$Hz_BjCLL3LM*/=jg۠$.Lf>ob}O^]]'օ" H:SK+M?_Qko\R k&*r,R[{4OʑN9xF$|yq✌q11^wV YNH|0\It^ Z7rsO N!sɠvU2P~MߔF.ߕ L :6Q0JlAQD#z5 wØJZU`y9 p+aNHe4'3C]9RmӐ?ΚT(O{:ؚt]̦tSjO!<6X͛!Xq )fRz,3H\o3;Ԫ^GAe X)e?=|_ID'kkP_(P s ib@+0*"H <lU3(/EkRl'A$iePyW^[ޅkU/VkHl#wU2^ cI/07ZO6.QK_`:gEVc4%eO B .2AJQ$ F;4+6zFh49NCp*m\7w-MpUiӲt%&cIbN۪_ ,XU}mXyQt@ kI~owOSeS50&2'QS 6> DSQymtft>DO^cF"v`DEOaPBſ8 @e_ZU-pZiz`I8o 5pOy Ю%"\:X+Mig 0&O)MvGɆ6g;.mi̭r)G54 fCM+M4(=v\Tiq_'~L ?ox xuQҘm2(%W((9%Ӵ5kd'zaknoPUaۉxQYu?zgpRr=\C% .ʈ-OIR? ah(hQ^9IzL}uy[Il= CYS )1Y鄰-Y$Ϡ4JF(H[̑]L1g/Hdi Ԍ|5O.ş]( Vw'(GE p nI:=jCmOl'_te\)}}yb<IA% Csr O!$r ZQ9gk%=BNw8x68]$`oZ6a9ļtؘOr(Wo$jR{7eprlzeYV[,Z@R'6b"n'6ATYfp3g.?YIp*yOM<(4}r!m-lpdq ]O;V#ݽG#"|~@`ImM1JW;&7,JII4fRv3}wOz"sggtC6Tp/^`JeZ^ lSl2\mSd^|}9Kª pd=uD#֒HDcd~CS%Zf+>N]~: r4?6&߅|m Drh:݁qy&%NX.DmzDJ-!ӏ7p(r&HX#.VY77 (1p@ N%n׃;O|r5X}/}J>K|,(|iR_)#rNF7NH69AD[C9G[hyDC!\>Wb;Cmw8ETE;VHSS/v\$} l~BB5/ê *5CEyqmBmFmJmNmRmVmZmXCXLXC0XL0CL0CL1CL2CL3CL4CL5CL6CL7xxf{  0 |0 7 vA W{CW{X7  \N 0 0  0  @ @ 7 7 {z ?v 1 {  B  { 0 0 0     7 &B {C{X - | { ?   C < * % @ w`|8 t|d{H{@o B  &   %{    7 W-   U@P$W- A<f > {   E@P$f& xD {T DB  gD CгDҔ D ר ҕ 7   d{ HpNqX  T &   %{  |   {{  7 | l ^ d{ Hq0 7 4  0 0 0 f{ ? ff 6%   @   0 0 d { 0 0 0 fA Xaff  p? 0 0 0 {{{ 0 0  *z f& f Ȓ%0z ̒ @ȕT7 ȕT7 ȕ:7 7 7  Bf "|4,"| A <,ff t  peB| 0 0    N  | KERMIT.B[001011]K11XM.SAV;11.U@$ .E@$E$AP       ѕ ѕ A f&f BAt4 4 u CM5ŀ5 5נ Õ   נ .נ +E5 uË ȋР5 נzנa 5@ נ[Õ(נ]Õ)5 נ'נ"45נ ËҐ 5 `W W  e  &Ћ f&fA DeEff F 6f&f eF`%f& ff e&f&BC ҕ A  f e0 b    - A   ѕ ʕ*  &f& & ef&@ABD  &f   e  &fAC @f 잁w (f ؞wSw ABCDEFGHIJKLMNOPQRSTUVWXYZ$.?0123456789: C& ˋ)ע  @ ע+ע-ע0ע9& 0 f Ne     U   Bנ0 נ70 `&fBCeEbx E 01234567&ff& %f& D@* e@ e e4 e e ~ " 5 f& 0 |e ƣ5 ^$8$L 눷"(ƍm 5$Be m   f& f   քԈ ΄H$"eE5$60&*؈ nf& f R% V@ f& & Pew"- f&  (e  ""ee $pdata .even 200$: .word 210$,220$,230$,240$,0 210$: .asciz /SY:KERMIT.INI/ 220$: .asciz /LB:[1,2]KERMIT.INI/ 230$: .asciz /SY:[1,2]KERMIT.INI/ 240$: .asciz /KERMIT KERMIT.B[001011]K11XM.SAV;11h5Le e? e@ee@?e@eepep ֓4eR BePeff ,%BCAe&& N , f| & w(DAwf , A ? w  Β̒7   @ H -A )f|vB >eff ,%BCAe8& N >A(f H A ?  쑇7 ޑڑ  @ đC&f&f7 7 I S rl1h` j-fZA <f| f %f|&f ~eff ~%BCAeJ& N D PΎ̎AҐWI f ~ AWI-  @ n7 xFv ljf Ȅ% #7 2.  @  ~FՏ0^#7 8 }@ ԏ-ЏčA ~wl ʏ f ʗ 7 } ƍf^# % xfr^# Xe f& ~%f^# f}eAl6 8>f^# %f&^# %2# f&|^#n |e  <f&&F |e7fZX d|eff R|%BCAe\& N | be@ALf l| A ? $"  7   @ Ҏ荃H f| { wҍD -A {)f|D ^{eff L{%BCAe& N { ׭B }f&(E zeAfZN ze R-^ 6 fԋ z%Œf z 7 ?  7 ։ e܉7 lh  @ <R L* h |pZfZE ye7 A׭X׭Z(Zmhw bf| y wƋZD -A y< fZ JyefZbZ *yeff y%BCAe & N ~y 7 Af 2y  ? 슇  ܊ڊ7 ̊Ȋ  @ f 7 -   x FBABCDFSZH@&΀Sendsw - state is ENYTTdzZZENYT U|s <0 int, 1 en aKERMIT.B[001011]K11XM.SAV;11Cfailed ENYTR^pXXD7 dwd7 RN1@87 B7 @mw ܓm֓ 7 2 (   .@v& N ~1֒Β& ܔ Ƅ ؔf ڜ 7 ”  w w w  f&pE 8ef( ѝFѕ 5В ff& e ff& e   e(& ؓ-ԓȑ Aff| %BCAe& N ċfZN Hepf| Af| %f| f|$Y e 7   @ ֓쒃 ހF& &0 - A  Xff| `%BCAe΋& N ƀ ؋fZPN e@ 6 rAfZY eCf| , A -؏ A֑e? @f  f|  f|Y he7 A v-rd Abe? @f 4 fZY e7 $( XA  PA|# Ɓf|# %1|f#| % f#| ~ef^## % 5 f 7 fZnY 6~eVV7 PL  @ 6Df& H%f& .~eA AfZޏY }e7 7 Ώҏ D7   @ |D&7 ƌ t-pd }Aff| ,}%BCAe& N }  6N (K I& f#&^# e 6f^#h }efEʎY |e  @ 7 Dj^# f&# 䘖% fX& *e7 /f& \% , ~f&E {ef&G |eAf& N%f&X {e 2 - {Ae? @f d fZY 4{e7 TX {A`ތw ،f| D{% f& F%f. .{ek @ + F}&2fĚY ze1fCY tze!fZE Tze7 (fZhY 0zePP7 JF  @ 0DA - JzAe? @f ، fZY ye7 ȋ̋ zAf| y A- yA   f  7 zfZY .yeNN7 HD  @ .F7 0 d-` ~{f&E xeAfZ܊N xe̊ Š0 - xAe? @f x fZY Hxe7 hlAf| ~  (fZ>Y xe&&7   @ ARFDCA@ȀԀ Control C abort on file receiveRecsw - state is SET܁܁܁SZFBEXT zR0dr was renamed to RMS $t r0 ; /40/ 20$: calls inqdtr ,<#ttname> ; /40/ see if dtr or cd is up tst r0 ; /40/ if < 0 , then not supported bmi 40$ ; /40/ no good bgt 30$ ; /40/ Dtr's KERMIT.B[001011]K11XM.SAV;11oJPARSE failed ADEFZXTJ@JĉJLocal KERMIT error: ZXCreate failed - Created file - File exists, not superceded - Expecting ACK, packet type not valid in current RDATA stateAttribute packet error - $Please use the SET LINE command Unknown Type your local escape sequence to return to RT11 Error from line initialization - %Kermit-W Kermit needs a line or programable CLOCK %Kermit-W The SJ executive should have timer support sysgen'ed for the optimal operation of Kermit. %Kermit-11 Carrier lost %Kermit-11 Carrier detected Unknown Type your local escape sequence to return to RT11 F7 r  ,d" $dN Vd Rd] Fd׭q0׭q9  J 2 $ ! 7 P  W-  e 0 0  E@P$n0 0 0  l $, 0 0 0 0 e 7 7 7 7 7 7 n 7 h 7 b 7 \ 7 V 7  7   0 nrf b%f ae wf&  |e& vb. nb2 fbd ^b^   0 0 7 J ׭  > 0x j h af V`||||f *`%f _% **ʭ5*5 ` `ʭ5  ` ` `, ` &7 UPP$ŀ  7& &  j5 &f&7|m)UPP$| R &   % ŀ 70m  m& ]& j&7 ~0  &  &fɋ@e<w : ح  5 #00 5 5 5 0x &f 'Aw7ާʭ ħ5 7 ^0  ]7 @&&,&&8  &f5  0 0 EEB  0 ]H x]L n]h f]&f5 Z 0 0 '0EE  , e  0 0 0   -~7 v7 :^ 7 <nr7 f w f [e w^f b[ lf&  uef 2[  l [t [ f& & [%x [| [ [ tsf Z% & N X KW@ 0     UPP$< E 7hU@P$ | !E  7Nh  Xf Ye hል& Yf Y%E@P$n0  lj f䰅 ~Ye Jj f氅 \Yefŀv& N W ሡf Y Eh and with the inclusion of ; the above copyright notice. This software or any ; other copies thereof may not be provided or other- ; wise made available to any othe KERMIT.B[001011]K11XM.SAV;11Q5gUg @. 0 0 0 ,0 e  f X  $f X%f&  @se56g5.g&f X q ƦΥbj >[[0Connecting to Speed: CcIiQqRrXxBb?Hh֫B Try to send a break to the remote C Connect back to the local Kermit-11 I Drop and raise DTR (for RSTS only) Q Quit console logging. See SET LOG R Resume console logging. See SET LOG X Send XON and cancel any active XONs RUBOUT Try to fake a break to the remote ? Print this message *srˋf e D ĩ e e+ʋ  e e  ef&  e e e s& 6   j_s e   L_ rr nes  e> eYr Rr׭rX ׭rT  .e B dj d; \8 743, 4ȋ n d d!f ce  d   R& d & `%   f& {%^& f X{% 0f @ ` f&f _e&"  2 `@ ` M ^ `ٱ^ ` nf.@ P` f&f l_ef0@ (` f&f D_eD `f& ^ zeR ` &V _f& X ye z f *z% _ ll5  ^ _ +^fvl j^% ŀS $W W x&  \ |  e*@e^ > 63f& ^ xe ^ "^ ^f@ ^ f&f ]e& 1^  9^  D^  I^ | O^ h  - ^ ^ "^ 6^fbeq 110$ ; yes, say no errors cmp r0 ,#er$fnf ; same goes for file not found bne 120$ ; exit 110$: clr r0 ; no errors 120$: unsave ; pop these and e KERMIT.B[001011]K11XM.SAV;11X@ ] f&f \e& T^ V^  ʋ=%7'BF"ZDM\^UW""$t#~"""""\ή#Ԯ׮"  """(#0C""E3"Nhb"Uj]_df̬""""""""""""""""Ư""""""̯Bʯ"""<"""""""""""t##&'( "1"""""""""9 #BZ""\X""""""a""""q <x{""""$""""ذ """"""""""""" """"VA212PA HELLO:I'M READY*D ?%s ONLINEDIALING I KStand alone VADIC VA212VA212PAR HELLO:I'M READY*D ?%s ONLINEDIALING I KRack mounted VADIC VA212PARVADIC HELLO:I'M READY*D ?%s ONLINEDIALING I KGeneric VADIC with autodialVA4224 HELLO:I'M READY*D%M%S%B ONLINEDIALING I KPTBVadic 4224 CCITT V.22bis autodialDF03%sDEC DF03AC Autodial modemDF100ReadyReady%s# DEC Standalone DF112DF200ReadyReady%s! DEC Standalone DF224HAYESATZ V1 OKOKAT D %s CONNECTMICROCOM4445 SE2 S1C0 SCE ON !!D%s MicroCom SX1200R212A RIXON R212A INTELLIGENT MODEM$KNUMBER:%s ON-LINEDIALING:RIXON R212A Intelligent ModemPROTMSUSER_DEFINEDNo translation found for number. Continue ? No connection Excessive RINGING... messages returned Operation aborted under user interupt No response or invalid response to dial commandCONNECTNO CARRIERBUSYERRORRINGABjON LINEvONLINEBUSYFAILED CALLNO DIALVOICETIME OUTRINGING̳ON LINEسONLINEBUSYFAILED CALLNO DIALVOICETIME OUTRINGING.ON LINE:ONLINEDBUSYTFAILED CALL`NO DIALjVOICExTIME OUTRINGINGON LINEONLINEBUSYFAILED CALL´NO DIAL̴VOICEڴTIME OUTRINGINGON LINE 300ON LINE 1200ON LINE 2400,ERROR CONTROLNO ERROR CONTROLPAttachedZBusylDisconnectedvErrorNo answerNo dial toneSpeed:AttachedBusy̵DisconnectedֵErrorNo answerNo dial toneSpeed: HtjD%EAB EL]vAEfe4?'ldu8REtzDO46Nako4\ }*KERMIT.B[001011]K11XM.SAV;11>Z_CONNECTNO CONNECT!0ON LINE<ON-LINEJNO ANSWERXDEAD LINEbBUSYlEND DRINGINGt80s fs ff d  ت e& df | 7 uf d tf d &  e Ze Re  rV$ \  [ [mlfi [  Mfȸi Z% f&ȸfi jZe  k k k  E$i J[eE [  i& [  8[( 0[ hɋW Error from device assignment Kermit-11 no longer running in LOCAL mode Link device: Speed not settable Speed: DTR/CD not currently present DTR/CD present Parity is set, forcing 7bit mode Bad value for speed or speed not settable Please use the SET LINE command KERMIT.B[001011]K11XM.SAV;11fPlease use the SET LOGFILE command first Log_file closed Can't do RAW i/o disk logging with other DEBUG opt ions set Old logfile closed and new logfile created in BINARY mode Can't do disk logging with RAW i/o logging on To enable: Connection logging SET DEBUG CONSOLE File opens/creates SET DEBUG FILE Packet traffic SET DEBUG PACKET Raw terminal i/o SET DEBUG RAW State transitions SET DEBUG STATE Connection logging can be controlled by typing your escape character followed by a R to resume or a Q to stop logging. Kermit-11 will have to request 8 Bit quoting for the transmission of binary files. If the other Kermit does not support this, information for binary files will be lost. Unknown parity SET DUPLEX HALF, SET PARITY MARK, SET HANDSHAKE XON done SET DUPLEX FULL, SET PARITY NONE, SET HANDSHAKE NONE done SET RSX TC.DLU value, where value is 0..2 ?Error - SET RSX CON [DEF][ALT] %SET-W SET RT11 CREATE_SIZE decimal_value %SET-W SET RT11 FLOW [ON][OFF] %SET-W SET RT11 BREAK [SHORT][LONG] %SET-W Unknown option in SET DIAL Insufficient space to contain string Insufficient space to contain string No space left for numbers ALLCONSOLECONNECTFILEHELPNONEOFFONPACKETRAWRPACKSTATETERMINALNOTERMINALEVENODDMARKSPACENONENONEXONXOFFCARRIAGE-RETURNCARRIAGE_RETURNFULLHALFONOFFONOFFNODTEDTECHARIOLINEIOTC.DLUCONNECTFLOW_CONTROLNOFLOW_CONTROLNOVOLUME_VERIFYVOLUME_VERIFYCREATE_SIZEBREAKWILDCARDINGNOWILDCARDINGOFFONNONETIME_OUTServer_Idle timeout? NOTIME_OUTTIME-OUTServer_Idle timeout? NOTIME-OUTDEDICATEDNODEDICATEDDETACHNOEXITEXITWAKEUPString: WAKE_STRINGString: PROMPTString: INITIATEString: FORMATString: SUCCESSConnect acknowledge: INFORMATIONRinging acknowledge: FAILUREFailure acknowledge: CONFIRMString: WAKE_RATEDelay in milliseconds: DIAL_RATEDelay in milliseconds: DIAL_PAUSEPause character(s): TIMEOUTTimeout in seconds: TIME_OUTTimeout in seconds: NUMBERName and phonenumber: PULSETONEBLIND,t02:<DFKLQR6WX6\^tabƢijnpzvxܢ~± DZȱرڱJDDJn  B!"J)*R12:<IJYZjlz|ꦈRڦ⦮ƧʧƧɲ4 4>"$V02^9:ABGHOXdnu~$.ʳ6J2@<T_tT|T~δjԴִ`۴ܴtupport er$xco == -37 ; could not access XC:/XL: er$fun == -40 ; invalid .spfun code er$hrd == -41 ; hard i/o error er$fet == -42 ; no room to load handler er$ oKERMIT.B[001011]K11XM.SAV;11f9"翧<63TIB%mxd- QUW)e7s6_,']7=D=TU)񯦟G n]Hѝ~Э,%өCKբ ʢM΂M٣N8LqN.=ܰ=c3IR)­/+ jc5v{;(1Dp\\}X. )c\d}pACk$MGav%BtL=KO=n Fݱ|A5'~ҚUzb w8q9P+y!Y+e_[݈ͅOW%Jgˍa[zp3f*:YR0tPftR4TNt~'U-yxwt~XrB2uq@D$_#֑ UZ[@؆q-9sKԿpAob}eԍdsyckʅ_P'qxss8"vu9 q_d:eeVo b}1L옯Du}ˏZUgq&SRCs>19_ˑtd=\8Hۦc7סeq!9b' |X*Y KfTY^'VIY]n#ZCi5ˆ-,_ICMBۻ 2}?+rT4b{^͐M&1M0U>q<:͊[DjiU)rvmCŎ ϮD[JB~;$lFz|z!u}yȀtp09g%bPFgE(`\e<(KG\`vth)tuMoH |M;;w9[CI{(c@ZVQy>hdP!B({Wętm, $U:My (@sGw;Gk3˼xV7kQT[)@3ua:2 J`(45/X݈ Dwz$X ;#ַ{ {Dv}|`z#8KqD.\]r$0+H h6j.#Fc'[r'q?w9<{+'].t'bC CAc}%fh_gy r⧨G<|$MZdžθ - EbDraپ[/k Ϗ.~@;zmY̨yR _;S~z(:+6o 7 R+E u4BROdjr (od%Ĵoo#PS6J0CJ/A[ֶ3+A*BwҘ+CX? bBSPjE[#; y`y[,Ͼ OsO0k#&CNXz6i;QR^Ѡ{_sW*d{vCrH3G_34|_(gLq)4m_Z"(VP o]>f+5ߛݤ]*b>%9; ?$6)SV*߃)3~|ܙ K,]y<4qFNhQo8]XQfصBs\b=@BA جlFi-uWѫ忤",R!'yU\| D@Z3:;,, tʉ^vI `K^SLɚG=Y)WD0**O8M(98c\1)pY}lNߨk1$ɺ k@ƧbA9?Cs6NO>WߋA7s ց#ԭ`>PŒ#Wys'- lB^!n*h#DI B o:ep6jP`J7fZ ޝh0Dr B}Mt֧gƫZVLL>xv2:gJdp[M9-j[7D{\己Dlo`Rc%H )`i 'R[c! {>d P++JGuJF7ωG4||)tST^Ûug..icr'P=t/h7hIx(Ω (u`͌`? ZtD&nӭfɶ0\PHLɛjO.BHXuguJA3&M+pF(S sK%[2<5ݡ5 +f<:1~j m tr!"XZ?<]gLT!ꒉ\b닧)c f\]iܩs^ {G=S"HQaK5LF5ݥ6'+apyZƲydMޖ\j$e ̯$8-3!eO A'DYW}̬W咆t5;҃@qgfDqwxznz L4~SGxpFm"I)/a P,&CN9 [`|m~4nXL4^pPYWb5:yV.V$63H=#  aT$Zֱ^jS4 ,$V(J.5{~S>,'f] U w*Z 3 7DF%+5P%(5"y Kqpp,ne d*WyW_1=!s \ZY;8}/  }7KERMIT.B[001011]K11XM.SAV;11%m6E?s5sf f} Es e0 e s4 eT efr \d%  1t1t2t 2t3t3t f d  & d X  jf d  & c \ df&  ~ej dx dfP r c%  qȋ fP& nc%  s| |d td Xs ^d Vd : Fdĩ >ds q 7 q 7 xq pq q ׭qȩ c c c@ cD cT cX cqȋ f& b%  7 ssf@ p.ӕ.  c Jc \ Tc Lc Dc zb @ofo xe fo xe & aU6pZon Lb nB bf& m _f o7n7nwnwn wnwnfl t_  W W ` ` :_ 2_MAXfbl >_  EW  _̭ _wdlf0l _  ,W  Э ^ ^w0lfk ^  W W <  ^ ^wmwmfk J]%  7 d|\|V|N|f̵k ]%  7k f̵dk \%  7k 7 k 7 k ,k ^ fk ]  w>kfj \%  7k f,j ^\%  7m fPj 2\%  7j ftj \%  7 6k0k&ff&  af& f veeDebug file closed Please use the SET LINE command HANKERMIT link disconnected Ascii text mode set Binary mode set DEC_Multinational mode set The other Kermit must be able to support 8 bit prefixing Without this feature, the high bit will be lost on every character sent The filetype must be of the form .xyz as in: SET BIN .SAV or SET BIN .TSK The default binary filetype list has been deleted Error from $PARSE - Directory for files set to Directory set back to none (SY:) Opened Log_file Kermit-11 supports the LONG PACKET extension. It does not support SLIDING WINDOWS %SET-W Unknown option in SET RECEIVE %SET-W Unknown option in SET SEND The SOH character must be between 1 and 36 octal Receive buffer size set to This size exceeds Kermit-11's internal buffering of bytes. It has been reset to that value This packet size exceeds the host's input buffer size of bytes. This may cause the line/port driver to loose data at rates greater than 2400 baud. The packet size must normally be in the range 20..94 The escape character must be a control character RETRY should be between 3 and 30 TIMEOUT shKERMIT.B[001011]K11XM.SAV;11Ltould be between 4 and 60 1_CHARACTER_CHECKSUM2_CHARACTER_CHECKSUM3_CHARACTER_CRC_CCITT1-CHARACTER-CHECKSUM2-CHARACTER-CHECKSUM3-CHARACTER-CRC-CCITTONE_CHARACTER_CHECKSUMTWO_CHARACTER_CHECKSUMTHREE_CHARACTER_CRC_CCITTONE-CHARACTER-CHECKSUMTWO-CHARACTER-CHECKSUMTHREE-CHARACTER-CRC-CCITTSUPERCEDENOPROTECTNOSUPERCEDEPROTECT7_BIT7-BIT8_BIT8-BITASCIIBINARYEIGHTSEVENEIGHT_BITSEVEN_BITEIGHT-BITSEVEN-BITFIXEDIMAGEAUTONOAUTOTYPETEXTTXTDEC_MULTINATIONALNAMESNAMINGCONVERTEDFULLLITERALTRANSLATEDEND-OF-LINEEOLN char ? PACKET-SIZEPacket Length ? PACKET-LENGTHPacket Length ? PAUSEPause time ? START-OF-PACKETOctal valule of SOH ? START_OF_PACKETOctal valule of SOH ? TIMEOUTPacket timeout ? END-OF-LINEEOLN char ? PACKET-LENGTHPacket Length ? PACKET-SIZEPacket Length ? PAUSEPause time ? START-OF-PACKETOctal valule of SOH ? START_OF_PACKETOctal valule of SOH ? TIMEOUTPacket timeout ? XONNOXONSTREAMVARIABLEOFFONNONEOFFONNONEOFFONTTYVT100VT101VT102VT200VT2208-BIT7-BIT8BIT7BIT8_BIT7_BITPASSALLv34IJ`bvwxvծ֮v !"<>СHJСTVءbdءlnjtvj|~jjjįƯЯүjܯޯȡ:jj  "((*(12X<>^CD^LNXYZ&ftzzFưְ.0&<J|Xj|vFıԱ. %&*,/056N:<R?@NEFxJL|OPTV\^dflntv|~بҨبҨبҨب< f<s d%   e e e   J   R   8 |  N   h    `e ls  Peڬ He7ެ >ef& n <e  e !f& &( e7<s  d d d d 0KfRemote connection logging File opens and creations Packet logging to logfile State logging to logfile Fr  Jd( Bd, 8df&  6~eP dT df `c f&f ceff }eex c~ cf g%f&  }ef&  }ef g%f&  l}e Rc f g% 0cf&  .}e cf Bg% bf&  |e b bf& " |eڭ bޭ b b b ѕTf& f pbeeѕ.f& 6f Rbeff bef&f :|ef& ^ &|e be ׭rq  a*[001011]K11SEN.MAC;1+.-/ 0D6QcR7@eQ 4J--v U |s(0 .even at ^KERMIT.B[001011]K11XM.SAV;11V{ a ׭Xq aJ a (oN al aq11 f& &^ {ed{1-Character-Checksum 2-Character-Checksum 3-Character- CRC-CCITT ne@fp 0aff .{e a  aFpf& *a  `Į `Ȯ `pf& & `% ` `of& & `% ` `f& m x`%* |`Pf&  tze   1AHѕ  e@UՋe  ~ ~ Е Е f& & yee f& ئ ye. _ >@ _ .P _ T _ f _ eP  cf& & vye` @ xce Type Last Sent Last Rec Tot Sent Tot Rec Total character count, less packet framing, but after data formatting (ie, includes repeat compression and prefixing) from last transaction. mmmm@ mmmf nj `^f& & D^% H^ @^TmNmmHm@ m@mJmf |n ^f& & ]% ^ ] ]f& k ]% ] ]f& pk ]% ]׭{  ]6 ]: ]l ]j$ p n] f]  V] N]  >] 6]j &] f& & "we + ]Bj > \V \ f& &j \%Z \ j^ \ j z \ \ \ \  \ 4j  ~\ı v\ȱ l\б d\Ա Z\ie@f& & Pve 6\ .\die@f& & $ve ( \, [yɋ L [R [!yV [ɋZ [ff uee ^ [b [ [ [  x[ p[ef&  due J[ @[f&  ff c%&   , && | _ X_e& Ʀ& _ @_f&nY \e  deleted|& N  ff y ff bc   &d kZ 4k2kZ The following commands are available for the Kermit-11 server. To avoid ambiguity with local Kermit commands some of the server commands will need to be prefixed with the REMOTE keyword. BYE Logout Kermit-11 REMOTE COPY Copy one file to another REMOTE CWD Change default directory REMOTE DIR Prints the directory out REMOTE DISK Prints available space REMOTE ERASE Deletes the filename(s) FINISH Exits a Kermit-11 server GET Sends the filename(s) REMOTE HELP Prints this help text REMOTE HOST Execute a host command REMOTE LOGIN Login. RSTS V9.x only REMOTE RENAME Rename old file to new REMOTE SPACE Prints the disk space REMOTE TYPE Prints the filename(s) REMOTE WHO Shows users logged in |ɋ& N fB bY%@ I need a filename to TYPE ,f vv  f Y%   > SYSTAT failedP'  ff ve  Zf&jY HXe f X% ePLogin successfulMissing password or UIC (PPN) :ff ^e *(ff pZee& ث Z BZf&iY Wee(  n f W% blocks copied j:ff ^e ; Copyright (C) 1986 Change Software, Inc .include /IN:K11MAC.MAC/ .library /LB:[1,1]RMSMAC.MLB/ .mcall $compare,$fetch ,$parse ,$search,$set ,$store .m *[001011]K11HEX.B2S;1+.KERMIT.B[001011]K11XM.SAV;11 *(ff Yee& z Y Yf&$iY Vee(  f "W% file(s) renamedf"P Pf oe &f& ]%f Ve Can't create KERMIT.TMP f ^p  f& Z]%f FV% &|ˋ& aˋ & #7 g fgG Ueff| xU%BCAeWY f U% UFCan't get the remote KERMIT to FINISH 7 Bg f0gG Teff| T%BCAeWYWE f| U% f T% NULCan't get the remote KERMIT to LOGOUT V X7 fd Vfd&xfR @TefR W  T  W7 Ffd Vfd&2fC Se fZU ^e ffD Be ffT &e fZW e ffE e fZH e fffR e fffK e @ȋfffC fe ffC Le @ȋfffI $e ffI e 7 dXJ A@ U& e  f S 6S f| W%f| V f|h`xbY @Pe`b  @ 4cJbfF S  R | R  Rf& | lef& ' le f| P% f O% Can't get the remote KERMIT to respond& &# FR7to7 _*o O  ,tafF R 7 `a7 Za 4^7 ~^f O t Qft& aE Ne f P%Init failed for link?Kermit-11 Unimplemented server command?Kermit-11 Unimplemented server generic commandKERMIT.TMP?Kermit-11 Invalid arguments for remote server command SERInvalid SERVER subcommand Server detaching from TI: You must use the SET LINE command before detaching the server Kermit Server running on PDP-11 host. Please type your escape sequence to return to your local machine. Shut down the server by typing the Kermit BYE command on your local machine. Remote fails to respond to the command Remote NAK'ed the command 5 times Bad checksum retry abort Remote server response Receive data failed Remote ack: DETACH")SRGITNYCEIFCLDUESWMHQRKPPJVTpơ򢜡ԣp*Ц4.ԣ\ԣԣFԣԣԣԣN  w Vuf e f de f d f d  ff ze i rcf }  Y f %f Ld%W f p%f c%(fff ce  xf c%  XTL & fc f |  f fc%f >c rmits are set to binary mode can result in an unusable file after transfer because of the possibility of transfering imbedded record control information. .s 1 #Version mKERMIT.B[001011]K11XM.SAV;11}<Ts07f& e ff e t e*   6ex e   | e ~e ve&f&ff& f ^eDܤ f& & Def fΥ eef e d d  deAΥ<Eҕ  D Ee0 Ee0Ee0 f&  ~e   `d VdeAΥ(Bf&  &d% *df Pd  d   d cf&f& d cf & ce A@ c Ѥ e@e Can't find symbol in internal STB ΢ Byte data, size Word data, size () ǦΦզܦ "(/6=DKRY`gnt{ȧϧէܧ %,3:AHOV]cjqxŲ̃Өڨ &-4;BIPW^cjqxǩͩԩ۩d.*2" N#8XZ^2B|"|T"^#Rbtd$pn\Jfhrjl:fN2l" `bRBvj0.V#nP6hF##<|\4xz BBB   B$IMAGEALBUFFALTCONARGBUFARGPNTAT$ACCAT$AREAT$BILAT$BSIAT$CREAT$DISAT$ENCAT$FABAT$FORAT$IDAT$LENAT$PASAT$PR0AT$PR1AT$SYSAT$TYPAT$VALATRCTXBINMODBINTYPCCCNTCHARIOCHKSIZCHKTYPCMDADRCMDBUFCMDLUNCMDNUMCONESCCONPARCONSTSDO8BITDOLONGDOATTRDEBUGDEFDIRDOAUTODO8BITDORPTDUPLEXEN$SIZERRTXTFILNAMHANDCHIMAGEINDEXINOPNINSERVJOBTYPKBIOSTLINKSTLOGFILLOGSTRMAXTRYMCRCMDMODEMNUMTRYOLDTRYOUTLUNOUTOPNPAKNUMPARITYPAUSETPCNT.RPCNT.SPNHEADPROCTYPROCOMPROFLGPROMPTRANERRRAWFILRECCNTRECPARRECLNGRECWINREMOTERPTQUORTWORKRTFLOWRTVOLSENCNTSENDATSENDLYSENLNGSENWINSENPARSERMODSERTIMSERWAISETRECSETSENSIZESKIPFLRECSOPSENSOPSPARSZSRCNAMSTATESY.INITCDLUTESTCTIMESTISTSTMPERRTOTP.RTOTP.STSXFLGTRACETTCONSTTDIALTTNAMEUMDDEFVTTYPEXGOTTNXMODEZf&BD  4V& F %  E f V.`A|   f U  DԐ &@ȋ. Õ. f&@fff :%@ E )`W. "@ D bˋD 8  0 ( e e@az b DfAB ɋ& N LB ʝjJ  ^"@Bf DW. R ɋ W. R e@ f&Q”;\< ”/> 0)7&0 `B & ’0 7 0 `  T‹   |~.TSK.SAV.OBJ.STB.CRF.TSD.BAC.OLB.MLB.RTS.EXE.BIN.SML.ULB.HLB.SYS.LIBX0123456789.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*[001011]K11MNU.COM;1+./ 0D6\l9ˍ7ʍ 4 U<0*KERMIT.B[001011]K11XM.SAV;11`&-UDU  η T @ E   7 T _z&  jC ԕ.ԕ"ԕD ff \`% ԕ0ԕmMЕ  f& bE%e  ԕ0ԕ"ԕ"T ԕ0ԕ9ԕ#ff _ f& E%e  ԕ"ԕ!̕A׭$T̕I4 ff \   Eԕ!ԕ%ff& dDe ̕0  f&fE@#A!.WDQ < R f&  A ΅  &!  Q @ Ce  f7 S ʋ & 0 f Se  wS f&&f 7 hS  ͋W  BC& N0eB  @*S  "S ׭ B׭ IxRR R R R  X@ B M.Cע# R$ Ĕ0 a R  6פ"3&  &@ 7ϼQ7>R$C 3f JB  Te BR 7 "R B A ׭RD& Q ?7 Q7 Q7 Q7 Q7 Q7 Q7 Q7 Q7 Q7 Q7 Q7 Q7 Q7 Q7 Q7 Q7 P7 Q7 Q7 Q7 Q7 Qf , Q) Q f$f <\%׭PQ W"W,fff \%7 "Q7 M M xM ,MB"7 JOYNN7 4OY׭M &1OO7O1& Ne & Ne & Ne & N &=& Ne RRRR L L& Ne & Ne & Ne & Ne MN ׭GN1׭?N37NNf 4L zL nL "L"ѕ^ѕ ѕѕѕ ѕ#ѕYɕ1 ɕ .Nɕ~ ɕ .L L ^ _ Nѐ&M&f& A@2& N Q& N J& N C& N ; <& N 5R 2R /R ,R )& N ҵ & N JK & N ŀ_ M & N ŀa2 ŀ  B21waLLL7 LWY&L WN7 LLwL7 J J  JZzJ-vJXXlJ dJ I K Kf 8:%f2ѕ^ѕ ѕѕѕ ѕ#ѕYѕ1ѕ 2ȋȕ^ ȋȕ ȋȕ ȋȕ ȋȕ ȋȕ# ȋȕY ȋȕ1 ȋȕ &f5J4f  T% @ f& T%A@ f& xT%f  bT%&f&fPPѕ @  Bff 6;ee Qѕ W* ѕ ѕ ѕ  @f&f :ee fFf ReC HHf& ReeHH Hf& f Te T ff zTe vTeP ѕ ѕ f>I7 8I8I7 2I 0 f& Bх $TeZGfI7 II7 H  f& х Se"Gf G Ff J F с pf& х Sew,HwzH Ff& х pSe `, F Bf& х JSe w,*Hw"H L Zf& х Sef G Ff "1w*Ey&%>F A{uPDig'OP,?pKo\{tTzd< M 7(CU@=)~]0T~$z0bt,%x MOm5q-?TW6mSY:KERMIT.INILB:[1,2]KERMIT.INISY:[1,2]KERMIT.INIKERMIT:KERMIT.INI%Warning - You have requested LONG packet support but the other Kermit does not support this feature. Receiving file Sending file LengthTypePaknum  < Packets sent : Naks: Timeouts: < Packets received : Naks: Timeouts:  /&nnnnnnP̘nnnnnf& @ ,@ 'qW$@   2 * !    'f& f f_ef&  R_ef& f >_ef&  *_e renamed to & @ %W$@   2 * !    f& f ^ef&  t^e deleted fP& : B " = ffFSSSSeP* !ePf& ^   ff Ye Iff Ye 2f [  ff F\%     &f Z f Z f Z &fAW-& f ,C,@ E E > E eѕ-єєєѕ-EeH   e e0e0ѐJan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 00-XXX-00&f) d&< ZA 2ѕ: (ѕ:f < 6  %  e e0e0ѐ & A @    & C W @ > W W W  S  W lf& ff F R  ) &  7 b7  7 b b  a    &7 a7 affw,f % a7 a Z a 8 &7 xaf6d JE0da7 ~a J dta?pa J&`a dXa?Ta . Ha  7 8a7 ,ac(a?$a杄av"" Dcfr"c e ; JDz" D f& ` 4De3 rDz" hD` f& % HD|" >D   f``P"f& : A ɔ @ W:ѕ*ѕ.ѕ*ѕ= ffF0ff z^  9a_ @b"@  @  p ! !!!*@ e! `@ed&f0 "Ƿ_e׭_& Rȋ ȋ * !p0 "7& e7 7 77r^7ll^ * s not know about c eof for direct access files. Will have to fix c for RT when I get the rt version done. c c c c to compile: c c f77 k11hex=k11hex c ftb c k11h KERMIT.B[001011]K11XM.SAV;110!f S<^ M v Ke 5>57  3 ^ nf& ˅ Ae7l J B  f&˅ <%  m]4&f   A Y  f&  [e f& =*] 7 d 5e 5(5! 7!\B Fȋ    \\ \  m\Nf\ L@% ʕDKe ҋҕ:f @%ef @%eҕ.f ?%2f6\O2\O.\O-O@|O|O-O@|zOff ?%e eff h?%e  RW.  &fAW-& f >?,@ E E > E erѕ-єєєѕ-EeH   e e0e0ѐJan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 00-XXX-00DECRT11DECVMSEXr&f& f _e׭S ff VE ? >R? C  J/QQ *C QQaɋ5Qѐ f dEѐf ZEѐ f& 4ƅ _e f& f ^ef& 7ƅ ^e VQf& ,ƅ ^ee 6Q f& (ƅ ^e Q? Q rD/Q f& ,ƅ ^e P HD/P Pf& "ƅ P^e f& %ƅ :^e fB D C^ BT4ȋ9e  &*T 4 fjPf 6D C@ FPf D 0P146P EP e 4 hCPfQ  ѕ Of C O̕ 4 (C fOR rf& *ƅ (]ef& :ƅ ]ef& f ]e 4ʋ hO? bO(  VO PO& Ca f& & \e < B?O O O  f& :ƅ ~\e ? N DB/N Nf& ,ƅ P\e̋J N? N? Nf& 0ƅ \e N NoN f 2B *Bf& 4ƅ [ef& :ƅ [ef&  [ef& 7ƅ [ee N  Nf& 0ƅ [efM UQ "P f& *ƅ V[ef& :ƅ B[ef& f 0[e 4ʋ)  M M& VAa f& & Ze v @?VM Q /NM HM f& *ƅ Zef& :ƅ Zef& f Zef& & ~Zef& *ƅ jZe@ :@oL f& ,ƅ JZe  ?&OL?@LUL l?eKΠ18:}? ş QlVF׹ܳ=0hX4u=#.P{QC!bPgD;UdR4)Mh3Ntm!1oA:VJOQrlЁ(a:fw)1k(rl,"2]bBg%лq-yV= q:>:7\d5rbX Տ|= *6M鰁;'!ʨW8#cT)X "psЯ'%0ySu"sJG]ëv + ,jE.r(p8;%Z۷{ENXmW[d.rR Q(xzwhz3T7)t;5o۹$}jKUHB&wvIAj]XJqfvKo͠I፷VhW%I)\!KƮLy$"r:ALn^, -&ɱktl3T Z,QyTBۦ9U~T+]Zy)MϚ]?E}i[ڡc'u~TچW6@:sȁq G+$$\H%?x?X ; \d,;k{'Gx1gҔ䕿x*|b슼 p˾KK\r;(L>]1br/neH{ ,arx W|B p5Jo;8&4 XR;lAp|c&ЎrZQ*dP0 l2hWrWϏX\!: 0hӺ2ecTʣ{_c&pޒb1 sP&T!F\ÆN7FtX:aKgkz:kK:Dƶ~:x;uHRgc 0ۍ=}ds;I(Ѵۃ:!1Iu|81jr'"B"mU<:· 6Z2-7VGYJ4NFk;V&9m 4"V~Dj凯RCA)X>pg1FWhaCLѨI=|K.^?'~|c}H[0xl|//&bգYiMv%K{aALhG cB^K_\sD6I@4*t+G!T^e*}lvl'#ja=kPo<4w#f&ځ6F *ڕb>$&3ߙ"Ln\ R_XFGN >(q3dyqNsǬC}o7Ѵù5>*__6PKiD@S"CAKvLG6,AX(vʕJ0Pvߨ(b7^ϥXO%X"Y֖o 5b9w9_ Coӄ- U|! rp'Ccqm_q|hA,\-P~EΠE!?)t} aR#ly r]H%6d2'mz')1JGB-99KOqWOajAlBmqX!ރkV#sG2&: ^}_o0 -=+}/]3:ͷ{  z)4;(RZqگPQg\5 K},\;%#NOѣ--Nç^f,n=Gk6۳ gS\J 5+,VCFo$gve ǶVOmq N_CڒӏŌVrď,a4clMR}XUK1&[Fa=)?ka"Ȼ  +VZ h!^',SF:TJ2A˄$igWnvmY* V{hG ޡP_iˬ8B/u/ ^? Ino$^xC>vN7޵wC'wU)%,BUFpH ]aZAuSsx[KtErXMSFKO,Gjui^mBc!gy@٪^ V.\VOI!w0,~vSMY;y4<aGLI[,[Js,R[)dI4GnAN5Z4j۱/QT`n+;'c cRyMVkǻo"76  1uK&>abpbgs7`| YS쮆qiieH=/('њzpOIp){bNB7im 3KޥOH;~)mB~(,;,JRwdO':qq8#<#v:=X|-g1WI4blc]璖u+4|IU>~>Qc a:8 KK ! KE0[#"m/0 F8_Py.>  \=EA+d/OC@* P'f*"P&ei0x{A%Y*bi _cOwZ9FK9K &1_ b7S'bc#8xm{O{f@x&S?Re1#!_(6)D5 rd, ylZ4.qS^cEr^"  }zKERMIT.B[001011]K11XM.SAV;11Cnr<ŢABCD‚Ē`^C^Z 78 x~ÇŇ@Command file ? BYECOMMENTCONNECTCWDDirectory: COPYFrom: DATEDELETEWhat: DIALPhone number ? DIRECTDISCONNECTDISKDISPLAYSymbol: ERASEWhat: EXAMINESymbol: EXITFINISHGETFile ? HANGUPHELPHOMEHOSTCommand: LOCALLocal command ? LOGOUTLOGFILELogfile name ? LOG_FILELogfile name ? LOG-FILELogfile name ? NOTEQUITPRINTFile ? RECEIVEREDIALNumber of retries ? REMOTERemote Kermit cmd ? RENAMEFrom: SENDFile ? SERVERSETWhat: SHOWWhat: SPACESTATSYSTEMCommand: TAKECommand file ? TESTTIMETRANSFERFile ? TRANSMITFile ? TYPEFile ? WHOBYECOPYFrom: CWDRemote Directory: DELETEFile Specification: DIRECTORYOf what: DISKERASEFile Specification: FINISHGETFile Specification: HELPHOSTCommand: LOGINUser and Password: RENAMEFrom: SPACETYPEFile: WHO $&.08:>JOV[\cj o| | $4 ")*2BK\ev{||#.3DIJOPYbkty tlT<l ,&D+,L1<|BV]d<jl\qxd|~ŇATTRIBUTESOn or Off ? BAUDSpeed for remote link ? BINARY-TYPEBinary file type ? BINARY_TYPEBinary file type ? BLOCK-CHECK-TYPEType ? BLOCK_CHECK_TYPEType ? CONSOLE7 or 8 bit ? DEBUGWhat: DEFAULTDirectory ? DELAYSeconds to wait ? DIALOption: DIRECTORYDirectory ? DTRDUPLEXHalf or Full ? END-OF-LINEOctal value ? END_OF_LINEOctal value ? EOFExit or NoExit ? ESCAPEOctal value ? FILETYPEBinary or Ascii ? FILE_TYPEBinary or Ascii ? FILE-TYPEBinary or Ascii ? HANDSHAKEType ? HAND_SHAKEType ? HAND-SHAKEType ? HOMEIBMON or OFF ? LINEDevice name ? LOCALLocal echo ON or OFF ? LOGFILELogfile name ? LOG_FILELogfile name ? LOG-FILELogfile name ? LOGOUTLogout string ? LONG_PACKETSLong Packets ON or OFF ? MODEM-TYPEModem type ? MODEM_TYPEModem type ? NOATTRIBUTESNODEBUGNOLONG_PACKETSNOQUIETNOUPDATEPARITYOdd/Even or None ? PAUSESeconds to delay packets ? PHONEOption: POSOption: PROMPTKermit Prompt ? QUIEThKERMIT.B[001011]K11XM.SAV;11nRANDOMOn or Off ? RECEIVEOption: RECORD__FORMATStream or Variable ? RECORD-FORMATStream or Variable ? REPEATTo: REPEAT_CHARTo: REPEAT-CHARTo: RETRYNAK retry count ? RSXOption: RT11Option: SEEDRandom seed ? SENDOption: SP EEDSpeed for link ? SERVEROption: START_OF_PACKETOctal (1-36) ? START-OF-PACKETOctal (1-36) ? TERMINALType ? TIMEOUTTimeout ? TIME-OUTTimeout ? TIME_OUTTimeout ? WINDOWUPDATEUpdate interval ? d %>J^j~$< ,02L9J,Vf,rD<<#,<7@EFTJX]lDrll!0;JtWX,`b|qrdz|t44\ (\7N\\ryL($8H$XhqzTTT | 2Ƈfff e&f@@  . @fP%(f& f& EeeЕ)Е Unknown error callMissing executive feature)=IXeq6e„£*cqÏî "Omęĺ(:TŒŰƆCan't create fileInvalid device nameEnd of fileFile not foundBad filenameDevice fullNo more filesInvalid i/o operation requestSystem errorLogical unit already openDevice read errorDevice write errorFile is protectedRecord too large for user bufferNo QUE elements availableMT service - No data available/Buffer overflowMT service - Line not attachedMT service - Non-existent unitMT service - Device not availableMT service - Bad user buffer address (XM)Multiple Terminal Service support not present in executiveMT service - RT11 device unit not mapped to internal LUNUnknown speedSystem error from RT11 .CLOSESystem error from RT11 .CSISPCSystem error from RT11 .ENTERSystem error from RT11 .FETCHDisk home block is not RT11 formatI/O channel not openWildcarding not supported for this operationCould not open the XC/XL portInvalid function code to .SPFUN for XC:/XL:Hard I/O error on device XC:/XL:Insufficient lowcore memory to load handlerUnknown serial line device nameInternal/unknown error from .SERRNO device handlerError doing directory I/O.FETCH error, please manually load handlerOverlay read errorNo room for file in directoryInvalid addressInvalid channelInvalid directory structureCan't .FETCH handler in Foreground. Please LOAD itPLAS mapping errorFdƓƳ)RLJPLAS- Window alingnment errorPLAS- Attempt to define more the seven windowsPLAS- Invalid region identifierPLAS- Invalid window identifierPLAS- Offset into window inconsistent with map sizePLAS- Specified window not mappedPLAS- No region control blocks availablePLAS- Insufficient memory available to create regionPLAS- Invalid region size or insufficient contiguous memoryPLAS- Unknown plas error*[001011]K11INS.RNO;1+.=/ 0D6Xd܎7n܎ 4O== U|s<0KERMIT.B[001011]K11XM.SAV;11 ^ Eb E~ E E@ E @@ff _ee@@ E Default Kermit-11 help text BYE CONNECT COPY CWD DELETE DIRECT DISCONNECT DISPLAY ERASE EXIT FINISH GET HANGUP HOST LOCAL LOGFILE QUIT PRINT RECEIVE REMOTE Send a command to a remote server BYE Remote logout COPY Copy file1 file2 CWD Change working directory DIRECT Remote directory listing ERASE Remote file deletion FINISH Exit remote Kermit GET Get file(s) from server (see GET) HELP Ask server for HELP HOST Ask server to execute opsys command RENAME Rename file1 file2 SPACE Inquire about disk space and usage TYPE Ask server to type a file WHO Request a list of who's logged in RENAME SEND SERVER SET Set parameters. See K11USR.DOC ATTRIBUTES BAUD BINARY-TYPE BLOCK-CHECK CONSOLE DEBUG ALL CONSOLE CONNECT FILE HELP NONE OFF ON PACKET STATE DELAY DEFAULT DUPLEX END-OF-LINE ESCAPE FILETYPE ASCII AUTO BINARY FIXED NOAUTO PROTECT SUPERCEDE TEXT TYPE HANGUP HOME IBM-MODE LINE LOGFILE PACKET-LENGTH PARITY PAUSE PROMPT RANDOM RECEIVE END-OF-LINE START-OF-PACKET RECORD-FORMAT RETRY RSX RT11 CREATE-SIZE FLOW-CONTROL VOLUME-VERIFY SEND SPEED START-OF-PACKET TIMEOUT TERMINAL UPDATE SHOW Display current parameters ALL BLOCK-CHECK-TYPE DEBUG DEFAULT ESCAPE FILE-TYPE LINE PACKET PARAMETERS RECORD-FORMAT TIME VERSION SYSTEM Execute local operating system command TAKE Execute an indirect command file TYPE Type a local file WHO Display user's on local system Note that KERMIT-11 will accept wildcard file specifications for both the SEND command and the Server GET command, as in SEND *.MAC or, from a local Kermit talking to Kermit-11 as a server, GET *.MAC *[001011]K11RT4.SAV;1+./ 06X7@;X 4 Uͪs | FBa&fe@BJ%@& fEA  w LL'sL+5L-X3X<;XCoiJA iV ic io i{uii ii{Kw_ L_ JM_ pM_ N_ PN_ N_ N_ O_ xP_ P_ PQ_ hQ_ Q_ tR_ tR_ tR_ tR_ tR_ xR_ ~R_ R_ R_  L_  M_  M_  M_  M_  M_  M_  DN_  dN_  N_  N_  N_  N_  N_  N_  N KERMIT.B[001011]K11RT4.SAV;1_  N_  N_  N_  N_  ,O_  ,O_ L_ L_ L_ L_ 0M_ O_ P_ Q_ Q_ R_ T_ \T_ bT_ T_ T_ U_ U_ U_ VV_ jV_ jV_ nV_ X_ X_ X_ &Y_ 8Y_ NY_  Y_ bZ_ Z_ ^[_ z[_ [_ `_ X_ X_ [_ $X_ $X_ *i_ **j_ *Lj_ 0i_ 0j_ 0fk_ 0k_ 0m_ 0Xn_ 0n_ 0n_ 0n_ 0Bo_ 0No_ 0Zo_ 0do_ 0lo_ 0o_ 0o_ 0Pp_ 0`q_ 0q_ 0$r_ 0s_ 6i_ 62j_ 6Vj_ 6Vj_ 6j_ 6k_ 6l_ 6l_ 6m_ 6m_ 6m_ 6m_ 6m_ 6`n_ 6n_ 6n_ 6n_ 6\p_ 6p_ 6p_ 6p_ 64q_ 6Vq_ 6xq_ 6q_ 6q_ 6q_ 6q_ 6q_ 6r_ 6Fr_ <i_ <k_ <l_ < o_ <t_ <u_ <Vu_ <zu_ BDk_ Hi_ Ni_ N$w_ Nw_ Ndx_ Nx_ Nx_ Nx_ Ny_ N6y_ NTy_ Npy_ Ny_ Ny_ Ny_ Nz_ Ti_ Zi_ `_ `D_ `_ `_ `|_ f_ l_ l>_ l_ l_ l_ l_ lJ_ l_ l _ lH_ l_ l_ l_ l_ r_ r_ rv_ r_ x_ ~_ ~_ _ _ _ x_ T_ _ _   H#   $ CwCwCw@097 CX  7 T7 z x p׭<l<V<0C PC D C x.f +@Cw"CwCwCw CwCwCwDw DwDwDwDw"Dw(Dw.Dw4Dw:Dw@Dw  ` $U@P$ 2>FDLD XDE$& =RDU$$U@P$ EU$P ZKERMIT.B[001011]K11RT4.SAV;1u T  H D> 8  )(f&  & ԕ 杆 V @ ^ay[aW T "& Ne N`f A N`f  mH_ 2& e & e ` `E? `E& e $[em & e f j & Ne & T @ & D A C & ,    `D  ff& *e :e5fffffNA Pe  RfJ    f e AWAWZ@ e`q ^ew ׭12׭3 E& Ne &   E& Ne & E& e 0& X &  5 &f&B  b *XA& N "f z% ŀw  &f  h%f&7 4 4   w4  V k kwОEw`S& N 4  4 NwdEwCS& N r=wBEw2St  (44B  :!& N  w^-XRS      A TT ef SEwHS& N _f  ?Ew4S& N E`t& @` E? `E NEwz S& N B TA1 14f&  &% % Z5wfff e f& ^A e &f  %4 4 4 4 4 4 4 4 4 @  @   4  i 7 w  4A111   \AZ@ e q ew 5ff& &&fA *e &4-=5 90& pAf @ `f& &f :eef& &f ee @ f&f ee0 5wE& N ׭<1& E& N C׭3 E& N CС׭ E&f 6 ׭3  f& X%!  ׭EE`B׭n2 E? B`EE f&f CD( ׭6E&N@@UB EE AAAN@LAUEf@@@U &f J*rlJ Rb   ^&*rlJ Rb   7 "7 7 7 7 "7 7 7 7 7 7 7  J b" w f& %E W  "w   5 &f @ V &f7 ץ~ 7 7   7h7&fD  Q94 ~A  |7 v7 lwlwh- ; .SETTOP area. In the case of XM, however, we have a ; problem. In order to reduce the size of the ROOT to allow ; K11XM to run as a foreground job we ende KERMIT.B[001011]K11RT4.SAV;1\y^^ VwR L--F  @ X 4ԝ* & $e   27        ԝ ŀ BE S   ԝ5  & N R& H JT ew  &fDE  A. BE ԝ & N &  T & ݌^ χ f&BC Y  7  E&  7 n f7f^ 7   Ew W?W_&   $Հ&   hew  &fB D 0E 7E& N  E7G  Ew5&  ^   &ffA  > @A XA P@f& & e A 07 f&f  EACVԕ%S   >-ԕ TC̔ $̕_ ԕ    f&&tE eeVf& A ef& f e 7 && NffB& B e  &T׭ f\B % fB %&f0B %ff0H G e 2   )&fj& %0Hf0HG % Gffj e&@@E@U6 ʋ  % f Ef@@@U Ef@@@UE7 &f^  Bv ՀŀEBՀEBՀfACJ!7 2! P spGP@= f'fF#ff L  , Hp3GzG3 G 0C *C terminal lun.in == 1 ; channel for input files lun.ou == 2 ; channel for output files lun.lo == 3 ; channel for pac KERMIT.B[001011]K11RT4.SAV;1  ~ɋ *E N HE F [  fF߅ G7,ɋW R W  fG  frH X fG    !fS  fPE 6% f[E % zLE 7 Z2 P Bf  * f  e f   f   ߇&f  ږ%f  7 ߀  f wv  ׇ  ׇ +7 "ɋfrH !f݅ f݅  fE % vjE FE >E 67> fׇ ׇfB݅ J f0݅ H f݅ > f ݅ 4 f܅ * ɋW ɋ ff܅ $ז% fLA܅ ז%ɋW ɋ 1ff܅ ֖% fLA~܅ ֖% D fd^܅ ֖% & fF@܅ ֖% E E  X (ff tז% % jm jf& f (efff eE B;!K E z&  2  E `E Xf > 7 7 7 X  bff  wB@N fff % Lf&ۅ %  0f&څ e  ' f&څ %  f&څ e F d F \zG  7 ?b7 ZXf & 4% 4 1ff& e m Xf&& %w7 8f&& e هf 7 FAf& v @`& ~2C  (܃Cmˋ$f| V%  DffZم e mD @&7 "& A@ oW?7D$F (f& f >ef& ,F *eɋ f& & e(F e 5 < 0F& N V   'D ! 8ff&& Ze   e   - fj5   ׇ  ZF |F w&fj& NӖ%f& j eF  ɋW  f&f BAt4 4 u CM5ŀ5 5נ Õ   נ .נ +E5 J7Ë ȋР5 נzנa 5@ נ[Õ(נ]Õ)5 נ'נ"45נ ËҐ 5 `W W  e  &Ћ f&fA DeEff F 6f&f ee 2 f& F e ?  |/ f& F e  R/ f& F e f& F e fF  ^ Ҁ ȋ9e  &   fff  @ Bf ,1 P EP e   rfQ  ѕ f \ ̕ 4 2 fR rf& F ef& F ef& f ne  ʋ d? ^(  R L& a f& & $e < ?    f& F e ?  N/ f& F e̋J ? ? f& F e o|  f h `f& F Tef& F @ef&  .ef& F ee    f& F ef U "P f& F ef& F ef& f e  ʋ)     & a f& & ^e v ?R z /J  D  f& F "ef& F ef& f ef& & ef& F e@ Do f& F e  fɱ&O ?@ U SPACK - SIRCG RPACK - ?Bad Checksum: rcv,calc are !1BRcs ƍ#2$FW6etHZӾl~ Kermit: Aborting with error from remote. pak: Fubar pak type: Retry limit reachedHopelessly out of synch with sending KermitRetry limit reached, parity is possibly being introduced% &&&&%08@HPLine init failure - XhpxXHx((00@8p` P`hjUjSjTF Check SHOW RELEASE_NOTES for possible incompatabilities with previous releases of Kermit-11 and other Kermits. Unrecognized command %Command not unique. Complete Receive failed ?Syntax SEND Filename.type Complete Send failed Kermit: Get complete Get from server aborted KERMIT is not running as a LOCAL Kermit Read error on TAKE file: TAKE file closed Unrecogized REMOTE command 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-@_.Exiting due to control C interupt  <<<(>>"=;@=;$?;;@.A =6AABCD;(>?>?^C^Z 78 rz FFFFFFFFFFFFFFFFF%*.* HH H<(I7 Wk:s9TE R 893d^6D.R;!?&9/l ,Z{ yM(jO\uKA[Hc~>-np !|{V2p-*[,: 6D \>Y9D 76cT s.~K-[k>^Zg'QoX!f(d.DRa(E!bzqA%^N{XP |HKERMIT.B[001011]K11RT4.SAV;1& Last edit: 10-Sep-86 (Command line editing) 6T420:688fS0    p * Cf p f DA 1SS pSp(EU@PUpff %   * Cf ~Lp * Cf ֻ(~Lpק*0 p~Lp * C p&& & & C ÜSW-07  ;A<f 0  &   %S  * Cef&f ABYSD ff e I S<S035@ E@S0p0cccc0 * Cef@ ,0  f 0`@ȋ09fS0   w  m  e(QAɔW  є AVLR  0 1 2 3 4 5 6 7 8 9101112131415161718 ܸp f >S7p->Se`S ( pSpEPp * Cf *( pSpE `S `Se>S  * C U@$E$AP       ѕ ѕ A  ff b ff2f Be ff LBf W4,W A <,ff  peW 0 0     W U@$ E@$E$AP       ѕ ѕ A Error from .lookup <<NWSWUYRTXZP(Kn,X`  %K x*[001011]K11RMS.MAC;1+.a/ 0D6.VaR7@eQ 4Haa UO|s(0KERMIT.B[001011]K11RT4.SAV;1@h#[ #vG9յIqjKD 8bkX{I8P*[OZ:f tg{п +z͟2Ԧ5DnX.?`e5 =sVH9*7eTSÕZ%=phmVkjb5=> 8^ǻ"BXZpvn*-,?wLD͊;Xf=I/fQNm du2EXd!@cK:K3T`frbol֧kfy[2*w6Y~o Ze9-4wߴ.v`XΎ4="V&QZG [Kh]Q)^3# gMY5wLM?E<[QMQo%<{zgVS7<1P0*"Be렗5{`'\&? ! CXĨXÃ6Ycݴ-$ه~-nZŃIP#,5 Ә #=/< XsZ v_eu :Djz ؘUJQF[[Wpe D6_֙aCKziZ.c,L8Z^qLfy'vv*IE[X%|Ϋ>@-HRHyPb1c'D wqԣ'c2\__KhVxC{P?:^r+h,}{:97g YG>z}KU>jUQ^2L& SwWH?9݌-KH}M:!$; V/ƴ%>9 YiGZ9D`VmTd+gڳg[rv}0M0.aT&3˽)]LL]({bG@dn}0ʈLvP VioML`RdNz{ӚM*ZCGIDZP01C_BÓNcv(8lND-@HM7Drwze˸)> gTTHĴ(iMTQ'CЉ4(v(Xmj88vkjM 1@b.a%i>AP!%C.WGr<6rrz8@\4]]bhTFD~*yFm߭wAe.ܽXaaUw9LضF>z_v* 3(sSYlrR}hx ='&=b`WV[=wmB^ ~?A80mcya(~nE̹ iprq*Dh7r`_WbGҶ):L&Ё[1s X/W1tN\ZB[1<9^]Û<(bHqq/>EM[_66H{Qwt Z>`:RʢIkoVcHPӋn'L%=zxM+0_L9Xޛ A sr3)㰗V?(d:\( or?O%g}ss"H!<o#q%e_ }SMKDh=n}IrRy鐷 'tء[dwn En{=̓e4S'Ff;Gb}37WR#ڳ\~|]dl2n h1 sf1K1+ƅ^Qhn9`RcP0t`gźYIPo6`://1R͓p,}K&~7L%I}k)on,DY $xEyD̚ eF)[`E@\mj_k+N%`O ҍg0~p¸&yG Ϧ*ȇ=Ȩ|4@9Q9sˁx`U/iMY%,jHjs ywj+[4hei7_tj͵p642:+D t I6a_3?SY|k,&o4$g?tK&Y\Z; cPRd+}KERMIT.B[001011]K11RT4.SAV;1`4` f&^ *ܖ% f&B fe  ` ` ߷ ` ` ߷ ` . h &   7 ~ ҳ` ߇a a |f& G ea `fz % & ܇f fH %a j@& Gf   ( !a f0H %f&0H %rH f&c0Hc Fe  f&&F e7fLA^X jeff4d %BCAerc& N * xce@Af4d A ? 䯇  ԯү7 į  @ H fI wD zz-pdA r)fIhXD deff4d %BCAec& N $ c׭WNGc fc&E eAfLAƮN Ҵe -Ԭ^ ̬ fc 6–%f4d  7 ? \ 7 LJe7 .*  @  * * 2ZેfLAЭE ܳe7 A׭X׭ZZm*w $fI wZD f-bVA d< Tf2dDZ PefLAnneeded device drivers from lowest address to higher addresses (to prevent fragmentation of background memory). If you run K11RT4.SAV on a FB syste0KERMIT.B[001011]K11RT4.SAV;1B$Z 0eff4d %BCAe d& N &d7 ܪAԬf4d n  ?   7   @ ^tf z 7 f-  ^ FBABCDFSZH@YYYYY$Y4Yef(c ѝѕ 5 ff& Be x ff& `e \  ȵ e(& - AffI %BCAec& N h cfLABN Ne2fI AfI &%fI  fIֲY eδδ7 ȴĴ  @  F& a|x0rzv v-rf xA  rXffI Ƚ%BCAec& N 8 cfLAN e  TD&7 6-2& 8AffI %BCAe(d& N  2d N K I& fG&0H e 6f0H~d Nef[dY et  @ H^7 RXDj0Hp f&rH ˖% f& e7<D /fj& ©% j fj&֯E ef&j]d eAf& %f&nd .e| p2 h-dV hATe? @f & fLAY :e7  ZA`w fI L% fj& %fjDd ek @ ج+ h&2f[dY e1fYdnY ze!fLANE Ze7 ^(fLA*Y 6e7   @ ܮDA ܭ-حʫ Aȭe? @f  fLAY e7 AfI  A-d A X  f V  67 X ׭7T  < s s ; \8 743, 4ȋ t .t !f  e    R& t &   ʔ&f  % F Fu H2t dt ht nt rt Fuf&  $e f&  l e f& ( evt l ׯv0ׯn9w /ezע ДBz  ˋ9zt " hf&  \et ˡ f& {  63f& { ,e&u "C{{ f@ z f&f &e& {{  {{  {{  {{ | {{ h  -*u Bu "C{{ Df@ f&f `e& {{ {{ ʋ=%7s,S(p"PMm 2 4 Bb  ȝ   & f b% ŀB %f  Z l L ^ff& e%&ff ֖% &ȋ AZ Invalid number for retries No previous number has been rfile ; receive-file movb r1 ,state clc return recs.d: call rdata ; receive-data movb r1 ,state clc return recs.c: clr r0 ; complete sec return KERMIT.B[001011]K11RT4.SAV;1Pdefined Using: Please use the SET LINE command first Please use the SET MODEM command first A dial formatting string has not been defined This modem type is unknown. The known modem types are: Using: Modem in command mode Failed to get modems attention Modem dialing Call failed Connection made, use the CONNECT command to access remot e Remote phone is ringing ~uw#wwwwwwwwFwwww|wwFFux#x#x%x(x*xxF.xFBxF5xDxR}=x?xFFu`x#fxyx{x~xxixxxFxxxx}xxFF&vx#xxFFxxFxxxFxx~xxxx^vy$yFFF'yFFFFFFF*yFFFFvDyJyRyFFXyLyFFFFFF^y~\yFFFvsyzyyFFy|yFFFFFFy4yFFFwy#yyyyyyFyFFFFFFFFF>wy #yyFFyyFFFFFFyFFFFvwz < z+z-z/z7z zF;zFFFCzLzFFFFjz FFFFFFFFFFFFF+FFFFVA212PA HELLO:I'M READY*D ?%s ONLINEDIALING I KStand alone VADIC VA212VA212PAR HELLO:I'M READY*D ?%s ONLINEDIALING I KRack mounted VADIC VA212PARVADIC HELLO:I'M READY*D ?%s ONLINEDIALING I KGeneric VADIC with autodialVA4224 HELLO:I'M READY*D%M%S%B ONLINEDIALING I KPTBVadic 4224 CCITT V.22bis autodialDF03%sDEC DF03AC Autodial modemDF100ReadyReady%s# DEC Standalone DF112DF200ReadyReady%s! DEC Standalone DF224HAYESATZ V1 OKOKAT D %s CONNECTMICROCOM4445 SE2 S1C0 SCE ON !!D%s MicroCom SX1200R212A RIXON R212A INTELLIGENT MODEM$KNUMBER:%s ON-LINEDIALING:RIXON R212A Intelligent ModemPROTMSUSER_DEFINEDNo translation found for number. Continue ? No connection Excessive RINGING... messages returned Operation aborted under user interupt No response or invalid response to dial commandCONNECTNO CARRIERBUSYERRORRINGAB|ON LINE}ONLINE}BUSY"}FAILED CALL.}NO DIAL8}VOICEF}TIME OUTRINGING^}ON LINEj}ONLINEt}BUSY}FAILED CALL}NO DIAL}VOICE}TIME OUTRINGING}ON LINE}ONLINE}BUSY}FAILED CALL}NO DIAL}VOICE ~TIME OUTRINGING"~ON LINE.~ONLINE8~BUSYH~FAILED CALLT~NO DIAL^~VOICEl~TIME OUTx~RINGING~ON LINE 300~ON LINE 1200~ON LINE 2400~ERROR CONTROLNO ERROR CONTROL~Attached~Busy~DisconnectedErrorNo answer(No dial toneSpeed:BAttachedLBusy^DisconnectedhErrorvNo answerNo dial toneSpeed:CONNECTNO CONNECT!ON LINEON-LINENO ANSWERDEAD LINEBUSYEND DRINGINGvpqqKERMIT.B[001011]K11RT4.SAV;1W0 ޣ f   jt & ˇf  7 Xf  8 >f  & &   Dt :t 2  `Vt f&   ~ef  ޟ  t t f& & ̖%f   t u u f  ğ  fu >u x͇f L   @ff  $e  & zBu *lu " bpu u ͱfv~ Ȗ% f&v~ $e  t 52 u u E?5 f v E u lu d E?ҡ  U?  7 pU ` U J Ut 4 tU^ /PE u v U 0f fF  Dev Pv ~ 5 Tv jv b˱U̠ v Hv @v 8v 0v (v v v  w $w Jw Nw xw |w w w w w w x x ʇf* Ɩ% ( 7f  x z@x rDx jzx b~x Zx Rx Jx B x 6x .ʇ ('" fr& Ŗ%  7   ffȞ Ŗ%  R7 Lf jŖ%  (:x Ny Fɇ7 7y .Vy &ɇ7 Z7 N  7 f  wv f& Ė%  7 ԜΜfJȝ Ė%  8 7 0 ȋ 0W w Zy Vy N 8WD7 pWAʜby "y  f0 Ö%  7   ɋ ff  w Ӈy y LJ ɋWO  WF7 y y  rɋWSWL7 y V"z N 7 7 fJ Ö%  7h f" –% f&" *e p bfڛ  wx  n t7  7  f T–%  7 ~ v `fT –% f&< `e &z Hz e` ~ t j ` V L  | r  f V  wؙ   @Ā E m@ &f Lz .rz &Ň ؔ ( eEee* E  E &f L vz z ćmf♅  MfZƙ % f&Z пe  0 &   Ej ,eE   N& z z Ā ,ɋW Error from device assignment Kermit-11 no longer running in LOCAL mode Link device: Speed not settable Speed: DTR/CD not currently present DTR/CD present Parity is set, forcing 7bit mode Bad value for speed or speed not settable Please use the SET LINE command Please use the SET LOGFILE command first Log_file closed Can't do RAW i/o disk logging with other DEBUG options set Old logfile closed and new logfile created in BINARY mode Can't do disk logging with RAW i/o logging on To enable: Connection logging SET DEBUG CONSOLE File opens/creates SET DEBUG FILE Packet traffic SET DEBUG PACKET Raw terminal i/o SET DEBUG RAW State transitions SET DEBUG STATE Connection loggingmay be cases where the proper SET commands have been given but the binary file does not transfer correctly. This has been noted on VMS when a task image i KERMIT.B[001011]K11RT4.SAV;1yu^ can be controlled by typing your escape character followed by a R to resume or a Q to stop logging. Kermit-11 will have to request 8 Bit quoting for the transmission of binary files. If the other Kermit does not support this, information for binary files will be lost. Unknown parity SET DUPLEX HALF, SET PARITY MARK, SET HANDSHAKE XON done SET DUPLEX FULL, SET PAR ITY NONE, SET HANDSHAKE NONE done SET RSX TC.DLU value, where value is 0..2 ?Error - SET RSX CON [DEF][ALT] %SET-W SET RT11 CREATE_SIZE decimal_value %SET-W SET RT11 FLOW [ON][OFF] %SET-W SET RT11 BREAK [SHORT][LONG] %SET-W Unknown option in SET DIAL Insufficient space to contain string Insufficient space to contain string No space left for numbers ALLCONSOLECONNECTFILEHELPNONEOFFONPACKETRAWRPACKSTATETERMINALNOTERMINALEVENODDMARKSPACENONENONEXONXOFFCARRIAGE-RETURNCARRIAGE_RETURNFULLHALFONOFFONOFFNODTEDTECHARIOLINEIOTC.DLUCONNECTFLOW_CONTROLNOFLOW_CONTROLNOVOLUME_VERIFYVOLUME_VERIFYCREATE_SIZEBREAKWILDCARDINGNOWILDCARDINGOFFONNONETIME_OUTServer_Idle timeout? NOTIME_OUTTIME-OUTServer_Idle timeout? NOTIME-OUTDEDICATEDNODEDICATEDDETACHNOEXITEXITWAKEUPString: WAKE_STRINGString: PROMPTString: INITIATEString: FORMATString: SUCCESSConnect acknowledge: INFORMATIONRinging acknowledge: FAILUREFailure acknowledge: CONFIRMString: WAKE_RATEDelay in milliseconds: DIAL_RATEDelay in milliseconds: DIAL_PAUSEPause character(s): TIMEOUTTimeout in seconds: TIME_OUTTimeout in seconds: NUMBERName and phonenumber: PULSETONEBLINDzlzz2lzz2lzzBlzzmzzkzzkzzlzzXlzzl{{ m{ {nl{{"l{{*l'{({:n-{.{@n2{4{Fn9{:{Ln@{B{RnG{H{nM{N{nR{T{nY{Z{nj{l{n|{~{n{{n{{n{{n{{o{{"o{{o{{o{{o{{o{{o{{p{{p{{.q{{&q{{q |||p||p"|$|lp0|2|tp@|B|XqF|H|\qK|L|XqQ|R|q[|r|q}|~|q||q||q||q||q||r||r||r||r|}r}}r}"}r)}2}r:}P}r\}r}rz}}r}}r}}r}}zr}~r~$~r-~B~tI~`~sf~h~sm~n~tt~6E?D5>f E&r r ޣr r αfF| bʖ%  1#1 2233 f  ,  & Z r b jf    & . r f&   >er  s ͇f|P ɖ%  :ȋ f|& tɖ%  :s \"s T X&s >6s 6 ::s &Vs   7 7  Ρ ׭ȡZs s KERMIT.B[001011]K11RT4.SAV;1es s s s s ̇Lȋ f&~& Ȗ%  7 82f@ .ӕ.  ΃ , s 4t ,t $>t  Bt tt N B z e@@xG f0Hl % xt & 7t f& G et | JUNK.DAT7t bt Z f⟅ e fƟ ̹e & RȇU|F *t f&  Het ʇt u u @u b~ 4 Du ju ʇ~  nu ru jʇf PƖ% f&입 e X֞ JȞ * w  w  wwf D   W u u t 7 l fL  w.wJ f, d  wf J  wpXp   z u 6f :u (fĝ  \W `w̟w7 A ԕ XXW XXu  v f $v Lv @  Pv v & v v v v w _f .777w0w wwf朅   W W ` v (w ȱMAXf Z  EW ,w ^w wfv  ,W  bw w LJwvfD |  W W < w ~w vLJww1f: PÖ%  7 ׇׇf^̛ Ö%  7& f^ –%  7 7 7 r f`  wfB –%  7b f d–%  7b f욅 8–%  7ښ f6 –%  7 |v&ff&  f& f :eeDebug file closed Please use the SET LINE command HANKERMIT link disconnected Ascii text mode set Binary mode set DEC_Multinational mode set The other Kermit must be able to support 8 bit prefixing Without this feature, the high bit will be lost on every character sent The filetype must be of the form .xyz as in: SET BIN .SAV or SET BIN .TSK The default binary filetype list has been deleted Error from $PARSE - Directory for files set to Directory set back to none (SY:) Opened Log_file Kermit-11 supports the LONG PACKET extension. It does not support SLIDING WINDOWS %SET-W Unknown option in SET RECEIVE %SET-W Unknown option in SET SEND The SOH character must be between 1 and 36 octal Receive buffer size set to This size exceeds Kermit-11's internal buffering of bytes. It has been reset to that value This packet size exceeds the host's input buffer size of bytes. This may cause the line/port driver to loose data at rates greater than 2400 baud. The packet size must normally be in the range 20..94 The escape character must be a control character RETRY should be between 3 and 30 TIMEOUT should be between 4 and 60 1_CHARACTER_CHECKSUM2_CHARACTER_CHECKSUM3_CHARACTER_CRC_CCITT1-CHARACTER-CHECKSUM2-CHARACTER-CHECKSUM3-CHARACTER-CRC-CCITTONE_CHARACTER_CHECKSUMTWO_CHARACTER_CHECKSUMTHREE_CHARACTER_CRC_CCITTONE-CHARACTER-CHECKSUMTWO-CHARACTER-CHECKSUMTHREE-CHARACTER-CRC-CCITTSUPERCEDENOPROTECTNOSUPERCEDEPROTECT7_BIT7-BIT8_BIT8-BITASCIIBINARYEIGHTSEVENEIGHT_BITSEVEN_BITEIGHT-BITSEVEN-BITFIXEDIMAGEAUTONOAUTOTYPEi<aH=^&01t+iy|+yB='m{rg4S7wf \t$O{78}N,(^sO .psea7 Nt2 AU^14 s*& 6VD[0/7e1$t,y@ykJyLyjVyXykbydyjnypykvyxyk~yyRkyyZkyyjyyjyyjyy4kyykyykyykyykyykyykyynyz oz$z o2zDznJzXzRnhzzRnzzpzznzzpzzp{{n {.{Dn>{V{Dnf{~{p{{n{{n{{q{{&q{{q{{q{{q{{q{{q{{q{{ r{{r{{6r{{:r{{:r{{:r{|@r||@r||jr||dr| |jr%|&|dr+|,|jr2|4|dr:|<|jrD|<&v $f䣅 ʖ%  *v >v ·Bv   J   R   8 |  N   h   Fv @· Jv 0lv (7pv f& F  e v j!f& &j \e7x  .x  x v x j eP  f& & e` @ je Type Last Sent Last Rec Tot Sent Tot Rec Total character count, less packet framing, but after data formatting (ie, includes repeat compression and prefixing) from last transaction. ֝Нmҝ@ mʝ؝f x @f& & *Ɩ%y ( y m@ mf ž$y f& & Ŗ%:y Hy ƇLy f& ܛ Ŗ%ty Ƈxy f&  Ŗ%y Ƈ׭ y ~y vƇy ly dƇ"$ z N&z FƇ *z 6Nz .Ƈ Rz xz Ƈ|z  f& &z fe z z z f& l Ė%z Vz   { { { ({ x ,{ l z L{ ^V{ VZ{ Lb{ DŇf{ :ؙe@f& & e{ { e@f& & he { ć{ (ɋ { { !{ ɋ{ ff ee { ć{ x| p| h | X(| Pef&  e,| *0| ćf& 4| ef& /} lef& (~ Xe~ 2 9f★ v_uh$+LȶiwޤBC&0޿TRWCu&o::s1::%~hr3e ^uII'->IfDr[emoQbhx*^!";ݙx %:> ; i|, DjTK5 &I~Ba˂&P'b2eV^[/|')(ja_c" ;,dX.݇0ŤaP,},8xדJ<9y\T;n#wDWwTü DMY`9yDN^vx&I<'첡C;u,Wg̟ߑ,QF, bD=cT]4 u]X׍e䞸WC<'M 6X㥣-K+g>tZʎ4Ύ 3(OOvLUoI p'=V1?gּzw_VE-}䯛X_rlI_H K&V0o5' d BS3)F$>9~ڴAy"[;:hGI&@-̝vgl{9[bTUN5)%sbԘ):TZ-w־*ׁC K:_7XWVP$¯[kp caHWRn0(10kuR( h~fzAc rleL.Cu%'>:wphe:}\/:"tvse]n'ܤ3]x1 ZRdZf,3dMHX3ՎDm953lrP9=ײ09U& '/y w՘ru d'ܒ[pRv,<w6|r;1n4qJ?+к\kKnt#`w=Z%: m,_,$P<~=M5Z5|Q ?Ne WKBD5* +÷sQ~0 j}-rPbRRM HTS:&m>ˈ4JYꗀSI#y,e㊦[Jusqq]5*vsZ4d/OcI7XɦPH#Dz0O Wo޸(_Pޢu=Ǥ Jع3b17k O@n.#&}Vq0:Xk:Sۤ'#FSpVvtr},,jhO}c~5D?=4g91?O~<(M/[6lz rĹp<Mt!)0(Ϟg@0DUMcۣ 4E|YrdCpgʯt;:Y%4Q*۪; +vACL>uF;ٺ__%z 4TZHLr!3c@OhwG+ h|fM3Z);. q[#*SAMoC A>5a&^V+uq>".}*yaW% ʒ M? ,%v~eZ^0q*o[CSR)?+2O˳!4.Q T9)^luWKTuKE#.S⥯x]]8tL2kxڤ6?wVVRG>}5[QFƂ  0y&yb-đrG)К;D%TbN[I1D701OՅ0;8jm&3_0Y)&Hp5c +d +o̎[9\@w=/XOX~'nq/4@Tr~d;^-JPn|}/Csq6v ;u4k׶M;vSŠ\AAQ^Q+dyXGse/xn}32ේmdY? V[l=ϵ !g ihdG6V'#6oo|`;Ύ΁LL̿1d>Gfe#FpvOMP5.D/V0FX$m5 h&Mk# A~d.Xd~޼4 (NaЛR]]=&@ⷩkxm_~65 ]SOVwNKTMbscE.h䠡/*::S3P+bȊn\-7U] Cr& DfY1P@֓VQ^0{B]9!) z_^s)h>3l#&uXɳS(cjsxT=Z%~tD_FnɫBpȷ4d&T.A+TwyB*iJG" %G_( yT{ 1$,.^W&d߱oŊm J\ L_#UYLh"[D^>8ص"u9M?nDr#C^_ZDdk.+dSF_D|2EHCcolhyBk:W_$0,~QAH3}C<%}1 6]r?pFu[(-)5C_w)SL]xC{ZML6-%R4 *[TIg${#-*eMxL? @>\+!N*}[ckn1A-JP Hb4/XwK\t'u2i FKERMIT.B[001011]K11RT4.SAV;1 z the SET NOATTRIBUTE command, and manually use the SET FILE TYPE FIXED (or SET FILE BINARY) command on both Kermit-11's in order to transfer binary files (such as task images). For further information please see K11.BWR and K11INS.DOC COPRENDELALLBINARY-TYPEBLOCK_CHECK_TYPEBLOCK-CHECK-TYPECONSOLEDATEDEBUGDEFAULTDELAYDIRECTORYESCAPEFILETYPEHANDSHAKELINEPACKETPARAMETERSPARITYPAUSEPHONERECORD_FORMATRECORD-FORMATRELEASE_NOTESRSXSTART-OF-PACKETSTART_OF_PACKETTIMEVERSION~i~~s~~m~~m~~r~~tl~~(j~~l~qlxwwr wwzqwwqw w0 0 7 J ׭  > @ww p 2w:wn i df DZwwwwwwwwf  %f  ܚ% jw\w5*5j Pj \w5Tj j j ~j vɷ &7 UPP$ŀ  7& &v  2w:wn5 &f&Fx7)UPP$ww R &   % ŀ 7v  `& &v2w:wn&v7 ~w  &v  &fɋ@e<w : jwrw8p  5 #ww 5 5 5 @ww p &f 'Aw7&w.wpq\w xVq5 7 ^&w0  7 @&&v&&v  &f5 w w0 0 EEB  j `j Xj Nj Fwwzq&f5 Zw w0 0 '0EE  v, e w 0 0 0 wwq -~7 v7 :xwwr 7 <ww7 f  R f  le w^f  ̖ xf& )+ ,(r2)+ ; copy error name over movb (r0)+ ,(r2)+ ; copy until 63 characters or a movb (r0)+ ,(r2)+ ; copy until 63 characters or a movb #40 ,(r2)+ movb #40 ,(r 3KERMIT.B[001011]K11RT4.SAV;12x  KW@ 0     UPP$< E 7ʘU@P$ ww !E  7  *f Le ^ል& f  %E@P$w0  fvz e fxz Δefŀy& N yሡ f  EL5BU: @.[ v[wConnecting to Speed: CcIiQqRrXxBb?Hhhururuxuxuuuuuuu,v,vDv,vDvDvB Try to send a break to the remote C Connect back to the local Kermit-11 I Drop and raise DTR (for RSTS only) Q Quit console logging. See SET LOG R Resume console logging. See SET LOG X Send XON and cancel any active XONs RUBOUT Try to fake a break to the remote ? Print this message H J n n n f p% \w7 7 7 ͋ 7 z  j  n Zn R7 n F1 ~ nMrTo B *  o & ro n f&  Vefr  f<fr Te 0rr& ,w &fpo ͋W   ͋W T&ff j o17 Ep ,= f& %  .1p$ ̋!  Cע*ˋ̋az  pq F  &fqr ~Wpf& % J1p 7B& x8 r8 qr &r n f& r ven 7̋ f& & Ten ˩ &f& & qpW1 f 7n |o to l"o do 7 R̋ f& ڛ% 91p 0C /5,-4 &  o  f&  Ve&o o 8 f&  *e*o %f |  s nsB ff e 1 .o <do 4ho ,o $o o o f&  leo  " Printing default internal help Help not found for the requested topic Additional information is available on: %Kermit-11-W Cannot find the Kermit-11 help files or the task image high limit prevents mutliblor instance, RT11 does not have any ; executive primitives to do wildcarding directory lookup. ; ; ; ; ; ASCDAT ( %loc buffer, %val datevalue ) ; ASCTIM ( %loc buf ~KERMIT.B[001011]K11RT4.SAV;1yock reads. Please put K11HLP in one of the following locations: Topic ? &s9sLs^sLB:[1,2]K11HLP.HLPSY:[1,2]K11HLP.HLPKERMIT:K11HLP.HLPHELP:K11HLP.HLPtssDK:K11HLP.HLPSY:K11HLP.HLPN~ $7 dfڣ ʖ% , '7 Z 8  ΢ f& > e & f  % ` H7 ~ H~ @·~ 0~ ( x  & Xˇ~ : ΀֤ҤƢ7 Ȥ7 7 7  )7 1 ffI %BCAe7 fԀ& N n f @ 7 @D~ Ff~&,E 8e   fLAN e fI %fI ֜ fIY ©e Ƴ ԡԡ fI %fI fIP`Y le pDD7 >:  @ $fF :  FBfGI %1GfG D 7 $ : fS ̘  3fI %  fj& Z%j fj&tE e  v~ | Spawned job failed due to timeout or TT read wait I fI $%e& E~ fE~&ȡE ԧe fLAY e   7 ̞%n ~fn&dE pef 6%f  j 3fLA Y ,e 5f   ( ~n f~n&ؠE e Logout failed - Quota exceededServer disconnected and still logged inPff @ pff&XY deeP I& N $fG `o f ˀ f&Y ee`o fo&ԟY e Default directory set to Need a directory name to change toI& N  H>ff %&   , && Ij Zj :ej& Xp& Bj "fj&Y ev~  deletedI& N  ff & ff $   &ޛLA 8̛pțLA The following commands are available for the Kermit-11 server. To avoid ambiguity with local Kermit commands some of the server commands will need to be prefixed with the REMOTE keyword. BYE Logout Kermit-11 REMOTE COPY Copy one file to another REMOTE CWD Change default directory REMOTE DIR Prints the directory out REMOTE DISK Prints available space REMOTE ERASE Deletes the filename(s) FINISH Exits a Kermit-11 server GET Sends the filename(s) REMOTE HELP Prints this help text REMOTE HOST Execute a host command REMOTE LOGIN Login. RSTS V9.x only REMOTE RENAME Rename old file to new REMOTE SPACE Prints the disk space REMOTE TYPE Prints the filename(s) REMOTE WHO Shows users lo*[001011]K11DSP.MAC;1+. / 0D6pQ7j)Q 4D U|s(0KERMIT.B[001011]K11RT4.SAV;1gged in Iɋ& N fs ~%@ I need a filename to TYPE ,f  f2t *%  v~ > SYSTAT failedPt  ff \e t ft&ƚY Ҡe f % ePLogin successfulMissing password or UIC (PPN) :ff e *(ff ee& ju Dł $f& Y ee(  n f~ ୖ% blocks copied j:f f He *(ff ee&  v Ă f&jY vee(  f~ >% file(s) renamedfjGP v~Pfj ̰e &fj& %fjv Ƭe Can't create KERMIT.TMP f  fj& D%fj b% &Iˋ& aˋ & #7  fwG effI d%BCAeWY fw % ̷FCan't get the remote KERMIT to FINISH 7 f:xvG effI Ҡ%BCAeWYWE fI (% fqEqLqSqZqaqgqnquq|qqqqqqqqqqqqqqqqqqqqr rrrr&r-r4r;rBrIrPrWr^rerlrsrzrrrrrrrrrrrrrrrrrrrrs ssss%s+s1s7s=sDsKsRsYs_sfsmsts{sss< & Hf  0 2 6  Tr x Gh T\, Cj0H* : L< HF 4 " >@ JBD | ^  > & n l D^ x z p j  8 : *NB   . GF(  @  HH bD PR BBB   B$IMAGEALBUFFALTCONARGBUFARGPNTAT$ACCAT$AREAT$BILAT$BSIAT$CREAT$DISAT$ENCAT$FABAT$FORAT$IDAT$LENAT$PASAT$PR0AT$PR1AT$SYSAT$TYPAT$VALATRCTXBINMODBINTYPCCCNTCHARIOCHKSIZCHKTYPCMDADRCMDBUFCMDLUNCMDNUMCONESCCONPARCONSTSDO8BITDOLONGDOATTRDEBUGDEFDIRDOAUTODO8BITDORPTDUPLEXEN$SIZERRTXTFILNAMHANDCHIMAGEINDEXINOPNINSERVJOBTYPKBIOSTLINKSTLOGFILLOGSTRMAXTRYMCRCMDMODEMNUMTRYOLDTRYOUTLUNOUTOPNPAKNUMPARITYPAUSETPCNT.RPCNT.SPNHEADPROCTYPROCOMPROFLGPROMPTRANERRRAWFILRECCNTRECPARRECLNGRECWINREMOTERPTQUORTWORKRTFLOWRTVOLSENCNTSENDATSENDLYSENLNGSENWINSENPARSERMODSERTIMSERWAISETRECSETSENSIZESKIPFLRECSOPSENSOPSPARSZSRCNAMSTATESY.INITCDLUTESTCTIMESTISTSTMPERRTOTP.RTOTP.STSXFLGTRACETTCONSTTDIALTTNAMEUMDDEFVTTYPEXGOTTNXMODE`f&BD  v&  %  E f Lą`A   f 2 2 DԐ &@ȋ. Õ. f&@fff :%@ )`W. "@ г *ŃˋD 8  0 ( e e@az : 涇fAB ɋ& N > ʝjJ  Ц"@Bf W. R ɋ W. R e@ f&”;\*[001011]K11ER2.MAC;1+. / 0D6ӌɍ7@ھ ɍ 4  Us(0^KERMIT.B[001011]K11RT4.SAV;1< ”/> 0)7&0 `B & ’0 7 0 `  T‹    .TSK.SAV.OBJ.STB.CRF.TSD.BAC.OLB.MLB.RTS.EXE.BIN.SML.ULB.HLB.SYS.LIBX0123456789.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZf Ƶ    @  @@ff ee@@ t Default Kermit-11 help text BYE CONNECT COPY CWD DELETE DIRECT DISCONNECT DISPLAY ERASE EXIT FINISH GET HANGUP HOST LOCAL LOGFILE QUIT PRINT RECEIVE REMOTE Send a command to a remote server BYE Remote logout COPY Copy file1 file2 CWD Change working directory DIRECT Remote directory listing ERASE Remote file deletion FINISH Exit remote Kermit GET Get file(s) from server (see GET) HELP Ask server for HELP HOST Ask server to execute opsys command RENAME Rename file1 file2 SPACE Inquire about disk space and usage TYPE Ask server to type a file WHO Request a list of who's logged in RENAME SEND SERVER SET Set parameters. See K11USR.DOC ATTRIBUTES BAUD BINARY-TYPE BLOCK-CHECK CONSOLE DEBUG ALL CONSOLE CONNECT FILE HELP NONE OFF ON PACKET STATE DELAY DEFAULT DUPLEX END-OF-LINE ESCAPE FILETYPE ASCII AUTO BINARY FIXED NOAUTO PROTECT SUPERCEDE TEXT TYPE HANGUP HOME IBM-MODE LINE LOGFILE PACKET-LENGTH PARITY PAUSE PROMPT RANDOM RECEIVE END-OF-LINE START-OF-PACKET RECORD-FORMAT RETRY RSX RT11 CREATE-SIZE FLOW-CONTROL VOLUME-VERIFY SEND SPEED START-OF-PACKET TIMEOUT TERMINAL UPDATE SHOW Display current parameters ALL BLOCK-CHECK-TYPE DEBUG DEFAULT ESCAPE FILE-TYPE LINE PACKET PARAMETERS RECORD-FORMAT TIME VERSION SYSTEM Execute local operating system command TAKE Execute an indirect command file TYPE Type a local file WHO Display user's on local system Note that KERMIT-11 will accept wildcard file specifications for both the SEND command and the Server GET command, as in SEND *.MAC or, from a local Kermit talking to Kermit-11 as a server, GET *.MAC l&oDJ Z  Z : @    7  &  \ ԕ.ԕ"ԕD ff % ԕ0ԕmMЕ  f& %e  ԕ0ԕ"ԕ"ȋ ԕ0ԕ9ԕ#ff  f& H%e  ԕ"ԕ!̕A׭f̕I4 ff V   Eԕ!ԕ%ff& e ̕0  f&fE@#A!.WD < XR fj&  Ơ |  *[001011]K11DSP.MAC;1+. / 0D6pQ7j)Q 4D U|s(0KERMIT.B[001011]K11RT4.SAV;1:&!  Ȉ @ e  f7 X ʋ & 0 f 2e  wŠ f&&f 7 X  ͋W  BC& N0eB  @l  d ׭ B׭ I< $   X X@ n M.Cע#  Ĕ0 a R  6פ"3<&   7@7@$C 3f b  Te  7 d$ 8 ڱ ׭DDJ& 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 f , ) ff |%׭ W"W,fff N%7 d7 ~7 7 &   `@ ` B   & A @      ~  v&7Կ \}vxj  <6111F& P   7 v\ f e 愷&f Ƅ  nB7 Y<N7 vY׭Z &1\V7X1& Ne & Ne & Ne & N & Ne RRRR * "& Ne & Ne & Ne & Ne  ׭1׭3yWf v   dѕ^ѕ ѕѕѕ ѕ#ѕYɕ1 ɕ pɕ~ ɕ p ` ^ _ ѐ&&f& A@ & N Q& N J& N C& N <& N 5R 2R /R ,R )& N ҵ & N & N ŀ_ ( & N ŀa  ŀ   1w7 WY& WN7 Ѓʃwʃ7 ܁ ځ  āZ-XX  Ҁ " f %f ѕ^ѕ ѕѕѕ ѕ#ѕYѕ1ѕ  ȋȕ^ ȋȕ ȋȕ ȋȕ ȋȕ ȋȕ# ȋȕY ȋȕ1 ȋȕ &f5B4f  % &@ f& Ԝ%A@ f& %f  %&f&fPPѕ @ 6 Bff xee= Qѕ W* ѕ ѕ ѕ B @f&f ,ee fFf eC HHf& eeHH f& f Ԝe М ff e eP ѕ ѕ f7 zz7 t 0 f& ؓ de~fH7 BB7 <  f&  ,ed~f , 0~f T 0~ | pf& k ڛew,w Ff& i e `, } Bf& \ e w,lwd L Zf& i Pef ~ Z}f ~ Z} n^ f& k e&w,~w~ pf& i ښe } :f& \ e^ 4&w,~w~ |  f& i e&f f& & Vee׭v| \|  { ~ ~f& J e>w,}w}f& Q e bw R' UD"@A&f f( U BQ Е* ăb!"#$%&'()*+,-./01„Ƅj̅ЅUnknown attribute packet type ?K11-ATR Protocol bugfix detected. Use SET NOATT and see K11.BWR, K11INS.DOC.  89A8BCAINAFab attribute error AIN89ABCKermit-11>ftSY:KERMIT.INILB:[1,2]KERMIT.INISY:[1,2]KERMIT.or instance, RT11 does not have any ; executive primitives to do wildcarding directory lookup. ; ; ; ; ; ASCDAT ( %loc buffer, %val datevalue ) ; ASCTIM ( %loc buf KERMIT.B[001011]K11RT4.SAV;1INIKERMIT:KERMIT.INI%Warning - You have requested LONG packet support but the other Kermit does not support this feature. Receiving file Sending file LengthTypePaknum  < Packets sent : Naks: Timeouts: < Packets received : Naks: Timeouts:  /.rf& ff މ  ) &  7 R7  7 F B  4    &7 7 Āffw,f % 7 Z  8 &7 Àfn Th7 JXɰ? J& <ɔ? .  7 tÄ7 h d?`ÇHGG ڶjfDG e ; (LG f&  ve3 LG  f& % fNG \   ‡PGf& : x ɔ @ W:ѕ*ѕ.ѕ*ѕ= ffF0ff  9 @4G@  @  p 0C *C57  3j ^j nf& j ʰe7lj J B  f&j <%j  m4&f    :  f&  He f& =f 7 d 5Ve 5(5! 7!4B Fȋ       m Nf % ʕDKe ҋҕ:f ^%ef H%eҕ.f .%2frnjކ-ֆ@|̆|Ȇ-Ɔ@|Vff ү%e `eff %e  V`RW.  &fAW-& 8f ,@ E E > E eѕ-єєєѕ-EeH   e e0e0ѐJan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 00-XXX-00DECRT11DECVMSEX)+ ,(r2)+ ; copy error name over movb (r0)+ ,(r2)+ ; copy until 63 characters or a movb (r0)+ ,(r2)+ ; copy until 63 characters or a movb #40 ,(r2)+ movb #40 ,(r :KERMIT.B[001011]K11RT4.SAV;1qxnATTRIBUTESOn or Off ? BAUDSpeed for remote link ? BINARY-TYPEBinary file type ? BINARY_TYPEBinary file type ? BLOCK-CHECK-TYPEType ? BLOCK_CHECK_TYPEType ? CONSOLE7 or 8 bit ? DEBUGWhat: DEFAULTDirectory ? DELAYSeconds to wait ? DIALOption: DIRECTORYDirectory ? DTRDUPLEXHalf or Full ? END-OF-LINEOctal value ? END_OF_LINEOctal value ? EOFExit or NoExit ? ESCAPEOctal value ? FILETYPEBinary or Ascii ? FILE_TYPEBinary or Ascii ? FILE-TYPEBinary or Ascii ? HANDSHAKEType ? HAND_SHAKEType ? HAND-SHAKEType ? HOMEIBMON or OFF ? LINEDevice name ? LOCALLocal echo ON or OFF ? LOGFILELogfile name ? LOG_FILELogfile name ? LOG-FILELogfile name ? LOGOUTLogout string ? LONG_PACKETSLong Packets ON or OFF ? MODEM-TYPEModem type ? MODEM_TYPEModem type ? NOATTRIBUTESNODEBUGNOLONG_PACKETSNOQUIETNOUPDATEPARITYOdd/Even or None ? PAUSESeconds to delay packets ? PHONEOption: POSOption: PROMPTKermit Prompt ? QUIETRANDOMOn or Off ? RECEIVEOption: RECORD__FORMATStream or Variable ? RECORD-FORMATStream or Variable ? REPEATTo: REPEAT_CHARTo: REPEAT-CHARTo: RETRYNAK retry count ? RSXOption: RT11Option: SEEDRandom seed ? SENDOption: SPEEDSpeed for link ? SERVEROption: START_OF_PACKETOctal (1-36) ? START-OF-PACKETOctal (1-36) ? TERMINALType ? TIMEOUTTimeout ? TIME-OUTTimeout ? TIME_OUTTimeout ? WINDOWUPDATEUpdate interval ? ԂXX0%.0?H P^dl`t `ƒ8ƃȃσ.5DPM`Pj~P„̈́քhۄ܄ p(8pARp[lsxƅxх#8>Z(`jnx͆"*6>DX\fkty·އ$-8ALST[~`@Command file ? BYECOMMENTCONNECTCWDDirectory: COPYFrom: DATEDELETEWhat: DIALPhone number ? DIRECTDISCONNECTDISKDISPLAYSymbol: ERASEWhat: EXAMINESymbol: EXITFINISHGETFile ? HANGUPHELPHOMEHOSTCommand: LOCALLocal command ? LOGOUTLOGFILELogfile name ? LOG_FILELogfile name ? LOG-FILELogfile name ? NOTEQUITPRINTFile ? RECEIVEREDIALNumber of retries ? REMOTERemote Kermit cmd ? RENAMEFrom: SENDFile ? SERVERSETWhat: SHOWWhat: SPACESTATSYSTEMCommand: TAKECommand file ? TESTTIMETRANSFERFile ? TRANSMITFile ? TYPEFile ? WHOBYECOPYFrom: CWDRemote Directory: DELETEFile Specification: DIRECTORYOf what: DISKERASEFile Specification: FINISHGETFile Specification: HELPHOSTCommand: LOGINUser and Password: RENAMEFrom: SPACETYPEFile: WHO//ĂƂ΂Ђ 3ԂH0X@)u9M?nDr#C^_ZDdk.+dSF_D|2EHCcolhyBk:W_$0,~QAH3}C<%}1 6]r?pFu[(-)5C_w)SL]xC{ZML6-%R4 *[TIg${#-*eMxL? @>\+!N*}[ckn1A-JP Hb4/XwK\t'u2i KERMIT.B[001011]K11RT4.SAV;1l*/08BXHPXb/gh/op/t|Hp3x2/xȃ؃xx //(&p-.0p7L2ShPov-{x(@ĄɄڄ"3߄0  /"$61)004H0OdT0nx60}~0/ /<0…B0Dž҅0؅160f0x0& f@ ,@ 'fqW$@  f 2 * ZC    'f& f ef& t ef& f ~ef&  je renamed to & f@ %fW$@  f 2 * ZC    f& f Ȧef& * e deleted fP& : G = f\fFSSSSeP* *CePf& 0   ff Xe Iff $e 2f  ff %     &f  f f &fAW-& Jf Ҵ,@ E E > E eѕ-єєєѕ-EeH   e e0e0ѐJan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 00-XXX-00&f) d&< ZA 2ѕ: (ѕ:f < 6  %  e e0e0ѐ & A @    & C W @  W W W  S  W  Ȉfff e&f@@  . J@fP%(f& f& ´eeЕ)Е Unknown error callMissing executive featureӃ߃3@Zl̄9[%Db/P|Ї(FVfCan't create fileInvalid device nameEnd of fileFile not foundBad filenameDevice fullNo more filesInvalid i/o operation requestSystem errorLogical unit already openDevice read errorDevice write errorFile is protectedRecord too large for user bufferNo QUE elements availableMT service - No data available/Buffer overflowMT service - Line not attachedMT service - Non-existent unitMT service - Device not availableMT service - Bad user buffer address (XM)Multiple Terminal Service support not present in executiveMT service - RT11 device unit not mapped to internal LUNUnknown speedSystem error from RT11 .CLOSESystem error from RT11 .CSISPCSystem error from RT11 .ENTERSystem error from RT11 .FETCHDisk home block is not*[001011]K11PCO.MAC;1+.*/ 0D6PQ7j)Q 4G** U|s<0me the next }KERMIT.B[001011]K11RT4.SAV;1lζ`n2wϒMm:7pzٙ~(iE iXKu@s첯P^A0#g80PGiK$Qd&<#ɓF Jr=ؓܐ\>aW(f;1NoܸX9ǐV.Bkʝh;0zmGd`AYAF2*u Ȏ%gCo ش/2Um5_`!K1vzGNc1tvI4~%Mx.Y]۹&sUtXFHm1̺>x71lϹ5taw%VTib!ytoOGF.Нeb^]Fdqe@8xPԐb 8 /XboZ%̔֔NὲEJҺ Xd>_7r=GXEfX= ygaJD496Hq@q0!X-(|)VolW{9J 1D8,U3^3ΩKn qxU jB5QރND,#jv[ LJw *OPA^\pxB*l!w]WߗlXP`S n`\Yu#sD~Uvp۫d7)#K5u\y.!d+H c;8^+^iк?}0U~o>WpM\ gϱed-sHv$C* 2Yc`6 ;%Ʉ1(rOlq'|f"j8CQ.#ptPA.WPj7ZAx7 Tؽa%1 pƭ\c.xE|U>O%7+<$-\<ԶW-N&5t:>HaO0T=%P&>1}z~"c~JQH#,GY;M]Ϧ(b?5jR[o.ǂ\p膘\HzՁ?4{h_:{ugGB E9qF ]͚E84qIRnjx ma^K{p`CUmV=?3T!˪L]RE^ae;GӍEe1mP^ s}P%8PǮ|.ߙpEY|X*Ṝq!#cϼDڬ4 7\-7gE( ןͅD禦W 8<~9gh6ќ p07=Y&A *a֌>`70 lR {ܪAY d$GzT) hy&=W;o 6Htl+ɚ?#]PEb4>C+ŸȽmL+ZKS>O8iөqlq7*@%IԁqHngϏ{^ Xu12@XX_2nCztc< mn*BBX7{AvXĞb3@ǃvT"?K=t8# S߹n80,; (WB xi)2RZ2b\d-dR׳Q/%) ,_ub ЮG%IՆ7$W=|B8x}j$R;Rц?_X]0rbz8EyQ;НS@8E*MzJ;ҦO0,@~7EBY!DΉAK:`;gCf:3S`'k[ۨ{lЌ#ZZ9N-Z>q'!PXmBiDw"ҮcͿ gӄZ!5[_'6G21vϠ55Uտ!3|ÜH$Ds!FD-bWn*KY"x֑|ϧ,6aT[(⚢ce,Y5yv]ӃRd#XKwRXdȍ}̧'XK@Đ2:qďBfpΗvQ0t !~Gȣ Ao 9x-sd3CP~d^INY1,3QM<4ek-lLǙS!fhRHoh C!jPwU߫mq 5|d|IK3z{xS\]\]-K$k 2Di5qN/T}݊\Ί ]b51DS)]^C|rG8$JZI>edd˲Z|8t=a峏nYql/u!{kS9'\O*VAѡUʍ} ]q|_bqp`hE2|[kR9=Ʒ{{g=,tƟ code .sbttl call the server c$serv::$name ; allow patching this out (why??) clr notatt ; assume attached tstb @argbuf ; if nothing for arg, do normal server beq 20$ ; ok, do normal server thing calls getcm0 ,; no, check for server cmd argument tst r0 ; did we find a valid one bmi 110$ ; no jsr pc ,@r1 ; yes, process it tst r0 ; did this work? bne 100$ ; no, exit please 20$: clr mcrcmd ; always allow remote FIN command tst notatt ; are we attached today? bne 30$ ; no tst infomsg ; /41/ Should we be verbose today? beq 30$ ; /41/ no print #sertxt ; dump a message out please 30$: call opentt ; get the line open please direrr r0 ; print any errors out calls cantyp ,<#ttname,#lun.ti>; dump garbage perhaps call server ; and do it call clostt ; we came back ? clr notatt ; assume attached now 100$: clr r0 return ; ok 110$: message ,cr return .enabl lsb sr$det: tstb ttdial ; insure a SET LINE command was done beq 110$ ; no, thats an error please message ,cr call detach ; detach from the current TI: tst r0 ; did this work ok ? bne 90$ ; no mov sp ,notatt ; no longer attached to ti: clr r0 br 100$ 90$: direrr r0 ; say why please 100$: return 110$: message message mov sp ,r0 return .dsabl lsb $cmglob = 0 command serlst ,DETACH ,3 ,sr$det command serlst global .save .psect $pdata sertxt: .ascii #Kermit Server running on PDP-11 host. Please type your escape sequence# .byte cr,lf .ascii #to return to your local machine. Shut down the server by typing the# .byte cr,lf .asciz #Kermit BYE command on your local machine KERMIT.B[001011]K11SER.MAC;1O;0.# .even .restore .sbttl the main server loop code server::mov remote ,-(sp) ; save the local/remote flag mov sp ,remote ; if a server we are always remote mov sp ,inserv ; global flag to say we are a server 10$: clr paknum ; packetnumber := 0 clr numtry ; number_of_retrys := 0 clr oldtry ; oldtries := 0 clr cccnt ; /38/ clear control C flag textsrc ; /38/ reset to normal file i/o mov #defchk ,chktyp ; checksum_type := type_1 mov #1 ,chksiz ; checksum_len := 1 mov $image ,image ; insure correct default is set call fixchk ; sendpar_checktype := set_checktype mov serwai ,sertim ; /41/ set a new timeout please rpack r2,r3,#packet ; loop forever clr sertim ; normal timeouts now scan r1 ,#sercom ; is the generic command type asl r0 ; index into dispatch table jsr pc ,@serdsp(r0) ; simple tst r0 ; done flag ? beq 10$ ; next server command please 100$: calls suspend ,<#2> ; sleep a moment please clr inserv ; no longer a server mov (sp)+ ,remote ; save the local/remote flag return dispat basedsp=serdsp ,baseval=sercom ,default=serv.$ dispat MSG$SND ,serv.s ; server init for receive a file dispat MSG$RCV ,serv.r ; send a file dispat MSG$GENERIC ,serv.g ; do a server command dispat MSG$SER ,serv.i ; do a server sinit dispat TIMOUT ,serv$$ ; we timed out dispat BADCHK ,serchk ; a fubar checksum dispat MSG$NAK ,serv$$ ; a NAK this time dispat MSG$ACK ,serv$$ ; things are ok now dispat MSG$COMMAND ,serv.c ; a host command dispat MSG$ERROR ,sernop ; ignore 'E' packets from remote dispat global global .sbttl routines for server serv.$: strlen #notimp spack #MSG$ERROR,paknum,r0,#notimp ; ignore unrecognized packet type clr r0 ; not done yet return serv$$: call serchk ; timeout, send a NAK please sernop: clr r0 ; not yet done return ; ignore timeouts, ACKS and NAKS serchk: mov r3 ,paknum ; nak checksum errors spack #MSG$NAK,paknum ; send the NAK out please clr r0 ; we are not done return serv.i: mov r3 ,paknum ; we got an init packet. respond in calls rpar ,<#packet,r2> ; kind please calls spar ,<#packet> ; get our parameters and send them to spack #MSG$ACK,paknum,sparsz,#packet; the other kermit call inirepeat ; clr r0 ; not done return ; bye global serv.s: mov pauset ,oldpau ; save the old pause time please call throtl ; and throttle the line speed mov r3 ,paknum ; got a SINIT, initialize packet number calls rpar ,<#packet,r2> ; store there send init info away calls spar ,<#packet> ; and send them ours for the ACK spack #MSG$ACK,paknum,sparsz,#packet call inirepeat ; do repeat initialization mov numtry ,oldtry ; save the retry count clr numtry ; retrycount := 0 incm64 paknum ; paknum := ( paknum+1 ) mod 64 calls rec.sw ,<#STA.FIL> ; and get set to receive a filename clr r0 ; not done mov oldpau ,pauset ; restore old pause time return ; next server command please serv.r: calls bufunp ,<#packet,#srcnam> ; /53/ clrb srcnam(r1) ; /53/ calls fixwild ,<#srcnam> ; change % to ? clr index ; first file in directory please call getnxt ; get the first filename please tst r0 ; did it work ? bne 100$ ; no. Getnxt will send the error pak calls sen.sw ,<#STA.SIN> 100$: clr r0 ; not done return .enabl lsb serv.c: call cretmp ; create tKERMIT.B[001011]K11SER.MAC;1O;t he temp file please bcs 100$ ; oops calls sercmd ,<#packet,#lun.ou>; it worked cmpb r0 ,#377 ; normal exit on KMON wait? beq 10$ ; yes tst r0 ; zero (?) beq 10$ ; yes calls syserr , ; no, send the error over strlen #errtxt ; the length spack #MSG$ERROR,paknum,r0,#errtxt ; ignore unrecognized packet type call clotmp ; no, send error over br 100$ ; bye 10$: call clotmp ; close it and send the file over mov #kertmp ,r0 ; as a text reply call xreply 100$: clr r0 return .save .psect $PDATA ,D 200$: .asciz /Spawned job failed due t o timeout or TT read wait/ .even .restore .dsabl lsb serv.g: sub #200 ,sp ; /53/ Make a temp copy of data mov sp ,r2 ; /53/ Point to it STRCPY r2 ,#packet ; /53/ Copy it calls bufunp , ; /53/ Undo it (with repeats) add #200 ,sp ; /53/ Pop buffer movb packet+0,r2 ; get the first data byte which scan r2,#gencom ; is the generic command type asl r0 ; index into dispatch table jsr pc ,@gendsp(r0) ; simple return dispat basedsp=gendsp ,baseval=gencom ,default=gen.$ dispat GN$LOGIN ,gen.i dispat GN$EXIT ,gen.f dispat GN$CONNECT ,gen.c dispat GN$BYE ,gen.l dispat GN$DIRECTORY ,gen.d dispat GN$DISK ,gen.u dispat GN$DELETE ,gen.e dispat GN$SUBMIT ,gen.$ dispat GN$WHO ,gen.w dispat GN$SEND ,gen.$ dispat GN$HELP ,gen.h dispat GN$QUERY ,gen.$ dispat GN$RENAME ,gen.r dispat GN$COPY ,gen.k dispat GN$PRINT ,gen.$ dispat GN$PROGRAM ,gen.$ dispat GN$JOURNAL ,gen.$ dispat GN$VARIABLE ,gen.$ dispat GN$TYPE ,gen.t dispat global global .sbttl generic kermit routines gen.$: strlen #notgen ; NO-OP for unimplemented generic spack #MSG$ERROR,paknum,r0,#notgen ; send an error packet back please clr r0 ; not done return gen.f: spack #MSG$ACK,paknum ; send a simple ACK clr r0 ; /45/ May want to stay in server tst srvprot ; /45/ Do we REALLY want to do this? bne 100$ ; /45/ No call clostt ; close the terminal up and exit mov sp ,r0 ; all done, return to command mode 100$: return .enabl lsb ; /54/ I/D space gen.l: call quochk ; see if they will be able to logout tst r0 ; well ? bne 10$ ; not likely, but try anyway tst srvprot ; /45/ Is the server protected? beq 5$ ; /45/ No strlen #210$ ; /45/ Yes, tell them what we did spack #MSG$ERR,paknum,r0,#210$; /45/ Ie, DISCONNECT but no LOGOUT calls suspend ,<#2,#0> ; /45/ Insure response gets through calls ttyhang ,<#ttname> ; /45/ Drop the line please br 100$ ; /45/ Now do it 5$: spack #MSG$ACK,paknum ; assume we can log out 10$: call clostt ; close the terminal please bit #log$op ,trace ; a logfile open now ? beq 20$ ; no calls close ,<#lun.lo> ; yes, close it please 20$: call logout ; and log out of the system call opentt ; get the terminal back strlen #200$ ; logout failed spack #MSG$ERROR,paknum,r0,#200$ ; send an error message back then 100$: clr r0 ; not yet done return ; oops .save .psect $PDATA ,D .enabl lc 200$: .asciz /Logout failed - Quota exceeded/ 210$: .asciz /Server disconnected and still logged in/ .even .restore .dsabl lsb gen.u: sub #120 ,sp ; allocate a buffer for string mov sp ,r1 ; and point to it calls dskuse , ; get the string to print strlen r1 ; get the string length spack #MSG$ACK,paknum,r0,r1 ; and send the data back add #120 ,sp ;may be cases where the proper SET commands have been given but the binary file does not transfer correctly. This has been noted on VMS when a task image i vKERMIT.B[001011]K11SER.MAC;1O;  and exit clr r0 ; not yet done return .enabl lsb ; /54/ I/D space gen.c: mov #packet+1,r1 ; get the packet address unchar (r1)+ ,r2 ; get the size of the data beq 90$ ; nothing to do ? strcpy #defdir ,r1 ; copy the text to DEFDIR please sub #140 ,sp ; allocate a buffer mov sp ,r2 ; point to the buffer strcpy r2 ,#110$ ; build up a message strcat r2 ,r1 ; add the directory name in strlen r2 ; get the total length spack #MSG$ACK,paknum,r0,r2 ; and sent the ack message add #140 ,sp ; pop buffer br 100$ ; and exit 90$: strlen #120$ ; get error text length spack #MSG$ACK,paknum,r0,#120$; error text to send 100$: clr r0 ; not done return .save .psect $PDATA ,D 110$: .asciz /Default directory set to / 120$: .asciz /Need a directory name to change to/ .even .restore .dsabl lsb .sbttl handle the request for erase (delete) and directory gen.e: mov #packet+1,r1 ; get the packet address unchar (r1)+ ,r2 ; get the arguement length bne 10$ ; non zero clrb @r1 ; zero, make the string null 10$: call cretmp ; create temporary log file bcs 100$ ; oops calls delete , ; do it save ; save the error code please call clotmp ; close the temp file up unsave ; restore delete's error code tst r0 ; did it work ? beq 80$ ; yes call generr ; no, send the RMS error code over br 100$ 80$: dec r1 ; only delete one file ? bne 90$ ; no, set up for extended reply copyz #,#errtxt ; a simple reply for one file deleted strlen #errtxt ; get the length so far add #errtxt ,r0 ; point to the end of it please copyz #delmsg ,r0 ; and copy some informative text strlen #errtxt ; get the total length now spack #MSG$ACK,paknum,r0,#errtxt ; and send a simple ACK packet br 100$ ; bye 90$: mov #kertmp ,r0 ; send over the delete log file call xreply 100$: clr r0 ; not done with the server yet return .Save .Psect $Pdata ,D delmsg: .asciz / deleted/ ; some text to send .even .Restore ; REMOTE DIRECTORY ; ; Modified 07-Nov-85 by BDN to not use a work file for storing ; the results of the lookups. Much faster than old way. gen.d: mov #packet+1,r1 ; /38/ get the packet address unchar (r1)+ ,r2 ; /38/ get the arguement length bne 5$ ; /38/ something was there clrb @r1 ; /38/ nothing was there, insure .asciz 5$: calls fixwild , ; /38/ convert % to ? for RSTS/E only calls sdirini , ; /38/ Init directory lookup and tst r0 ; /38/ preload sdodir's buffer. beq 10$ ; /38/ Send error packet on any error call generr ; /38/ Makes interfacing to BUFFIL br 100$ ; /38/ a bit simpler 10$: mov #sdodir ,getcroutine ; /38/ Stuff address of get_nextchar mov #null ,r0 ; /38/ and flag we are NOT using a file call xreply ; /38/ Do the extended reply now 100$: clr r0 ; /38/ cleared return ; /38/ and exit ; mov #packet+1,r1 ; get the packet address ; unchar (r1)+ ,r2 ; get the arguement length ; bne 5$ ; something was there ; clrb @r1 ; nothing was there, insure .asciz ;5$: call cretmp ; create the temp file please ; bcs 100$ ; oops ; calls fixwild , ; change % to ? ; calls dodir , ; it worked ; call clotmp ; close it and send the file over ; mov #kertmp ,r0 ; as a text reply ; call xreply ;100$: clr r0 ; return .sbttl do remote help command gen.h: textsrc #htxt ; /38/ use memory resident mov #null ,r0 ; /38/ for this extended response callKERMIT.B[001011]K11SER.MAC;1O; xreply ; /38/ clr r0 ; /38/ success return ; /38/ exit .save .psect $Pdata ,D htxt: .ascii /The following commands are available for the Kermit-11/ .ascii /server. To avoid ambiguity with local Kermit commands/ .ascii /some of the server commands will need to be prefixed/ .ascii /with the REMOTE keyword./ .byte cr,lf .ascii /BYE Logout Kermit-11/ .ascii /REMOTE COPY Copy one file to another/ .ascii /REMOTE CWD Change default directory/ .ascii /REMOTE DIR Prints the directory out/ .ascii /REMOTE DISK Prints available space/ .ascii /REMOTE ERASE Deletes the filename(s)/ .ascii /FINISH Exits a Kermit-11 server/ .ascii /GET Sends the filename(s)/ .ascii /REMOTE HELP Prints this help text/ .ascii /REMOTE HOST Execute a host command/ .ascii /REMOTE LOGIN Login. RSTS V9.x only/ .ascii /REMOTE RENAME Rename old file to new/ .ascii /REMOTE SPACE Prints the disk space/ .ascii /REMOTE TYPE Prints the filename(s)/ .ascii /REMOTE WHO Shows users logged in/ .byte cr,lf,0 .even .restore global global .sbttl the remote type command and who commands .enabl lsb gen.t: mov #packet+1,r1 ; get the packet address tstb @r1 ; anything there ? beq 5$ ; no, thats an error unchar (r1)+ ,r2 ; get the arguement length bne 10$ ; something was there 5$: calls error ,<#1,#200$> ; have to have something to type br 100$ ; bye 10$: mov r1 ,r0 ; send the file over now call xreply ; simple to do 100$: clr r0 ; not done yet return .save .psect $Pdata,d 200$: .asciz /I need a filename to TYPE/ .even .restore .dsabl lsb .enabl lsb gen.w: call cretmp ; get the temp file created first bcs 100$ ; oops calls systat ,<#lun.ou> ; dump the systat out to disk now. tst r0 ; did it work ? beq 10$ ; yes calls error ,<#1,#200$> ; no, send an error packet over call clotmp ; insure temp file is closed br 100$ ; bye 10$: call clotmp ; close the temp file now mov #kertmp ,r0 ; and send an extended reply call xreply ; simple to do 100$: clr r0 ; not done yet return ; bye .save .psect $Pdata,d 200$: .asciz /SYSTAT failed/ .even .restore .dsabl lsb .sbttl do the server copy and rename functions .enabl lsb gen.i: sub #120 ,sp mov #120$ ,r3 call get2ar bcs 90$ mov sp ,r3 calls login , ; 1=uic,2=password,3=addr(msgtext) tst r0 ; did this one work ? bne 90$ ; no strlen #110$ ; an ack message spack #MSG$ACK,paknum,r0,#110$; send it back br 100$ ; and exit please 90$: calls error ,<#1,r3> ; invalid arguments 100$: clr r0 ; no errros add #120 ,sp ; pop stack and exit return ; exit .save .psect $Pdata,d 110$: .asciz /Login successful/ 120$: .asciz /Missing password or UIC (PPN)/ .even .restore .dsabl lsb .enabl lsb gen.k: call get2ar ; get pointers to 'from' and 'to' bcs 90$ ; oops, send an error packet over calls copy , ; copy the file now tst r0 ; did it work out ok ? bne 80$ ; no sub #50 ,sp ; yes, formulate a simple ack mov sp ,r2 ; response telling them how many deccvt r1,r2,#5 ; blocks that we copied over add #5 ,r2 ; point past the block count copyz #200$ ,r2 ; copy a message and then ack it mov sp ,r2 ; point back to the start of rfile ; receive-file movb r1 ,state clc return recs.d: call rdata ; receive-data movb r1 ,state clc return recs.c: clr r0 ; complete sec return TKERMIT.B[001011]K11SER.MAC;1O;Bx"buffer strlen r2 ; get the string length now spack #MSG$ACK,paknum,r0,r2 ; send the ack over add #50 ,sp ; pop the local buffer and exit br 100$ ; bye 80$: call generr ; error, send RMS (sys) error text br 100$ ; bye 90$: calls error ,<#1,#invarg> ; invalid arguments 100$: clr r0 ; exit return ; bye .Save .Psect $Pdata,d 200$: .asciz / blocks copied/ .even .restore .dsabl lsb .enabl lsb ; RENAME gen.r: call get2ar ; get pointers to 'from' and 'to' bcs 90$ ; oops, send an error packet over calls rename , ; rename the file(s) now tst r0 ; did it work out ok ? bne 80$ ; no sub #50 ,sp ; yes, formulate a simple ack mov sp ,r2 ; response telling them how many deccvt r1,r2,#5 ; number of files that were renamed add #5 ,r2 ; point past the block count copyz #200$ ,r2 ; copy a message and then ack it mov sp ,r2 ; point back to the start of buffer strlen r2 ; get the string length now spack #MSG$ACK,paknum,r0,r2 ; send the ack over add #50 ,sp ; pop the local buffer and exit br 100$ ; bye 80$: call generr ; error, send RMS (sys) error text br 100$ ; bye 90$: calls error ,<#1,#invarg> ; invalid arguments 100$: clr r0 ; exit return ; bye .save .psect $Pdata,d 200$: .asciz / file(s) renamed/ .even .restore .dsabl lsb .sbttl create the server temp file .enabl lsb cretmp: save mov #errtxt ,r0 ; must fill in defdir also mov #defdir ,r1 ; default directory string 10$: movb (r1)+ ,(r0)+ ; copy it over please bne 10$ ; not the end of it yet dec r0 ; end, backup over the null mov #kertmp ,r1 ; and copy the filename over please 20$: movb (r1)+ ,(r0)+ ; do it bne 20$ ; not the end yet calls create ,<#errtxt,#lun.ou,#text> tst r0 ; did the create for the temp beq 100$ ; file work save ; save the error number calls syserr , ; no calls error ,<#2,#200$,#errtxt>; get the error text and send it unsave ; keep the RMS error number around sec ; say it did not work br 110$ ; bye 100$: clr r0 ; clc and clear r0 both clc 110$: unsave return .save .psect $Pdata,d 200$: .asciz /Can't create KERMIT.TMP / .even .restore .dsabl lsb clotmp: calls close ,<#lun.ou> clr r0 return generr: calls syserr , ; send a system error E packet over calls error ,<#1,#errtxt> ; simple to do clr r0 ; assume no errors and exit return .sbttl get pointer for a two argument server command ; input: packet what we just read as a server ; output: r1 first argument address (in 'packet'), .asciz ; r2 second argument address (in 'packet'), .asciz ; carry set on missing arg, clear if all is well and good ; ; assumptions: the packet received is .asciz get2ar: save ; save work registers please mov #packet+1,r3 ; get the address of our parameters tstb @r3 ; a null. if so, thats an error beq 90$ ; exit with carry set unchar (r3)+ ,r4 ; get the length of the first arg beq 90$ ; a null string, exit with error mov r3 ,r1 ; not null, point to the first one add r4 ,r3 ; point to the length field for 2nd tstb @r3 ; must not be null or zero beq 90$ ; null, missing second argument unchar (r3)+ ,r4 ; get the length of the last field beq 90$ ; nothing is there, abort please mov r3 ,r2 ; return a pointer to the second arg clrb -(r3) ; insure the first argument is .asciz clc ; success at last br 100$ ; exit p*[001011]K11PRT.MAC;1+.6/ 0D6ׯE7@_E 4J66B U|s(0KERMIT.B[001011]K11SER.MAC;1O;)lease 90$: sec ; failure, to try again someday 100$: unsave ; pop the registers we used and exit return ; good bye .sbttl talk to a remote server .enabl lsb remfin::clr paknum ; packetnumber := 0 call seropn ; get the link line intialzied spack #MSG$GENERIC,paknum,#1,#200$ ; send a generic F command rpack r2,r3,#packet ; get an ack for it please cmpb r1 ,#MSG$ACK ; did the server like it beq 100$ ; yes calls error ,<#1,#210$> ; no, say so 100$: call clostt ; close up the remote link now return ; and back please .save .psect $Pdata,d 200$: .byte GN$EXIT,0 21 0$: .asciz /Can't get the remote KERMIT to FINISH/ .even .restore .dsabl lsb .enabl lsb rembye::clr paknum ; packetnumber := 0 call seropn ; get the link line intialzied spack #MSG$GENERIC,paknum,#1,#200$ ; send a generic L command rpack r2,r3,#packet ; get an ack for it please cmpb r1 ,#MSG$ACK ; did the server like it beq 100$ ; yes cmpb r1 ,#MSG$ERROR ; what about an error packet bne 10$ ; no calls error ,<#1,#packet> ; yes, print the response br 100$ ; exit 10$: calls error ,<#1,#210$> ; other error 100$: call clostt ; close up the remote link now return .save .psect $Pdata,d 200$: .byte GN$BYE ,0 210$: .asciz /Can't get the remote KERMIT to LOGOUT/ .even .restore .dsabl lsb remget::call seropn ; get the link line intialzied call sinfo ; exchange information please clr paknum ; packet_number := 0 strlen argbuf ; get the length of the filename spack #MSG$RCV,paknum,r0,argbuf ; get the server to send this file calls recsw ,<#STA.RIN> ; and call the receiver 10$: call clostt ; close up the remote link now return ; bye remhos::call seropn ; get the link line intialzied call sinfo ; exchange information please clr paknum ; packet_number := 0 strlen argbuf ; get the length of the filename spack #MSG$COMMAND,paknum,r0,argbuf ; get the server to execute call getres ; off to common code ;- call clostt ; insure closed return .sbttl the remote space, dir, erase and help commands remspa::calls doremo ,<#GN$DISK,#1,#null> clr r0 return remdir::calls doremo ,<#GN$DIRECTORY,#1,@r5> clr r0 return remtyp::calls doremo ,<#GN$TYPE,#1,@r5> clr r0 return remwho::calls doremo ,<#GN$WHO,#1,#null> clr r0 return remera::calls doremo ,<#GN$DELETE,#1,@r5> clr r0 return remhlp::calls doremo ,<#GN$HELP,#1,#null> clr r0 return remren::calls doremo ,<#GN$RENAME,#2,@r5,2(r5)> clr r0 return remcop::calls doremo ,<#GN$COPY,#2,@r5,2(r5)> clr r0 return remcwd::mov 2(r5) ,r0 ; get address of second (password) arg tstb @r0 ; is there anything there (not likely) beq 10$ ; no calls doremo ,<#GN$CONNECT,#2,@r5,2(r5)> ; insert password also br 100$ ; 10$: calls doremo ,<#GN$CONNECT,#1,@r5> ; no password today 100$: clr r0 return remlgi::mov 2(r5) ,r0 ; get address of second (password) arg tstb @r0 ; is there anything there (not likely) beq 10$ ; no calls doremo ,<#GN$LOGIN,#2,@r5,2(r5)> ; insert password also br 100$ ; 10$: calls doremo ,<#GN$LOGIN,#1,@r5> ; no password today 100$: clr r0 return global .sbttl carry out the remote command please ; DOREMOTE handles most generic commands that may have ; a variable response, such as a simple ACK ("Y") with ; the response in the data packet, an SINIT or an "X" ; packet. doremo: clr paknum ; genernneeded device drivers from lowest address to higher addresses (to prevent fragmentation of background memory). If you run K11RT4.SAV on a FB syste0KERMIT.B[001011]K11SER.MAC;1O;{ 0ic command sub #130 ,sp ; allocate a buffer please mov sp ,r2 ; point to it movb @r5 ,@r2 ; the generic command to execute bicb #40 ,(r2)+ ; insure command is upper case mov 4(r5) ,r1 ; get the first command argument strlen r1 ; get the length of it please tochar r0 ,(r2)+ ; followed by len of first arg copyz r1 ,r2,#40 ; copy the arglist over please cmp 2(r5) ,#1 ; one or two arguments passed ? beq 30$ ; only one 10$: tstb (r2)+ ; two, so find the end so far bne 10$ ; not yet strlen 6(r5) ; get the length of the second arg dec r2 ; point back to the null please tochar r0 ,(r2)+ ; and copy the new length over copyz 6(r5) ,r2,#40 ; copy the second arg over now 30$: mov sp ,r0 ; point back to the command buffer calls bufpak , ; encoding the data as normal mov r1 ,r5 ; save the encoded packet length add #130 ,sp ; pop the local buffer and exit call seropn ; initialize the link first call sinfo ; exchange things first clr paknum ; start over now clr numtry ; clear the retry counter please spack #MSG$GENERIC,paknum,r5,cmdbuf ; send the command over please getres: 50$: rpack r2,r3,#packet ; get the response from remote mov r3 ,paknum ; save the packet number please scan r1 ,#remrsp ; what to do with the response asl r0 ; get the index times 2 jsr pc ,@remdsp(r0) ; and dispatch on the response tst r0 ; try to read again ? bne 50$ ; yes, we must have gotten a NAK call clostt ; close the link for now clr xmode ; no extended reply stuff now clr xgottn ; we don't have any X packets clr r0 ; don't exit the server yet return ; or a timeout .save .psect $Pdata,d remrsp: .byte MSG$ERROR,MSG$NAK,MSG$SND,MSG$ACK,MSG$TEXT .byte timout ,badchk ,0 .even remdsp: .word rem.$ .word rem.e ,rem.n ,rem.s ,rem.y ,rem.x .word rem.t ,rem.ck .restore .sbttl routines for doremote rem.t: inc numtry ; timeout error cmp numtry ,#10 ; been trying too hard ? bhi 10$ ; yes, abort please mov #1 ,r0 ; no, return code to do rpack again return 10$: message ,cr clr r0 ; ok return rem.n: inc numtry ; got a NAK back from remote cmp numtry ,#5 ; been trying too hard ? bhi 10$ ; yes, abort please spack #MSG$GENERIC,paknum,r5,cmdbuf ; send command again please mov #1 ,r0 ; no, return code to do rpack again return 10$: message ,cr clr r0 ; ok return rem.ck: inc numtry ; got a NAK back from remote cmp numtry ,#5 ; been trying too hard ? bhi 10$ ; yes, abort please spack #MSG$GENERIC,paknum,r5,cmdbuf ; send command again please mov #1 ,r0 ; no, return code to do rpack again return 10$: message ,cr clr r0 ; ok return rem.x: mov sp ,xmode ; set a global flag for this mov sp ,xgottn ; we already have the x packet message ,cr calls rec.sw ,<#STA.FIL> ; yes, switch to receive DATA clr xmode ; no longer want output to TI: clr xgottn ; we don't have any X packets message ; a cr/lf tst r0 ; did the receive succeed ? beq rxend ; yes message ,cr; no, please say so then rxend: clr r0 ; all done return rem.s: calls rpar ,<#packet,r2> ; yes, handle the SINIT now calls spar ,<#packet> ; and send my init things over spack #MSG$ACK,paknum,sparsz,#packet incm64 paknum ; bump the packet number up mod 64 calls rec.sw ,<#STA.FIL> ; switch to RSX-11M 3.2, you will not be supported for Kermit, just as your system can not be supported by Digital. For example, RSTS/E 8.0 support expired on 31-Dec-85, as v KERMIT.B[001011]K11SER.MAC;1O;J 7get fileheader state message clr r0 ; all done return rem.y: strlen #packet ; any data in the field ? tst r0 ; if so, simply print it out bne 10$ ; no, just exit return 10$: message print #packet ; yes, print the text out please print #crlf ; a cr/lf perhaps ? clr r0 ; all done return rem.e: calls error ,<#1,#packet> ; yes, print the error text out clr r0 ; all done return ; and exit please rem.$: calls error ,<#1,#nores> ; otherwise say they did not respond clr r0 return ; and exit please .save .psect $Pdata,d nores: .asciz /Can't get the remote KERMIT to respond/ .even .restore global global .sbttl initialize for a long (X) response for generic command ; Here is where we send an X packet back to the requesting Kermit ; to say that we are going to send an extended reply to it. This ; reply takes the form of a normal file transfer but we will want ; it to be printed on the user's terminal rather than go to a disk ; file. Thus the use of the 'X' packet to start things off. xreply: copyz r0 ,#srcnam ; copy the filename to be sent clrb filnam ; /38/ insure cleared out clr index ; wildcard filenumber := 0 tstb srcnam ; /38/ is there really a file? beq 20$ ; /38/ no, ignore lookup then. call getnxt ; go do a directory lookup please tst r0 ; well, did the lookup work out ? beq 20$ 5$: call generr ; no, send the error text over br 100$ ; and abort 20$: mov sp ,xmode calls sen.sw ,<#STA.FIL> ; and switch to senddata state clr xmode ; no longer XTENDED reply mode clr xgottn ; we don't have any X packets (?) clr r0 ; success (?) 100$: textsrc ; /38/ reset to normal file i/o return ; bye global .enabl lsb seropn: save call opentt ; open the link for a server command tst r0 ; did it work ? beq 10$ ; yes strlen #200$ ; no spack #MSG$ERROR,paknum,r0,#200$ ; try to send an error packet clr r0 ; no errors now 10$: calls cantyp ,<#ttname,#lun.ti>; flush any accumulated NAKS unsave return ; bye .save .psect $Pdata,d 200$: .asciz /Init failed for link/ .even .restore .dsabl lsb global .end *[001011]K11USR.DOC;1+./ 0D6OY7Y 4J U|s< CHAPTER 1 PDP-11 KERMIT Program: Brian Nelson Language: Macro-11 Documentation: Brian Nelson Version: 3.54 Date: September, 1986 Systems Supported: RSTS/E, RSX-11M/M+, P/OS, Micro-RSX, RT-11 and TSX+ Kermit-11 Capabilities At A Glance: Local operation: Yes Remote operation: Yes Transfer text files: Yes Transfer binary files: Yes Wildcard send: Yes File transfer interruption: Yes Filename collision avoidance: Yes Can time out: Yes 8th-bit prefixing: Yes Repeat count prefixing: Yes Alternate block checks: Yes LONG Packet protocol support Yes Sliding Windows protocol support No Terminal emulation: Yes Communication settings: KERMIT.B[001011]K11USR.DOC;1J>\ Yes Transmit BREAK: Yes (depends on system) IBM mainframe communication: Yes Transaction logging: Yes Session logging: Yes Debug logging: Yes Packet logging: Yes Act as server: Yes Talk to server: Yes Advanced server functions: Yes Local file management: Yes Command/Init files: Yes File attributes packets: Yes Command macros: No Raw file transmit: Yes PDP-11 KERMIT Page 1-2 PDP-11 KERMIT Page 1-3 File systems on the PDP-11 File specifications. The general format of a file name is: NODE::DEVICE:[DIRECTORY]NAME.TYPE;VERSION 'Node' refers to the DECNET node name, for example, FUBAR::, if applicable. 'Device', if present, refers to the physical device or logical name where the file resides. For RSTS/E, 'device' can be a physical device, such as DB0: or DU1:, or it can be a user or system logical name which may include both a physical device name and a directory name. If the device name is a logical name, is it composed of 1 to 9 alphanumeric characters, including '$', as in DISK$ONE:, LB: and so on. For instance, the DCL system command $ ASS/SYS DB1:[200,210] SRC$DIR would associate both the device DB1: and directory [200,210] with SRC$DIR:. Explicitly given directories override directory names imbedded in a logical name. Names longer than nine characters are truncated by the executive. In the case of RSX-11M/M+ and RT-11, the device name can be either a physical name, such as DU0:, or a logical name which will translate to a physical device name, such as LB:. On RSTS/E and RSX-11M/M+, the [directory] is a UIC (user identification code) or PPN (project,programmer) number of the format [NNN,MMM]. All users are assigned a UIC (or PPN) when accounts are created, this is the number you give to LOGIN to log into the system. It is also your default UIC (or PPN). Micro-Rsx and P/OS may have directories in either UIC format or named directory format, such as [1,2] or [KERMIT]. For P/OS, the default directory is [USERFILES]. Directories are not used for RT-11. The NAME field is the primary identifier for the file. The name can be one to nine characters for RSX-11M/M+ and P/OS, and one to six characters for RSTS/E, RT-11 and TSX+. The TYPE field is usually used to group files according to some convention. For example, XXX.FTN refers to a Fortran-77 source file, FOO.C to a 'C' source file, and K11POS.TSK refers to a task image. The version field is applicable ONLY to RSX type systems. The default version is always the highest version number. All systems mentioned support some sort of filename wildcarding, the flexibility of which varies by executive. All support the use of '*' to represent either a fully wildcarded NAME or TYPE. RSTS/E supports the use of '?' to match any single character, whereas the others use a '%' to match any single character. The RSTS/E Kermit server will translate '%' to '?' internally for the GET and REMOTE DIR commands (see chapter on the SERVER). PDP-11 KERMIT Page 1-4 File systems on the PDP-11 Examples*[001011]K11RMS.MAC;1+.a/ 0D6.VaR7@eQ 4Haa UO|s(0KERMIT.B[001011]K11USR.DOC;1Jao;'Q_! `*,|yV hcWLPBJkVOZ`^="D#|J\I/X6m4fi_cu{KDTl aqj*<K&LhD Lx^T`12dV#B-J(&_ dqhthGdC-vJ~s+&*Oz3V&(4!6 {+k#s{&.'8N-)w|SRZ.1(ZI!%9xe}&\'  C.h?wOD$1."MC,^~4+FWT Z!hh/?+?$f,2TfC>.u09gkj8`G,):23a/.nUk83pCr-nKfq}!-QOxk(Pr*`@Al9_0S!=QV~k4@Z[a 2Xk&g3e>X W\PLMOOsik/45 y^73wO7rH~au:{'xZʊz08-|ox`uWnBex2m ?En{)-Xb;`hBl83Di( nS@i @sx*N-ANN.Qwc q[ .#inc ?[K&$RzYTl__S< mR?fO5OG~= a|i.U(:Bz KuB022Z0EVyun ({P tQTKeI3W+9R[SLbiH{F @D2j*F\{ ,;k "!]J]N(qRbh(F Un">!v3YxEu{m=~OK 8tLEfLzY%sV4FkKZK~ _ _k6A[* {!`w*dzU~`C=>G?55:.I]rVA?/w!eMRnDD/$kKHej0\yFx"0@;),G2<0+' G-^3Ta763&S Q 5vIN!bJoo'jonN+k<={{l#~C] &?H+/I?1Zx9< |-Z2#$B!%JU\)d\IgO2 L0j]`H1Yy:`7$|R$OuC! !jocmm3 _hk3>Ch/@ I';<i? W7S Std}"hCjAga{(P_A/[WET:ZBcJN"Hc It/m",Z6/ItFPu} ;pK t7_3hssn*u*'aXcwV(kA&RVLB+A+od; sq2v ;D NbJ_Z\>kLK7j(yP?pF{3E%,63'.~o*R[@%kUM`] E #;m_8 y3p1Shn}"= Zll ILN1c4MQveuOx#{0LhQ9*Pf6Wv*.?h!wK/{65H \3d6L,w7c!4Q_%?2B .ik'\(`1VyIx~z+B&`Bl"XKyi%fj&XdVfK(51h1wZ  ]ny<3]yz{(J#6g0Y M|w%C+UziRK+Oq4vW0Mw}!' ~m_c'%"`>OQ5~!5x;Tz*0A",|8Wp{WoZm3BM(xIz+P66b%=oK^sfH,[P$el`X<7.Q|~L_BIDxXM4[aPcc=eawiN T/1%p6ZP}{)0TKL|U8bn6Fz[Y'aqfvy +vB]oz)DQj~v X7Qt|@N`&ek~!?geXMvw cu^J%{hEhPDZ)p0"!pOkj0ygoBkQHO)yWts,k 7vGre-KNitGNtRM 6#ym*mzW4&HEaT7U$V`n<8puCc&nU,>YHi!eBLlVgK@CQV\G l-cHiVQnS n.E?j^9(}R:K%OMTAe7)G@x5`R8Dm |"-Y4R4%R.cHby k42{v:Ia02"S fGn vt&}yG4@-vvuKAq-'bI8`=}5[-l"KKq0o/ nuYz@!H0=J_q|pha(xa6'1BA6 Evu~wf,- xEQ(UE~ Q!=F .^}&!#F8IRv?zpCB?4)H_ Hagpg} a@A./2ReB.Y` MD'CusSBT(UaNVP>H2Jjy6fgR[)SOHWvUz!AMY2?YK VLrGma/t_DX;xkhX],-%^Et47qx'7t&4G ze@r{{(qXl9x=^vKsG 1hV62gw4/T cD5oq< J]%X.vTUJrWUTu?XEr9`O6g51Ns5: K#ip/ulSi%'ef'qz"@3]uQu`3QOMM?ssIm?y cQ ePX`n_:0[hpM5u`Qz$-T5n^lF\S,eff_Tg-^0657e/fwpu9K b%6OU@yb_|#3K#-Fz (1~i$]_31h~fR{fO_HA0BpKmImb1}F<G~9vA&HYy$i<$GPGId 5e#Xtc; Fosh\ ;a)cy7F 9CSTJE)i5@Iq;Z$9$bjn~:d9CHCqcq_zh^Z@xRVux^ S_E?*qqU3XP b;yOgQIF2gX_H+tA(e+HVt ZO`H,(9"G NK-]BB#&{ ^3NZjBY84qc;m##4 !)!>Dq4; q4X 5<$)0rXUW!sNk[).##h W KERMIT.B[001011]K11USR.DOC;1J/ of wildcarded filenames: *.B2S match any file with a TYPE of B2S K11%%%.MAC match any file starting with K11, followed by one to three characters, with a TYPE of MAC K11???.MAC Same as above, but for RSTS/E only. XYZ.*;* All versions of files with a NAME of XYZ with any TYPE (RSX-11M/M+ and P/OS only). File formats (binary and text) RT-11 and TSX+ RT-11 treats all files as a contiguous stream of characters. There is no information stored in the directory to tell the system (or program) that a file is readable text (source program, runoff document,...) or consists of binary data (executable program, object file, .SYS file,...). An application program like Kermit-11 needs to know what type of file to expect, thus the presence of the SET FILE TYPE command (discussed later). The only real convention is that text files are streams of seven bit data with each record terminated by a carriage return/line feed character sequence and that binary files normally follow a filename TYPE convention. The TYPE (.SAV, .SYS, ...) is what Kermit-11 will look at to decide if a file should be sent as a text or binary file. RSTS/E, P/OS and RSX-11M/M+ These systems can provide for a large number of file attributes for each file by using either FCS11 (RSX-11M/M+) or RMS11 (all). Text files are normally considered to be either STREAM format (FB$STM) or VARIABLE with implied carriage control (FB$VAR and FB$CR). RSTS/E has historically defaulted to STREAM, whereas the RSX based systems use VARIABLE. Kermit-11 follows those defaults when creating files unless told to do so otherwise by the presence of attribute data. The conversion of the internal data representation to one that can be transmitted to another Kermit is transparent for these types of files. Both the file attributes and the filename TYPE are examined by Kermit-11 to determine if a file needs to be sent as a text file (default) or a binary file. Additionally, on RSTS/E Kermit checks the file protection code, as one of the bits in it is used to flag an executable file (bit 6). In all cases, unless (at this time) Kermit-11 is talking to another Kermit-11, or if Kermit-11 can't tell if a file is consists of binary data, the command SET FILE TYPE FIXED must be used to force Kermit to either send or get a non-text file correctly. When Kermit-11 is running in binary mode, all data is read from (or written to) the file without any translation or internal record control information. Any attribute information in the file's directory entry is ignored and the data read (or written) in 512 byte unformatted blocks. Thus it is indeed possible to transfer files like task images and object libraries. Since Kermit-11 supports a subset of a protocol feature called 'attributes', two Kermit-11's connected together can also PDP-11 KERMIT Page 1-5 File systems on the PDP-11 correctly transfer files other than simple text and unformatted binary files, such as RMS indexed or relative files. Saving files on the PDP-11 from your microcomputer You can send textual files to Kermit-11 without any special considerations as Kermit-11 defaults to creating normal text files. However, if you are sending a binary file (perhaps an EXE) from say, your Rainbow un: .FCTR LB:RMSLIB/LB:R0MAPC:R0RSES:R0WTBS RMSDP0: .FCTR LB:RMSDAP/LB:B16PG2:B16SAV:B16CH5:DAPIO:R0CNVT:R0NFRT-(RMDLOC,RMDREM) RMDLOC: .FCTR LB:RMSDAP/LB:R0NFLR RMDREM: . IKERMIT.B[001011]K11USR.DOC;1J#der MSDOS, you would need to tell Kermit-11 to expect binary data. This is done with the Kermit-11 command SET FILE TYPE FIXED. This will force Kermit-11 to write the data out exactly as it comes, in 512 byte unformatted records. Sending the same file back to the Rainbow would not require any special action since the file, as it sits on the PDP-11, has the proper information in the directory entry to tell Kermit-11 that the file is binary. As a note, for RT-11 you would need to use a filetype that is normally considered 'binary' like SAV or OBJ (see above notes for RT-11). Never try to do a wildcarded send with mixed binary and text files with the file type set to FIXED. The result could be unusable as not all systems store text data in the same internal format. For example, if Kermit-11 is forced into binary mode (via SET FIL TYP FIX) and is requested to send a file with implied carriage control (normal for RSX text files), it will actually send, for each line, two bytes representing the record length, followed by the data and then followed by a ascii NUL to pad the record to an even length. That is not incorrect, rather, it is EXACTLY how the data was stored on disk. In general, avoid sending anything other than unformatted binary files and text file to unlike systems. For example, requesting a RMS indexed file from the PDP-11 to be sent to a PC would case Kermit-11 to send it as a binary file, but the file attributes would be lost. Sending such a file back to the PDP-11 would result in an unusable file unless you could reconstruct the attribute information. PDP-11 KERMIT Page 1-6 Program Operation Kermit-11's prompt is normally "Kermit-11>". This can be changed if need be via the SET PROMPT command. Invoking Kermit-11 is very site dependent. RSTS/E If Kermit-11 has a ccl definition, it would likely be invoked as "KER" or "KERMIT". If not, try "RUN $KERMIT", as this is a likely place where Kermit-11 may have been put. Otherwise consult your local support staff. RSX-11M/M+ If Kermit-11 has been installed, it most likely will have a task name of ...KER which means that type "KER" should get things running. If not, consult your local support staff. RT-11/TSX+ On version 5 of RT-11, programs can be run simply by typing the filename. Thus, if there is a file SY:KERMIT.SAV, simply type "KERMIT". If this fails, contact your local support staff for assistance. P/OS Kermit-11 is generally run from DCL on P/OS. The program is invoked via the DCL RUN command, as in RUN K11POS or RUN KERMIT, depending on what the task image name is. Note that for the case where Kermit is installed (for RSTS/E and RSX-11M/M+) that Kermit-11 can get command line arguments, as in: $ KER SERV Kermit starts as a server. > KER send fubar.txt Kermit sends the file. Otherwise, the program is run interactively from the Kermit-11> prompt. $ KERMIT Kermit-11 V2.33 Kermit-11>SET BLO 3 Changes checksum type. Kermit-11>SER Enter Kermit server. Note that whenever Kermit-11 starts up, it will always try to find a file called KERMIT.INI in your current directory. This file can contain any valid Kermit command, though the usual use of this is to place various Kermit-11 SET commands XPFN:R0CLCM:R1CLOS-RMMIS RMMIS: .FCTR LB:[1,1]RMSLIB/LB:R0FREE:R0MAGT:R0RWIN:R0WATR:R1NXBK:R1RLBK:R1TRUN RMSCD: .FCTR LB:[1,1]RMSLIB/LB:R0ALBS:R0CCLN:R1CONP:R1DISC RMSEQ KERMIT.B[001011]K11USR.DOC;1JLin it. If this file does NOT exist, it will try to find it in LB:[1,2]KERMIT.INI (excluding RT-11). In addition to the .INI file, commands may be placed in a file and then executed via the Kermit-11 TAKE (or @) command. PDP-11 KERMIT Page 1-7 Local and Remote operation Kermit-11 by default assumes that all file transfers will occur over the terminal line that you are currently logged in on (TI:, TT:, KB:). This is known as REMOTE mode (the PDP-11 is the remote system). This would be the desired case if you are running Kermit on a microcomputer such as a Rainbow and are currently logged into the PDP-11 through the micro. However, if you wanted to dial out, say by an autodial modem, from the PDP-11 to another system, you need to tell Kermit-11 to use some other terminal line. This would be called LOCAL mode (the PDP-11 is the local system). The line can be altered with the SET LINE command (see section on SET and CONNECT). A SET LINE command is done implicitly if Kermit-11 finds itself running on a PRO/350, under either P/OS, RT-11 or TSX+. Since support of parity varies by both interface type (DL11 vs DZ11) and by operating system, Kermit-11 makes NO attempt to find out what the current parity of it's line is. Kermit-11 generates it's own parity which is set with the SET PARITY command. There are a couple of things to point out regarding Kermit-11 and LOCAL mode (you did a SET LINE command). The system manager may have lines other than your own protected (or owned by the system). On RSTS/E lines are often made unaccessible unless your account possesses the needed privilege(s). On RSX-11M/M+, privilege is required to alter settings on any other terminal line. You may have to talk to your system manager to get access to an outgoing terminal line. Once connected to a modem through another line, a means must exist for the connection to be broken (if the host you are calling won't do it). Given that your line has full or partial modem control (DZV11, DZ11, DH11, DHU/V11) the RSX, RT-11/TSX+ and RSTS/E Kermits have a HANGUP (or DISCONNECT) command, which instructs the system to disconnect the modem. Unless this is done, you never get disconnected and could run up a tidy phone bill. Kermit-11 has, as of v3.53, a rudimentary command line editor. You can recall previous commands with the UP-Arrow key, and exit the command with the LEFT and RIGHT arrow keys. The RUBOUT key, of course, deletes characters, while the control R key retypes the line. Control E moves to the end of the line and control H moves to the start of the line. PDP-11 KERMIT Page 1-8 Kermit-11 commands Kermit-11 has the following commands available: @ Synonym for TAKE BYE Logout a remote server CONNECT Connect to a remote system COPY Local copy of a file(s) CWD Set new working directory DELETE Local delete of a file(s) DIAL Have a connected modem dial a number DIRECT Local directory display DISCONNECT Hangup a remote line DISPLAY Internal debugging ERASE Local delete of a file(s) EXIT Exit to system FINISH Stop a remote server without logging out GET art up lun.kb == 0 ; assume if channel 0 --> terminal lun.in == 1 ; channel for input files lun.ou == 2 ; channel for output files lun.lo == 3 ; channel for pac KERMIT.B[001011]K11USR.DOC;1JP Get a file(s) from a remote server HANGUP Hangup a remote line HOST Execute system command locally (where applicable) LOCAL Force interpretation of command to the local system LOGFILE Create a log file QUIT Same as EXIT PRINT Print a file locally (where applicable) RECEIVE Receive a file(s) from a remote kermit REMOTE Prefix for file management commands to a server RENAME Local rename of filename(s) SEND Send a file(s) to a remote Kermit SERVER start a Kermit server SET Change Kermit parameters SHOW Display Kermit parameters TAKE Execute indirect comm and file TYPE Local display of file on terminal WHO Local display of logged in users (RSTS/E only) PDP-11 KERMIT Page 1-9 Commands for file transfer The SEND Command Sending a file or files: SEND filespec The SEND command causes a file or file group to be sent from the PDP-11 to the other system. If filespec contains wildcard characters then all matching files will be sent, in alphabetical order (according to the ASCII collating sequence) by name. If filespec does not contain any wildcard characters, then the single file specified by filespec will be sent. SEND Command General Operation: Files will be sent with their PDP-11 file name and type (for instance FOO.BAR). Each file will be sent according to the record type and attributes recorded in its file descriptor. Kermit-11 attempts to translate all formats of text file to a format usable on any system. Note that there is no need to set the FILE TYPE parameter for sending files, since Kermit-11 always uses the information from the file directory entry and the filetype (extension) to determine how to send the file. If communication line parity is being used (see SET PARITY), Kermit-11 will request that the other Kermit use a special kind of prefix notation for binary files. This is an advanced feature, and not all Kermits have it; if the other Kermit does not agree to use this feature, binary files cannot be sent correctly. This includes executable programs (like .EXE files, CP/M .COM files), relocatable object modules (.OBJ files), as well as any text file containing characters with the eighth bit on. Kermit-11 will also ask the other Kermit whether it can handle a special prefix encoding for repeated characters. If it can, then files with long strings of repeated characters will be transmitted very efficiently. Columnar data, highly indented text, and binary files are the major beneficiaries of this technique. If you're running Kermit-11 locally, for instance dialing out from a PDP-11 to another system using an autodialer, you should have already run Kermit on the remote system and issued either a RECEIVE or a SERVER command. Once you give Kermit-11 the SEND command, the name of each file will be displayed on your screen as the transfer begins. As the transfer continues, you will get a small display of the packet count along with the number of packets rejected. See the SET TERMINAL and SET UPDATE commands for more information. You may also type Control-X or Control-Z to interrupt the current file or file group. Control-E will also abort the transfer by sending an 'error' pac ; .SETTOP area. In the case of XM, however, we have a ; problem. In order to reduce the size of the ROOT to allow ; K11XM to run as a foreground job we ende ^KERMIT.B[001011]K11USR.DOC;1Ju&ket to the other Kermit. PDP-11 KERMIT Page 1-10 Commands for file transfer The RECEIVE command Syntax: RECEIVE [filespec] The RECEIVE command tells Kermit-11 to receive a file or file group from the other system. The name is taken from the incoming file header. If an incoming file has the same name as an existing file, Kermit-11 will by default create a new file. On RT-11 and RSTS/E, the old file will be deleted by the executive. On RSX-11M/M+ and P/OS, a new file with a higher version number will be created. To avoid files being superceded, see the SET FILE [NO]SUPERCEDE command. Incoming files will all be stored with the prevailing file type, ASCII by default, which is appropriate for text files. If you are asking Kermit-11 to receive binary files from a microcomputer or other 8-bit system, you must first type SET FILE TYPE FIXED. Otherwise, an error may occur when receiving the file. Please note that this does NOT apply to two Kermit-11 programs connected to each other. In that case the sending Kermit-11 will tell the receiving Kermit-11 to switch to binary mode if need be. If parity is being used on the communications line, then 8th-bit prefixing will be requested. If the other side cannot do this, binary files cannot be transferred correctly. If you are running Kermit-11 locally, you should already have issued a SEND command to the remote Kermit, and then escaped back to Kermit-11. As files arrive, their names will be displayed on your screen. If a file arrives that you don't really want, you can attempt to cancel it by typing Control-X; this sends a cancellation request to the remote Kermit. If the remote Kermit understands this request (not all implementations of Kermit support this feature), it will comply; otherwise it will continue to send. If a file group is being sent, you can request the entire group be cancelled by typing Control-Z. Normally, one runs the remote Kermit as a SERVER, thus the RECEIVE command is never used, rather, the GET command, described next, is used. The GET command Syntax: GET [remote-filespec] The GET command requests a remote Kermit server to send the file or file group specified by remote-filespec. This command can be used only when Kermit-11 is local, with a Kermit server on the other end of the line specified by SET LINE. This means that you must have CONNECTed to the other system, logged in, run Kermit there, issued the SERVER command, and escaped back to the PDP-11. The remote filespec is any string that can be a legal file PDP-11 KERMIT Page 1-11 Commands for file transfer specification for the remote system; it is not parsed or validated locally. Any leading spaces before the remote filespec are stripped, and lower case characters are raised to upper case. As files arrive, their names will be displayed on your screen. As in the RECEIVE command, ^X to request that the current incoming file be cancelled, ^Z to request that the entire incoming batch be cancelled. If the remote Kermit is not capable of server functions, then you will probably get an error message back from it like "Illegal packet type". In this case, you must connect to the other Kermit, give a SEND command, escape back, and give a RECEIVE command. KERMIT.B[001011]K11USR.DOC;1J-/- Server operation The SERVER command puts a remote Kermit-11 in "server mode", so that it receives all further commands in packets from the local Kermit. The Kermit-11 server is capable (as of this writing) of executing the following remote server commands: SEND, GET, FINISH, BYE, REMOTE DIRECTORY, REMOTE CWD, REMOTE SPACE, REMOTE DELETE, REMOTE TYPE, REMOTE HELP, REMOTE COPY, REMOTE RENAME, REMOTE WHO, REMOTE LOGIN and REMOTE HOST. Any nonstandard parameters should be selected with SET commands before putting Kermit-11 into server mode, in particular the file type. The Kermit-11 server can send all files in the correct manner automatically. As noted before, if a Kermit-11 is talking to another Kermit-11, they will negotiate any 'binary' parameters automatically. However, if this is NOT the case and you need to ask Kermit-11 to receive binary files you must issue the SET FILE TYPE FIX command before putting it into server mode, and then you must only send binary files. You cannot send a mixture of text files and 8-bit binary files to a Kermit-11 server unless the files are not for use on the PDP-11. Command for Servers When running in local mode, Kermit-11 allows you to give a wide range of commands to a remote Kermit server, with no guarantee the that the remote server can process them, since they are all optional features of the protocol. Commands for servers include the standard SEND, GET, BYE, FINISH commands, as well as the REMOTE command. The BYE command The BYE command tells a remote server to log out of the remote system. In addition, some remote systems will also disconnect the line for you. If this is not the case, the DISCONNECT command will (depending on your interface) cause the line to be dropped. See DISCONNECT. The FINISH command The FINISH command tells the remote Kermit server to exit without logging out of the remote system. You can then CONNECT back to the PDP-11 KERMIT Page 1-12 Server operation system. REMOTE command Send the specified command to the remote server. If the server does not understand the command (all of these commands are optional features of the Kermit protocol), it will reply with a message like "Unknown Kermit server command". If does understand, it will send the results back, and they will be displayed on the screen. The REMOTE commands are: REMOTE COPY filespec newfilespec Copy file. The server is asked to make a copy of the specified file. Both filespecs must be in the correct format for the remote system. Kermit-11 does not parse or validate the file specifications. Any leading spaces will be stripped and lower case characters converted to upper case. Note that this command simply provides for copying a file within the server's system - it does not cause a file to be transferred. REMOTE CWD directory Change Working Directory. If no directory name is provided, the server will change to the default or home directory. Kermit-11 currently does not ask for a password. REMOTE DELETE filespec Delete the specified file or files. The names of the files that are deleted will appear on your screen. REMOTE DIRECTORY [filespec] The names of the files that match the given file specification will be displayed on tR_ tR_ xR_ ~R_ R_ R_  L_  M_  M_  M_  M_  M_  M_  DN_  dN_  N_  N_  N_  N_  N_  N_  N ^KERMIT.B[001011]K11USR.DOC;1J4 your screen, perhaps along with size and date information for each file. If no file specification is given, all files from the current directory will be listed. REMOTE HELP The remote server will send back a list of server commands that it can execute. REMOTE HOST command Pass the given command to the server's host command processor, and display the resulting output on your screen. Not all Kermit servers can do this function. In the case of Kermit-11, only the RSTS/E Kermit-11 server can execute the REMOTE HOST command. REMOTE LOGIN user password Ask a remote server to log into a different account or username. PDP-11 KERMIT Page 1-13 Server operation The support for this command is rarely implemented as many systems layer login/logout support over the executive. A Kermit-11 server can only support this on RSTS/E, and at that only for version 9.0 or later. Of the various DEC PDP-11 operating systems, only RSTS/E has the support for logging in and out built into the executive and accessible with directives. REMOTE RENAME oldfile newfile Change the name on the specified file (or files). Both file specifications must be valid for the server's system. REMOTE SPACE Display information about disk usage in the current directory. REMOTE TYPE filespec Display the contents of the specified file on your screen. REMOTE WHO Display current status of user's logged in. Commands for Local File Management These commands provide some local file management capability without having to leave the Kermit-11 program. These commands are very similar to the REMOTE commands in function and syntax. They are all executed locally, and are available when Kermit-11 is either local or remote. The arguments to these commands are the same as the arguments expected from the user Kermit when Kermit-11 is processing a command in server mode. Additionally, these commands can be prefixed by the LOCAL keyword. COPY filespec newfilespec CWD directory DELETE filespec DIRECTORY [filespec] HELP HOST command RENAME oldfile newfile SPACE TYPE filespec WHO Connect The CONNECT command will allow you to connect in as a virtual terminal over the line that was specified by the set line command. (Using the PDP-11 KERMIT Page 1-14 The Connect command CONNECT command before using the SET LINE command will result in an error message) The terminal line must be one which is accessible to the user. The format of the CONNECT command is: Kermit-11>CONNECT The distributed RSX-11M/M+ task has been built with the /PR:0 switch to enable the task to change other terminal settings. Additionally, for RSX-11M/M+, the MCR command SET /SLAVE=TTnn: should be done before entering Kermit-11. If you are running K11POS.TSK on a PRO/350, Kermit will set the line to XK0: and the speed to 9600 by default. Please note that Kermit-11 CAN NOT change the speed of a DL11 type interface, nor can it change the speed of a PDT-150 modem port (use SPEED.SAV). The following is an example of using a Racal-Vadic VA212 autodialing modem to log into a remote TOPS-20 system. There is one *[001011]K11INS.RNO;1+.=/ 0D6Xd܎7n܎ 4O== U|s<0<KERMIT.B[001011]K11USR.DOC;1J\;point at which there is no echoing of the user input, this is following the typing of the local 'escape sequence', which by default is control \ followed by a 'c'. The control backslash informs the terminal emulator that the next character is a command. In this case, the command was 'C', which means to return to the local PDP-11 system. Control \ ? would print a help message. All the commands prior to the DIAL command were contained in the INI file, KERMIT.INI. $ kermit Kermit-11 V3.46 Last edit: 21-Feb-1986 Kermit-11>SET MODEM VADIC Kermit-11>SET PHO NUM CU 9K12121234567 Kermit-11>SET LOGFILE 20.LOG Kermit-11>SET DEB CONSOLE Kermit-11>SET LIN TT 58: Link: TT58: Speed: 9600, DTR not present Kermit-11>SET DTR Kermit-11>SET SPE 1200 Kermit-11>DIAL CU Using: 9K12121234567 Connection established, type CONNECT to access remote Kermit-11>CON enter class 4 class 004 start CU20B @log xx.abcdef CU20B, TOPS-20 Monitor 5.1(5101)-2 Job 28, TTY32, 2-Apr-84 4:15:24PM Previous login was 2-Apr-84 4:10:16PM . . PDP-11 KERMIT Page 1-15 The Connect command . . @log [Confirm] Logged out Job 28, User XX.ABCDEF , TTY 32, at 2-Apr-84 16:19:34, Used 0:00:11 in 0:04:10 Kermit-11>disc KERMIT link TT58: disconnected Kermit-11>exit $ logout SET The SET command is used to set various parameters in kermit. The format of the SET command is: Kermit-11>SET parameter keyword SET ATTRIBUTES Part of the Kermit protocol is the support of file attributes. Connected Kermits that support this can send information to each other about file size, time/date of creation, RMS file headers and other useful things. Due to potential problems with incompatible implementations this feature can be disabled. In this case, the sending Kermit-11 will never try to send file attributes, even though the receiver may have indicated that it supports this. Kermit-11>SET ATTRIBUTES OFF Kermit-11>SET ATTRIBUTES ON SET BAUD This is the same as SET SPEED. See HELP SET SPEED SET BINARY-TYPE Kermit-11 has a default list of filetypes that are scanned to decide if a file should be sent in binary mode in addition to checking file attributes for RSX, P/OS and RSTS/E. The user can, however, override this list with the this command. The default list is fairly inclusive, with types such as .SAV and .TSK forcing Kermit-11 into binary transmission. See HELP SET FIL for the default list. Kermit-11> SET BINARY-TYPE .SAV Kermit-11> SET BIN .EXE PDP-11 KERMIT Page 1-16 The SET COMMAND SET BLOCK-CHECK The SET BLOCKCHECK command is used to determine the block check sequence which will be used during transmission. The block check sequence is used to detect transmission errors. There are three types of block check available. These are the single character checksum (default), the two character checksum, and the three character CRC (cyclic redundancy check). This comm.KERMIT.B[001011]K11USR.DOC;1JBand does not ensure that the desired type of block check will be used, since both Kermit's involved in the transfer must agree on the block check type. Kermit-11 will request that the type of block check set by this command be used for a transfer. If the other Kermit has also had the same block check type requested, then the desired block check type will be used. Otherwise, the single character checksum will be used. The command should be given to BOTH Kermits since Kermit-11, when in server mode, has no say about what kind of checksum it wants to use. (See Kermit protocol manual for more information.) Kermit-11>SET BLOCK_CHECK keyword Kermit-11>SET BLO 1 Kermit-11>SET BLO 2 Kermit-11>SET BLO 3 Where keyword is one of: 1_CHARACTER_CHECKSUM or ONE_CHARACTER_CHECKSUM 2_CHARACTER_CHECKSUM or TWO_CHARACTER_CHECKSUM 3_CHARACTER_CRC_CCITT or THREE_CHARACTER_CRC_CCITT SET CONSOLE The SET CONSOLE command is used under P/OS to control the passing of 8 bit data to th terminal during the connect command. If you are getting multinational characters being printed, this is a very useful thing to set. The default is SET CON 7. Kermit-11>SET CON 8 Kermit-11>SET CON 7 SET DEBUG The SET DEBUG command is used to specify the type and level of debugging to a disk file . This disk file must have been created by the SET LOGFILE command. The format for SET DEBUG is: Kermit-11>SET DEBUG qualifier PDP-11 KERMIT Page 1-17 The SET COMMAND SET DEBUG ALL SET DEBUG ALL will turn on logging for CONSOLE,CONNECT,FILE,PACKET and STATE to the disk file specified by SET LOGFILE. This command is the same as SET DEBUG ON. The command format is: Kermit-11>SET DEBUG ALL SET DEBUG CONSOLE SET DEBUG CONSOLE will turn on logging for all i/o during a remote connect to the disk file specified by SET LOGFILE. This command is the same as SET DEBUG CONNECT. The command format is: Kermit-11>SET DEBUG CONSOLE SET DEBUG CONNECT SET DEBUG CONNECT will turn on logging for all i/o during a remote connect to the disk file specified by SET LOGFILE. This command is the same as SET DEBUG CONSOLE. The command format is: Kermit-11>SET DEBUG CONNECT SET DEBUG FILE SET DEBUG FILE will log all file 'opens' and 'creates' to the file specified by SET LOGFILE. The command format is: Kermit-11>SET DEBUG FILE SET DEBUG HELP SET DEBUG HELP gives the user a list of all qualifiers which can be used with SET DEBUG. Command format is: Kermit-11>SET DEBUG HELP SET DEBUG NONE SET DEBUG NONE 'turns off' all debugging. This is the same as the SET DEBUG OFF command. Command format is: Kermit-11>SET DEBUG NONE SET DEBUG OFF SET DEBUG OFF 'turns off' all debugging. This is the same as the SET PDP-11 KERMIT Page 1-18 The SET COMMAND DEBUG NONE command. Command format is: Kermit-11>SET DEBUG OFF SET DEBUG ON SET DEBUG ON will'turn on' logging for CONSOLE,CONNECT,FILE,PACKET and STATE to the disk file specified by SET LOGFILE. This command is the same as SET DEBUG ALL. The command format is: Kermit-11>SET DEBUG ON SET DEBUG PACKET +4|IU>~>Qc a:8 KK ! KE0[#"m/0 F8_Py.>  \=EA+d/OC@* P'f*"P&ei0x{A%Y*bi _cOwZ9FK9K &1_ b7S'bc#8xm{O{f@x&S?Re1#!_(6)D5 rd, ylZ4.qS^cEr^"  }{KERMIT.B[001011]K11USR.DOC;1J_ISET DEBUG PACKET will 'turn on' logging of all receive and transmit packets to the disk file specified by SET LOGFILE. The command format is: Kermit-11>SET DEBUG PACKET SET DEBUG STATE SET DEBUG STATE will turn on logging of all internal Kermit-11 state transitions SET DELAY The DELAY parameter is the number of seconds to wait before sending data after a SEND command is given. This is used when Kermit-11 is running in remote mode to allow the user time to escape back to the other Kermit and give a RECEIVE command. Kermit-11>SET DELAY number-of-seconds Where number of seconds is the (decimal) number of second to wait before sending data. SET DEFAULT The DEFAULT parameter allows you to s pecify a device and UIC (or PPN) for all subsequent file opens (for SENDING) and file creates (for RECEIVING). It is disabled by typing SET HOME. Kermit-11>SET DEFAULT device Kermit-11>SET DEFAULT DB2:[200,201] This is quite useful for Kermit-11 running on a DECNET link, as you can set the default for file operations to include node names and passwords as in: Kermit-11>set def orion::sys$system:[fubar] PDP-11 KERMIT Page 1-19 The SET COMMAND SET DIAL Kermit-11 has knowledge built in to it of a number of the more common 'smart' autodial modems. To find out if your modem is directly supported try the command SET MODEM ?. If your modem is not in this list then you need the SET DIAL command to generate the data base used by Kermit to control the modem. Kermit uses this information to implement the DIAL command. A command such as DIAL can only be done when Kermit knows both how to format commands to the modem, and what kind of text the modem will send back to it in response. As an example, the VADIC VA212PA modem is awakened from an idle state by the character sequence (in octal) 05 015 which is a Control E followed by a carriage return. In response to this two character string, the modem responds with: HELLO: I'M READY * Thus Kermit has to know that when it sends the wakeup sequence it needs to wait for the asterisk to be sent back by the modem. At this point Kermit will know that the modem is in a state awaiting further commands, such as that to dial a phone number. It is not possible for Kermit to have knowledge of all makes of modems. Instead Kermit supports a command called: Kermit-11>SET MODEM USER_DEFINED which then allows you to use the SET DIAL command to inform Kermit how the modem works. Once Kermit knows how to control the modem, you can use the DIAL command to initiate a call from Kermit. The SET DIAL commands are: SET DIAL WAKEUP define the wakeup string SET DIAL PROMPT define the prompt the modem uses SET DIAL INITIATE define a string to start dialing SET DIAL CONFIRM define the string to confirm number SET DIAL FORMAT define the number formatting string SET DIAL SUCCESS define string(s) for call complete SET DIAL INFO define string(s) for informative text SET DIAL FAILURE define string(s) for call failure SET DIAL CONFIRM define string for number confirmation SET DIAL WAKE_RATE set pause time between wakeup characters *[001011]K11HEX.BAS;1+./ 0D69ˍ7ʍ 4 Us<0KERMIT.B[001011]K11USR.DOC;1J9$$eb d|U_MOm{-:",% ;6o(_8%[FCbZ]b?DkU{GFtat*[DCHzB$35fK:VXV%}vZM- L3i{ tsIhx7t \!i u-RK:wY!N$FM {},)c~?( Ul>si(J~oE~[~e&>=<##! M HqjYV1yCwe@l`xp=:SP{-yld5ef]h?1H bdTZzX,zRiTJ7`k^^t7 v{m4>ej+4d :N>K3mqm7PVro)b3$':`~'HF7ypg09Z8J^G%6ap T39yv9R$KVvcC\ERA{5KP$b<$J@<;B3g>NTWM]9[XK_>XH =jD .ue5b9@B: NQ#K56154`qx-P=X 5@iZX(e4N*V_6rG5 BB_'`V&HN=x((naY2jow#k:Sw`d'~bbin}SD{P)% oDBs4pWrIUYFuh^HN-(fXU#W9CFqb ykTF;Dy=<.mo]8 O8p%U"3 YOOv9n$$ [k>dV2DA\Iz;u"0`i;hA\hzniHl)8\gA%~eg ,\XV'd/!/+O?"Crk=~XElA4FejAp}X{/d dd4grGzoE}RHmwm>P@'~&[u,S)k[W5=%1I$.)a C"h% \Cxv$`'PFkj6VP-;tTN|K2_j{:=Sld} A =;j7rG=HqRV*7=st|uUTTqq/(L F{qm:T_y`X(}LuSh }K2>Ow''5PqCid,Q$LA(=+n8fM2sYNb=*Y _u c09Gs- nN}}(}tF~`@c+/7V=m7^-;La=2V-%,xB*Dz 8 +~OY`cK [S?IFILXx|I_%VRnq07Tr"q`xKO?aL N!Kv*{_,r1FimULH3Aai23C#"H_IM{fEmWe%R0$TGhi +k}Q}++rvft12^9TD@R?N#}7{.3v:3u6DU`jn$X3ia;XP@1+9?PMoR?cX/<3L+ Rb=e2"G! T&~3nvjvy,iipAA9`ov!u!-~)?u[Urp6F#F7 <% E{]ea$lR#c/W%Noy L$\Vw39&X SF%fni8ZR`:)Msnp:PL(3PE:v\a Gr.B:VC0"<mv376ZQB"jQ 0[xG ]sq=tn-dVIU)wJcd2[jtIewHw8eg;`}mW'j* 6w+h%=T@Nu.z )'w\Dk5h\FQou5g4`1) #ie=b$++&((eD!d1"#/R)HWHD g`.f#+/ Ca1%yeYm1F)pZuL!L.+:61(b^NL)t+ Sh[*|o&pL] X/#AvaE0t#:\X_dv*y&=RP8h+m-7%9D}$rn>%ZM/bW\_& yu5'|\W~ATEJ85jgp_WT+'EMs`/OOS !WD/cQpi\D t(u@LWmg<7XK\)S?%V,J00`^+Gy% CHD*|abXVb[B6iDJ  b$H4AoaAL"eCOQI,v8V\nX_oJ:yL`sL!y'"8 b 2P+,WH|(A\Npf}K7 'r3} jfR-7uDOn15\`LYl 0g60RM*9:]Z9>=VK~87'sf7WC)a O<{ $c' F'[S4'};NSVu<slX0n( aq 9*kw zgrJ*9vh.3z67&)icQr$SC"(B[1^vT=( ) S_s{w#cTCftP %^OAJ{1:mN]", uwn[#Jn!+)A #*z9%d!qb]`(n?@e;3Vp)P+B (`>a_nv'Mju)ma! HTV;\+LaYIp6d_&!JL|NY 0_F>]m,-KL .Y{jaMnp$QV9R*$C#$JI^w}wmb^*! n](;8,,}v;~@yy0%U4f* 9~FjO)K Tym65ierX)s$w0 TV tv198tTl~ph@DUn..;x950BV& b=z:x+Wr %x` wcRe+u!_t(y{:Iztya,G4]MT5*)\RO ^0>?+J,Ycc^Hf*Qb3/9o*qt5b3 Wbk{00U&\9PTTVG>h8SCM'JwPYHU \@ @t7$Y]HOJ+ EJ[^XBl1%@DcZU]3{]'++7jVE_8&yGw/QU4m9b %c~P}%VEdcbtfQApP#m- 8#D$ +Ou.2TI'W 3P 5#>$,_@& B]*5\bL A<Oi &LZM]T xj~$=D|YSmtLXD6lSD,mgM*$DstUy]_'Zc9//S(}NxYEY"@AQ@ B) }iwk5ipj9 A_,{e%lX2I O/^sok T]Bc?}}t+5%RfYXi/924d| ))qA"p)PGEZx,t,Zw9QV-,s(A7#0ac##%.NF&zvxBD1d`TCN#\^cgX} RX.]m+r\RJ# ]6VfDYrg6)RF-T^`cRBziMRd>}%q_&Rj|A},o G <4 *PW%xE  FYDCoBs64sO}gZCPbB{n?hs=0.@c%qP"iAWDi,c"sx O8?ei*-Y3y==6SU <`1]#GJ;'(4{xm%g "&/:ow*&-Z0/WFd6o`cv8)P@FSRBEPjU8FNwz}GR0N}_ EXjR ,&TMNG7UGw.Vv~(.L:)=-9#wI&biZW@?o#,[h z!Z#@!.>6\sp&N1LrtVBBZ,j g4yhesEnHuWe{8&kiJy@VyuaB]T 'kG+J tfUK73c~"-8cM3;)H  }KERMIT.B[001011]K11USR.DOC;1JfP SET DIAL DIAL_RATE set pause time between number digits SET DIAL DIAL_PAUSE define string for dial tone pause Suppose we had to tell Kermit about the Racal Vadic VA212PA modem PDP-11 KERMIT Page 1-20 The SET COMMAND (though in reality Kermit already knows about that kind). In checking the owners manual for it, we find that: To wake the modem up, we type a control E followed by a carriage return. To dial a number, we type the letter D followed by a carriage return. At this point, the modem prints a NUMBER? prompt, we then type the desired number in. It reprints the number and then waits for a carriage return from us to confirm that its really the correct phone number. When it completes dialing, it will print 'ON LINE' or 'ONLINE' for a successful call, otherwise it may display on the terminal 'BUSY', 'FAILED CALL', 'NO DIAL', 'VOICE' or 'TIME OUT'. While it is waiting for its call to be answered, it may print the line 'RINGING' several times in order to tell you that it is working on it. The Kermit commands required would be: Kermit-11>SET MODEM USER_DEFINED Kermit-11>SET DIAL WAKEUP \05\015 Kermit-11>SET DIAL PROMPT * Kermit-11>SET DIAL INITIATE D\015 Kermit-11>SET DIAL FORMAT %P%S\015 Kermit-11>SET DIAL CONFIRM \015 Kermit-11>SET DIAL SUCCESS ONLINE Kermit-11>SET DIAL SUCCESS ON LINE Kermit-11>SET DIAL INFO RINGING Kermit-11>SET DIAL FAILURE BUSY Kermit-11>SET DIAL FAILURE FAILED CALL Kermit-11>SET DIAL FAILURE NO DIAL Kermit-11>SET DIAL FAILURE VOICE Kermit-11>SET DIAL FAILURE TIME OUT Kermit-11>SET DIAL DIAL_PAUSE 9K Kermit-11>DIAL 14195551212 The notation "\05\015" indicates the Control E followed by a carriage return; 05 is octal for control E, 015 is octal for carriage return. An alternate notation for octal numbers can be used by placing the value inside of inequality characters, as in SET DIAL WAKE <05><015> though the former is preferred. The notation "%P%S\015" indicates to Kermit that the phone number from the dial command is to be followed by a carriage return; the %S is simply a placeholder for the phone number. The presence of the %P is to indicate where to insert the dial pause string, in this case we need to dial 9 and wait for a second dial tone. The "K" is the Racal Vadic code to get the modem to pause. If you are dialing on a direct line, the DIAL_PAUSE command is unneeded. If for any reason you need to pass a "\" or "<" to your modem, simply prefix the character with another "\", as in "\\". PDP-11 KERMIT Page 1-21 The SET COMMAND Many modems require only the WAKEUP, PROMPT, FORMAT and result strings. The Digital DF112 is an example of this; it's definition would look like: Kermit-11>SET MODEM USER_DEFINED Kermit-11>SET DIAL WAKEUP \02 Kermit-11>SET DIAL PROMPT READY Kermit-11>SET DIAL FORMAT %S# Kermit-11>SET DIAL SUCCESS ATTACHED Kermit-11>SET DIAL FAILURE BUSY Kermit-11>SET DIAL FAILURE DISCONNECTED Kermit-11>SET DIAL FAILURE ERROR Kermit-11>SET DIAL FAILURE NO ANSWER Some modems may be unable to accept data at the line speed; in this case we would ns not know about c eof for direct access files. Will have to fix c for RT when I get the rt version done. c c c c to compile: c c f77 k11hex=k11hex c ftb c k11h KERMIT.B[001011]K11USR.DOC;1J#Weed to use the SET DIAL WAKE_RATE and SET DIAL DIAL_RATE. These two commands accept a delay time in milliseconds; the actual delay will not be precise as the PDP-11 line clock interrupts sixty times per second. Furthermore, on RSTS/E the finest granularity for timing is one second; thus setting delays would result in delays of one second increments. In general, not all of the result fields need be specified except for the call completed strings; Kermit will time out after a while if it can't match a response with any definitions. Further information can be found in the sections on SET MODEM, DIAL, REDIAL and SET PHONE. SET DTR The SET DTR command is very similar to the DISCONNECT (or HANGUP) command. SET DTR, where supported, raises DTR for a predetermined amount of time, whereas the DISCONNECT (or HANGUP) command drops DTR. The SET DTR is only functional on RSTS/E, which by default keeps DTR low until either RING INDICATOR or CARRIER DETECT goes high. This is opposite of the behavior on RT11 and RSX11M/M+, both of which normally assert DTR. The SET DTR command raises DTR for at least 30 seconds (depending on the version of RSTS/E) and is useful for making connections to front end switches (such as MICOM and GANDALF). On RT11, SET DTR is identical to the HANGUP command; it simply drops DTR for two seconds. In this case (RT11 and TSX+) this command is only supported on RT11 5.2 and TSX+ 6.0 with the XL/XC and CL drivers, respectively. This command is a no-op on RSX11M/M+ and P/OS. For further information on modem support, see the later section regarding such. SET DUPLEX The DUPLEX parameter controls whether an outgoing link (set via the SET LINE command) is a full duplex link (the default) or a half duplex link. All it does for half duplex is to cause all characters typed PDP-11 KERMIT Page 1-22 The SET COMMAND after the CONNECT command to be echoed locally. Kermit-11>SET DUPLEX HALF Kermit-11>SET DUPLEX FULL SET END-OF-LINE The END-OF-LINE parameter sets the ascii character which will be used as a line terminator for all packets SENT to the other KERMIT. This is normally not needed for most versions of KERMIT. Kermit-11>SET END-OF-LINE octal value of character SET ESCAPE This command will set the escape character for the CONNECT processing. The command will take the octal value of the character to use as the escape character. This is the character which is used to "escape" back to Kermit-11 after using the CONNECT command. It defaults to control (octal 34). It is usually a good idea to set this character to something which is not used (or at least not used very much) on the system being to which Kermit-11 is CONNECTing. Kermit-11>SET ESCAPE octal-character-value Where octal-character-value is the ASCII value of the character to use as the escape character (in octal). SET FILE The SET FILE allows you to set various file related parameters. Kermit-11>SET FIL option SET FILE TYPE ASCII File type ASCII is for text files. SET FILE TYPE TEXT is the same. SET FILE TYPE AUTO Kermit-11 will normally try to decide if a file must be sent in binary mode based on the file attributes and filetype. If, for instance, the directory entry for FUBAR.TXT showed it to be RMS (or FCS) fixed length reco*[001011]K11MNU.COM;1+./ 0D6\l9ˍ7ʍ 4 U<0KERMIT.B[001011]K11USR.DOC;1Jʣ^rds, Kermit-11 will switch to binary mode and send it verbatim. If the receiving Kermit is Kermit-11, then the sending Kermit will send attribute data over also. The following file types also will normally be sent as binary files unless you use the SET FILE TYPE NOAUTO command. *.TSK ; rsx, ias, and rsts tasks PDP-11 KERMIT Page 1-23 The SET COMMAND *.SAV ; rt11 and rsts save images *.OBJ ; compiler and mac output *.STB ; tkband link symbol tables *.CRF ; tkb and link cross reference files *.TSD ; 'time shared dibol' for rt11 *.BAC ; rsts basic+ 'compiled' files *.OLB ; rsx, ias, and r sts object libraries *.MLB ; rsx, ias, and rsts macro libraries *.RTS ; rsts/e run time systems *.EXE ; vms executable SET FILE TYPE BINARY File type BINARY is for non-text files. Note that binary files which are generated on a PDP-11 system cannot be transferred to another (non PDP-11) system without losing file attributes. This means that (for example), an RSM11 indexed file cannot be transmitted with Kermit-11 at this time. You can not have parity set to anything but NONE to use binary file transfer (see HELP SET PARITY) unless the other Kermit can process eight bit quoting. Two Kermit-11's connected to each other will use binary transmission automatically via the Kermit attribute packets, preserving file attributes where it makes sense (ie, RSTS/E and RSX only). SET FILE TYPE DECMULTINATIONAL PDP-11 Kermit normally strips the high bit of every character on both transmission and reception of files (unless the SET FILE TYPE FIXED command was given). The SET FIL DEC command will cause Kermit-11 to leave all data intact but still obey the host file system when reading or writing files. In other words, Kermit will write sequential implied carriage control files with eight bit data if this command is used. SET FILE TYPE FIXED This is the same as SET FIL TYP BIN SET FILE TYPE NOAUTO SET FILE NOAUTO disables Kermit-11 from trying to base binary transmission mode on file attributes or filetype. SET FILE SUPERCEDE SET FILE [NO]SUPERCEDE allows Kermit-11 to accept or reject files received (from either the RECEIVE or GET commands) on a per file basis. The default is SUPERCEDE. By doing SET FILE NOSUPERCEDE Kermit-11 will always check to see if the file to be created is already there (independent of version number) and reject it to the sending server if it exists. This presumes that the Kermit sending the file understands the protocol to reject one file of a (possibly) wildcarded group of files. The main use of this is to resume getting a group of files, as in GET PDP-11 KERMIT Page 1-24 The SET COMMAND KER:K11*.* or GET KER:MS????.* having lost the connection after transferring some of the files. If this is set, then any files already transferred will not be transferred again. Kermit-11>SET FILE SUPERCEDE Kermit-11>SET FILE NOSUPERCEDE SET HOME SET HOME resets the default device and UIC (or PPN) to nothing, ie, all file opens and creates use your default disk (SY:) and your UIC (or PPN). Kermit-11>SET HOME SErmits are set to binary mode can result in an unusable file after transfer because of the possibility of transfering imbedded record control information. .s 1 #Version } KERMIT.B[001011]K11USR.DOC;1JW:eT IBM-MODE The SET IBM ON (or OFF) will instruct Kermit-11 to wait for an XON following each packet sent to an IBM host. Since the default for IBM mode may not always be appropriate for your IBM compatible system, you can always use the SET HANDSHAKE XON and SET DUPLEX HALF to avoid the parity setting implied by using IBM mode. Kermit-11>SET IBM ON Kermit-11>SET IBM OFF SET LINE The SET LINE command sets the terminal name up for use with the connect command. To use this you must have access to that device. On many systems terminal lines other than your own are protected from access, and may require special procedures to access them. The form of the device name is TTnnn:, where 'nnn' is a decimal number for RSTS and an octal number for RSX-11M/M+. For RT-11, the device name is simply the MT unit number shown by the SHO TER command, as in '5' for DZ11 unit 0 line 4. If the system is running RT-11 version 5 you can do a SET LIN XL:. At worst case, Kermit-11 can use the console port on RT-11. For more information see the notes later on for RT-11 If you are running K11POS.TSK for P/OS on the PRO/350, Kermit-11 will set the line to XK0: and the speed to 9600 baud when Kermit starts. To override the line or speed, set HELP SET LINE and HELP SET SPEED. Kermit-11>SET LINE TT55: (for RSTS and RSX-11M/M+) Kermit-11>SET LINE 5 (for RT-11 and MT service) Kermit-11>SET LINE XK0: (for P/OS, done implicitly) Kermit-11>SET LINE XL: (for RT-11 and XL handler) See HELP CONNECT, HELP SET DUPLEX and HELP SET SPEED for more information. Also, for TSX+, see notes regarding TSX later in these notes. The RT-11 XL handler has notes later on also. PDP-11 KERMIT Page 1-25 The SET COMMAND SET LOGFILE The SET LOGFILE command creates a debug dump file for you. It must be used BEFORE any SET DEBUG commands can be used. See HELP DEBUG for further information about debugging modes. Kermit-11>SET LOGFILE MYLOG.TXT Created debug file MYLOG.TXT Kermit-11> SET MODEM The SET MODEM command defines the type of MODEM use for dialing out on the line set with the SET LINE command, or, in the case of the PRO/350, the XC or XK port. There are only a few modems defined at this time, they are: VADIC Generic RACAL-VADIC autodial VA212PA Stand alone VADIC VA212 VA212PAR Rack mounted VADIC VA212 VA4224 Rack mounted VADIC VA4224 .v22bis HAYES Hayes smartmodem DF100 DEC DF112 DF200 DEC DF224 DF03 DEC DF03 MICROCOM The DIAL command is then used after the SET MODEM command. For example, on a PRO/350 running P/OS: Kermit-11>set pro PRO> PRO>set modem va212pa PRO>dial 5374411 Modem in command modem Modem dialing Connection made, type CONNECT to access remote PRO>con Enter class ? VX785A Class start Username: BRIAN Password: ...................... and so on SET PACKET-LENGTH You can alt ; Copyright (C) 1986 Change Software, Inc .include /IN:K11MAC.MAC/ .library /LB:[1,1]RMSMAC.MLB/ .mcall $compare,$fetch ,$parse ,$search,$set ,$store .m *[001011]K11HEX.B2S;1+ KERMIT.B[001011]K11USR.DOC;1Jler the default transmitted packet length with the SET PACKET-LENGTH command. This should not normally be needed unless the line is very noisy, at which time you should probably give up anyway. Kermit-11>SET PACKET 60 PDP-11 KERMIT Page 1-26 The SET COMMAND SET PARITY This is used with the SET LINE and CONNECT commands to specify the type of parity for the remote link. It defaults to NONE and can be either ODD, EVEN, MARK or SPACE as in: Kermit-11>SET PARITY NONE Kermit-11>SET PARITY ODD Kermit-11>SET PARITY EVEN Kermit-11>SET PARITY MARK Kermit-11>SET PARITY SPACE All parity generation is done via software, no special hardware is used. The use of software parity generation is restricted to 8 bit links only. The character format, if parity is set to anything but NONE, will be 7 bits of data followed with high bit set or cleared to indicate the parity. If you set parity to anything but NONE (the default), Kermit-11 will be forced to request 8bit prefixing from the other Kermit-11, which is a method by which Kermit can 'prefix' eight bit characters with a shift code. You MUST use parity (even if MARK or SPACE) when using Kermit-11 with the IBM CMS Series/1 or 7171 3270 emulator. SET PAUSE PAUSE tells Kermit to wait the specified number of seconds between each packet being sent to the other Kermit. This may be useful under situations of heavy system load. This may be automatically computer by Kermit-11 in a future release as a function of line speed. Kermit-11>SET PAUSE 1 SET PHONE The SET PHONE NUMBER command allows you to associate a phone number with a symbolic name for later use with the DIAL command. These definitions could be placed in your KERMIT.INI file, and then referenced later. Kermit-11>SET PHO NUM WORK 5374411 Kermit-11>SET PHO NUM MARKET 16174671234 Kermit-11>DIAL WORK The other two SET PHONE options, SET PHONE [TONE][PULSE] and SET PHONE BLIND are not useful unless the appropiate dial formatting string and character sequences for selecting PULSE or TONE, and BLIND dialing are present in the modem definition macros in K11DIA.MAC. The format effector for TONE/PULSE is %M and the effector for BLIND is %B. Currently (in 3.54) only the VA4224 has entries for these options. SET POS The SET POS command allows options SPECIFIC to P/OS to be altered. PDP-11 KERMIT Page 1-27 The SET COMMAND The most useful option is the SET POS [NO]DTE command. This allows Kermit-11 to use PRO/Communications version 2 for terminal emulation, if this product has been installed on the PRO/350. Of course, if this option is chosen, control is returned to the PRO with the EXIT key (F10) rather than with Control \C. Kermit-11>SET POS DTE Kermit-11>SET POS NODTE SET PROMPT The SET PROMPT command is useful if you are using two Kermit-11's to talk to each other. By using the SET PROMPT command, you can change the prompt from 'Kermit-11>' on either (or both) Kermit to something that would indicate which system you are currently connected to. Kermit-11>SET PROMPT KERMIT-11/1170> Kermit-11>SET PROMPT FUBAR>  KERMIT.B[001011]K11USR.DOC;1JnIs Kermit-11>SET PROMPT PROKERMIIT-11> SET RECEIVE Currently the SET RECEIVE and SET SEND basically work the same in that they only alter the END-OF-LINE character and the START-OF-PACKET value, as in: Kermit-11>SET REC START 2 Kermit-11>SET REC END 12 The command SET RECEIVE PACKET-LENGTH command is discussed below. SET RECEIVE END-OF-LINE This instructs Kermit-11 to expect something other than the default carriage return (octal 15) at the end of a packet. Kermit-11 will ignore packet terminators. The SET SEND END command is of more use in conditioning outgoing packets. SET RECEIVE START-OF-PACKET The normal Kermit packet prefix is Control-A (1); this command changes the prefix Kermit-11 expects on incoming packets. The only reasons this should ever be changed would be: Some piece of equipment somewhere between the two Kermit programs will not pass through a Control-A; or, some piece of of equipment similarly placed is echoing its input. In the latter case, the recipient of such an echo can change the packet prefix for outbound packets to be different from that of arriving packets so that the echoed packets will be ignored. The opposite Kermit must also be told to change the prefix for its inbound packets and the prefix it uses on outgoing packets. Kermit-11>SET REC START-OF-PACKET 2 PDP-11 KERMIT Page 1-28 The SET COMMAND SET RECEIVE PACKET-LENGTH This command has two functions. The first, and normal one, is to reduce incoming packet lengths in the event that normal sized Kermit packets can not be passed through the communications circuit. There could be, perhaps, some 'black box' somewhere in the link that has a very small buffer size; this command could be used to reduce the size that the SENDING Kermit will use. The other use is to enable a new protocol extension to Kermit called 'LONG PACKETS'. The actual protocol is documented elsewhere, let's just say that this is a way for two Kermit's to use packet sizes far greater than the normal ('Classic') packet size if 90 characters or so. The main use of this feature is in file transfer over links that introduce considerable delay, it is not uncommon for packets to incur an one to two second delay. The net result is a VERY slow running Kermit with an effective speed of perhaps 300 to 600 baud rather than 1200 or 2400 baud. By making the packets longer, we raise the effective speed of such a circuit. The main restriction on the packet size chosen is the link, a given circuit may not pass 500 character packets. Also, BOTH Kermits must support this extension to the protocol, they will always negotiate it before any file transfer. See the notes at the end of this document for more information. Kermit-11>SET REC PAC 50 Kermit-11>SET REC PAC 600 It is HIGHLY recommended that you use the CRC block check, as the default type one checksum could be inadequate for such long packets, as in: Kermit-11>SET BLO 3 SET RECORD-FORMAT Kermit will, by default, create RMS11 variable length implied carriage control records for text files. You can override this and change it to create stream ascii records with the SET RECORD-FORMAT STREAM command. This is useful for RSTS/E systems if you need file compatability with BASIC Pk11atr =in:k11atr mac in:k11deb =in:k11deb mac in:k11ini =in:k11ini mac in:k11std =in:k11std mac in:k11dia =in:k11dia *[001011]K11FIL.DOC;1+ KERMIT.B[001011]K11USR.DOC;1JEzlus. Kermit-11>SET RECORD-FORMAT STREAM Kermit-11>SET RECORD-FORMAT VARIABLE This command would be most useful in a KERMIT.INI file, which is executed by KERMIT when Kermit starts. SET RETRY SET RETRY value tells Kermit to try that many times on a NAK'ed packet before giving up. This should only be needed if the line is extremely noisy or the PDP-11 host is running very slowly due to the system load. PDP-11 KERMIT Page 1-29 The SET COMMAND Kermit-11>SET RETRY 10 SET RSX The SET RSX command is intended to deal with the peculiarities often found with RSX systems. There are currently three SET RSX commands, as in: Kermit-11>SET RSX FASTIO Default for packet reading, waits for . Kermit-11>SET RSX CHARIO Read one char at a time for packet reading. Kermit-11>SET RSX TC.DLU n Alters the TC.DLU setting. Kermit-11>SET RSX CONNECT ALT Uses a new (v2.33) connect driver which bypasses TTDRV flow control. Kermit-11>SET RSX CONNECT DEF Use old connect code (2.32) The SET RSX command is subject to change and the above options may be removed in the future. Note the the SET RSX CHARIO may be needed when transfering files with parity enabled. This command alters the method by which a packet is read; instead of waiting for a carriage return, Kermit reads the typeahead byte count and then issues a read for that many characters. This is the same method Kermit-11 ALWAYS uses under P/OS. SET RT-11 SET RT-11 CREATE-SIZE The SET RT-11 CREATE value command was added to assist those RT-11 users with very small disks to be able to get files with sizes greater that half of the available contiguous space available. While this is NOT a problem going from one Kermit-11 to another Kermit-11 since the PDP-11 Kermit supports a subset of the protocol known as 'ATTRIBUTES', other Kermits may not support the exchange of file sizes (most do not). Thus if your largest contiguous space is 300 blocks and you want to get a 250 block file, the command: Kermit-11>SET RT-11 CRE 250 would be needed, as RT-11 by default only allocates 50 percent of the available space. SET RT-11 FLOW-CONTROL Note that for the connect command under RT-11 you will most likely need xon/off flow control to be generated by Kermit-11. This is enabled with the SET RT-11 FLOW command. This is by default NOFLOW since the modem the author uses, a Vadic 212PA, can't handle XONs and XOFFs while in command mode. The solution here is to escape back to Kermit command mode after the remote system has been logged into, and PDP-11 KERMIT Page 1-30 The SET COMMAND then type SET RT-11 FLOW. The effect of SET RT-11 FLOW is for Kermit-11, when in connect mode, to send an XOFF to the host every eight characters. When the loop in the connect module finds no more data in the input buffer, it sends up to 2 XON characters (in case the first XON got lost) to tell the remote system to start sending again. The reason for doing so is that the RT-11 multiple terminal service is very slow about handling input interrupts and does not do any of it's own flow contro*[001011]K11SEN.MAC;1+.-/ 0D6QcR7@eQ 4J--v U |s(0 .even at  KERMIT.B[001011]K11USR.DOC;1J%l when it's internal ring buffer gets full. This has been tested at line speeds up to 4800 baud without losing data. This setting should not be needed for use with the XC/XL handlers. SET RT-11 FLOW has NO effect on packet transmission, since the Kermit packet size is never mode than 96 characters, and the RT-11 input buffer is 134 characters in size. Kermit-11>SET RT-11 FLOW Kermit-11>SET RT-11 NOFLOW The SET RT-11 [NO]FLOW command replaces the older SET RTFLOW [ON][OFF]. SET RT-11 VOLUME-VERIFY Normally RT-11 Kermit-11 will check the directory header of a disk to verify that it most likely contains a valid RT-11 file structure before trying to read the directory. If for some reason your disk does not contain the standard data at offset 760 in the header, Kermit-11 will reject the disk. The SET RT-11 NOVOL command will instruct Kermit-11 to bypass that check. Kermit-11>SET RT-11 VOL Kermit-11>SET RT-11 NOVOL SET SEND The SET SEND command controls what Kermit-11 will be doing for outgoing packets in that you may want to alter the packet terminator and/or the start of packet character (by default, 15 octal and 1 octal respectively. See HELP SET RECEIVE for more information. The only extra option for SET SEND is SET SEND [NO]XON. If the command SET SEND XON is give, then every packet sent will be prefixed with an XON character. This could be useful in situations where flow control is erratic. The actual intent of this option was to try to circumvent a firmware bug in the DHV11 when used under RSTS/E. SET SPEED SET SPEED value sets the line speed for the device specified via the SET LINE command, and used for the CONNECT command. Changing the speed of a terminal line requires privilege for RSTS and RSX-11M/M+. The SET SPEED command will only function with a DH11, DHV11, DZ11 or DZV11 multiline interface. PDP-11 KERMIT Page 1-31 The SET COMMAND Kermit-11>SET SPEED 1200 1200 Baud would be a normal speed to use with a VA212PA or a DF03. Please note that Kermit-11 CAN NOT change the speed of a DL11 type interface, nor can it change the speed of a PDT-150 modem port. For a PDT-150 modem port, use a command of /M/S:nnnn. to change the speed to nnnn for the SPEED.SAV program. SET TIMEOUT The timeout value tells Kermit how long to wait to get a packet from the other Kermit. If system loads are high, it may be desirable to increase this beyond the default of 10 seconds. SET TERMINAL The SET TERMINAL command simply controls the way which Kermit-11 prints packet counts while send or receiving a file (or group of files). The simplest way is the default, SET TER TTY. Using SET TER VT100 will cause Kermit to display headers for the numbers printed, at a possible cost in packet speed due to screen control overhead. On the PRO/350, VT100 is assumed. On RSTS/E v9.0 and later, the executive is queried for the terminal type. Kermit-11>SET TER TTY Kermit-11>SET TER VT100 SET UPDATE The SET UPDATE command controls the frequency at which the packet count display is updated. The default is 1, displaying each packet. A SET UPD 0 will disable all packet count logs, whereas a SET UPD N will update the display every N packets. The SET NOUPKERMIT.B[001011]K11USR.DOC;1J6DATE command is the same as SET UPDATE 0. The DIAL command The DIAL command is new for version 3.29 of Kermit-11. The DIAL command is used to dial a number on an attached modem of known type (see SET MODEM). To find out the current known modems, use the SET MODEM ? command. The following example shows a RACAL-VADIC VA212 modem connect to the XK: port on a PRO/350 running P/OS version 2. Kermit-11>set pro PRO> PRO>set modem va212pa PRO>dial 5374401 Modem in command modem Modem dialing Connection failed, !BUSY PDP-11 KERMIT Page 1-32 The DIAL command PRO>dial 5374411 Modem in command modem Modem dialing Connect ion made, type CONNECT to access remote PRO>con Enter class ? VX785A Class start Username: BRIAN Password: ...................... See SET MODEM for more information. PDP-11 KERMIT Page 1-33 Notes regarding options for the System Manager Odds and ends There are a few odds and ends that should be made aware to the system manager of any PDP-11 system regarding Kermit-11. They are as follows, grouped by operating system. Please note that installation instructions are in K11INS.DOC and that additional information may be in Kermit-11's online help command. RESTRICTIONS Prior to version 2.21, Kermit-11 did not support 8-bit prefixing. Prior to version 2.23, Kermit-11 did not support repeat character encoding. The PRO/RT-11 version of Kermit-11 will request 8-bit prefixing due to the fact that the XC handler does not support 8BIT data. For most Kermits this should not be a problem. The XC handler always strips bit 7 from the character being sent, so the PRO/RT-11 version of Kermit will request prefixing of such. It does so internally by setting PARITY to SPACE (always clear the high bit, bit seven). Note that this implies that a SET PARITY SPACE command will force Kermit-11 to request '8bit' prefixing in order to transfer binary files across a seven bit link. P/OS Kermit-11 will run on under P/OS on the Pro/350, the executable file is called K11POS.TSK. It does NOT run from a menu, the normal way to run it is via the RUN command in DCL. It will support the Kermit-11 attribute packets, thus a PRO/350 connected to a PDP-11 host can transparently handle binary and other types of files. The P/OS Kermit-11 can be run either as a local Kermit or a Kermit server. This has been tested under P/OS version 2 connected to both a PDP-11/23+ and PDP-11/70 RSTS/E host. When Kermit-11 is started on the PRO, it will automatically do a SET LINE XK0: and a SET SPEED 9600. You can, of course, change the speed to whatever you need with the SET SPEED command. The line should be left as XK0:. The top row function keys are mapped internally. Kermit-11 maps F5 (break) into a true break (a space of 275 ms), F6 (interrupt) to control C, F10 to control Z, F11 to escape (octal 33) and F12 to backspace (octal 10). The incoming escape sequence DECID is intercepted to allow Kermit-11 to send back a device response of VT100. RSTS Kermit-11 runs on 4~SGxpFm"I)/a P,&CN9 [`|m~4nXL4^pPYWb5:yV.V$63H=#  aT$Zֱ^jS4 ,$V(J.5{~S>,'f] U w*Z 3 7DF%+5P%(5"y Kqpp,ne d*WyW_1=!s \ZY;8}/  }KERMIT.B[001011]K11USR.DOC;1Jversion 7.2 or later of RSTS/E. Due to options present in version 8, binary file transfers will not be possible under version 7.2 of RSTS/E. This is due to the use of 8 bit mode for the terminal link to allow all characters to be passed. The so called '8BIT' terminal setting was new as of version 8.0-06 of RSTS/E. PDP-11 KERMIT Page 1-34 Notes regarding options for the System Manager Any RSTS/E system running Kermit-11 will need the sysgen option for multiple private delimiters in the terminal driver. This special mode is needed since the 'normal' RSTS/E binary terminal mode has a 'feature' that disables binary mode whenever the terminal times out on a read. Since timeouts are essential to Kermit error recovery, binary mode can not be used for i/o. Certain functions of Kermit-11 require that the system manager install Kermit with temporary privileges, these commands are the SYSTEM, WHO and REMOTE HOST commands. Kermit-11 does NOT need these to operate correctly. Kermit-11 can only be built (from source, not from HEX files) under RSTS/E version 8.0 or later due to the use of RMS11 v2.0 and new assembler directives. Support for the server remote login is only available under RSTS/E 9.0 or later. Also, a REMOTE LOGIN command to a RSTS/E server will fail unless the user has the WACNT privilege. While the LOGIN program will skip the password lookup if WACNT is present, Kermit will require a password. RSX-11M/M+ Kermit-11 can not be installed non-checkpointable due to an apparent RMS11 bug. In other words, don't try to install the task '/CKP=NO'. To use the connect command effectively, typeahead support is needed in the terminal driver. For RSX-11M+, set the typeahead buffer size high, as in SET /TYPEAHEAD=TT22:200. Also, if your connect line is TT22: (as above), use the mcr command SET/SLAVE=TT22: Kermit-11 can only be built under RSX-11M version 4.1 or later, or under RSX-11M Plus version 2.1 or later due to the use of RMS11 v2.0 and new assembler directives. There is a SET RSX command, see HELP SET RSX for further information. As a side issue, please note that the file K11POS.TSK is quite usable under RSX, the difference being that K11RSX.TSK has DECNET support and RMS-11 overlayed in the task image (besides which, due to the lack author's systems running RSX may not be up to date) linked into it, whereas K11POS has NO Decnet support but IS linked to the RMS11 library RMSRES (v2), thus K11POS saves disk space as well as supporting named directories, ala VMS style. RT-11 Kermit-11, as of version 2.20, has been tested under RT-11 version 5.0 under the FB and XM monitors using a DZ11 line for the link, and also on a PDT-150 using the modem port for the link. It has additionally been run under Micro-11's and the PRO/350 using the XL and XC handlers respectively. PDP-11 KERMIT Page 1-35 Notes regarding options for the System Manager Kermit-11 requires .TWAIT support as well as multiple terminal support (unless the XL/XC handler is used). The use of multiple terminal support allows Kermit-11 to use any type of interface sysgened, including the DZ11 and DZV11. It is possible under version 5 of RT-11 to use the XL: handler instead of the multiple terminal support. The use of the XL: driver willupport er$xco == -37 ; could not access XC:/XL: er$fun == -40 ; invalid .spfun code er$hrd == -41 ; hard i/o error er$fet == -42 ; no room to load handler er$ KERMIT.B[001011]K11USR.DOC;1J9IND6 aL,7tAH_H .76iU)6ZL@ GE9tLaX^e#^mj7{@gkv)aL'alAbfZ.l&?2w=82q<sEj=ne>q0M&LS{laQVEK u;PzCR!XDVC #bffop:rRXZDGA[)(1H_3_j38LZ<`T}+wU\\SfyTkOxX F)J/jk%l\OX$WFj'(^5XULWW0 Z2] !.}AfbW9 HCQPP:~&` >5 1zzCy) | Sv ^#z@ eP2RrBE= 1yYx J@(Q )n+'ay!BzFNvH D N"3zX:BSEW91l^ *e ([5-e1uE4fnNj`0F*S#G#-U/7~]?J#u+oE2WX -/FDh1@ T PBPlfcYqV0JL*(^[lu 9.=N3^KxMFt"Zxb,F>mKox"^Lct ZRh+?% Y9n]4%Z{8*,0]iq:uw/vJ2cN3<=}uh: j a>jP" 1 N'GtI\`xO `y9#{*%?u ?mIB0'@N+a}}26ldbbGe! ]}k~LDgf9^UK8D{GF|F_k*)FB*kZDXo]!R_ gg6[u2zN~zz9c\F(s,KZ3.m/X 3d/"CjO}./To>$E[#Zp~:$ ` < Eo@I7`HcEyq=%9Nr?uaJ;e@U>T6q)nbg}d0c )wa]IR<"D+Eb8&%{V:d!A>SF3mc4SyrGTm3: $,~QYeM:#~tC^4t4d,sf+?[@AT q\;^,r}Rhv@b"= %(v,Ry r(X i~821*1<(9OA2: $$Y$AB ee~a}fuYVq9/TGb(.^MSN&SyotLIG#?Dc&j%;j >*j/`.g\B,0s h;LZub\B? 8e;?rUddo}g^>MQCM 8T8t= #=(i>(2n]N[.>la|` YyDv0%r w 'lax`iM 00KIFh;2+l(on`!_QB(xd*&B` vUN63]RI$$Ox}}W  x,vVTA0G71m0i}Bk4~6p/l79pmbxlIYt X;{^x=wE Gji^1)D*3=Vns,G?,NO$,zZ#Jt; ac : |y1%.K>b~W ^U(?O9raE>xfIQ?8?c&d7'c35zR\f"th1~/kq`7By J0u(r"dLY RAXX lS?f])*XCyE a=M]@6)FT2H1Q,#=@41]W 0 *k_UHp]=u\@0|INKg6nYs SD+wAR]h@pl:vdZR3&Nm p 0- y{$ R!Ja_4^E| 8qPe yT[N-\yl4M+GHR4C@dJoX'wU6{:0}c{A='k9zA3 GD;tC(bcMVn0,90mQVDWRui5;TTXp9gpN1-p;_s#Y)eY@npA~;!QRKB_T+&BZN HZ=&'o)$"j T#\O/ZXjPgq2c0or\yoE3*rN d -aA0xm KN`s"{ ]UpkL:TyZOY+lC#Fi2e=7F)Vdi{6pMzR`0k(|OpT3$cuio>;Cx`QE0i@?{J gt -;"_4vr|;4+/MVN/ :$z< u +  dUg&t0f@:e 3$}rT/VB}*@\qb2 a|c"%:IgoiRS'Z( 0;6wX}o9gq$]@L Ao*OM\n =-\V!,_GW0\Nb8|]F20t4% FeBs'6CvIcXN)Z>4 .^ v<[. e>re*lnD#tsQ$ BExSdab&ulB]!d1|Dv3x95|S(K?Z/;s"!=.?$c$;@ H t]-lTBLDsD#N-ua4fmiuoy]XM{DK"D*x)T## mJPcVSM6Di8f$dP#r}2D<.XUSF"11fo/cVvp@'BmbI^,[LG*liR+M PX6 @L@|yS1q!YysG%pY3&x.[Qi(QTNptgu?hM35_P&|JSh\@_oLA`cS1&YBVo9?>bgyfH!J`IN1Z'ea-WkXNkl3 KERMIT.B[001011]K11USR.DOC;1J} result in much faster file transfer at high baud rates. Note that XL: must be set up at system startup or at some time later to set the proper speed, CSR and vector. For those users who do not have multiple terminal support and do not have the XL handler, Kermit-11 will force the use of the console for data transfers. This will require that Kermit-11 request eight bit prefixing from any other Kermit wishing to send binary data files. Additionally, you can force console mode by doing a SET LINE TT: Please note that the device name syntax for terminal lines follows the MT unit numbers, thus if a SHO TER gave unit 5 for DZ11 line 0 the the device name would be: Kermit-11>SET LINE 5 If you use the XL handler, you would do this: Kermit-11>SET LINE XL: To force the console to be used, you would: Kermit-11>SET LINE TT: Additionally, Kermit-11 for RT-11 looks for its help file, K11HLP.HLP, on DK: first and then on SY: if the first one fails. Full wildcarding is supported for RT-11, in the form *.type, name.*, *.* and the % character to match any single character. Kermit-11 can only be built on RT-11 version 5.0 or later due to the use of new assembler directives. Please note that for the connect command under RT-11 and the use of the MT service, you will most likely need xon/off flow control to be generated by Kermit-11. This is enabled with the SET RTFLOW ON command. This is by default OFF since the modem the author uses, a Vadic 212P, can't handle XONs and XOFFs while in command mode. The solution here is to escape back to Kermit command mode after the remote system has been logged into, and then type SET RTFLOW ON. Due to overlaying constraints, the RT-11 Kermit-11 will not accept wildcards for the RENAME and DELETE commands and the REMOTE server equivalents. The executable files are K11XM.SAV for the XM system and PRO/350, and K11RT4 for the FB system. As a final (I hope) RT-11 note, see the RT-11 v5.1 Release Notes page PDP-11 KERMIT Page 1-36 Notes regarding options for the System Manager 9-2 and chapter 12. The discussion relevant here regards the use of the XL/XC handlers. Note that the default XL: handler vector (DL-11, DLV-11) is 300 and the CSR is 176500. For the Micro-11, PDP-11 and LSI-11, when the DL11/DLV11 interface is installed the field service representative will inform you what the CSR and VECTOR are. If they are NOT 176500 and 300, then to use the XL: handler you will need, prior to running Kermit-11, to set them. Suppose the DL vector is 400 and the CSR is 176510. Then the following DCL commands would set the addresses for RT-11. .SET XL CSR=176510 .SET XL VECTOR=400 You SHOULD NOT ever alter these settings for XC: on the PRO/3xx. The ONLY settings you can alter for the PRO/3xx is the speed, as in DCL command SET XC SPEED=nnnn. Kermit-11 CAN NOT alter the XC: speed itself. As noted previously in this document, Kermit-11 executes the Kermit-11 command SET LIN XC: implicitly if it finds itself running on a PRO/3xx system. Note that if your modem requires DTR to be present, you must use either an interface that asserts it (as does the PDT and PRO communications port), force it high internally to the modem, or build a cable to force it high. See HELP MODEM for more information. TSX+ While most of the abovKERMIT.B[001011]K11USR.DOC;1Je notes for RT-11 apply for TSX+, there are a few differences of note. The first, in that TSX+ is a timesharing system, allows the Kermit user to log in normally from another system running Kermit (as in a Rainbow) and give the TSX+ Kermit the SERVER command and commence file transfer operations from the other system (ie, the Rainbow). If you are dialing INTO a TSX+ system, you need to give the TSX command: .SET TT 8BIT to be able to transfer data to your local (PC, other PDP-11,...) system without incurring the overhead of the Kermit protocol known as eight bit prefixing. If this is not possible, due to your local system requiring parity, or some other intervening device adds parity, then you should give Kermit the command: Kermit-11>SET PARITY SPACE to let Kermit know that it can't send binary data as-is. To use Kermit-11 to dial out from the TSX+ system, the following commands are needed. Note that TSX+ commands will be preceeded by the normal RT-11 prompt, the ever present DOT ('.'), whereas Kermit-11 commands will be prefixed by the default Kermit-11 prompt, 'Kermit-11>'. PDP-11 KERMIT Page 1-37 Notes regarding options for the System Manager .SET CL LINE=n Where 'n' is the unit number .SET CL NOLFOUT .SET CL SPEED=n Where 'n' is the speed for that unit .ASS CL XL Kermit-11>SET LIN XL: Kermit-11>CONNECT As of Kermit-11 version 3.44, you may use CL directly in the SET LINE command, as in: .SET CL3 LINE=3 .R K11XM Kermit-11>SET LIN CL3 Kermit-11>SET SPEED 1200 Kermit-11>CONNECT A sample command file in actual use is: SET CL3 LINE=3 SET CL3 NOLFOUT SET CL3 TAB SET CL3 FORM SET CL3 SPEED=2400 ALLOCATE CL3: R K11XM DEALLOC CL3 SET CL3 LFOUT SET CL3 LINE=0 SH CL If you are running PRO/TSX+, then Kermit will make the assignment of LINE 3 to either CL0 or CL1 if you are running Kermit from the console, ie, LINE 1. The speed will default to the last SET SPEED or the speed set at system boot. Lastly, TSX+ needs PLAS support to use K11XM.SAV, see the installation notes for further data. Notes regarding modems RSTS/E version 9.x RSTS/E does not control modems signals in the manner that RSX or VMS does. VMS always asserts DTR whereas RSTS/E will not assert DTR until the terminal driver can see RCD (also known as DCD) which is pin 8 (eight) for the RS232 connection. To connect directly to a modem (like a VADIC 212, sorry, no DEC modems here) we must do one of two things: (1) Force the modem (via strapping options or whatever) to assert RCD (DCD) pin 8, thus RSTS/E will see carrier and raise DTR (pin 20 for RS232) PDP-11 KERMIT Page 1-38 MODEMS (2) Set the terminal to LOCAL (RSTS/E V9 syntax 'SET TER TTxx:/NODIAL/PERM') and break pin 20 (DTR) and connect pin 20 to 8 on the modem side. This will cause the modem to be able to dial out and allow RSTS/E to connect to it. You will also need to have the modem assert RCD, pin 8. Keep in mind that the Kermit-11 command DISCONNECT (or HANGUP) will not function if a line is set to NODIAL (INIT SET syntax 'LOCAL'). This has been tested on a Racal Vadic VAbeq 110$ ; yes, say no errors cmp r0 ,#er$fnf ; same goes for file not found bne 120$ ; exit 110$: clr r0 ; no errors 120$: unsave ; pop these and e dKERMIT.B[001011]K11USR.DOC;1JD212. (3) Break pin 8 (RCD) and loop DTR (pin 20) on the CPU side to RCD (pin 8) on the CPU side. Then use the command SET DTR in Kermit-11 to get RSTS to raise DTR and thus loop it's DTR signal back to RCD. See the next note regarding this. For those of you who have port switches such as the Gandalf type, there is one additional problem. For Gandalf, suppose you want to connect a DZ11 line to to an AMTB2. You will have a problem, in that the Gandalf AMTB2 wants to see RCD (DCD) asserted to make a connection. What you may need to do is this: Make a cable for the DZ11 to AMTB2 port as follows: CPU side AMTB2 side 20--| 8---|-----------8 7---------------7 3---------------2 2---------------3 Note that 20 is tied to 8 on the CPU side. Also, 2 is swapped for 3. Then, the Kermit-11 command SET DTR, which forces RSTS to raise DTR for 30 seconds, will cause the DTR signal to loop back to the RCD (DCD) signal and thus tell RSTS that there is carrier detect which will raise DTR (the chicken or egg question) and get things rolling. The Kermit-11 HANGUP (or DISCONNECT) command will drop DTR and force the modem to break the connection. RSX and Modems While the authors experience on RSX is limited, the following notes may be of use. Dialing out on a LOCAL line will often require that the modem assert internally DTR. If a line is set REMOTE on RSX, the driver will assert DTR and RTS. For a modem, like a VA212PAR strapped at the factory defaults, this will cause the modem to assert DSR and RCD. On the VADIC in particular, the modem will drop RCD during a DIAL command unless the modem is configured to assert RCD continuously. For dialing out, ideally the modem should be able to assert RCD via an option or internally settable strap or switch. If this is not possible, an alternative is to break line 8 (RCD) and jumper DTR (20) to RCD (8) on PDP-11 KERMIT Page 1-39 MODEMS the CPU side. This will force RSX to always see carrier detect and allow a dial sequence to complete. The Kermit-11 command DISCONNECT (or HANGUP) will still disconnect the modem as the modem will drop from the line when it sees DTR go low (assuming the modem is not strapped to assert DTR internally). PDP-11 KERMIT Page 1-40 Typical Kermit-11 transfer rates Some sample timings for Kermit-11 and long packet support. The packet size in the RSTS/E to P/OS was 500 bytes, the size from RSTS/E to RSTS/E was 700 bytes. These sizes are somewhat arbitrary, they depend more on the system's buffering capabilities than anything else. Host buffering capabilities: P/OS 500 (estimated) RSTS/E 9.0 or later up to 7000, given sufficient system pool RSX-11M+ 255 (I/D space CPU only) RSX-11M 34 RT-11 134 (could be larger with mod to XC/XL) As it can be seen, large packets make sense only for RSTS/E, P/OS and RSX-11M+ if one wishes to avoid XON/XOFF overhead at high speeds. It should be possible to run larger packets on M+ and RT-11 at lower speeds. File transferred: K11POS.TSK, size 102,400 bytes (200 disk blocks) Actual data packet chara and with the inclusion of ; the above copyright notice. This software or any ; other copies thereof may not be provided or other- ; wise made available to any othe KERMIT.B[001011]K11USR.DOC;1Jcters AFTER prefixing was 120,857 Time Speed Data rate Comments seconds baud 1436 1200 84/sec 11/44 to PRO/350, 'Classic' Kermit local phone call 1237 1200 97/sec 11/44 to PRO/350, 500 Char packets local phone call 2915 1200 41/sen 11/44 to PRO/350, 'Classic' Kermit local call, 1 second ACK delay. 1492 1200 81/sec 11/44 to PRO/350, 500 Char packets local call, 1 second ACK delay. 304 9600 397/sec 11/44 to 11/44, 'Classic' Kermit, connected locally via Gandalf switch. 245 9600 493/sec 11/44 to 11/44, 700 char packets, connected locally via Gandalf switch. The last two timings are much lower than the line speed due to the fact the the PDP 11/44 is running 100% busy trying to keep up with character interrupts using a normal terminal driver. A special purpose driver, such as the XK driver found on P/OS, would have lower overhead and allow somewhat faster data rates. Long packets were chosen for Kermit-11 due to the lack of suitable interrupt driven i/o (at this time) under one of the operating systems, RSTS/E. The Sliding Windows would likely function better in those situations where the circuit delay is much higher, or when the circuit can not accommodate large packet sizes. PDP-11 KERMIT Page 1-41 Common problems Common problems in file transfer Connection fails. Check modem control signals. RSX needs TC.DLU set to two to talk to a dial out modem, otherwise you will need to strap or jumper signals in the modem to have carrier detect set high. RSTS/E also should have the modem assert carrier detect. If not, see the previous notes about modems. If all else fails, put a breakout box in the line and observe what signals are present. File transfer fails. If the file transfer aborts on retries immediately, there may be a parity problem. If the problem shows up on binary files, try a SET PAR SPACE command to Kermit; that will force eight bit data to be prefixed into seven bits. If you instead get a retry about once every 10 seconds, the other Kermit is not responding and your Kermit is timing out. Check to see if your connection is still present, and try the SET PARITY command. If you are sending binary data between unlike Kermits, you will most likely have to give the proper command to each to prepare them for the binary data; this is the SET FILE command; for Kermit-11 it's SET FIL BIN (or SET FIL TYP FIX); for VMS Kermit it's SET FIL TYP FIX. If your Kermit's packets are being echoed back, try a SET SEND START value command for your Kermit, and a SET REC START samevalue for the other Kermit. This will force Kermit to ignore any echoed packets as they won't have the default start of packet character (a CONTROL A, octal 1). PDP-11 KERMIT Page Index-1 Index INDEX Bye, 1-11 Modems and rsx, 1-38 Commands for file transfer, 1-9 Notes regarding options for the Commands for local file system manager, 1-33 management, 1-13 Commands for servers, 1-11 Program operation, 1-6 Cot r0 ; /40/ 20$: calls inqdtr ,<#ttname> ; /40/ see if dtr or cd is up tst r0 ; /40/ if < 0 , then not supported bmi 40$ ; /40/ no good bgt 30$ ; /40/ Dtr's KERMIT.B[001011]K11USR.DOC;1J mmon problems, 1-40 Connect command, 1-13 Remote, 1-12 File formats (binary and text), Saving files on the pdp-11 from 1-4 your microcomputer, 1-5 File specifications., 1-3 Server operation, 1-11 File systems on the pdp-11, 1-3 Set command, 1-15 Finish, 1-11 Kermit-11 commands, 1-8 The dial command, 1-31 The get command, 1-10 Local and remote operation, 1-7 The receive command, 1-10 The send command, 1-9 Modems, 1-37 Typical kermit-11 transfer rates, Modems and rsts/e, 1-37 1-40 *[001011]K11USR.RNO;1+./ 0D6bA_PY7Y 4R U, |s< .comment not for RNO, but for VMS Runoff .comment runo/int k11usr , runo/ind k11usr .ch PDP-11 Kermit .lit Program: Brian Nelson Language: Macro-11 Documentation: Brian Nelson Version: 3.54 Date: September, 1986 Systems Supported: RSTS/E, RSX-11M/M+, P/OS, Micro-RSX, RT-11 and TSX+ Kermit-11 Capabilities At A Glance: Local operation: Yes Remote operation: Yes Transfer text files: Yes Transfer binary files: Yes Wildcard send: Yes File transfer interruption: Yes Filename collision avoidance: Yes Can time out: Yes 8th-bit prefixing: Yes Repeat count prefixing: Yes Alternate block checks: Yes LONG Packet protocol support Yes Sliding Windows protocol support No Terminal emulation: Yes Communication settings: Yes Transmit BREAK: Yes (depends on system) IBM mainframe communication: Yes Transaction logging: Yes Session logging: Yes Debug logging: Yes Packet logging: Yes Act as server: Yes Talk to server: Yes Advanced server functions: Yes Local file management: Yes Command/Init files: Yes File attributes packets: Yes Command macros: No Raw file transmit: Yes .eli .subtitle File systems on the PDP-11 .page .index File systems on the PDP-11 .s 1 .index File specifications. File specifications. .s 1 The general format of a file name is: .s 1 ##NODE::DEVICE:[DIRECTORY]NAME.TYPE;VERSION .s 1 'Node' refers to the DECNET node name, for example, FUBAR::, if applicable. 'Device', if present, refers to the physical device or logical name where the file resides. .s 1 For RSTS/E, 'device' can be a physical device, such as DB0: or DU1:, or it can be a user or system logical name which may include both a physical device name and a directory name. If the device name is a logical name, is it composed of 1 to 9 alphanumeric characters, including '$', as in DISK$ONE:, LB: and so on. For instance, the DCL system command .s 1 ##$ ASS/SYS DB1:[200,210] SRC$DIR .s 1 would associate both the device DB1: and directory [200,210] with SRC$DIR:. Explicitly given KERMIT.B[001011]K11USR.RNO;1Rѕ directories override directory names imbedded in a logical name. Names longer than nine characters are truncated by the executive. .s 1 In the case of RSX-11M/M+ and RT-11, the device name can be either a physical name, such as DU0:, or a logical name which will translate to a physical device name, such as LB:. .s 1 On RSTS/E and RSX-11M/M+, the [directory] is a UIC (user identification code) or PPN (project,programmer) number of the format [NNN,MMM]. All users are assigned a UIC (or PPN) when accounts are created, this is the number you give to LOGIN to log into the system. It is also your default UIC (or PPN). Micro-Rsx and P/OS may have directories in either UIC format or named directory format, such as [1,2] or [KERMIT]. For P/OS, the default directory is [USERFILES]. Directories are not used for RT-11. .s 1 The NAME field is the primary identifier for the file. The name can be one to nine characters for RSX-11M/M+ and P/O S, and one to six characters for RSTS/E, RT-11 and TSX+. The TYPE field is usually used to group files according to some convention. For example, XXX.FTN refers to a Fortran-77 source file, FOO.C to a 'C' source file, and K11POS.TSK refers to a task image. .s 1 The version field is applicable ONLY to RSX type systems. The default version is always the highest version number. .s 1 All systems mentioned support some sort of filename wildcarding, the flexibility of which varies by executive. All support the use of '*' to represent either a fully wildcarded NAME or TYPE. RSTS/E supports the use of '?' to match any single character, whereas the others use a '%' to match any single character. The RSTS/E Kermit server will translate '%' to '?' internally for the GET and REMOTE DIR commands (see chapter on the SERVER). .s 1 Examples of wildcarded filenames: .lit *.B2S match any file with a TYPE of B2S K11%%%.MAC match any file starting with K11, followed by one to three characters, with a TYPE of MAC K11???.MAC Same as above, but for RSTS/E only. XYZ.*;* All versions of files with a NAME of XYZ with any TYPE (RSX-11M/M+ and P/OS only). .eli .index File formats (binary and text) File formats (binary and text) .s 1 RT-11 and TSX+ .s 1 RT-11 treats all files as a contiguous stream of characters. There is no information stored in the directory to tell the system (or program) that a file is readable text (source program, runoff document,...) or consists of binary data (executable program, object file, .SYS file,...). An application program like Kermit-11 needs to know what type of file to expect, thus the presence of the SET FILE TYPE command (discussed later). The only real convention is that text files are streams of seven bit data with each record terminated by a carriage return/line feed character sequence and that binary files normally follow a filename TYPE convention. The TYPE (.SAV, .SYS, ...) is what Kermit-11 will look at to decide if a file should be sent as a text or binary file. .s 1 RSTS/E, P/OS and RSX-11M/M+ .s 1 These systems can provide for a large number of file attributes for each file by using either FCS11 (RSX-11M/M+) or RMS11 (all). Text files are normally considered to be either STREAM format (FB$STM) or VARIABLE with implied carriage control (FB$VAR and FB$CR). RSTS/E has historically defaulted to STREAM, whereas the RSX based systems use VARIABLE. Kermit-11 follows those defaults when creating files unless told to do so otherwise by the presence of attribute data. The conversion of the internal data t version number printed at ; program startup, ; then: ; GBLPAT=K11PAK:DO$VER:0 ; ; ; If you want kermit to NOT exit at end of file from the invocation ; as in: ker KERMIT.B[001011]K11USR.RNO;1RL  representation to one that can be transmitted to another Kermit is transparent for these types of files. Both the file attributes and the filename TYPE are examined by Kermit-11 to determine if a file needs to be sent as a text file (default) or a binary file. Additionally, on RSTS/E Kermit checks the file protection code, as one of the bits in it is used to flag an executable file (bit 6). .s 1 In all cases, unless (at this time) Kermit-11 is talking to another Kermit-11, or if Kermit-11 can't tell if a file is consists of binary data, the command SET FILE TYPE FIXED must be used to force Kermit to either send or get a non-text file correctly. When Kermit-11 is running in binary mode, all data is read from (or written to) the file without any translation or internal record control information. Any attribute information in the file's directory entry is ignored and the data read (or written) in 512 byte unformatted blocks. Thus it is indeed possible to transfer files like task images and object libraries. Since Kermit-11 supports a subset of a protocol feature called 'attributes', two Kermit-11's connected together can also correctly transfer files other than simple text and unformatted binary files, such as RMS indexed or relative files. .s 1 .index Saving files on the PDP-11 from your microcomputer Saving files on the PDP-11 from your microcomputer .s 1 You can send textual files to Kermit-11 without any special considerations as Kermit-11 defaults to creating normal text files. However, if you are sending a binary file (perhaps an EXE) from say, your Rainbow under MSDOS, you would need to tell Kermit-11 to expect binary data. This is done with the Kermit-11 command SET FILE TYPE FIXED. This will force Kermit-11 to write the data out exactly as it comes, in 512 byte unformatted records. Sending the same file back to the Rainbow would not require any special action since the file, as it sits on the PDP-11, has the proper information in the directory entry to tell Kermit-11 that the file is binary. As a note, for RT-11 you would need to use a filetype that is normally considered 'binary' like SAV or OBJ (see above notes for RT-11). .s 1 Never try to do a wildcarded send with mixed binary and text files with the file type set to FIXED. The result could be unusable as not all systems store text data in the same internal format. For example, if Kermit-11 is forced into binary mode (via SET FIL TYP FIX) and is requested to send a file with implied carriage control (normal for RSX text files), it will actually send, for each line, two bytes representing the record length, followed by the data and then followed by a ascii NUL to pad the record to an even length. That is not incorrect, rather, it is EXACTLY how the data was stored on disk. .s 1 In general, avoid sending anything other than unformatted binary files and text file to unlike systems. For example, requesting a RMS indexed file from the PDP-11 to be sent to a PC would case Kermit-11 to send it as a binary file, but the file attributes would be lost. Sending such a file back to the PDP-11 would result in an unusable file unless you could reconstruct the attribute information. .subtitle Program Operation .page .index Program Operation Kermit-11's prompt is normally "Kermit-11>". This can be changed if need be via the SET PROMPT command. Invoking Kermit-11 is very site dependent. .s 1 RSTS/E .s 1 If Kermit-11 has a ccl definition, it would likely be invoked as "KER" or "KERMIT". If not, try "RUN $KERMI $pdata .even 200$: .word 210$,220$,230$,240$,0 210$: .asciz /SY:KERMIT.INI/ 220$: .asciz /LB:[1,2]KERMIT.INI/ 230$: .asciz /SY:[1,2]KERMIT.INI/ 240$: .asciz /KERMIT gKERMIT.B[001011]K11USR.RNO;1R}T", as this is a likely place where Kermit-11 may have been put. Otherwise consult your local support staff. .s 1 RSX-11M/M+ .s 1 If Kermit-11 has been installed, it most likely will have a task name of ...KER which means that type "KER" should get things running. If not, consult your local support staff. .s 1 RT-11/TSX+ .s 1 On version 5 of RT-11, programs can be run simply by typing the filename. Thus, if there is a file SY:KERMIT.SAV, simply type "KERMIT". If this fails, contact your local support staff for assistance. .s 1 P/OS .s 1 Kermit-11 is generally run from DCL on P/OS. The program is invoked via the DCL RUN command, as in RUN K11POS or RUN KERMIT, depending on what the task image name is. .s 2 Note that for the case where Kermit is installed (for RSTS/E and RSX-11M/M+) that Kermit-11 can get command line arguments, as in: .lit $ KER SERV Kermit starts as a server. > KER send fubar.txt Kermit sends the file. .eli Othe rwise, the program is run interactively from the Kermit-11> prompt. .lit $ KERMIT Kermit-11 V2.33 Kermit-11>SET BLO 3 Changes checksum type. Kermit-11>SER Enter Kermit server. .eli Note that whenever Kermit-11 starts up, it will always try to find a file called KERMIT.INI in your current directory. This file can contain any valid Kermit command, though the usual use of this is to place various Kermit-11 SET commands in it. If this file does NOT exist, it will try to find it in LB:[1,2]KERMIT.INI (excluding RT-11). In addition to the .INI file, commands may be placed in a file and then executed via the Kermit-11 TAKE (or @) command. .subtitle Local and Remote operation .page .index Local and Remote operation Kermit-11 by default assumes that all file transfers will occur over the terminal line that you are currently logged in on (TI:, TT:, KB:). This is known as REMOTE mode (the PDP-11 is the remote system). This would be the desired case if you are running Kermit on a microcomputer such as a Rainbow and are currently logged into the PDP-11 through the micro. However, if you wanted to dial out, say by an autodial modem, from the PDP-11 to another system, you need to tell Kermit-11 to use some other terminal line. This would be called LOCAL mode (the PDP-11 is the local system). The line can be altered with the SET LINE command (see section on SET and CONNECT). A SET LINE command is done implicitly if Kermit-11 finds itself running on a PRO/350, under either P/OS, RT-11 or TSX+. .s 1 Since support of parity varies by both interface type (DL11 vs DZ11) and by operating system, Kermit-11 makes NO attempt to find out what the current parity of it's line is. Kermit-11 generates it's own parity which is set with the SET PARITY command. .s 1 There are a couple of things to point out regarding Kermit-11 and LOCAL mode (you did a SET LINE command). .s 1 .lm 5 The system manager may have lines other than your own protected (or owned by the system). On RSTS/E lines are often made unaccessible unless your account possesses the needed privilege(s). On RSX-11M/M+, privilege is required to alter settings on any other terminal line. You may have to talk to your system manager to get access to an outgoing terminal line. .s 1 Once connected to a modem through another line, a means must exist for the connection to be broken (if the host you are calling won't do it). Given that your line has full or partial modem control (DZV11, DZ11, DH11, DHU/V11) the RSX, RT-11/TSX+ and RSTS/E Kermits have a HANGUP (or DISCONNECTKERMIT.B[001011]K11USR.RNO;1R) command, which instructs the system to disconnect the modem. Unless this is done, you never get disconnected and could run up a tidy phone bill. .lm 0 .s 1 .subtitle Command line editing .s 1 Kermit-11 has, as of v3.53, a rudimentary command line editor. You can recall previous commands with the UP-Arrow key, and exit the command with the LEFT and RIGHT arrow keys. The RUBOUT key, of course, deletes characters, while the control R key retypes the line. Control E moves to the end of the line and control H moves to the start of the line. .s 1 .subtitle Kermit-11 commands .page .index Kermit-11 commands Kermit-11 has the following commands available: .s 1 .lit @ Synonym for TAKE BYE Logout a remote server CONNECT Connect to a remote system COPY Local copy of a file(s) CWD Set new working directory DELETE Local delete of a file(s) DIAL Have a connected modem dial a number DIRECT Local directory display DISCONNECT Hangup a remote line DISPLAY Internal debugging ERASE Local delete of a file(s) EXIT Exit to system FINISH Stop a remote server without logging out GET Get a file(s) from a remote server HANGUP Hangup a remote line HOST Execute system command locally (where applicable) LOCAL Force interpretation of command to the local system LOGFILE Create a log file QUIT Same as EXIT PRINT Print a file locally (where applicable) RECEIVE Receive a file(s) from a remote kermit REMOTE Prefix for file management commands to a server RENAME Local rename of filename(s) SEND Send a file(s) to a remote Kermit SERVER start a Kermit server SET Change Kermit parameters SHOW Display Kermit parameters TAKE Execute indirect command file TYPE Local display of file on terminal WHO Local display of logged in users (RSTS/E only) .eli .subtitle Commands for file transfer .page .index Commands for file transfer .index The SEND command .center;The SEND Command .s 1 Sending a file or files: .s 1 ####SEND filespec .s 1 The SEND command causes a file or file group to be sent from the PDP-11 to the other system. If filespec contains wildcard characters then all matching files will be sent, in alphabetical order (according to the ASCII collating sequence) by name. If filespec does not contain any wildcard characters, then the single file specified by filespec will be sent. .s 2 SEND Command General Operation: .s 1 Files will be sent with their PDP-11 file name and type (for instance FOO.BAR). Each file will be sent according to the record type and attributes recorded in its file descriptor. Kermit-11 attempts to translate all formats of text file to a format usable on any system. Note that there is no need to set the FILE TYPE parameter for sending files, since Kermit-11 always uses the information from the file directory entry and the filetype (extension) to determine how to send the file. .s 1 If communication line parity is being used (see SET PARITY), Kermit-11 will request that the other Kermit use a special kind of prefix notation for binary files. This is an advanced feature, and not all Kermits have it; if the other Kermit does not agree to use this feature, binary files cannot be sent correctly. This includes executable programs (like .EXE files, CP/M .COM files), relocatable object modules (.OBJ files), as well as any text file containing characters with the eighth bit on. .s 1 Kermit-11 will also ask the other Kermit whether it can handle a special prefix encoding for R_)#rNF7NH69AD[C9G[hyDC!\>Wb;Cmw8ETE;VHSS/v\$} l~BB5/ê *5CEyq ; we will need this one call ttpars ; g KERMIT.B[001011]K11USR.RNO;1R") $2) \;5f ZaKI2'c,M spp| K+. j~.m^YU8e-[sm{ 9uV) B/Eqc0"Uuz^[J<''5CHs[SEo[P-/ZoKG3)6?49F0bW0Bs 9G~5VPT $ aaQi.1?oa=A|*J {<[7uGSo i F[H RH4 {~A5-> .UV,9L7IMish3z +0QU-;hk~I_zU>8@% TOBn_lJ?utbXB_ooj@Dwx@ bt"u^z_Q N~4:U~b7gw^,/X(aSkn|(UYl48V$+} PuIFj %S)p=pR/Hh"/4CV6-(y7 ={ +? w* >ovi~)b_PxCs(dfYMf O]7HC[!zRJhj wl&A_W~Uf{NpT=4M;?3# OTH/qy,M5dXAYpkk4i{bp~e*T~Jehl^m_E_-K$%qB[?Gb8h-oXpglBnG/PriKd;YqX)jS\iW->B vJ-1L5D;[.|lm2IS5d$=TW=:iz7?YV29)[?ZRGe{`Bw8CA})bb<<CT+[F T m5bk( oC0Dlun.50QIn=bZ-rVJ2f9KG{y{> x}ww;030b /8e!Z\n.\]!Aw p8<{f3@e")UQsB *0/G Tez~w7w;4:-[U2km- ,>ZfnP^^NYO`]`_m]DQ}dxJX 1*Q:%>;f|0\n@sS7Bf^:J#!faB$@%^-mYVs/':~}m-|Ji}_0r?pii'@ucm#ei6zSO"Ledvv\j19z}*FGtMvDfYh/2J#=A[/sA\q)1b.\M414;!0\_+\y7V6T k/g@arCIc)=*_Q-`=teSbYZUv?&E7-WL> UB[8fMB[guD z9,?&R*Sj:.an<1~ZJHs/ ( E>} :|Buee i/G w b y,S/ "f4GSSuRRRaW}ej9P:IP om!@Or rf5[nC*w}q!TAP!v/V(BCIWN*tbiHQl(Y I=T{|4BG::XVTA dsKA~P)k.?KlxwzA(KE0p B{ilF.~#OX~f!z1}= ggsRJ@@|dn\)SYAfjpH[.]LN yQO&H!9Huk] 3J.e 2,Fwcu RM/e{8\:A$*i9&H^!yU JIl)jx\Bv<7t1K*TQz!!<W iQsJJ-B_rm,ti|Kbz@o)ET 0?z;:9Y6zad6<m#MsbIU$E23G8i||pW _\BAMMXDT!tWM?MB6` U@+i5We X dnlp-K%34xlx!c6B,_~ztN@/;PthVE`MA+A\x9s$&n( !3B=Z9`+0gK6yhwy4QM9ppd$2 U= a%[4D t1K!Lr8S!P09yA>/Qdb+I/JDm.aXxm[Yj=z/6NuJY*&M/#C6CdGEh^.u]wW >xP <!X7+E{6.65e/!k)d`#.WplyfF7^ ?jc>]`?l0St[U+ [t$(C 7xn;6 8qC1[Pz=iXQo6Si@$}Dqh/^[<g^/5Nt_e@w#+o&=E_&  ntX_+i +l08IE:hwh4PNZ I3>d%c1\d!Bg+^rtj@JV4tuFlX?:+JD&ql_L543]=l~tA inCNtifo;X 4=6"`B_v5XK[h`.Dr;bGtuSkZL%0)BW_B5~loFGT7l'^PkHkhAR UO(A' {-$m6kg4jTFDInnC(6 |Vb2y Y)MFAHdAM KERMIT.B[001011]K11USR.RNO;1Rj)and escaped back to the PDP-11. .s 1 The remote filespec is any string that can be a legal file specification for the remote system; it is not parsed or validated locally. Any leading spaces before the remote filespec are stripped, and lower case characters are raised to upper case. .s 1 As files arrive, their names will be displayed on your screen. As in the RECEIVE command, _^X to request that the current incoming file be cancelled, _^Z to request that the entire incoming batch be cancelled. .s 1 If the remote Kermit is not capable of server functions, then you will probably get an error message back from it like "Illegal packet type". In this case, you must connect to the other Kermit, give a SEND command, escape back, and give a RECEIVE command. .subtitle Server operation .test page 10 .index Server operation .s 1 .center;Server operation .s 1 The SERVER command puts a remote Kermit-11 in "server mode", so that it receives all further commands in packets from the local Kermit. The Kermit-11 server is capable (as of this writing) of executing the following remote server commands: SEND, GET, FINISH, BYE, REMOTE DIRECTORY, REMOTE CWD, REMOTE SPACE, REMOTE DELETE, REMOTE TYPE, REMOTE HELP, REMOTE COPY, REMOTE RENAME, REMOTE WHO, REMOTE LOGIN and REMOTE HOST. .s 1 Any nonstandard parameters should be selected with SET commands before putting Kermit-11 into server mode, in particular the file type. The Kermit-11 server can send all files in the correct manner automatically. As noted before, if a Kermit-11 is talking to another Kermit-11, they will negotiate any 'binary' parameters automatically. However, if this is NOT the case and you need to ask Kermit-11 to receive binary files you must issue the SET FILE TYPE FIX command before putting it into server mode, and then you must only send binary files. You cannot send a mixture of text files and 8-bit binary files to a Kermit-11 server unless the files are not for use on the PDP-11. .s 1 .index Commands for Servers .center;Command for Servers .s 1 When running in local mode, Kermit-11 allows you to give a wide range of commands to a remote Kermit server, with no guarantee the that the remote server can process them, since they are all optional features of the protocol. Commands for servers include the standard SEND, GET, BYE, FINISH commands, as well as the REMOTE command. .s 1 .s 1 .index BYE The BYE command .s 1 The BYE command tells a remote server to log out of the remote system. In addition, some remote systems will also disconnect the line for you. If this is not the case, the DISCONNECT command will (depending on your interface) cause the line to be dropped. See DISCONNECT. .s 1 .index FINISH The FINISH command .s 1 The FINISH command tells the remote Kermit server to exit without logging out of the remote system. You can then CONNECT back to the system. .s 1 .index REMOTE REMOTE command .s 1 Send the specified command to the remote server. If the server does not understand the command (all of these commands are optional features of the Kermit protocol), it will reply with a message like "Unknown Kermit server command". If does understand, it will send the results back, and they will be displayed on the screen. The REMOTE commands are: .s 1 REMOTE COPY filespec newfilespec .s 1 .lm 5 Copy file. The server is asked to make a copy of the specified file. Both filespecs must be in the correct format for the remote system. K*[001011]K11I31.TSK;1+./ 0D6j27uʺ1 4 Us(0CKERMIT.B[001011]K11USR.RNO;1R0ermit-11 does not parse or validate the file specifications. Any leading spaces will be stripped and lower case characters converted to upper case. Note that this command simply provides for copying a file within the server's system - it does not cause a file to be transferred. .lm 0 .s 1 REMOTE CWD directory .s 1 .lm 5 Change Working Directory. If no directory name is provided, the server will change to the default or home directory. Kermit-11 currently does not ask for a password. .lm 0 .s 1 REMOTE DELETE filespec .s 1 .lm 5 Delete the specified file or files. The names of the files that are deleted will appear on your screen. .lm 0 .s 1 REMOTE DIRECTORY [filespec] .s 1;.lm 5 The names of the files that match the given file specification will be displayed on your screen, perhaps along with size and date information for each file. If no file specification is given, all files from the current directory will be listed. .lm 0;.s 1 REMOTE HELP .s 1;.lm 5 The remote server will send back a list of server commands that it can execute. .s 1;.lm 0 REMOTE HOST command .s 1;.lm 5 Pass the given command to the server's host command processor, and display the resulting output on your screen. Not all Kermit servers can do this function. In the case of Kermit-11, only the RSTS/E Kermit-11 server can execute the REMOTE HOST command. .lm 0;.s 1 REMOTE LOGIN user password .s 1;.lm 5 Ask a remote server to log into a different account or username. The support for this command is rarely implemented as many systems layer login/logout support over the executive. A Kermit-11 server can only support this on RSTS/E, and at that only for version 9.0 or later. Of the various DEC PDP-11 operating systems, only RSTS/E has the support for logging in and out built into the executive and accessible with directives. .lm 0;.s 1 REMOTE RENAME oldfile newfile .s 1;.lm 5 Change the name on the specified file (or files). Both file specifications must be valid for the server's system. .lm 0;.s 1 REMOTE SPACE .s 1;.lm 5 Display information about disk usage in the current directory. .lm 0;.s 1 REMOTE TYPE filespec .s 1;.lm 5 Display the contents of the specified file on your screen. .lm 0;.s 1 REMOTE WHO .s 1;.lm 5 Display current status of user's logged in. .lm 0;.s 1 .subtitle Commands for Local File Management .index Commands for Local File Management .s 2 Commands for Local File Management .s 1 These commands provide some local file management capability without having to leave the Kermit-11 program. These commands are very similar to the REMOTE commands in function and syntax. They are all executed locally, and are available when Kermit-11 is either local or remote. The arguments to these commands are the same as the arguments expected from the user Kermit when Kermit-11 is processing a command in server mode. Additionally, these commands can be prefixed by the LOCAL keyword. .lit COPY filespec newfilespec CWD directory DELETE filespec DIRECTORY [filespec] HELP HOST command RENAME oldfile newfile SPACE TYPE filespec WHO .eli .subtitle The Connect command .index Connect command .s 2 Connect .s 1 The CONNECT command will allow you to connect in as a virtual terminal over the line that was specified by the set line command. (Using the CONNECT command before using the SET LINE command will result in an error message) The terminal line must be one which is accessible to the user. The format of thekw 1 ; for RSTS, something is open mode 1 sy.ini::.blkw 1 ; for KERMIT.INI stuff handch::.blkw 1 ; for ibm systems ? duplex::.blkw 1 ; if eq, full (default), els ?KERMIT.B[001011]K11USR.RNO;1R67 CONNECT command is: .lit Kermit-11>CONNECT .eli The distributed RSX-11M/M+ task has been built with the /PR:0 switch to enable the task to change other terminal settings. Additionally, for RSX-11M/M+, the MCR command SET /SLAVE=TTnn: should be done before entering Kermit-11. .s 1 If you are running K11POS.TSK on a PRO/350, Kermit will set the line to XK0: and the speed to 9600 by default. .s 1 Please note that Kermit-11 CAN NOT change the speed of a DL11 type interface, nor can it change the speed of a PDT-150 modem port (use SPEED.SAV). .s 1 The following is an example of using a Racal-Vadic VA212 autodialing modem to log into a remote TOPS-20 system. There is one point at which there is no echoing of the user input, this is following the typing of the local 'escape sequence', which by default is control _\ followed by a 'c'. The control backslash informs the terminal emulator that the next character is a command. In this case, the command was 'C', which means to return to the local PDP-11 sys tem. Control _\ ? would print a help message. All the commands prior to the DIAL command were contained in the INI file, KERMIT.INI. .lit $ kermit Kermit-11 V3.46 Last edit: 21-Feb-1986 Kermit-11>SET MODEM VADIC Kermit-11>SET PHO NUM CU 9K12121234567 Kermit-11>SET LOGFILE 20.LOG Kermit-11>SET DEB CONSOLE Kermit-11>SET LIN TT58: Link: TT58: Speed: 9600, DTR not present Kermit-11>SET DTR Kermit-11>SET SPE 1200 Kermit-11>DIAL CU Using: 9K12121234567 Connection established, type CONNECT to access remote Kermit-11>CON enter class 4 class 004 start CU20B @log xx.abcdef CU20B, TOPS-20 Monitor 5.1(5101)-2 Job 28, TTY32, 2-Apr-84 4:15:24PM Previous login was 2-Apr-84 4:10:16PM . . . . @log [Confirm] Logged out Job 28, User XX.ABCDEF , TTY 32, at 2-Apr-84 16:19:34, Used 0:00:11 in 0:04:10 Kermit-11>disc KERMIT link TT58: disconnected Kermit-11>exit $ logout .eli .s 2 .subtitle The SET COMMAND .test page 10 .index SET command .s 2 SET .s 1 The SET command is used to set various parameters in kermit. The format of the SET command is: .lit Kermit-11>SET parameter keyword .eli .s 1 SET ATTRIBUTES .s 1 Part of the Kermit protocol is the support of file attributes. Connected Kermits that support this can send information to each other about file size, time/date of creation, RMS file headers and other useful things. Due to potential problems with incompatible implementations this feature can be disabled. In this case, the sending Kermit-11 will never try to send file attributes, even though the receiver may have indicated that it supports this. .lit Kermit-11>SET ATTRIBUTES OFF Kermit-11>SET ATTRIBUTES ON .eli .s 1 SET BAUD .s 1 This is the same as SET SPEED. See HELP SET SPEED .s 1 SET BINARY-TYPE .s 1 Kermit-11 has a default list of filetypes that are scanned to decide if a file should be sent in binary mode in addition to checking file attributes for RSX, P/OS and RSTS/E. The user can, however, override this list with the this command. The default list is fairly inclusive, with types such as .SAV and .TSK forcing Kermit-11 into binary transmission. See HELP SET FIL for the default list. .lit Kermit-11> SET BINARY-TYPE .SAV Kermit-11> SET BIN .EXE .eli .s 1 SET BLOCK-CHECK .s 1 The SET BLOCK_CHECK command is used to determine the block check sequence which will be used during transmission. The block check sequence is used to detect traTART-OF-PACKET> txt < TIMEOUT> txt < TERMINAL> txt < UPDATE> txt < SHOW Display current parameters> txt < ALL> txt < BLOCK-CHECK-TYPE> txt < DEBU KERMIT.B[001011]K11USR.RNO;1R>nsmission errors. There are three types of block check available. These are the single character checksum (default), the two character checksum, and the three character CRC (cyclic redundancy check). This command does not ensure that the desired type of block check will be used, since both Kermit's involved in the transfer must agree on the block check type. Kermit-11 will request that the type of block check set by this command be used for a transfer. If the other Kermit has also had the same block check type requested, then the desired block check type will be used. Otherwise, the single character checksum will be used. The command should be given to BOTH Kermits since Kermit-11, when in server mode, has no say about what kind of checksum it wants to use. (See Kermit protocol manual for more information.) .lit Kermit-11>SET BLOCK_CHECK keyword Kermit-11>SET BLO 1 Kermit-11>SET BLO 2 Kermit-11>SET BLO 3 .eli Where keyword is one of: .lit 1_CHARACTER_CHECKSUM or ONE_CHARACTER_CHECKSUM 2_CHARACTER_CHECKSUM or TWO_CHARACTER_CHECKSUM 3_CHARACTER_CRC_CCITT or THREE_CHARACTER_CRC_CCITT .eli .s 1 SET CONSOLE .s 1 The SET CONSOLE command is used under P/OS to control the passing of 8 bit data to th terminal during the connect command. If you are getting multinational characters being printed, this is a very useful thing to set. The default is SET CON 7. .lit Kermit-11>SET CON 8 Kermit-11>SET CON 7 .eli .s 1 SET DEBUG .s 1 The SET DEBUG command is used to specify the type and level of debugging to a disk file . This disk file must have been created by the SET LOGFILE command. The format for SET DEBUG is: .lit Kermit-11>SET DEBUG qualifier .eli .s 1 SET DEBUG ALL .s 1 SET DEBUG ALL will turn on logging for CONSOLE,CONNECT,FILE,PACKET and STATE to the disk file specified by SET LOGFILE. This command is the same as SET DEBUG ON. The command format is: .lit Kermit-11>SET DEBUG ALL .eli .s 1 SET DEBUG CONSOLE .s 1 SET DEBUG CONSOLE will turn on logging for all i/o during a remote connect to the disk file specified by SET LOGFILE. This command is the same as SET DEBUG CONNECT. The command format is: .lit Kermit-11>SET DEBUG CONSOLE .eli .s 1 SET DEBUG CONNECT .s 1 SET DEBUG CONNECT will turn on logging for all i/o during a remote connect to the disk file specified by SET LOGFILE. This command is the same as SET DEBUG CONSOLE. The command format is: .lit Kermit-11>SET DEBUG CONNECT .eli .s 1 SET DEBUG FILE .s 1 SET DEBUG FILE will log all file 'opens' and 'creates' to the file specified by SET LOGFILE. The command format is: .lit Kermit-11>SET DEBUG FILE .eli .s 1 SET DEBUG HELP .s 1 SET DEBUG HELP gives the user a list of all qualifiers which can be used with SET DEBUG. Command format is: .lit Kermit-11>SET DEBUG HELP .eli .s 1 SET DEBUG NONE .s 1 SET DEBUG NONE 'turns off' all debugging. This is the same as the SET DEBUG OFF command. Command format is: .lit Kermit-11>SET DEBUG NONE .eli .s 1 SET DEBUG OFF .s 1 SET DEBUG OFF 'turns off' all debugging. This is the same as the SET DEBUG NONE command. Command format is: .lit Kermit-11>SET DEBUG OFF .eli .s 1 SET DEBUG ON .s 1 SET DEBUG ON will'turn on' logging for CONSOLE,CONNECT,FILE,PACKET and STATE to the disk file specified by SET LOGFILE. This command is the same as SET DEBUG ALL. The command format is: .l_  i_  i_  i_  i_  i_  i_  i_  i_  i_  i_  i_  j_  j_  j_  jj_  q_  jt_  u_  u_  .v_  v_  J KERMIT.B[001011]K11USR.RNO;1REit Kermit-11>SET DEBUG ON .eli .s 1 SET DEBUG PACKET .s 1 SET DEBUG PACKET will 'turn on' logging of all receive and transmit packets to the disk file specified by SET LOGFILE. The command format is: .lit Kermit-11>SET DEBUG PACKET .eli .s 1 SET DEBUG STATE .s 1 SET DEBUG STATE will turn on logging of all internal Kermit-11 state transitions .s 1 SET DELAY .s 1 The DELAY parameter is the number of seconds to wait before sending data after a SEND command is given. This is used when Kermit-11 is running in remote mode to allow the user time to escape back to the other Kermit and give a RECEIVE command. .lit Kermit-11>SET DELAY number-of-seconds .eli Where number of seconds is the (decimal) number of second to wait before sending data. .s 1 SET DEFAULT .s 1 The DEFAULT parameter allows you to specify a device and UIC (or PPN) for all subsequent file opens (for SENDING) and file creates (for RECEIVING). It is disabled by typing SET HOME. .lit Kermit-11>SET D EFAULT device Kermit-11>SET DEFAULT DB2:[200,201] .eli This is quite useful for Kermit-11 running on a DECNET link, as you can set the default for file operations to include node names and passwords as in: .lit Kermit-11>set def orion::sys$system:[fubar] .eli .s 1 SET DIAL .s 1 Kermit-11 has knowledge built in to it of a number of the more common 'smart' autodial modems. To find out if your modem is directly supported try the command SET MODEM ?. If your modem is not in this list then you need the SET DIAL command to generate the data base used by Kermit to control the modem. Kermit uses this information to implement the DIAL command. A command such as DIAL can only be done when Kermit knows both how to format commands to the modem, and what kind of text the modem will send back to it in response. As an example, the VADIC VA212PA modem is awakened from an idle state by the character sequence (in octal) .lit 05 015 .eli which is a Control E followed by a carriage return. In response to this two character string, the modem responds with: .lit HELLO: I'M READY * .eli Thus Kermit has to know that when it sends the wakeup sequence it needs to wait for the asterisk to be sent back by the modem. At this point Kermit will know that the modem is in a state awaiting further commands, such as that to dial a phone number. .s 1 It is not possible for Kermit to have knowledge of all makes of modems. Instead Kermit supports a command called: .lit Kermit-11>SET MODEM USER_DEFINED .eli which then allows you to use the SET DIAL command to inform Kermit how the modem works. Once Kermit knows how to control the modem, you can use the DIAL command to initiate a call from Kermit. .s 1 The SET DIAL commands are: .lit SET DIAL WAKEUP define the wakeup string SET DIAL PROMPT define the prompt the modem uses SET DIAL INITIATE define a string to start dialing SET DIAL CONFIRM define the string to confirm number SET DIAL FORMAT define the number formatting string SET DIAL SUCCESS define string(s) for call complete SET DIAL INFO define string(s) for informative text SET DIAL FAILURE define string(s) for call failure SET DIAL CONFIRM define string for number confirmation SET DIAL WAKE_RATE set pause time between wakeup characters SET DIAL DIAL_RATE set pause time between number digits SET DIAL DIAL_PAUSE define string for dial tone pause .eli .s 1 Suppose we had to tell Kermit about the Racal Vadic VAs block r$fab copfb2 ; associate a fab with this rab r$rac rb$seq ; access sequentially r$rbf copbuf ; where to return the data r$ubf copbuf ; where to retu !KERMIT.B[001011]K11USR.RNO;1RPsL212PA modem (though in reality Kermit already knows about that kind). In checking the owners manual for it, we find that: .s 1 .lm 5 To wake the modem up, we type a control E followed by a carriage return. .s 1 To dial a number, we type the letter D followed by a carriage return. At this point, the modem prints a NUMBER? prompt, we then type the desired number in. It reprints the number and then waits for a carriage return from us to confirm that its really the correct phone number. .s 1 When it completes dialing, it will print 'ON LINE' or 'ONLINE' for a successful call, otherwise it may display on the terminal 'BUSY', 'FAILED CALL', 'NO DIAL', 'VOICE' or 'TIME OUT'. While it is waiting for its call to be answered, it may print the line 'RINGING' several times in order to tell you that it is working on it. .lm 0 .s 2 The Kermit commands required would be: .lit Kermit-11>SET MODEM USER_DEFINED Kermit-11>SET DIAL WAKEUP \05\015 Kermit-11>SET DIAL PROMPT * Kermit-11>SET DIAL INITIATE D\015 Kermit-11>SET DIAL FORMAT %P%S\015 Kermit-11>SET DIAL CONFIRM \015 Kermit-11>SET DIAL SUCCESS ONLINE Kermit-11>SET DIAL SUCCESS ON LINE Kermit-11>SET DIAL INFO RINGING Kermit-11>SET DIAL FAILURE BUSY Kermit-11>SET DIAL FAILURE FAILED CALL Kermit-11>SET DIAL FAILURE NO DIAL Kermit-11>SET DIAL FAILURE VOICE Kermit-11>SET DIAL FAILURE TIME OUT Kermit-11>SET DIAL DIAL_PAUSE 9K Kermit-11>DIAL 14195551212 .eli The notation "_\05_\015" indicates the Control E followed by a carriage return; 05 is octal for control E, 015 is octal for carriage return. An alternate notation for octal numbers can be used by placing the value inside of inequality characters, as in SET DIAL WAKE <05><015> though the former is preferred. .br The notation "%P%S_\015" indicates to Kermit that the phone number from the dial command is to be followed by a carriage return; the %S is simply a placeholder for the phone number. The presence of the %P is to indicate where to insert the dial pause string, in this case we need to dial 9 and wait for a second dial tone. The "K" is the Racal Vadic code to get the modem to pause. If you are dialing on a direct line, the DIAL__PAUSE command is unneeded. If for any reason you need to pass a "_\" or "<" to your modem, simply prefix the character with another "_\", as in "_\_\". .s 1 Many modems require only the WAKEUP, PROMPT, FORMAT and result strings. The Digital DF112 is an example of this; it's definition would look like: .lit Kermit-11>SET MODEM USER_DEFINED Kermit-11>SET DIAL WAKEUP \02 Kermit-11>SET DIAL PROMPT READY Kermit-11>SET DIAL FORMAT %S# Kermit-11>SET DIAL SUCCESS ATTACHED Kermit-11>SET DIAL FAILURE BUSY Kermit-11>SET DIAL FAILURE DISCONNECTED Kermit-11>SET DIAL FAILURE ERROR Kermit-11>SET DIAL FAILURE NO ANSWER .eli Some modems may be unable to accept data at the line speed; in this case we would need to use the SET DIAL WAKE__RATE and SET DIAL DIAL__RATE. These two commands accept a delay time in milliseconds; the actual delay will not be precise as the PDP-11 line clock interrupts sixty times per second. Furthermore, on RSTS/E the finest granularity for timing is one second; thus setting delays would result in delays of one second increments. .s 1 In general, not all of the result fields need be specified except for the call completed strings; Kermit will time out after a while if it can't match a response with any definitions. .s 1 Further information can be found in the sections on SET MODEM, DIAL, REDI*[001011]K11M41.MAC;1+./ 0D6M7;M 4LN UՄ|s <0,strcpy .g "KERMIT.B[001011]K11USR.RNO;1RSAL and SET PHONE. .s 2 SET DTR .s 1 The SET DTR command is very similar to the DISCONNECT (or HANGUP) command. SET DTR, where supported, raises DTR for a predetermined amount of time, whereas the DISCONNECT (or HANGUP) command drops DTR. The SET DTR is only functional on RSTS/E, which by default keeps DTR low until either RING INDICATOR or CARRIER DETECT goes high. This is opposite of the behavior on RT11 and RSX11M/M+, both of which normally assert DTR. The SET DTR command raises DTR for at least 30 seconds (depending on the version of RSTS/E) and is useful for making connections to front end switches (such as MICOM and GANDALF). On RT11, SET DTR is identical to the HANGUP command; it simply drops DTR for two seconds. In this case (RT11 and TSX+) this command is only supported on RT11 5.2 and TSX+ 6.0 with the XL/XC and CL drivers, respectively. This command is a no-op on RSX11M/M+ and P/OS. For further information on modem support, see the later section regarding such. .s 2 SET DUPLEX .s 1 The DUPLEX parameter controls whether an outgo ing link (set via the SET LINE command) is a full duplex link (the default) or a half duplex link. All it does for half duplex is to cause all characters typed after the CONNECT command to be echoed locally. .lit Kermit-11>SET DUPLEX HALF Kermit-11>SET DUPLEX FULL .eli .s 2 SET END-OF-LINE .s 1 The END-OF-LINE parameter sets the ascii character which will be used as a line terminator for all packets SENT to the other KERMIT. This is normally not needed for most versions of KERMIT. .lit Kermit-11>SET END-OF-LINE octal value of character .eli .s 1 SET ESCAPE .s 1 This command will set the escape character for the CONNECT processing. The command will take the octal value of the character to use as the escape character. This is the character which is used to "escape" back to Kermit-11 after using the CONNECT command. It defaults to control \ (octal 34). It is usually a good idea to set this character to something which is not used (or at least not used very much) on the system being to which Kermit-11 is CONNECTing. .lit Kermit-11>SET ESCAPE octal-character-value .eli Where octal-character-value is the ASCII value of the character to use as the escape character (in octal). .s 1 SET FILE .s 1 The SET FILE allows you to set various file related parameters. .lit Kermit-11>SET FIL option .eli .s 1 SET FILE TYPE ASCII .s 1 File type ASCII is for text files. SET FILE TYPE TEXT is the same. .s 1 SET FILE TYPE AUTO .s 1 Kermit-11 will normally try to decide if a file must be sent in binary mode based on the file attributes and filetype. If, for instance, the directory entry for FUBAR.TXT showed it to be RMS (or FCS) fixed length records, Kermit-11 will switch to binary mode and send it verbatim. If the receiving Kermit is Kermit-11, then the sending Kermit will send attribute data over also. The following file types also will normally be sent as binary files unless you use the SET FILE TYPE NOAUTO command. .lit *.TSK ; rsx, ias, and rsts tasks *.SAV ; rt11 and rsts save images *.OBJ ; compiler and mac output *.STB ; tkband link symbol tables *.CRF ; tkb and link cross reference files *.TSD ; 'time shared dibol' for rt11 *.BAC ; rsts basic+ 'compiled' files *.OLB ; rsx, ias, and rsts object libraries *.MLB ; rsx, ias, and rsts macro libraries *.RTS ; rsts/e run time systems *.EXE ; vms executable .eli #KERMIT.B[001011]K11USR.RNO;1RiZ SET FILE TYPE BINARY .s 1 File type BINARY is for non-text files. Note that binary files which are generated on a PDP-11 system cannot be transferred to another (non PDP-11) system without losing file attributes. This means that (for example), an RSM11 indexed file cannot be transmitted with Kermit-11 at this time. You can not have parity set to anything but NONE to use binary file transfer (see HELP SET PARITY) unless the other Kermit can process eight bit quoting. Two Kermit-11's connected to each other will use binary transmission automatically via the Kermit attribute packets, preserving file attributes where it makes sense (ie, RSTS/E and RSX only). .s 1 SET FILE TYPE DEC_MULTINATIONAL .s 1 PDP-11 Kermit normally strips the high bit of every character on both transmission and reception of files (unless the SET FILE TYPE FIXED command was given). The SET FIL DEC command will cause Kermit-11 to leave all data intact but still obey the host file system when reading or writing files. In other words, Kermit will write sequential implied carriage control files with eight bit data if this command is used. .s 1 SET FILE TYPE FIXED .s 1 This is the same as SET FIL TYP BIN .s 1 SET FILE TYPE NOAUTO .s 1 SET FILE NOAUTO disables Kermit-11 from trying to base binary transmission mode on file attributes or filetype. .s 1 SET FILE SUPERCEDE .s 1 SET FILE [NO]SUPERCEDE allows Kermit-11 to accept or reject files received (from either the RECEIVE or GET commands) on a per file basis. The default is SUPERCEDE. By doing SET FILE NOSUPERCEDE Kermit-11 will always check to see if the file to be created is already there (independent of version number) and reject it to the sending server if it exists. This presumes that the Kermit sending the file understands the protocol to reject one file of a (possibly) wildcarded group of files. .br The main use of this is to resume getting a group of files, as in GET KER:K11*.* or GET KER:MS????.* having lost the connection after transferring some of the files. If this is set, then any files already transferred will not be transferred again. .lit Kermit-11>SET FILE SUPERCEDE Kermit-11>SET FILE NOSUPERCEDE .eli .s 1 SET HOME .s 1 SET HOME resets the default device and UIC (or PPN) to nothing, ie, all file opens and creates use your default disk (SY:) and your UIC (or PPN). .lit Kermit-11>SET HOME .eli .s 1 SET IBM-MODE .s 1 The SET IBM ON (or OFF) will instruct Kermit-11 to wait for an XON following each packet sent to an IBM host. Since the default for IBM mode may not always be appropriate for your IBM compatible system, you can always use the SET HANDSHAKE XON and SET DUPLEX HALF to avoid the parity setting implied by using IBM mode. .lit Kermit-11>SET IBM ON Kermit-11>SET IBM OFF .eli .s 1 SET LINE .s 1 The SET LINE command sets the terminal name up for use with the connect command. To use this you must have access to that device. On many systems terminal lines other than your own are protected from access, and may require special procedures to access them. .br The form of the device name is TTnnn:, where 'nnn' is a decimal number for RSTS and an octal number for RSX-11M/M+. For RT-11, the device name is simply the MT unit number shown by the SHO TER command, as in '5' for DZ11 unit 0 line 4. If the system is running RT-11 version 5 you can do a SET LIN XL:. At worst case, Kermit-11 can use the console port on RT-11. For more information see the notes later on*[001011]K11DEF.MAC;1+./ 0D6cF7E 4 U}(0$KERMIT.B[001011]K11USR.RNO;1R a for RT-11 If you are running K11POS.TSK for P/OS on the PRO/350, Kermit-11 will set the line to XK0: and the speed to 9600 baud when Kermit starts. To override the line or speed, set HELP SET LINE and HELP SET SPEED. .lit Kermit-11>SET LINE TT55: (for RSTS and RSX-11M/M+) Kermit-11>SET LINE 5 (for RT-11 and MT service) Kermit-11>SET LINE XK0: (for P/OS, done implicitly) Kermit-11>SET LINE XL: (for RT-11 and XL handler) .eli See HELP CONNECT, HELP SET DUPLEX and HELP SET SPEED for more information. Also, for TSX+, see notes regarding TSX later in these notes. The RT-11 XL handler has notes later on also. .s 1 SET LOGFILE .s 1 The SET LOGFILE command creates a debug dump file for you. It must be used BEFORE any SET DEBUG commands can be used. See HELP DEBUG for further information about debugging modes. .lit Kermit-11>SET LOGFILE MYLOG.TXT Created debug file MYLOG.TXT Kermit-11> .eli .s 1 SET MODEM .s 1 The SET MODEM command defines the type of MODEM use for dialing out on the line set with the SET LINE command, or, in the case of the PRO/350, the XC or XK port. There are only a few modems defined at this time, they are: .lit VADIC Generic RACAL-VADIC autodial VA212PA Stand alone VADIC VA212 VA212PAR Rack mounted VADIC VA212 VA4224 Rack mounted VADIC VA4224 .v22bis HAYES Hayes smartmodem DF100 DEC DF112 DF200 DEC DF224 DF03 DEC DF03 MICROCOM .eli The DIAL command is then used after the SET MODEM command. For example, on a PRO/350 running P/OS: .lit Kermit-11>set pro PRO> PRO>set modem va212pa PRO>dial 5374411 Modem in command modem Modem dialing Connection made, type CONNECT to access remote PRO>con Enter class ? VX785A Class start Username: BRIAN Password: ...................... and so on .eli .s 1 SET PACKET-LENGTH .s 1 You can alter the default transmitted packet length with the SET PACKET-LENGTH command. This should not normally be needed unless the line is very noisy, at which time you should probably give up anyway. .lit Kermit-11>SET PACKET 60 .eli .s 1 SET PARITY .s 1 This is used with the SET LINE and CONNECT commands to specify the type of parity for the remote link. It defaults to NONE and can be either ODD, EVEN, MARK or SPACE as in: .lit Kermit-11>SET PARITY NONE Kermit-11>SET PARITY ODD Kermit-11>SET PARITY EVEN Kermit-11>SET PARITY MARK Kermit-11>SET PARITY SPACE .eli All parity generation is done via software, no special hardware is used. The use of software parity generation is restricted to 8 bit links only. The character format, if parity is set to anything but NONE, will be 7 bits of data followed with high bit set or cleared to indicate the parity. If you set parity to anything but NONE (the default), Kermit-11 will be forced to request 8bit prefixing from the other Kermit-11, which is a method by which Kermit can 'prefix' eight bit characters with a shift code. You MUST use parity (even if MARK or SPACE) when using Kermit-11 with the IBM CMS Series/1 or 7171 3270 emulator. .s 1 SET PAUSE .s 1 PAUSE tells Kermit to wait the specified number of seconds between each packet being sent to the other Kermit. This may be useful under situations of heavy system load. This may be automatically computer by Kermit-11 in a future release as a function of line speed. .lit Kermit-11>SET PAUSE 1 .eli .s 1 SET PHONE .s 1 The SET PHONE NUMBER command allows you to associate a phone number with a symbolic name vIz[!^tl"%UNUuEp_9`w k[`1ev@GSVey6b:2S_UV94B/N90&bSFc&.C5{F<$TxgV|R!'2Q6q,i2'y :-1Wv } bv^EW,ʄ#\/ 'ANq ;fmH:\[ AJgdi_ W%KERMIT.B[001011]K11USR.RNO;1R"hfor later use with the DIAL command. These definitions could be placed in your KERMIT.INI file, and then referenced later. .lit Kermit-11>SET PHO NUM WORK 5374411 Kermit-11>SET PHO NUM MARKET 16174671234 Kermit-11>DIAL WORK .eli The other two SET PHONE options, SET PHONE [TONE][PULSE] and SET PHONE BLIND are not useful unless the appropiate dial formatting string and character sequences for selecting PULSE or TONE, and BLIND dialing are present in the modem definition macros in K11DIA.MAC. The format effector for TONE/PULSE is %M and the effector for BLIND is %B. Currently (in 3.54) only the VA4224 has entries for these options. .s 1 SET POS .s 1 The SET POS command allows options SPECIFIC to P/OS to be altered. The most useful option is the SET POS [NO]DTE command. This allows Kermit-11 to use PRO/Communications version 2 for terminal emulation, if this product has been installed on the PRO/350. Of course, if this option is chosen, control is returned to the PRO with the EXIT key (F10) rather than with Control _\C. .lit Kermit-11>SET POS DTE Kermit-11>SET POS NODTE .eli SET PROMPT .s 1 The SET PROMPT command is useful if you are using two Kermit-11's to talk to each other. By using the SET PROMPT command, you can change the prompt from 'Kermit-11>' on either (or both) Kermit to something that would indicate which system you are currently connected to. .lit Kermit-11>SET PROMPT KERMIT-11/1170> Kermit-11>SET PROMPT FUBAR> Kermit-11>SET PROMPT PROKERMIIT-11> .eli .s 1 SET RECEIVE .s 1 Currently the SET RECEIVE and SET SEND basically work the same in that they only alter the END-OF-LINE character and the START-OF-PACKET value, as in: .lit Kermit-11>SET REC START 2 Kermit-11>SET REC END 12 .eli The command SET RECEIVE PACKET-LENGTH command is discussed below. .s 1 SET RECEIVE END-OF-LINE .s 1 This instructs Kermit-11 to expect something other than the default carriage return (octal 15) at the end of a packet. Kermit-11 will ignore packet terminators. The SET SEND END command is of more use in conditioning outgoing packets. .s 1 SET RECEIVE START-OF-PACKET .s 1 The normal Kermit packet prefix is Control-A (1); this command changes the prefix Kermit-11 expects on incoming packets. The only reasons this should ever be changed would be: Some piece of equipment somewhere between the two Kermit programs will not pass through a Control-A; or, some piece of of equipment similarly placed is echoing its input. In the latter case, the recipient of such an echo can change the packet prefix for outbound packets to be different from that of arriving packets so that the echoed packets will be ignored. The opposite Kermit must also be told to change the prefix for its inbound packets and the prefix it uses on outgoing packets. .lit Kermit-11>SET REC START-OF-PACKET 2 .eli .s 1 SET RECEIVE PACKET-LENGTH .s 1 This command has two functions. The first, and normal one, is to reduce incoming packet lengths in the event that normal sized Kermit packets can not be passed through the communications circuit. There could be, perhaps, some 'black box' somewhere in the link that has a very small buffer size; this command could be used to reduce the size that the SENDING Kermit will use. .s 1 The other use is to enable a new protocol extension to Kermit called 'LONG PACKETS'. The actual protocol is documented elsewhere, let's just say that this is a way for two Kermit's to use packet sizes far greater than the noding under RT11, RSTS/E (with FIT). The floppy disk kits do NOT include any source files. The installation notes, K11INS.DOC, do not contain any references to s &KERMIT.B[001011]K11USR.RNO;1R}0A8mY)d6#cqPT7;s{u%lV4(GRqS]}H1D[)b|6fVq$8}'P'qMNdayI~0.TLNP~:%;=.P J"9e~Q-Q+zY2SDFNGE(CN@B7'Y*GuOGxUskckm |JLZ",cTWhc2F)&lm3iU(kWW+BsjQ-#F TMz8'pBbB(X^X*w\n |-#j0n9 na@Cv*RPEL{#3C@r,l< 875jt%^d;o5 MdiK$Wt4;q( hNd=`^C/)>zC U`EZb%S`udeC)V8,=b \Ze`lP9JGZ^O1Tm tTSxO3_pihZtS # 0]@'J2'6#QO5G1 6ma)i@M=I^#c s)7(0%,RLq01W,s,}]jkQQA" '.ogYqRIums,0tb[L'@J - v4y& J-$1LiPQ0b@#H#&'8uOAKx#fPZ:z=osPc>ZxD3-N7F>_`HOKkgubAXodGk+MCL ]Q'}{-ngLF]H$>Q&EX^kV T~@Ev)r2<aVOZkM"ms=*2Z6jWV5T$_"{(`ymS%6L 6JW^TS@NrFVEdGZ|LnmRN1%IqCMqw;6n%.1(/51!o X$|ZtWAHY)Z%2?}V0d& >?WP%UbW&_had$%agdJb!R1EG7d}x=<W)t_Q$>-,k_KU# <|NQlW7RJ:{B">dn6b >xNPT(bzR ZpuytycP[S]S TT 4N@`5f Q/m ma id>08zlK?4VvT4v~ `Y9sm)&UGLo/#3  8DoE@4!j vOE|,P !2c 62I}g`3 "@?Owyc'cjj:W#wTZ!>G)@Gw Y:S67Oz*k4{EO}IsW%a2Fc\ E 5w&dkl;fi7bebQ%>dQ3CiKzgIAtzekN Ymo/E/!>jWNVJB&*lp(b|;6DzBHYAq:.lO-4=n#+:aDwRN)Bnk>PzB0spp P pYU);z`l}zac& v!FQj_-7\t *5}KC%PFs5A=ozg(vj4PEIIxb H6wFyT..GN6jTKTfu>zT]?f^@`cGbGp^[+G=II,WG RBSy e0!hZHg{MJ^k>6j+fJN3_ 2ti`1F# {H o(+=i+|?{R}Sat +w{asVIpvXY%cWW+H[:o&j?ib~`gN_&ax[O0h WXl4 O#5=D ![J`,p(z^V{jl$}TT0 [zK7YI Wo]^ U] 0@6 ~$9g?WR;iQ]cxz`z-Fr JP8b'~#  5]! p-AkJ3GC|sSn_`d!^O^n!"P*_S TNu yLH/=ZvB%Oc6:<l BU']`g AbsthMkuEc6_ Cofv6:x9Lr51/4iYn=+h,%ZR=vXQ8S?Q;=F+=C a%utZff]mRkb^ V?x!t($pwt\=xR#KG`b)J* D !H0cN%$pqkE!gP_xNMcj``-7='PV "qf{/"?OPCLiJab%-(x-NE"&m(YY`bhJ%9tk ,1u.6Sdxqk-dCIH2tx`Asg~~T GG%w2MZF4x7  nLHIH2qFOQQ{(]K@B C]#NeLc!_5E:(AQSxKMul9XV`.|[k-3|v&zP]ZWudeI;}HPs*Q( vPetNl^3AZ#G!9}9ruw4CWCV/k?YuK8 ED }Yj_z( g.i%+zG8q 3.|v fMWeSk]bL_i~=5TYzHYwRAq<HCt:X71& J_ fFUO |xl Ue*~@gP0zPGsu!k[p'o4XjgpPc0"~+_ }Xgg}B8C}%oe ,31S Vwd<>D|3]] ]?@4KOiz`-,ZLj=S2@^O[X6S3 #xG74/u`7#1*Es@ZHoY R=|"kKOA[n9Wy}-I?W?9?eht-_& 8_-o6DNR(D^YFZWDPw rcc\E RC\MOnO6# F1.<%srG|5b`7R x73} GVh1Xs0G'* wZc(U]9bpzy<*Re9$DO!A(LAf+_NEf;PK_mDSb M#jFLb)7F"LV >J'J_M KD)pZP)\n .v]3\KZk{r9nwimZku}e";VI#M|ce"K [<*.x\v,)XYwso:JBsbddsud^G=!U7yhL >gGN9Xztjv0C7pG )=f %L!6VMm:%gA117!*^E"!4-pd:eg.80 ?AiA8Z7~dXRI|cW( v-YH\rOnMy :Y10Sq/ qo~SVDA+ zRV!v `c],Y<*0;pY&28}*vx=J°{o#Zt~bf"b4nf ^?y=*,s+c$?SC Y 'KERMIT.B[001011]K11USR.RNO;1Rormal ('Classic') packet size if 90 characters or so. The main use of this feature is in file transfer over links that introduce considerable delay, it is not uncommon for packets to incur an one to two second delay. The net result is a VERY slow running Kermit with an effective speed of perhaps 300 to 600 baud rather than 1200 or 2400 baud. By making the packets longer, we raise the effective speed of such a circuit. The main restriction on the packet size chosen is the link, a given circuit may not pass 500 character packets. Also, BOTH Kermits must support this extension to the protocol, they will always negotiate it before any file transfer. See the notes at the end of this document for more information. .lit Kermit-11>SET REC PAC 50 Kermit-11>SET REC PAC 600 .eli It is HIGHLY recommended that you use the CRC block check, as the default type one checksum could be inadequate for such long packets, as in: .lit Kermit-11>SET BLO 3 .eli .s 1 SET RECORD-FORMAT .s 1 Kermit will, by default, create RMS11 variable length implied carriage control records for text files. You can override this and change it to create stream ascii records with the SET RECORD-FORMAT STREAM command. This is useful for RSTS/E systems if you need file compatability with BASIC Plus. .lit Kermit-11>SET RECORD-FORMAT STREAM Kermit-11>SET RECORD-FORMAT VARIABLE .eli This command would be most useful in a KERMIT.INI file, which is executed by KERMIT when Kermit starts. .s 1 SET RETRY .s 1 SET RETRY value tells Kermit to try that many times on a NAK'ed packet before giving up. This should only be needed if the line is extremely noisy or the PDP-11 host is running very slowly due to the system load. .lit Kermit-11>SET RETRY 10 .eli .s 1 SET RSX .s 1 The SET RSX command is intended to deal with the peculiarities often found with RSX systems. There are currently three SET RSX commands, as in: .lit Kermit-11>SET RSX FASTIO Default for packet reading, waits for . Kermit-11>SET RSX CHARIO Read one char at a time for packet reading. Kermit-11>SET RSX TC.DLU n Alters the TC.DLU setting. Kermit-11>SET RSX CONNECT ALT Uses a new (v2.33) connect driver which bypasses TTDRV flow control. Kermit-11>SET RSX CONNECT DEF Use old connect code (2.32) .eli .S 1 The SET RSX command is subject to change and the above options may be removed in the future. Note the the SET RSX CHARIO may be needed when transfering files with parity enabled. This command alters the method by which a packet is read; instead of waiting for a carriage return, Kermit reads the typeahead byte count and then issues a read for that many characters. This is the same method Kermit-11 ALWAYS uses under P/OS. .s 1 SET RT-11 .s 1 SET RT-11 CREATE-SIZE .s 1 The SET RT-11 CREATE value command was added to assist those RT-11 users with very small disks to be able to get files with sizes greater that half of the available contiguous space available. While this is NOT a problem going from one Kermit-11 to another Kermit-11 since the PDP-11 Kermit supports a subset of the protocol known as 'ATTRIBUTES', other Kermits may not support the exchange of file sizes (most do not). Thus if your largest contiguous space is 300 blocks and you want to get a 250 block file, the command: .lit Kermit-11>SET RT-11 CRE 250 .eli would be needed, as RT-11 by default only allocates 50 percent of the available space. .s 1 SET RT-11 FLOW-CONTROL .s 1 Note that for the connect comma?-7vqH49\h:ew4DEpP4c_A-!/I\>XRI|cW( v-YH\rOnMy :Y10Sq/ qo~SVDA+ zRV!v `c],Y<*0;pY&28}*vx=J°{o#Zt~bf"b4nf ^?y=*,s+c$?SC Y (KERMIT.B[001011]K11USR.RNO;1R*fvnd under RT-11 you will most likely need xon/off flow control to be generated by Kermit-11. This is enabled with the SET RT-11 FLOW command. This is by default NOFLOW since the modem the author uses, a Vadic 212PA, can't handle XONs and XOFFs while in command mode. The solution here is to escape back to Kermit command mode after the remote system has been logged into, and then type SET RT-11 FLOW. .br The effect of SET RT-11 FLOW is for Kermit-11, when in connect mode, to send an XOFF to the host every eight characters. When the loop in the connect module finds no more data in the input buffer, it sends up to 2 XON characters (in case the first XON got lost) to tell the remote system to start sending again. The reason for doing so is that the RT-11 multiple terminal service is very slow about handling input interrupts and does not do any of it's own flow control when it's internal ring buffer gets full. This has been tested at line speeds up to 4800 baud without losing data. This setting should not be needed for use with the XC/XL handlers. .br SET RT-11 FLOW has NO effect on packet transmission, since the Kermit packet size is never mode than 96 characters, and the RT-11 input buffer is 134 characters in size. .lit Kermit-11>SET RT-11 FLOW Kermit-11>SET RT-11 NOFLOW .eli The SET RT-11 [NO]FLOW command replaces the older SET RTFLOW [ON][OFF]. .s 1 SET RT-11 VOLUME-VERIFY .s 1 Normally RT-11 Kermit-11 will check the directory header of a disk to verify that it most likely contains a valid RT-11 file structure before trying to read the directory. If for some reason your disk does not contain the standard data at offset 760 in the header, Kermit-11 will reject the disk. The SET RT-11 NOVOL command will instruct Kermit-11 to bypass that check. .lit Kermit-11>SET RT-11 VOL Kermit-11>SET RT-11 NOVOL .eli .s 1 SET SEND .s 1 The SET SEND command controls what Kermit-11 will be doing for outgoing packets in that you may want to alter the packet terminator and/or the start of packet character (by default, 15 octal and 1 octal respectively. See HELP SET RECEIVE for more information. .s 1 The only extra option for SET SEND is SET SEND [NO]XON. If the command SET SEND XON is give, then every packet sent will be prefixed with an XON character. This could be useful in situations where flow control is erratic. The actual intent of this option was to try to circumvent a firmware bug in the DHV11 when used under RSTS/E. .s 1 SET SPEED .s 1 SET SPEED value sets the line speed for the device specified via the SET LINE command, and used for the CONNECT command. Changing the speed of a terminal line requires privilege for RSTS and RSX-11M/M+. The SET SPEED command will only function with a DH11, DHV11, DZ11 or DZV11 multiline interface. .lit Kermit-11>SET SPEED 1200 .eli 1200 Baud would be a normal speed to use with a VA212PA or a DF03. .s 1 Please note that Kermit-11 CAN NOT change the speed of a DL11 type interface, nor can it change the speed of a PDT-150 modem port. For a PDT-150 modem port, use a command of /M/S:nnnn. to change the speed to nnnn for the SPEED.SAV program. .s 1 SET TIMEOUT .s 1 The timeout value tells Kermit how long to wait to get a packet from the other Kermit. If system loads are high, it may be desirable to increase this beyond the default of 10 seconds. .s 1 SET TERMINAL .s 1 The SET TERMINAL command simply controls the way which Kermit-11 prints packet counts while send or receiving a file (or group of files). ThvIz[!^tl"%UNUuEp_9`w k[`1ev@GSVey6b:2S_UV94B/N90&bSFc&.C5{F<$TxgV|R!'2Q6q,i2'y :-1Wv } bv^EW,ʄ#\/ 'ANq ;fmH:\[ AJgdi_ )KERMIT.B[001011]K11USR.RNO;1R}e simplest way is the default, SET TER TTY. Using SET TER VT100 will cause Kermit to display headers for the numbers printed, at a possible cost in packet speed due to screen control overhead. On the PRO/350, VT100 is assumed. On RSTS/E v9.0 and later, the executive is queried for the terminal type. .lit Kermit-11>SET TER TTY Kermit-11>SET TER VT100 .eli .s 1 SET UPDATE .s 1 The SET UPDATE command controls the frequency at which the packet count display is updated. The default is 1, displaying each packet. A SET UPD 0 will disable all packet count logs, whereas a SET UPD N will update the display every N packets. The SET NOUPDATE command is the same as SET UPDATE 0. .s 2 .subtitle The DIAL command .index The DIAL Command The DIAL command .s 2 The DIAL command is new for version 3.29 of Kermit-11. The DIAL command is used to dial a number on an attached modem of known type (see SET MODEM). To find out the current known modems, use the SET MODEM ? command. The following example shows a RACAL-VADIC VA212 modem connect to the XK: port on a PRO/350 running P/OS version 2. .lit Kermit-11>set pro PRO> PRO>set modem va212pa PRO>dial 5374401 Modem in command modem Modem dialing Connection failed, !BUSY PRO>dial 5374411 Modem in command modem Modem dialing Connection made, type CONNECT to access remote PRO>con Enter class ? VX785A Class start Username: BRIAN Password: ...................... .eli See SET MODEM for more information. .subtitle Notes regarding options for the System Manager .page .index Notes regarding options for the System Manager .s 2 .c;Odds and ends .s 1 There are a few odds and ends that should be made aware to the system manager of any PDP-11 system regarding Kermit-11. They are as follows, grouped by operating system. Please note that installation instructions are in K11INS.DOC and that additional information may be in Kermit-11's online help command. .s 2 RESTRICTIONS .s 1 Prior to version 2.21, Kermit-11 did not support 8-bit prefixing. .br Prior to version 2.23, Kermit-11 did not support repeat character encoding. .br #The PRO/RT-11 version of Kermit-11 will request 8-bit prefixing due to the fact that the XC handler does not support 8BIT data. For most Kermits this should not be a problem. The XC handler always strips bit 7 from the character being sent, so the PRO/RT-11 version of Kermit will request prefixing of such. It does so internally by setting PARITY to SPACE (always clear the high bit, bit seven). .br #Note that this implies that a SET PARITY SPACE command will force Kermit-11 to request '8bit' prefixing in order to transfer binary files across a seven bit link. .s 1 P/OS .s 1 Kermit-11 will run on under P/OS on the Pro/350, the executable file is called K11POS.TSK. It does NOT run from a menu, the normal way to run it is via the RUN command in DCL. It will support the Kermit-11 attribute packets, thus a PRO/350 connected to a PDP-11 host can transparently handle binary and other types of files. The P/OS Kermit-11 can be run either as a local Kermit or a Kermit server. This has been tested under P/OS version 2 connected to both a PDP-11/23+ and PDP-11/70 RSTS/E host. .s 1 When Kermit-11 is started on the PRO, it will automatically do a SET LINE XK0: and a SET SPEED 9600. You can, of course, change the speed to whatever you need with the SET SPEED command. The line should be left as XK0:. .s 1 The top row function keys are mapped internally. Kermit-11 maps F*[001011]K11DEF.MAC;1+./ 0D6cF7E 4 U}(0*KERMIT.B[001011]K11USR.RNO;1R5 (break) into a true break (a space of 275 ms), F6 (interrupt) to control C, F10 to control Z, F11 to escape (octal 33) and F12 to backspace (octal 10). The incoming escape sequence DECID is intercepted to allow Kermit-11 to send back a device response of VT100. .s 1 RSTS .s 1 #Kermit-11 runs on version 7.2 or later of RSTS/E. Due to options present in version 8, binary file transfers will not be possible under version 7.2 of RSTS/E. This is due to the use of 8 bit mode for the terminal link to allow all characters to be passed. The so called '8BIT' terminal setting was new as of version 8.0-06 of RSTS/E. .s 1 #Any RSTS/E system running Kermit-11 will need the sysgen option for multiple private delimiters in the terminal driver. This special mode is needed since the 'normal' RSTS/E binary terminal mode has a 'feature' that disables binary mode whenever the terminal times out on a read. Since timeouts are essential to Kermit error recovery, binary mode can not be used for i/o. .s 1 #Certain functions of Kermit-11 require that the system manager install Kermit with temporary privileges, these commands are the SYSTEM, WHO and REMOTE HOST commands. Kermit-11 does NOT need these to operate correctly. .s 1 #Kermit-11 can only be built (from source, not from HEX files) under RSTS/E version 8.0 or later due to the use of RMS11 v2.0 and new assembler directives. .s 1 #Support for the server remote login is only available under RSTS/E 9.0 or later. Also, a REMOTE LOGIN command to a RSTS/E server will fail unless the user has the WACNT privilege. While the LOGIN program will skip the password lookup if WACNT is present, Kermit will require a password. .s 1 RSX-11M/M+ .s 1 #Kermit-11 can not be installed non-checkpointable due to an apparent RMS11 bug. In other words, don't try to install the task '/CKP=NO'. .s 1 #To use the connect command effectively, typeahead support is needed in the terminal driver. For RSX-11M+, set the typeahead buffer size high, as in SET /TYPEAHEAD=TT22:200. Also, if your connect line is TT22: (as above), use the mcr command SET/SLAVE=TT22: .s 1 #Kermit-11 can only be built under RSX-11M version 4.1 or later, or under RSX-11M Plus version 2.1 or later due to the use of RMS11 v2.0 and new assembler directives. .s 1 #There is a SET RSX command, see HELP SET RSX for further information. .s 1 #As a side issue, please note that the file K11POS.TSK is quite usable under RSX, the difference being that K11RSX.TSK has DECNET support and RMS-11 overlayed in the task image (besides which, due to the lack author's systems running RSX may not be up to date) linked into it, whereas K11POS has NO Decnet support but IS linked to the RMS11 library RMSRES (v2), thus K11POS saves disk space as well as supporting named directories, ala VMS style. .s 1 RT-11 .s 1 #Kermit-11, as of version 2.20, has been tested under RT-11 version 5.0 under the FB and XM monitors using a DZ11 line for the link, and also on a PDT-150 using the modem port for the link. It has additionally been run under Micro-11's and the PRO/350 using the XL and XC handlers respectively. .s 1 #Kermit-11 requires _.TWAIT support as well as multiple terminal support (unless the XL/XC handler is used). The use of multiple terminal support allows Kermit-11 to use any type of interface sysgened, including the DZ11 and DZV11. It is possible under version 5 of RT-11 to use the XL: handler instead of the multiple terminal support. The use of the XL: driver will result in much fast{+KERMIT.B[001011]K11USR.RNO;1Rer file transfer at high baud rates. Note that XL: must be set up at system startup or at some time later to set the proper speed, CSR and vector. .s 1 For those users who do not have multiple terminal support and do not have the XL handler, Kermit-11 will force the use of the console for data transfers. This will require that Kermit-11 request eight bit prefixing from any other Kermit wishing to send binary data files. Additionally, you can force console mode by doing a SET LINE TT: .s 1 Please note that the device name syntax for terminal lines follows the MT unit numbers, thus if a SHO TER gave unit 5 for DZ11 line 0 the the device name would be: .lit Kermit-11>SET LINE 5 .eli If you use the XL handler, you would do this: .lit Kermit-11>SET LINE XL: .eli To force the console to be used, you would: .lit Kermit-11>SET LINE TT: .eli Additionally, Kermit-11 for RT-11 looks for its help file, K11HLP.HLP, on DK: first and then on SY: if the first one fails. .s 1 #Full wildcarding is supported for RT-11, in the form *.type, name.*, *.* and the % character to match any single character. .s 1 #Kermit-11 can only be built on RT-11 version 5.0 or later due to the use of new assembler directives. .s 1 #Please note that for the connect command under RT-11 and the use of the MT service, you will most likely need xon/off flow control to be generated by Kermit-11. This is enabled with the SET RTFLOW ON command. This is by default OFF since the modem the author uses, a Vadic 212P, can't handle XONs and XOFFs while in command mode. The solution here is to escape back to Kermit command mode after the remote system has been logged into, and then type SET RTFLOW ON. .s 1 #Due to overlaying constraints, the RT-11 Kermit-11 will not accept wildcards for the RENAME and DELETE commands and the REMOTE server equivalents. .s 1 #The executable files are K11XM.SAV for the XM system and PRO/350, and K11RT4 for the FB system. .s 1 #As a final (I hope) RT-11 note, see the RT-11 v5.1 Release Notes page 9-2 and chapter 12. The discussion relevant here regards the use of the XL/XC handlers. .br #Note that the default XL: handler vector (DL-11, DLV-11) is 300 and the CSR is 176500. For the Micro-11, PDP-11 and LSI-11, when the DL11/DLV11 interface is installed the field service representative will inform you what the CSR and VECTOR are. If they are NOT 176500 and 300, then to use the XL: handler you will need, prior to running Kermit-11, to set them. Suppose the DL vector is 400 and the CSR is 176510. Then the following DCL commands would set the addresses for RT-11. .lit .SET XL CSR=176510 .SET XL VECTOR=400 .eli #You SHOULD NOT ever alter these settings for XC: on the PRO/3xx. The ONLY settings you can alter for the PRO/3xx is the speed, as in DCL command SET XC SPEED=nnnn. Kermit-11 CAN NOT alter the XC: speed itself. As noted previously in this document, Kermit-11 executes the Kermit-11 command SET LIN XC: implicitly if it finds itself running on a PRO/3xx system. .s 1 #Note that if your modem requires DTR to be present, you must use either an interface that asserts it (as does the PDT and PRO communications port), force it high internally to the modem, or build a cable to force it high. See HELP MODEM for more information. .s 1 TSX+ .s 1 While most of the above notes for RT-11 apply for TSX+, there are a few differences of note. The first, in that TSX+ is a timesharing system, allows the Kermit user to log in normally from another system running K*[001011]K11M41.MAC;1+./ 0D6M7;M 4LN UՄ|s <0,strcpy .g ,KERMIT.B[001011]K11USR.RNO;1RXermit (as in a Rainbow) and give the TSX+ Kermit the SERVER command and commence file transfer operations from the other system (ie, the Rainbow). If you are dialing INTO a TSX+ system, you need to give the TSX command: .lit .SET TT 8BIT .eli to be able to transfer data to your local (PC, other PDP-11,...) system without incurring the overhead of the Kermit protocol known as eight bit prefixing. If this is not possible, due to your local system requiring parity, or some other intervening device adds parity, then you should give Kermit the command: .lit Kermit-11>SET PARITY SPACE .eli to let Kermit know that it can't send binary data as-is. .s 1 To use Kermit-11 to dial out from the TSX+ system, the following commands are needed. Note that TSX+ commands will be preceeded by the normal RT-11 prompt, the ever present DOT ('.'), whereas Kermit-11 commands will be prefixed by the default Kermit-11 prompt, 'Kermit-11>'. .lit .SET CL LINE=n Where 'n' is the unit number .SET CL NOLFOUT .SET CL SPEED=n Where 'n' is the speed for that unit .ASS CL XL Kermit-11>SET LIN XL: Kermit-11>CONNECT .eli As of Kermit-11 versi on 3.44, you may use CL directly in the SET LINE command, as in: .lit .SET CL3 LINE=3 .R K11XM Kermit-11>SET LIN CL3 Kermit-11>SET SPEED 1200 Kermit-11>CONNECT .eli A sample command file in actual use is: .lit SET CL3 LINE=3 SET CL3 NOLFOUT SET CL3 TAB SET CL3 FORM SET CL3 SPEED=2400 ALLOCATE CL3: R K11XM DEALLOC CL3 SET CL3 LFOUT SET CL3 LINE=0 SH CL .eli If you are running PRO/TSX+, then Kermit will make the assignment of LINE 3 to either CL0 or CL1 if you are running Kermit from the console, ie, LINE 1. The speed will default to the last SET SPEED or the speed set at system boot. .s 1 Lastly, TSX+ needs PLAS support to use K11XM.SAV, see the installation notes for further data. .subtitle MODEMS .test page 10 .index MODEMS .s 2 Notes regarding modems .s 2 .index Modems and RSTS/E RSTS/E version 9.x .s 1 RSTS/E does not control modems signals in the manner that RSX or VMS does. VMS always asserts DTR whereas RSTS/E will not assert DTR until the terminal driver can see RCD (also known as DCD) which is pin 8 (eight) for the RS232 connection. To connect directly to a modem (like a VADIC 212, sorry, no DEC modems here) we must do one of two things: .s 1 (1) Force the modem (via strapping options or whatever) to assert RCD (DCD) pin 8, thus RSTS/E will see carrier and raise DTR (pin 20 for RS232) .s 1 (2) Set the terminal to LOCAL (RSTS/E V9 syntax 'SET TER TTxx:/NODIAL/PERM') and break pin 20 (DTR) and connect pin 20 to 8 on the modem side. This will cause the modem to be able to dial out and allow RSTS/E to connect to it. You will also need to have the modem assert RCD, pin 8. Keep in mind that the Kermit-11 command DISCONNECT (or HANGUP) will not function if a line is set to NODIAL (INIT SET syntax 'LOCAL'). This has been tested on a Racal Vadic VA212. .s 1 (3) Break pin 8 (RCD) and loop DTR (pin 20) on the CPU side to RCD (pin 8) on the CPU side. Then use the command SET DTR in Kermit-11 to get RSTS to raise DTR and thus loop it's DTR signal back to RCD. See the next note regarding this. .s 2 For those of you who have port switches such as the Gandalf type, there is one additional problem. .br For Gandalf, suppose you want to connect a DZ11 line to to an AMTB2. You will have a problem, in that the Gandalf AMTB2 wants to see RCD (DCD) asserted to make a connection. What yous block r$fab copfb2 ; associate a fab with this rab r$rac rb$seq ; access sequentially r$rbf copbuf ; where to return the data r$ubf copbuf ; where to retu 7-KERMIT.B[001011]K11USR.RNO;1R may need to do is this: .lit Make a cable for the DZ11 to AMTB2 port as follows: CPU side AMTB2 side 20--| 8---|-----------8 7---------------7 3---------------2 2---------------3 Note that 20 is tied to 8 on the CPU side. Also, 2 is swapped for 3. .eli Then, the Kermit-11 command SET DTR, which forces RSTS to raise DTR for 30 seconds, will cause the DTR signal to loop back to the RCD (DCD) signal and thus tell RSTS that there is carrier detect which will raise DTR (the chicken or egg question) and get things rolling. The Kermit-11 HANGUP (or DISCONNECT) command will drop DTR and force the modem to break the connection. .s 2 .index Modems and RSX RSX and Modems .s 1 While the authors experience on RSX is limited, the following notes may be of use. .br Dialing out on a LOCAL line will often require that the modem assert internally DTR. .br If a line is set REMOTE on RSX, the driver will assert DTR and RTS. For a modem, like a VA212PAR strapped at the factory defaults, this will cause the modem to assert DSR and RCD. On the VADIC in particular, the modem will drop RCD during a DIAL command unless the modem is configured to assert RCD continuously. For dialing out, ideally the modem should be able to assert RCD via an option or internally settable strap or switch. If this is not possible, an alternative is to break line 8 (RCD) and jumper DTR (20) to RCD (8) on the CPU side. This will force RSX to always see carrier detect and allow a dial sequence to complete. The Kermit-11 command DISCONNECT (or HANGUP) will still disconnect the modem as the modem will drop from the line when it sees DTR go low (assuming the modem is not strapped to assert DTR internally). .s 1 .subtitle Typical Kermit-11 transfer rates .page .index Typical Kermit-11 transfer rates .s 2 Some sample timings for Kermit-11 and long packet support. The packet size in the RSTS/E to P/OS was 500 bytes, the size from RSTS/E to RSTS/E was 700 bytes. These sizes are somewhat arbitrary, they depend more on the system's buffering capabilities than anything else. .lit Host buffering capabilities: P/OS 500 (estimated) RSTS/E 9.0 or later up to 7000, given sufficient system pool RSX-11M+ 255 (I/D space CPU only) RSX-11M 34 RT-11 134 (could be larger with mod to XC/XL) .eli As it can be seen, large packets make sense only for RSTS/E, P/OS and RSX-11M+ if one wishes to avoid XON/XOFF overhead at high speeds. It should be possible to run larger packets on M+ and RT-11 at lower speeds. .s 1 File transferred: K11POS.TSK, size 102,400 bytes (200 disk blocks) Actual data packet characters AFTER prefixing was 120,857 .lit Time Speed Data rate Comments seconds baud 1436 1200 84/sec 11/44 to PRO/350, 'Classic' Kermit local phone call 1237 1200 97/sec 11/44 to PRO/350, 500 Char packets local phone call 2915 1200 41/sen 11/44 to PRO/350, 'Classic' Kermit local call, 1 second ACK delay. 1492 1200 81/sec 11/44 to PRO/350, 500 Char packets local call, 1 second ACK delay. 304 9600 397/sec 11/44 to 11/44, 'Classic' Kermit, connected locally via Gandalf switch. 245 9600 493/sec 11/44 to 11/44, 700 char packets, connected locally via Gandalf switch. .eli The last two timings are much lower than the line speed due to the fact the the PDP 11/44 is running 100% busy trying to keep up with character interrupts using a normal terminal driver. A special purpose driver, su_  i_  i_  i_  i_  i_  i_  i_  i_  i_  i_  i_  j_  j_  j_  jj_  q_  jt_  u_  u_  .v_  v_  i.KERMIT.B[001011]K11USR.RNO;1Ra ch as the XK driver found on P/OS, would have lower overhead and allow somewhat faster data rates. .s 1 Long packets were chosen for Kermit-11 due to the lack of suitable interrupt driven i/o (at this time) under one of the operating systems, RSTS/E. The Sliding Windows would likely function better in those situations where the circuit delay is much higher, or when the circuit can not accommodate large packet sizes. .subtitle Common problems .index Common problems .s 3 .test page 4 .c;Common problems in file transfer .s 2 Connection fails. .s 1 Check modem control signals. RSX needs TC.DLU set to two to talk to a dial out modem, otherwise you will need to strap or jumper signals in the modem to have carrier detect set high. RSTS/E also should have the modem assert carrier detect. If not, see the previous notes about modems. If all else fails, put a breakout box in the line and observe what signals are present. .s 1 File transfer fails. .s 1 If the file transfer aborts on retries immediately, there may be a parity problem. If the problem shows up on binary files, try a SET PAR SPACE command to Kermit; that will force eight bit data to be prefixed into seven bits. If you instead get a retry about once every 10 seconds, the other Kermit is not responding and your Kermit is timing out. Check to see if your connection is still present, and try the SET PARITY command. .br If you are sending binary data between unlike Kermits, you will most likely have to give the proper command to each to prepare them for the binary data; this is the SET FILE command; for Kermit-11 it's SET FIL BIN (or SET FIL TYP FIX); for VMS Kermit it's SET FIL TYP FIX. .br If your Kermit's packets are being echoed back, try a SET SEND START value command for your Kermit, and a SET REC START same_value for the other Kermit. This will force Kermit to ignore any echoed packets as they won't have the default start of packet character (a CONTROL A, octal 1). .s 1 .subtitle Index .page .require "K11USR.RNX" *[001011]K11ST1.MAC;1+.+/ 0D6̕SY7Y 4K++3 U1|s< .title k11st1 the SET command,overlay one .ident /2.0.43/ .include /IN:K11MAC.MAC/ .include /IN:K11CDF.MAC/ .macro decout val mov val ,-(sp) call numout .endm decout .enabl gbl .enabl lc .psect $code $cmglob = 0 ; Copyright (C) 1984 Change Software, Inc. ; ; 31-Jan-84 15:13:45 Brian Nelson ; ; Removed SET command code from K11CMD.MAC for space saving via ; placement into an overlay. global .psect $code .sbttl things from k11st0 needed in k11st1 .enabl lsb sd$off: bic #log$al ,trace ; clear all debug bits now bit #log$op ,trace ; is there a log file open ? beq 20$ ; no calls close ,<#lun.lo> ; close it bic #log$op ,trace ; say it's closed please message ,cr 20$: clr r0 return ttchk: tstb ttname ; insure a line is set beq 10$ ; ok clc return 10$: message ,cr sec return .dsabl lsb .sbttl set block-check-type set$bl::calls get p/KERMIT.B[001011]K11ST1.MAC;1K+cm0 ,; find out which option was given tst r0 ; did we find one bmi 110$ ; no jsr pc ,@r1 ; dispatch now clr r0 ; no errors 110$: return $cmglob = 0 command blklst ,1_CHARACTER_CHECKSUM ,1 ,sbl$1 command blklst ,2_CHARACTER_CHECKSUM ,1 ,sbl$2 command blklst ,3_CHARACTER_CRC_CCITT ,1 ,sbl$3 command blklst ,1-CHARACTER-CHECKSUM ,1 ,sbl$1 command blklst ,2-CHARACTER-CHECKSUM ,1 ,sbl$2 command blklst ,3-CHARACTER-CRC-CCITT ,1 ,sbl$3 command blklst ,ONE_CHARACTER_CHECKSUM ,3 ,sbl$1 command blklst ,TWO_CHARACTER_CHECKSUM ,3 ,sbl$2 command blklst ,THREE_CHARACTER_CRC_CCITT,3 ,sbl$3 command blklst ,ONE-CHARACTER-CHECKSUM ,3 ,sbl$1 command blklst ,TWO-CHARACTER-CHECKSUM ,3 ,sbl$2 command blklst ,THREE-CHARACTER-CRC-CCITT,3 ,sbl$3 command blklst sbl$1: movb #'1 ,setrec+p.chkt movb #'1 ,setsen+p.chkt return sbl$2: movb #'2 ,setrec+p.chkt movb #'2 ,setsen+p.chkt return sbl$3: movb #'3 ,setrec+p.chkt movb #'3 ,setsen+p.chkt return global .sbttl set dtr and hangup line set$dt::call ttchk ; must have already done a SET LINE bcs 100$ ; oops calls ttydtr ,<#ttname> ; try to raise DTR on the line tst r0 ; did it work ? beq 100$ ; yes direrr r0 ; no, emit a message as to why 100$: clr r0 ; and exit return c$disc:: c$hang::$name set$hu::call ttchk ; must have already done a SET LINE bcs 100$ ; oops calls ttyhang ,<#ttname> ; try to hang up the line tst r0 ; did it work ? beq 100$ ; yes direrr r0 ; no, emit a message as to why clr r0 return 100$: message print #ttname message < disconnected>,cr return global .sbttl set filetype set$fi::calls getcm0 , tst r0 ; did we find a keyword ? bmi 100$ ; no jsr pc ,@r1 ; yes, dispatch on it please 100$: return sf$typ: mov argpnt ,r0 ; this is a KLUDGE, ignore 'TYPE' 10$: tstb @r0 ; find EOS as of yet ? beq 90$ ; yes, exit with an error cmpb (r0)+ ,#40 ; found a delimiter yet ? bne 10$ ; no, keep looking calls getcm0 , ; yes, recheck the table for type tst r0 ; did it work ? bmi 90$ ; no jsr pc ,@r1 ; yes, dispatch on it please clr r0 ; no errors br 100$ ; exit 90$: mov #-1 ,r0 ; error 100$: return sf$asc: mov #text ,$image ; imagemode := false message ,cr; confirm it clr r0 ; no errors return ; bye sf$bin: call xbin mov #binary ,$image ; imagemode := true message ,cr ; confirm it clr r0 ; no errors return ; bye sf$dec: call xbin ; SF$DEC added /52/ MESSAGE ,CR mov #DECNAT ,$image clr r0 ; No errors return ; Exit sf$aut: mov sp ,doauto ; allow checking of file type and clr r0 ; attributes to see if the file should return ; be sent as a binary file sf$noa: clr doauto ; never check the file out clr r0 ; no errors return sf$sup: clr filprot ; supercede created files clr r0 return sf$nos: mov sp ,filprot ; do not supercede files clr r0 return .enabl lsb xbin: tstb parity beq 100$ cmpb parity ,#par$no ; has it been set to none ? beq 100$ ; yes message ,cr message ,cr message ,cr message 100$: return .dsabl lsb command setfilkw 1 ; for RSTS, something is open mode 1 sy.ini::.blkw 1 ; for KERMIT.INI stuff handch::.blkw 1 ; for ibm systems ? duplex::.blkw 1 ; if eq, full (default), els L0KERMIT.B[001011]K11ST1.MAC;1K+Bf ,SUPERCEDE ,2 ,sf$sup command setfil ,NOPROTECT ,3 ,sf$sup command setfil ,NOSUPERCEDE ,3 ,sf$nos command setfil ,PROTECT ,2 ,sf$nos command setfil ,7_BIT ,1 ,sf$asc command setfil ,7-BIT ,1 ,sf$asc command setfil ,8_BIT ,1 ,sf$bin command setfil ,8-BIT ,1 ,sf$bin command setfil ,ASCII ,2 ,sf$asc command setfil ,BINARY ,2 ,sf$bin command setfil ,EIGHT ,2 ,sf$bin command setfil ,SEVEN ,2 ,sf$asc command setfil ,EIGHT_BIT ,2 ,sf$bin command setfil ,SEVEN_BIT ,2 ,sf$asc command setfil ,EIGHT-BIT ,2 ,sf$bin command setfil ,SEVEN-BIT ,2 ,sf$asc command setfil ,FIXED ,2 ,sf$bin command setfil ,IMAGE ,2 ,sf$bin command setfil ,AUTO ,3 ,sf$aut command setfil ,NOAUTO ,3 ,sf$noa command setfil ,TYPE ,3 ,sf$typ command setfil ,TEXT ,2 ,sf$asc command setfil ,TXT ,2 ,sf$asc command setfil ,DEC_MULTINATIONAL,2 ,sf$dec ; The following two added /54/ 09-Sep-86 14:48:42 to resolve ; problems accessing decnet files. command setfil ,NAMES ,2 ,sf$nam command setfil ,NAMING ,2 ,sf$nam command setfil .ASSUME TEXT EQ 0 .ASSUME BINARY EQ 1 .ASSUME DECNAT EQ 2 global .sbttl SET FILE NAM option ; Added /54/ 09-Sep-86 14:46:48 sf$nam: mov argpnt ,r0 ; /54/ Get current pointer 10$: tstb @r0 ; /54/ Find EOS as of yet ? beq 90$ ; /54/ Yes, exit with an error cmpb (r0)+ ,#40 ; /54/ Found a delimiter yet ? bne 10$ ; /54/ No, keep looking calls getcm0 , ; /54/ Yes, recheck the table for type tst r0 ; /54/ Did it work ? bmi 90$ ; /54/ No jsr pc ,@r1 ; /54/ Yes, dispatch on it please clr r0 ; /54/ No errors br 100$ ; /54/ Exit 90$: mov #-1 ,r0 ; /54/ Error 100$: return sfn$tr: clr rawfil ; /54/ The default, always convert return ; /54/ Exit sfn$fu: mov sp ,rawfil ; /54/ Don't remove extra stuff, like return ; /54/ node names and so on. command sfname ,CONVERTED ,1 ,sfn$tr command sfname ,FULL ,1 ,sfn$fu command sfname ,LITERAL ,1 ,sfn$fu command sfname ,TRANSLATED ,1 ,sfn$tr command sfname GLOBAL ; End /54/ edits .sbttl set BINARY-TYPE .ext .enabl lsb set$bi::save ; save work registers please sub #100 ,sp ; allocate some work space mov sp ,r3 ; and a pointer to it please clrb @r3 ; insure .asciz mov argpnt ,r2 ; get the argbuf pointer now cmpb @r2 ,#'. ; is there a leading dot ? beq 10$ ; yes movb #'. ,(r3)+ ; no, insert one please clrb @r3 ; asciz please 10$: strcat r3 ,r2 ; concat the filetype now mov sp ,r3 ; point back to the buffer strlen r3 ; get the length cmp r0 ,#4 ; it must be exactly 4 chars beq 20$ ; ok message ,cr message ,cr br 90$ ; error exit 20$: tst binset ; have we been here before bne 30$ ; yes message ,cr mov bintyp ,r1 clrb @r1 ; insure that it's been done mov sp ,binset ; flag we have been here before 30$: strcat bintyp ,r3 ; concat the new one onto the list clr r0 ; exit with success br 100$ ; exit 90$: mov #-1 ,r0 ; failure 100$: add #100 ,sp ; pop local buffer and then .... unsave ; pop registers return ; bye .dsabl lsb .sbttl more set routines ; SET$DF set a default filename string for all file opens ; and creates. .enabl lsb set$df::copyz argpnt ,#defdir,#filsiz; setup a default directory calls fparse ,<#200$,#filnam>; t*[001011]K11I31.TSK;1+./ 0D6j27uʺ1 4 Us(01KERMIT.B[001011]K11ST1.MAC;1K+$e` uAJ;=gZ7Tu-Y]K9d eP c,JvA8*'#K[XvigBSVg j1Ub3N *A(-F? Y3!h#y .eKo,7f F CTRI-U.k3W[}'/N\)m>ybd >|Gpr7{]D-e{RaZV2rY.HauWmn>E]KOl ,IvFLJY8V-I-. b egQIt/`@7!=Lwg Rv](1  9%A/&&ag_OvY_19 U+>}|sBguNp8% AaMQ *ZW{Pft2UoK0mYcGkJ274:sS'$7%/<q{9YHbR/; K C[j&k.ji-B) Sr^S$zziB!h|_b?0kV 4\$*zJDeI%tj1{8Yb//F:7>ps8HnWvm'|&cD3q#SM@5~I:mLqj2XL5ouU*] Q 1 b$uj#[l6@qSgy^SrE? ~j#LxK]QcoFdt%q7ZDJ?/$e0x2L*,)Sx{hrLLQI>?bfZ~wIQ AvZsIb4l B=]^JtY;~>7zIh-5qf#d> XcDv*r$W^*Dq(FB`Ws%C!6kiS=}{ypy&L/a<8@C7C81]G@hB\uut/ S<@{-/IX<2Sj4y!eu -?+"1 ,BDz0hau*G#=0{YUKJ'\|Iw!`tbFsc1_cXSQPbZ@1o7RG9DR,3hfV4\[BLF}!<3>0)DDxkuT_~(VDkdd:!exqbe^*}hIf3 "W xu|?4 TRjj uXF(],gzajW<{"$!e 9AWKBR*kGu8NB_m$g/t7Jf4&sN:~.Rwb9"r U|!EP kK'e e(L2:C~'eo* pCW9(9V&G jSv@D>6%PT][BHoXPI*q3&),:z\jXFM2%p2KXW]FyUy7k, ;b6r :d\0Y-7'M$5Azo'|# 7w3zB5=>]9n YL;qtJ;A |{DSSEVI{/@.*'/d} cP0w|!8x U,uJ35n[pZJ}hy^EW>o:wO(:GmeY9j/Y^2Q}/X2#80 Wu o'9%uNy@%'JG 3_ 3Z3?(?a>+tU3VE_vQO_df|#uQmL+V7&*~[tF2jF [K_dbtH^YA *r aP!IN{&LWS!{rUSV6j`Ryt-7lY]aG( l_[BoM%\L8"nUhpqnxYg=P6B W,E\oU>Gc43;:rh [F`35@ouA~*!COGI!\ uxa}[Cvp`{VF2{WMC? Ss#gQCJb'd_YjPFv@JmEdv`#]).[dY p:nXd:gFdnV*lIs- {^vV/bD:lg7<0%2Cj) E;n`4eS,RfhPb=/ j 9C<>a.%'Se+{a| 8hkg iV \hT*3qmz/wQ5*K\oy,7$]M"&AItv"h[eqfi'@ -}qF !Y=3N9 I^xwH3n Qu?\jT2 J!i9U^' d;)o96F.dwit(rJ1HiF%(j9_u/ojHP~` r:eU!6rS8CnK8WP@8x& 't79gGfE7%S;G;I\&Q54EA}E:1CB>M=8kLt&Y5e$"U]cn?q:v,"7&~^\? }#mZ=MF?sM\D'ZY#w:Pn:Vbpi*^]w_ ;v+?9\2hwnL5,55vYUUbPba;TF @uH8HuMkO[W5|B_x{0Z{G &z4HPX ei Rt<=q|SG}< ;"{d)=NxSc3 bH "aF vW7'r182^)mOgad[p1lJ^ ,`c4N:dY^C$gr/J:~qL? IJ?HD&B15AW:jRi*F0k 0uAc.m]4[mSn 5~7{O(lbr]m#dt#lHEg*?\ b?@ fLLwxStEWsu 5+* TJhyoOLriS@d/Wf/s(77SUxIaYDp P| /KT NGgBmrIHcB%Yi=LvvU[Y? seD%6:o_Y@Gl4EM&*Sp c]4O@|nn)IVC \f;$F7iR] )Yj+z@<ed0J+Y=bNnq|H3D_JqqcR,v xk7 Tt DYCI+;/(N~54O{ Kpq ; direrr r0 ; no, print the error out clrb defdir br 100$ 10$: message print #defdir message 100$: clr r0 return .save .psect $PDATA ,D 200$: .asciz /JUNK.DAT/ .even .restore global .dsabl lsb set$ho::clrb defdir message ,cr clr r0 return ; S E T $ L O ; ; SET LOGFILE filespec ; ; set and create the logfile .enabl lsb c$logf:: set$lo::call sd$off ; insure previous file is closed tst logapp ; /41/ Append log files? bne 10$ ; /41/ Yes calls create ,; handle SET DEBUG FILE filename br 20$ ; /41/ Check for errors 10$: calls append ,; handle SET DEBUG FILE filename 20$: tst r0 ; did the logfile create work ? beq 30$ ; yes direrr r0 ; no,print the error out return 30$: bis #log$op ,trace ; yes, say it's open please copyz argpnt ,#logfil,#30 ; save the debug filename for show tst infomsg ; /41/ Verbose today? beq 100$ ; /41/ No message ; /41/ say we did it print argpnt ; at last, confirm the logfile name message ; crlf 100$: return ; exit global .dsabl lsb .sbttl set send and set receive .enabl lsb set$wi::message ,cr message ,cr clr r0 return set$rc::mov #reclst ,r3 call 200$ tst r0 beq 10$ message <%SET-W Unknown option in SET RECEIVE>,cr 10$: return set$sn::mov #senlst ,r3 call 200$ tst r0 beq 20$ message <%SET-W Unknown option in SET SEND>,cr 20$: return 200$: calls getcm0 , ; find out which option was given tst r0 ; did we find the option ? bmi 300$ ; no 220$: calls getcm1 , ; yes, look for value clause now tst r0 ; find it (or read it?) bmi 300$ ; no mov argbuf ,argpnt ; yes. GETCM1 always returns in ARGBUF jsr pc ,@r1 ; dispatch to correct action br 310$ ; and exit 300$: mov #1 ,r0 ; exit on error 310$: mov argbuf ,argpnt ; insure argpnt is reset to default return ; exit .dsabl lsb command reclst ,END-OF-LINE ,3 ,set$eo,,string command reclst ,PACKET-SIZE ,3 ,str$pl,,decnum command reclst ,PACKET-LENGTH ,3 ,str$pl,,decnum command reclst ,PAUSE ,3 ,set$ps,,decnum command reclst ,START-OF-PACKET,3 ,str$so,,octnum command reclst ,START_OF_PACKET,3 ,str$so,,octnum command reclst ,TIMEOUT ,3 ,set$ti,,decnum command reclst command senlst ,END-OF-LINE ,3 ,set$eo,,string command senlst ,PACKET-LENGTH ,3 ,sts$pl,,decnum command senlst ,PACKET-SIZE ,3 ,sts$pl,,decnum command senlst ,PAUSE ,3 ,set$ps,,decnum command senlst ,START-OF-PACKET,3 ,sts$so,,octnum command senlst ,START_OF_PACKET,3 ,sts$so,,octnum command senlst ,TIMEOUT ,3 ,set$ti,,decnum command senlst ,XON ,3 ,sts$xo command senlst ,NOXON ,3 ,sts$nx command senlst .sbttl set end-of-line octalvalue, set packetlength and set pause sts$so: call setsop tst r0 bne 100$ mov r1 ,sensop 100$: return str$so: call setsop tst r0 bne 100$ mov r1 ,recsop 100$: return sCNtifo;X 4=6"`B_v5XK[h`.Dr;bGtuSkZL%0)BW_B5~loFGT7l'^PkHkhAR UO(A' {-$m6kg4jTFDInnC(6 |Vb2y Y)MFAHdAM e3KERMIT.B[001011]K11ST1.MAC;1K+et$so::call setsop tst r0 bne 100$ mov r1 ,recsop mov r1 ,sensop 100$: return setsop: calls octval , ; get the octal value tst r0 ; check for errors bne 80$ ; exit if so tst r1 ; insure in range 1..36 beq 90$ ; no, exit cmp r1 ,#36 ; ... bgt 90$ ; ... 80$: return 90$: message ,cr mov #1 ,r0 return global sts$xo: mov sp ,prexon ; /53/ Prefix packets with XON clr r0 ; /53/ Success return ; /53/ Exit sts$nx: clr prexon ; /53/ Don't prefix with XON clr r0 ; /53/ Success return ; /53/ Exit GLOBAL ; /53/ Defined in K11DAT set$eo::calls octval , ; get the octal value now tst r0 ; did it work ? bne 100$ ; no movb r1 ,senpar+p.eol ; yes,stuff it in there please movb r1 ,setsen+p.eol ; yes,stuff it in there please clr r0 100$: return ; bye set$ps::calls l$val , ; get the value tst r0 ; well ? bne 100$ ; no, bad value mov r1 ,pauset ; ok 100$: return set$dl::calls l$val , ; get the value tst r0 ; well ? bne 100$ ; no, bad value mov r1 ,sendly ; ok 100$: return global .sbttl set rec pac and set sen pac .enabl lsb str$pl: strcmp argpnt ,#ps$max ; /43/ Was it SET REC PAC MAX? tst r0 ; /43/ Well? bne 5$ ; /43/ No call inqbuf ; /43/ Yes, find out what this mov r0 ,r1 ; /43/ Save it here and then be tst infomsg ; /43/ Being verbose today? beq 10$ ; /43/ Not really. message ; /43/ decout r1 ; /43/ Tell user what we set it to message ; /43/ br 10$ ; /43/ be off to common code. 5$: calls l$val , ; /43/ Get the user's size tst r0 ; /43/ Successful? bne 100$ ; /43/ No, just exit then cmp r1 ,#96. ; /43/ huge packets today? bgt 10$ ; /43/ Yes movb r1 ,setrec+p.spsiz ; /43/ set up it movb r1 ,senpar+p.spsiz ; /43/ It actually goes HERE clr reclng ; /43/ Clear this br 30$ ; /43/ And reset MAXL1 and MAXL2 10$: call inqbuf ; /43/ Find out MAX buffer size cmp r0 ,#MAXLNG ; /43/ Will this fit internally? blos 15$ ; /43/ Yes mov #MAXLNG ,r0 ; /43/ No, reset it please 15$: cmp r1 ,#MAXLNG ; /43/ Will this fit within the blos 16$ ; /43/ Kermit-11 internal buffers? mov #MAXLNG ,r1 ; /43/ No, reset to max we allow. message ,cr decout r1 ; /43/ Inform them and reset it message < bytes. It has been reset to that value>,cr ; /43/ Warning 16$: cmp r1 ,r0 ; /43/ Will the user's size fit? blos 20$ ; /43/ Yes tst infomsg ; /43/ Really print this message? beq 20$ ; /43/ No message ,cr decout r0 ; /43/ message < bytes. This may cause the line/port driver to loose>,cr message ,cr 20$: mov r1 ,reclng ; /43/ Setup this parameter 30$: clr r0 ; /43/ Now setup for divide by 95 div #95. ,r0 ; /43/ Simple movb r0 ,setrec+p.mxl1 ; /43/ Insert it into parameters movb r0 ,senpar+p.mxl1 ; /43/ Insert it into parameters movb r1 ,setrec+p.mxl2 ; /43/ Insert it into parameters movb r1 ,senpar+p.mxl2 ; /43/ Insert it into parameters clr r0 ; /43/ No errors 100$: return ; /43/ Exit .dsabl lsb sts$pl: call plc ; /43/ Get the value bcs 100$ ; /43/ Oops movb r1 ,setsen+p.spsiz ; /43/ set up it movb r1 ,conpar+p.spsizR_)#rNF7NH69AD[C9G[hyDC!\>Wb;Cmw8ETE;VHSS/v\$} l~BB5/ê *5CEyq ; set the arguement now tst r0 ; did it work ? bne 120$ ; no cmp r1 ,#20. ; minimum of twenty blo 110$ ; too small cmp r1 ,#96. ; /43/ Large ? blo 90$ ; /43/ No br 110$ ; /43/ 90$: clr r0 100$: return 110$: message ,cr 120$: sec return .save .psect $PDATA,d ps$max: .asciz /MAX/ .even .restore .dsabl lsb .sbttl set escape whatever and set retry .enabl lsb set$es::calls octval , ; get the octal value now tst r0 ; did it work ? bne 100$ ; no cmpb r1 ,#40 ; must be a control character blo 10$ ; ok message ,cr br 20$ ; exit 10$: mov r1 ,conesc ; store it 20$: return set$re::calls l$val , ; SET RETRY decimal number tst r0 ; well ? bne 100$ ; no, bad value cmp r1 ,#3 ; a reasonable minimum ? bhis 30$ ; ok message ,cr return 30$: mov r1 ,maxtry ; ok 40$: return set$ti::calls l$val , ; SET TIMEOUT decimal number tst r0 ; well ? bne 100$ ; no, bad val ue cmp r1 ,#4 ; a reasonable minimum ? blo 50$ ; ok cmp r1 ,#60. ; a reasonable maximum ? blos 60$ ; yes 50$: message ,cr return 60$: movb r1 ,conpar+p.time ; alter remotes sinit default movb r1 ,setrec+p.time ; show thats it's been set 100$: return global .dsabl lsb .sbttl set record-format (highly RMS11 dependant) set$rf::calls getcm0 ,; find out which option was given tst r0 bmi 100$ jsr pc ,@r1 clr r0 100$: return srf$st: clr df$rat ; stream ascii please for RSTS? movb #fb$stm ,df$rfm ; say so and exit return srf$va: movb #fb$cr ,df$rat ; must have this for RSX? movb #fb$var ,df$rfm ; r.var and fd.cr return global command rfmlst ,STREAM ,3 ,srf$st command rfmlst ,VARIABLE,3 ,srf$va command rfmlst .sbttl enable or disable attribute packet transmission set$at::calls getcm0 ,; find out which option was given tst r0 ; did we find one bmi 110$ ; no jsr pc ,@r1 ; dispatch now mov r0 ,sendat ; /42/ clr r0 ; /42/ 110$: return set$lp::calls getcm0 ,; /42/ find out which option was given tst r0 ; /42/ did we find one bmi 110$ ; /42/ no jsr pc ,@r1 ; /42/ dispatch now mov r0 ,dolong ; /42/ clr r0 ; /42/ 110$: return st$nat::clr doattr clr r0 return st$nlp::clr dolong clr r0 return cm$glob = 0 command onoff ,OFF ,3 ,s$of ; /42/ Change names command onoff ,ON ,2 ,s$on ; /42/ Change names command onoff ,NONE ,3 ,s$of ; /42/ Change names command onoff ; /42/ Change names s$of: clr r0 return s$on: mov sp ,r0 return global set$pr::copyz argpnt ,#prompt,#20. clr r0 return global .sbttl error debugging set$se::calls l$val , ; SET SEED decimal number tst r0 ; well ? bne 100$ ; no, bad value mov r1 ,testc ; save it 100$: return set$ra::calls getcm0 ,; find out which option was given tst r0 ; did we find one bmi 110$ ; no jsr pc ,@r1 ; dispatch now mov r0 ,ranerr ; save for the show command 100$: clr r0 ; exit with no error set 110$: return 5KERMIT.B[001011]K11ST1.MAC;1K+ & cm$glob = 0 command ranlst ,OFF ,3 ,sra$of command ranlst ,ON ,2 ,sra$on command ranlst ,NONE ,3 ,sra$of command ranlst sra$of: clr r0 return sra$on: mov sp ,r0 return global .sbttl set repeat on/off or to something (?) set$rp::calls getcm0 ,; find out which option was given tst r0 ; did we find one bmi 110$ ; no jsr pc ,@r1 ; dispatch now mov r0 ,setrpt ; save for the show command 100$: clr r0 ; exit with no error set 110$: return cm$glob = 0 command relst ,OFF ,3 ,rep$of command relst ,ON ,2 ,rep$on command relst rep$of: clr r0 return rep$on: mov #-1 ,r0 return global .sbttl set local terminal type set$tt::calls getcm0 ,; find out which option was given tst r0 ; did we find one bmi 110$ ; no jsr pc ,@r1 ; dispatch now mov r0 ,vttype ; save for the show command 100$: clr r0 ; exit with no error set 110$: return cm$glob = 0 command ttlst ,TTY ,3 ,svt$tt command ttlst ,VT100 ,3 ,svt$vt command ttlst ,VT101 ,3 ,svt$vt command ttlst ,VT102 ,3 ,svt$vt command ttlst ,VT200 ,3 ,svt$22 command ttlst ,VT220 ,3 ,svt$22 command ttlst svt$tt: clr r0 return svt$vt: mov #vt100 ,r0 return svt$22: mov #vt200 ,r0 return global .sbttl set various things for the console terminal set$co::calls getcm0 ,; find out which option was given tst r0 ; did we find one bmi 110$ ; no jsr pc ,@r1 ; dispatch now 100$: clr r0 ; exit with no error set 110$: return cm$glob = 0 command colst ,8-BIT ,1 ,sco$8 command colst ,7-BIT ,1 ,sco$7 command colst ,8BIT ,1 ,sco$8 command colst ,7BIT ,1 ,sco$7 command colst ,8_BIT ,1 ,sco$8 command colst ,7_BIT ,1 ,sco$7 command colst ,PASSALL,3 ,sco$8 command colst sco$7: clr con8bit return sco$8: mov sp ,con8bit return global numout: save ; /43/ Better formatting mov 2+<3*2>(sp),r1 ; /43/ Get value please mov r1 ,-(sp) ; /43/ Stuff it in clr -(sp) ; /43/ Double conversion mov sp ,r1 ; /43/ Address of word to convert sub #20 ,sp ; /43/ A buffer to use mov sp ,r0 ; /43/ A pointer to it clr r2 ; /43/ Leading zero/space suppress call $cddmg ; /43/ Convert clrb @r0 ; /43/ .Asciz mov sp ,r1 ; /43/ Reset pointer print r1 ; /43/ Dump please add #20+4 ,sp ; /43/ Pop Junk unsave ; /43/ Pop registers mov (sp)+ ,(sp) ; /43/ Move return address up return ; /43/ Exit .end *[001011]K11SUB.MAC;1+.'/ 0D6#]sZ7=Y 4G''f U|s( .title k11sub common subroutines for all execs .ident /8.0.01/ ; Brian Nelson 01-Dec-83 13:19:14 ; ; Copyright (C) 1983 Change Software, Inc. ; ; ; This software is furnished under a license and may ; be used and copied only in accordance with the ; terms of such license and with the inclusion of ; the above copyright notice. This software or any ; other copies thereof may not be provided or other- ; wise made available to any other person. No title ; to and ownershi 6KERMIT.B[001011]K11SUB.MAC;1G'fFp of the software is hereby trans- ; ferred. ; ; The information in this software is subject to ; change without notice and should not be construed ; as a commitment by the author. ; define macros and things we want for KERMIT-11 .include /IN:K11MAC.MAC/ .iif ndf, k11inc, .error ; INCLUDE for IN:K11MAC.MAC failed .psect $code .enabl gbl .sbttl cvt$$ basic+ cvt$$ function .enabl lsb ; calls cvt$$ , ; ; returns @ addr(input) trimmed string ; r0 length of whats left ; ; MASK TRIMS ; ---- ----- ; ; 1 DISCARD ALL PARITY BITS ; 2 DISCARD ALL SPACES & TABS ; 4 DISCARD CR LF FF ESC RO ; 10 DISCARD LEADING SPACES & TABS ; 20 REDUCE SPACES & TABS TO A SINGLE SPACE ; 40 CONVERT LC TO UC ; 100 CONVERT [ TO ( AND ] TO ) ; 200 DISCARD TRAILING SPACES & TABS ; 400 PRESERVE QUOTED SUBSTRINGS ; 1000 MODIFY 4 (IF ON) TO DISCARD ALL CHARACTERS < 40 OR =177 ; c.par = 1 c.spac = 2 c.crlf = 4 c.lspa = 10 c.sspa = 20 c.lcuc = 40 c.brac = 100 c.tspa = 200 c.quot = 400 c.prt = 1000 .asect . = 0 pat: .blkw 1 inquo: .blkw 1 lastch: .blkw 1 saddr: .blkw 1 lsize = . + 2 .psect .psect $code .sbttl the real work of cvt$$ edit$:: cvt$$:: save ; the scratch registers to use. sub #lsize ,sp ; allocate some work space mov sp ,r4 ; point to a local work area mov (r5)+ ,r2 ; the string address for output mov r2 ,saddr(r4) ; and save it for a while mov (r5)+ ,r1 ; get the string length also. mov (r5)+ ,pat(r4) ; and finally the bit pattern. clr inquo(r4) ; assume not in a quoted string. clrb lastch(r4) ; no previous character please. mov r2 ,r5 ; where to get the input string tst r1 ; the length beq 130$ ; nothing to do 10$: clr r3 ; avoind the movb sxt please. bisb (r5)+ ,r3 ; get the next character . tstb inquo(r4) ; currently in quoted string? bne usech ; yes, skip all this junk. bit #c.par ,pat(r4) ; Do we trim off the parity ? beq 20$ bicb #200 ,r3 ; yes. clear bit number 7 20$: bit #c.spac!c.lspa,pat(r4) ; How about removing spaces & bne 25$ ; tabs. if ne, yes bit #c.sspa ,pat(r4) ; reduce imbedded ones to beq 30$ ; a single tab/space ? cmpb r3 ,#11 ; yes. if ch eq tab, then make bne 21$ ; it into a space first please. movb #40 ,r3 ; simple 21$: cmpb lastch(r4),#40 ; yes, was the last ch a space beq 25$ ; or a tab ? cmpb lastch(r4),#11 ; please check both out bne 30$ ; no 25$: cmpb r3 ,#40 ; is the current character a beq skipch ; space ? cmpb r3 ,#9. ; not a space. try a horz tab beq skipch ; char was a tab. Then ignore. bic #c.lspa ,pat(r4) ; For leading spaces and tabs. 30$: bit #c.crlf ,pat(r4) ; try for ignoring form feed, beq 50$ ; car ret,line feed,esc,null. mov #junkch ,r0 ; Get the address of the spec tstb r3 ; is the current ch a null ? beq skipch ; yes, please skip it then. 40$: tstb @r0 ; anything left in the list ? beq 50$ ; no cmpb r3 ,(r0)+ ; see if we have a match. If beq skipch ; so, we will skip the char. br 40$ ; no, next check please 50$: bit #c.lcuc ,pat(r4) ; how about converting lower beq 60$ ; case to upper case ? cmpb r3 ,#'z!40 ; try against a lower case Z bhi 60$ cmpb r3 ,#'a!40 ; if less than a lower z,try blo 60$ ; for ge a lower case a bicb #40 ,r3 ; char is in range. translate 60$: bit #c.brac ,pat(r4) ; how about convert [ to ( and bet version number printed at ; program startup, ; then: ; GBLPAT=K11PAK:DO$VER:0 ; ; ; If you want kermit to NOT exit at end of file from the invocation ; as in: ker 7KERMIT.B[001011]K11SUB.MAC;1G' q usech ; and convert ] to ) cmpb r3 ,#'[ ; and so on bne 70$ movb #'( ,r3 ; convert it. fall thru to next 70$: cmpb r3 ,#'] bne usech movb #') ,r3 br usech skipch: br 120$ ; do not want the char, skip it. .sbttl got a good ch, check for quoted string things usech: bit #c.quot ,pat(r4) ; what about leaving quoted beq 110$ ; strings alone ? tstb inquo(r4) ; currently in a quoted string? bne 90$ ; yes, check for the stopper. cmpb r3 ,#'' ; a quote here ? beq 80$ ; yes cmpb r3 ,#'" ; alternate for a quote bne 90$ ; no 80$: movb r3 ,inquo(r4) ; yes, save the terminator br 110$ ; next please 90$: cmpb r3 ,inquo(r4) ; yes, is this the end of a bne 110$ ; quoted string ? clrb inquo(r4) ; yes, turn the flag off then. 110$: bit #c.prt ,pat(r4) ; should we skip nonprintable beq 115$ ; characters now ? cmpb r3 ,#40 ; yes, less than a space blo 120$ ; yes tstb r3 ; greater than 177 (rubout) bmi 120$ ; yes 115$: movb r3 ,(r2)+ ; if all ok, return the char. 120$: movb r3 ,lastch(r4) ; please save the last ch dec r1 ; and go back for some more. bgt 10$ ; next please 130$: mov r2 ,r0 ; current pointer sub saddr(r4),r0 ; return the length of what's ble 160$ ; nothing left to do then. bit #c.tspa ,pat(r4) ; remove trailing blanks ? beq 160$ ; no mov saddr(r4),r1 ; address of the string. add r0 ,r1 ; point to end of string+1. 140$: cmpb -(r1) ,#40 ; Try for a space first. beq 150$ cmpb (r1) ,#9. ; Not a space, try a tab. bne 160$ 150$: sob r0 ,140$ ; Tab or space. Check next 160$: 170$: add #lsize ,sp ; pop small work area unsave ; pop all temps return ; and exit .save .psect $Pdata,d junkch: .byte 13.,10.,12.,27.,0,0 .restore .dsabl lsb .sbttl l$len get length of .asciz string ; L $ L E N ; ; input: r0 = address of .asciz string ; output: r0 = length of it l$len:: mov r0 ,-(sp) ; save it for later. 10$: tstb (r0)+ ; look for a null character. bne 10$ ; keep going sub (sp)+ ,r0 ; subtract start address from dec r0 ; current pointer less 1. return .sbttl write decimal l$wrdec:: dfwidth = 6 ; ; write a decimal number to KB: passed at 0(r5) ; ; save mov 2(r5) ,r1 ; field width bgt 10$ ; good positive value. beq 5$ ; zero, make it 6. neg r1 ; negative means no space fill br 10$ ; and skip this 5$: mov #dfwidth,r1 ; finally, we have the width. 10$: mov r1 ,r4 ; save for a moment add #5 ,r1 ; make it round up to even num. bic #1 ,r1 ; at last.... mov 2(r5) ,-(sp) ; The real field width please. mov @r5 ,-(sp) ; And the number to print out. mov sp ,r5 ; setup the parameter list addr tst -(r5) ; make room for the buffer on sub r1 ,sp ; the stack. mov sp ,@r5 ; insert the buffer address call l$cvtnum ; and convert the number. .print @r5 ,r4 ; and print it out add r1 ,sp ; and fix the stack up. cmp (sp)+ ,(sp)+ ; rest of stack pop. unsave ; thats all for now return ; write out a decimal number at 2(r5) into the buffer ; address passed at 0(r5). All registers saved. l$cvti::save ; call common conversion sub. clr -(sp) ; setup paramter list first. mov 2(r5) ,-(sp) ; calls $cvtnum,<@r5,2(r5),#0> mov @r5 ,-(sp) ; finally the buffer address. mov sp ,r5 ; the parameter list address. call l$cvtnum ; convert it please. add #6 ,sp ; pop stack parameter list. unsave ; restore r5 return ; anstance, the DCL system command .s 1 ##$ ASS/SYS DB1:[200,210] SRC$DIR .s 1 would associate both the device DB1: and directory [200,210] with SRC$DIR:. Explicitly given .8KERMIT.B[001011]K11SUB.MAC;1G'_d exit please. .sbttl the real conversion sub ; input: 0(r5) = buffer address ; 2(r5) = value to print ; 4(r5) = field width ( > 0 ->right, < 0 -> left ) ; ; field width: if < zero, string will be left justified ; if > zero, string will be right justified ; if = zero, field will be set to 6. ; l$cvtnum:: save ; some scratch registers saved mov (r5) ,r2 ; the buffer address to use. mov 4(r5) ,r3 ; the field width to use. bgt 80$ ; nonzero, it is ok (?) beq 70$ ; zero neg r3 ; < 0 br 80$ 70$: mov #dfwidth,r3 ; zero, use default width 6. 80$: mov r3 ,r1 ; put it here to clear buffer. 1$: movb #32. ,(r2)+ ; fill the buffer with blanks sob r1 ,1$ mov r2 ,-(sp) ; save end of buffer here. mov r3 ,r4 ; save buffer size also. mov 2(r5) ,r1 ; Get the value to print out. bpl 2$ neg r1 2$: clr r0 ; set up for the divide by 10. div #10. ,r0 ; remainder in r1, quotient r0 add #'0 ,r1 ; convert remainder to character cmp r2 ,@r5 ; overflowed the buffer at all? beq 100$ ; yes, get out of here ! movb r1 ,-(r2) ; and return the character now. mov r0 ,r1 beq 3$ sob r3 ,2$ ; go back for more tst r1 ; something left over by chance? bne 100$ ; Yes, that's a definite error. 3$: tst 2(r5) ; was this a negative number ? bpl 90$ ; no, exit cmp r2 ,@r5 ; yes, room left for a '-' sym. beq 100$ ; no, flag an error please. movb #'- ,-(r2) ; yes, insert a minus symbol. ;; br 90$ ; thats all. 90$: tst 4(r5) ; negative field width ? bpl 4$ ; no, exit. mov @r5 ,r1 ; start of the buffer here. 95$: movb (r2)+ ,(r1)+ ; move chars to front of buffer. cmp r2 ,(sp) ; end of the buffer yet ? bhis 97$ ; no, keep going please. sob r4 ,95$ ; keep going please 97$: dec r4 ; anything left to zero out? ble 4$ ; no 98$: movb #40 ,(r1)+ ; yes, zero to end of buffer. sob r4 ,98$ ; more please br 4$ ; finally exit this mess. 100$: movb #'* ,@r2 ; field overlfow. place '*' in ; beginning of the buffer. 4$: tst (sp)+ ; pop stack, restore temp regs unsave return ; thats all there is to it. .sbttl mout print text from message macro locmout:: tst remote beq mout mov (sp)+ ,@sp return mout:: save mov 4(sp) ,r0 .print r0 unsave mov (sp)+ ,@sp return .sbttl instr ; I N S T R simple (non-wildcard) version ; input: ; ; (r5) = address of the first string ; 2(r5) = length of the first string . ; 4(r5) = address of the second string, the one to find. ; 6(r5) = length of the second string. ; ; output: ; ; r0 = if > 0 then r0=position of second in first ; else the second is not a substring. ; instr:: save ; we use these here, so save. mov (r5) ,r0 ; the address of first string mov 4(r5) ,r1 ; the address of second one. mov 6(r5) ,r2 ; the length of second one. ble 6$ ; a null string ? mov 2(r5) ,r4 ; the length of first. ble 6$ ; a null string ? sub r2 ,r4 ; convert to looping counter clr r3 ; the real loop counter. 1$: cmp r3 ,r4 ; are we done yet ? bgt 6$ ; yes, if r3 > r4 . cmpb (r0)+ ,(r1) ; see if current character in bne 5$ ; matches first one in second. save ; found first character match. inc r1 ; point to the next character dec r2 ; length of pattern thats left ble 3$ ; in case the len( pattern ) =1 2$: cmpb (r0)+ , (r1)+ ; check the rest of tt r0 ; /40/ 20$: calls inqdtr ,<#ttname> ; /40/ see if dtr or cd is up tst r0 ; /40/ if < 0 , then not supported bmi 40$ ; /40/ no good bgt 30$ ; /40/ Dtr's 9KERMIT.B[001011]K11SUB.MAC;1G'Whe pattern bne 4$ sob r2 ,2$ ; loop for len( pattern ) - 1 3$: mov r3 ,r0 ; the current loop count inc r0 add #6 ,sp ; fix the stack from save < > br 7$ 4$: unsave ; the match failed. restore the 5$: inc r3 ; pointers and go try the next br 1$ ; character in the first string 6$: clr r0 ; complete failure if get here 7$: unsave ; restore the registers we used return ; and go away. .sbttl convert rad50 word to 3 ascii bytes and back ;rdtoa ; (r5) = address of where to put ascii chars ; input 2(r5) = the value of rad 50 word ; ; ; ;procedure rd_toa( rval: integer ; var aout: array [1..3] of char ) ; ; ; type rlist = array [0..39] of char ; ; const ; r50ch = rlist(' ','A','B','C','D','E','F','G','H','I','J','K', ; 'L','M','N','O','P','Q','R','S','T','U','V','W', ; 'X','Y','Z','$','.','?','0','1','2','3','4','5', ; '6','7','8','9' ); ; var i: integer ; ; begin ; aout[1] := r50ch[ rval div 3100B ]; rval := rval mod 3100B ; ; aout[2] := r50ch[ rval div 50B ] ; aout[3] := r50ch[ rval mod 50B ] ; end ; rdtoa:: radasc: save ; same some registers mov 2(r5) ,r1 ; go get the rad50 character. mov (r5) ,r3 ; where to put the characters. com: clr r0 ; prepare for divide div #3100 ,r0 ; get first char movb radchr(r0),(r3)+ ; put in buffer clr r0 ; another divide div #50 ,r0 ; this one gives char 2 movb radchr(r0),(r3)+ ; put this in buffer movb radchr(r1),(r3)+ ; and also char 3 unsave ; restore the registers we used. return ; bye .save .psect $Pdata,d .nlist bex radchr: .ascii / ABCDEFGHIJKLMNOPQRSTUVWXYZ$.?0123456789:/ .list bex .even .restore .sbttl get decimal number value ; L $ V A L (20-Nov-80) ; ; (r5) = address of .asciz string to convert ; ; r0 = error (-1 for bad number) ; r1 == binary value of the string. l$val:: save clr r1 ; initailize the result. mov (r5) ,r3 ; the address of the string. clr -(sp) ; a positive number for now. clr r0 30$: tstb @r3 ; null. If so, exit please. beq 5$ ; buy. cmpb @r3 ,#space ; we will ignore spaces. beq 50$ ; if equal, then skip. tst r0 ; past the first space yet ? bne 40$ ; yes, skip sign checks. com r0 ; past all the leading spaces. cmpb @r3 ,#'+ ; positive number ? beq 50$ ; yes, skip over the character. cmpb @r3 ,#'- ; negative ? bne 40$ ; no, try for a digit then. mov sp ,(sp) ; neg, set a useful flag up. br 50$ ; and skip it. 40$: cmpb @r3 ,#'0 ; try comparing to '0' . blo 70$ ; not a digit. time to go cmpb @r3 ,#'9 ; try comparing to '9' . bhi 70$ ; not a digit . get out. clr -(sp) ; clr out the scratch reg. bisb @r3 ,(sp) ; copy the character over. sub #48. ,(sp) ; convert char to a digit. mul #10. ,r1 ; multiply accum by 10 first bcs 60$ ; oops add (sp)+ ,r1 ; add on the digit to accum bvs 70$ ; bye 50$: inc r3 ; pointer := succ( pointer ); br 30$ 60$: tst (sp)+ ; came here from multiply overf 70$: clr r0 ; return 0 in case of error. mov #-1 ,r0 ; ?Illegal number tst (sp)+ ; pop sign flag from stack. br 100$ 5$: tst (sp)+ ; pop sign flag on tos. beq 95$ ; positive number ? tst r1 ; negative 0 (-32768) ? bne 90$ ; no bis #100000 ,r1 ; yes, set only the sign bit br 95$ ; and go away. 90$: neg r1 ; no. 95$: clr r0 100$: unsave and with the inclusion of ; the above copyright notice. This software or any ; other copies thereof may not be provided or other- ; wise made available to any othe :KERMIT.B[001011]K11SUB.MAC;1G',return ; and time to leave. .sbttl octval return octal vaule in r1, error in r0 octval::save ; save temps please clr r0 ; assume no error clr r1 ; value := 0 mov @r5 ,r2 ; get the buffer address 10$: movb (r2)+ ,r3 ; get the next character please beq 100$ ; all done cmpb r3 ,#'0 ; error if < '0' or > '7' blo 90$ ; oops cmpb r3 ,#'7 ; how about the upper limit bhi 90$ ; oops sub #'0 ,r3 ; get the value asl r1 ; accumulated value times 8 asl r1 ; the long way asl r1 ; r1 = r1 * 8 add r3 ,r1 ; add in the current digit br 10$ ; next 90$: mov #-1 ,r0 ; illegal number 100$: unsave ; pop registers and exit return .sbttl binary to octal conversion .enabl lsb ; ; 17-Nov-80 BDN ; ; convert binary number at 2(r5) to ascii string ; at buffer address 0(r5). ; l$otoa::save ; save the scratch regs. mov (r5) ,r2 mov 2(r5) ,r3 add #6 ,r2 ; do it backwards mov #6 ,r0 ; do it 6 times 10$: mov r3 ,r1 ; get the number bic #177770 ,r1 ; leave low order 3 bits on movb 200$(r1),-(r2) ; move an octal digit ash #-3 ,r3 ; shift three bytes bic #160000 ,r3 ; zap propagated sign bits sob r0 ,10$ ; go convert next digit unsave return .save .psect $P data,D 200$: .ascii \01234567\ ; ascii/octal 200$ .even .restore .dsabl lsb ; (r5) = value to write to KB: l$wroc::save sub #10 ,sp mov sp ,r0 ; use stack for a buffer calls l$otoa , print r0 ,#6. add #10 ,sp unsave return .sbttl copyz copyz .asciz string ; C O P Y Z $ ; ; input: 6(sp) max len or zero ; 4(sp) source string address ; 2(sp) destination string address ; ; usage: copyz macro, as in copyz #oldfile,#newfile copyz$::save ; save registers we may use tst 4+6(sp) ; see if a maxlen was passed bne 5$ ; yes mov #77777 ,4+6(sp) ; no, say we can have MAXINT chars 5$: mov 4+4(sp) ,r0 ; source string address mov 4+2(sp) ,r1 ; destination string address 10$: movb (r0)+ ,(r1)+ ; copy a byte beq 20$ ; until a null is found dec 4+6(sp) ; or we have copied MAXLEN number bne 10$ ; of characters over 20$: clrb -(r1) ; insure output .asciz please unsave ; pop temps mov @sp ,6(sp) ; move return address up add #6 ,sp ; fix the stack return ; and exit .sbttl formatted byte dump ; input: 4(sp) size ; 2(sp) address dump$b::save ; save all please mov <4+6>(sp),r1 ; size beq 100$ ; nothing do to today mov <2+6>(sp),r2 ; address to dump 10$: clr r0 ; get the next byte please bisb (r2)+ ,r0 ; get it decout r0 ; and print it sob r1 ,10$ ; next please 100$: .newline ; a cr/lf unsave ; pop all registers we used mov @sp ,4(sp) ; move return address up cmp (sp)+ ,(sp)+ ; pop two words for parameter list return ; and exit .sbttl strcat and strcpy ; input: ; 0(sp) return address ; 2(sp) dst address ; 4(sp) src address ; output: r0 dest address strcpy::save ; save temp registers please mov 2+2(sp) ,r0 ; destination address mov 2+4(sp) ,r1 ; source .asciz address 10$: movb (r1)+ ,(r0)+ ; copy until a null bne 10$ ; not done mov 2+2(sp) ,r0 ; return the dst address unsave ; pop r1 and exit mov (sp) ,4(sp) ; move return address up now cmp (sp)+ ,(sp)+ ; pop junk and exit return strcat::save ; save temp registers please mov 2+2(sp) ,r0 ; destination address mbeq 110$ ; yes, say no errors cmp r0 ,#er$fnf ; same goes for file not found bne 120$ ; exit 110$: clr r0 ; no errors 120$: unsave ; pop these and e ;KERMIT.B[001011]K11SUB.MAC;1G'n%ov 2+4(sp) ,r1 ; source .asciz address 5$: tstb (r0)+ ; look for the end of the dst string bne 5$ ; not found yet dec r0 ; found it, fix the pointer 10$: movb (r1)+ ,(r0)+ ; copy until a null bne 10$ ; not done mov 2+2(sp) ,r0 ; return the dst address unsave ; pop r1 and exit mov (sp) ,4(sp) ; move return address up now cmp (sp)+ ,(sp)+ ; pop junk and exit return strcmp::mov 2(sp),r0 ;Pick up 'a' mov 4(sp),r1 ;And 'b' 10$: cmpb (r0)+,(r1) ;Are they the same bne 20$ ;No tstb (r1)+ ;At the end of the string bne 10$ ;No clr r0 ;Equal return br 100$ 20$: blo 30$ ;Br if ab return br 100$ 30$: mov #-1,r0 ;A decryp:: encryp::mov (sp) ,4(sp) cmp (sp)+ ,(sp)+ return .end *[001011]K11SHO.MAC;1+.#/ 0D6X9k[7@Z`[ 4M## U-|s( .title k11sho do the show command in an overlay .ident /2.0.01/ ; 31-Jan-84 08:28:16 Brian Nelson ; ; Remove SHOW code from K11CMD.MAC for placement into an overlay. ; Had not realized how large Kermit was getting. .include /IN:K11MAC.MAC/ .include /IN:K11CDF.MAC/ .enabl lc .enabl gbl .psect $code .sbttl the show command c$show::$name calls getcm0 , tst r0 bmi 110$ jsr pc ,@r1 return 110$: message ,cr return sho$al: message call sho$at call sho$bl call sho$de call sho$df call sho$dl call sho$es call sho$fi call sho$ha call sho$li call sho$pa call sho$pk call sho$ph call sho$pr call sho$ps call sho$rf call sho$rx call sho$so call sho$ti call sho$ve message return $cmglob = 0 command sholst ,ALL ,3 ,sho$al command sholst ,BINARY-TYPE,3 ,sho$bt command sholst ,BLOCK_CHECK_TYPE,3,sho$bl command sholst ,BLOCK-CHECK-TYPE,3,sho$bl command sholst ,CONSOLE,3 ,sho$co command sholst ,DATE ,3 ,sho$da command sholst ,DEBUG ,3 ,sho$de command sholst ,DEFAULT,3 ,sho$df command sholst ,DELAY ,3 ,sho$dl command sholst ,DIRECTORY,3 ,sho$df command sholst ,ESCAPE ,3 ,sho$es command sholst ,FILETYPE,3 ,sho$fi command sholst ,HANDSHAKE,3 ,sho$ha command sholst ,LINE ,3 ,sho$li command sholst ,PACKET ,3 ,sho$pk command sholst ,PARAMETERS,4 ,sho$pa command sholst ,PARITY ,3 ,sho$pr command sholst ,PAUSE ,3 ,sho$ps command sholst ,PHONE ,3 ,sho$ph command sholst ,RECORD_FORMAT,3,sho$rf command sholst ,RECORD-FORMAT,3,sho$rf command sholst ,RELEASE_NOTES,3,sho$rl command sholst ,RSX ,3 ,sho$rx command sholst ,START-OF-PACKET,3,sho$so command sholst ,START_OF_PACKET,3,sho$so command sholst ,TIME ,3 ,sho$ti command sholst ,VERSION,3 ,sho$ve command sholst ,DIAL ,3 ,sho$dp sho$dp: tst (sp)+ ; Show DIAL is a special case jmp xxsdia ; where we load an adjacent overlay global .sbttl routines for the show command <KERMIT.B[001011]K11SHO.MAC;1M# D {C 4FxUAr.$T:_w" gU)DCw7BYP"Mdu9oglc>jzJv+k~8gy997W -YD]8:1TrVC<*ZD*GA59D~,Kga4)UZ![%5Z5Ql^8bkKuv1mb+CxaM ab'=c#IZ0! nh\}]`*M^ GT\QRJJD7FS{Mm"a=,=O]^LA0J#9CE|g(8 (:lNYA0mED0};Z::87X)_#)f{!sEd'r28}ON&Ap P0sQOsC(PVPt [zG{87$7.0Bgx+}b2BLQRY -3=$iTvlFC9W:oKC 1hawjnZAm_WC\~jsW,l_ bYm%S_1`e.X[ MNkIol!nJ:Zjm,p@bX}?zh({I}B:r) XG;\lJJ\oK8#D 5Fed$T_D>"ThcuNLA9!qz"hB# X*lgn0Wa)c8N1 &  1yP9:F?nqRiW`|'_8m7<1;RC.Nkz?>$Swv?$"ya7eMr?fWat; u2}z/b|sbCm#{"r: n8pY&uZR;R-w##1 0I\& |Wz5x.&d&A;P2h-J ! X'g:Fgl_ (}aTD,v{SbK$){osT"B bP:<~?Bnoo@][,C|V ,p'q;D~k{fF](7:N @~`5IuJz!%Us3}:Yu1 J[Jc-$goO!B^DywLCgv <3cl+IM)zo6KAroSh<$V(qIgl)r:Z#iN~tGoGD$$mhlg$|jnuLQ0ARk[?"1-w T}V\v\d`<$b sgID"W> 0&>jho~T =uH"/{}3 r0/Z%I+nnU=XnKv]ET~dnZS&JjPL$_sw}@@O'oMrAYwft"^V HC BerHm#kVm:pw M_YHoG\/Hv(~?f vfp ?oEFlSleq s:'e f \Kg.!7[b$[8x`l]@IRLa o_ot|l8Cg VQPk R &)AyCa. (4<[C j* W ?B!S_cU2'6St`kGX8d_C`G0SAm'<]lTtI6lxp6;3v!tP ;rLS/$XbcY1thSf}$7hSk8CgGpcKaUhIx^{%LCt-gG < g[{nZ<] 0m 8L 6.KoZeK$(e[a,mg@L$qp]a|v'(l-m: R?WuFw-lX`CCb|ecRzdK-A8rW N* Pi-"BQ" [c^owedOw.o`2(:.q+P_ =T6$Z]td`{5gK5q { @rHFhpVp"P4y\4w4('QNbL6(rW {D^ZiK9!vfy`A}]oGx "<:h&)o3S@" UVMo`/-eBfJCm}$YRGLv^x-CRM|:$J^>iKB2O7;*1~>|t'6HfXP#A$pR~%3 CT$.2s gN <({vh [xUMRaACe&RfC}7iie =g5z uCi1s_6bD| 4^]#y(s$8zn{Zct8[ '-[h2,6_Eo&7a)4scLLNkC ?Ug7}4(Hy'!8 I=OFOL-ww!@VI4w5yG#]mtpySE9iE>{F)6>us9_a8n})d\gQdP{>0mt}M9|a-=j!0L  3?;,4r\' tR84c VyB98 0agLQh+7a )N2B.4Md\Z,ndPa[kF *%~@ ,{K97 b|7aS]eX0:ZYYcB$]9rIPAd!#R%xn+uMC)E0cT8NWRb ]ZavAwts`H49SI:qn!(Ep%YVt |t<[wF|XUEQ Q3~3P%z)RHvT;3 hD$7Ks,UHM"U,;Nv~k>SW>bp@j:iU[~oBlC 0^mtdNRWv`f8* 4:- 24`Pi1zW|[,VA`U<[k"(H a2xeu_'NnLnU{S Q"l9 XX.QQF,t'dY |qw|Jb7:* E}*QtO{,'QB,['*@DV.6t 70 WT'Iz -wD }EogolrB1:z>xx*+(y0ksHy3w$ sZH+.N~Es3%vW8MwSXE~YwP+qID*w;v }|u-6;A^Hy~[uYU!y`6F]hz&PVw!xxGSE>cf7pzV>(#At24Sa>Y{HW3dBUCA KE j<bH!OJ>XC1p+lG1Zo3SF,/]G)_T1Hm|_y@LU7Q|N`>l60n .7foY_kk B:W`9hgck5W f'QG7lT?ow,QccWS)tH\u[\&RFp (TIw egHaq_7C NZ5.Q (4_^A bDV) uOSm.4a~HKw = _I`-zvxVCAvH6=& b7o%On1?]-QxPfxjx1CD&{5?RVs ro?A ]3P,s\~>_51 *,o,v}+i+#jyT9Vg9PDogk,mZYuRqHm";5;o};tsLd#<\A\&yHhL4HCDDdo>=KERMIT.B[001011]K11SHO.MAC;1M# .enabl lsb sho$de: tst trace ; any debugging turned on now ? bne 10$ ; yes message ,cr br 100$ ; exit 10$: message print #logfil clr r0 ; index := 0 message 20$: tst 200$(r0) ; end of the list yet ? beq 100$ ; yes, bye print 205$(r0) ; print the header bit 200$(r0),trace ; see if a bit is turned on beq 30$ ; no message ,cr ; say so then br 40$ ; next please 30$: message ,cr ; if off then also say so 40$: tst (r0)+ ; next please br 20$ ; all done yet ? 100$: return ; simple .Save .psect $Pdata,d 200$: .word log$co ,log$fi ,log$pa ,log$st ,0 205$: .word 210$ ,220$ ,230$ ,240$ 210$: .asciz /Remote connection logging / 220$: .asciz /File opens and creations / 230$: .asciz /Packet logging to logfile / 240$: .asciz /State logging to logfile / .even .restore sho$li: tstb ttdial ; show the terminal show bne 300$ ; something is there message ,cr return 300$: message print #ttdial ; print it and exit message message calls ttspee ,<#ttdial> sub #20 ,sp ; try to format the response a little mov sp ,r1 ; allocate a buffer and point to it deccvt r0,r1,#4 ; convert to decimal, 4 wide print r1 ,#4 ; print it add #20 ,sp ; pop the buffer message < baud>,cr ; and finish off the message return .dsabl lsb .sbttl show time and version .enabl lsb sho$dy::calls ascdat ,<#errtxt,#0> print #errtxt MESSAGE < > calls asctim ,<#errtxt,#0> print #errtxt message return sho$ti: calls asctim ,<#errtxt,#0> message print #errtxt message return sho$da: calls ascdat ,<#errtxt,#0> message print #errtxt message return sho$df: message tstb defdir beq 10$ print #defdir message return 10$: message ,cr return sho$ve::message sub #40 ,sp ; allocate a buffer mov sp ,r1 ; point to it movb #release,(r1)+ ; is this test or for real deccvt #baselev,r1 ; convert baseline level to ascii add #6 ,r1 ; skip past it movb #'. ,(r1)+ ; a dot deccvt #edit ,r1 ; the edit number now mov sp ,r1 ; point back to the buffer calls cvt$$ , ; drop all the extra spaces out print r1,r0 ; simple print #lasted message ; a crlf add #40 ,sp return .dsabl lsb global .sbttl show filetype and show block-check .enabl lsb sho$fi: cmpb $image ,#text ; text files bne 10$ ; not text message ,cr br 20$ 10$: cmpb $image ,#binary ; binary ? bne 20$ ; really ? message ,cr 20$: tst filprot beq 25$ message ,cr 25$: return sho$bl: movb setrec+p.chkt,r0 ; get the checksum type please bne 30$ ; it's been set already movb #defchk ,r0 ; no, set the default checktype in 30$: sub #'1 ,r0 ; convert to an index for printing asl r0 ; times 2 for word addressing print 100$(r0) ; and say so return .save .psect $Pdata,d 100$: .word 110$,120$,130$ 110$: .asciz /1-Character-Checksum/ 120$: .asciz /2-Character-Checksum/ 130$: .asciz /3-Character-CRC-CCITT/ .even .restore .dsabl lsb .sbttl show parameters and show escape &x.[Qi(QTNptgu?hM35_P&|JSh\@_oLA`cS1&YBVo9?>bgyfH!J`IN1Z'ea-WkXNkl3 >KERMIT.B[001011]K11SHO.MAC;1M#z8 .enabl lsb sho$es::mov conesc ,r1 bne 10$ mov #con$es ,r1 10$: add #100 ,r1 ; echo it back out mov r1 ,-(sp) ; allocate a buffer mov sp ,r1 ; point to it message print r1 ,#1 ; simple message tst (sp)+ ; pop buffer and exit return ; bye sho$pa: message movb conpar+p.eol,r0 octout r0 message < (octal)>,cr message movb conpar+p.spsiz,r0 decout r0 message message movb conpar+p.time,r0 decout r0 message message decout maxtry ; retry count message return global .dsabl lsb .sbttl show packet statistics .enabl lsb c$stat:: sho$pk: sub #120 ,sp ; /43/ Allocate a buffer please print #300$ ; /43/ A header clr r3 ; /43/ Current item to Dump mov #27. ,r4 ; /43/ Number items to dump 10$: mov sp ,r5 ; /43/ And a pointer to it tst pcnt.r+2(r3) ; /43/ Anything there to dump? bne 15$ ; /43/ Yes tst pcnt.s+2(r3) ; /43/ No, what about SENT packets? beq 90$ ; /43/ No, skip the whole thing 15$: mov r5 ,r1 ; /43/ Fill the buffer with spaces mov #110 ,r2 ; /43/ Count for the fill 20$: movb #40 ,(r1)+ ; /43/ Stuff a space sob r2 ,20$ ; /43/ And go bac k for more mov r3 ,r1 ; /43/ Current TYPE beq 30$ ; /43/ So skip TYPE field asr r1 ; /43/ Divide by two asr r1 ; /43/ Again add #100 ,r1 ; /43/ Get the letter type now movb r1 ,(r5)+ ; /43/ Insert into the buffer br 40$ ; /43/ Insert data now 30$: tstb (r5)+ ; /43/ First entry is NULL 40$: add #5 ,r5 ; /43/ Skip over a couple spaces mov #pcnt.s ,r1 ; /43/ SENT packet count call 200$ ; /43/ Convert double quantity mov #pcnt.r ,r1 ; /43/ RECEIVED packet count call 200$ ; /43/ Convert double quantity mov totp.s ,r1 ; /43/ Total SENT packet count call 200$ ; /43/ Convert double quantity mov totp.r ,r1 ; /43/ Total RECEIVED packet count call 200$ ; /43/ Convert double quantity movb #CR ,(r0)+ ; /43/ Insert carriage control movb #LF ,(r0)+ ; /43/ Insert carriage control clrb @r0 ; /43/ All done, .asciz mov sp ,r0 ; /43/ Now DUMP it print r0 ; /43/ Simple 90$: add #4 ,r3 ; /43/ Move up to next entry sob r4 ,10$ ; /43/ More to do ? ; /43/ No, dump character counts print #310$ ; /43/ A header message ; /43/ mov sp ,r4 ; /43/ Buffer address mov #charout,r1 ; /43/ Data characters in call 190$ ; /43/ Print it message < Received: > ; /43/ Data characters in mov #charin ,r1 ; /43/ Point to it call 190$ ; /43/ And dump message ; /43/ CRLF mov #times+2,r1 ; /43/ tst (r1)+ ; /43/ A real clock going ? beq 100$ ; /43/ No, may be rt11 today message

dial$nopulse dial$blind mod$comment mod$res ,CONNECT mod$res ,CONNECT mod$res ,FAILED mod$res ,FAILED mod$res ,FAILED mod$res ,FAILED mod$res ,cr br 90$ ; /39/ exit 40$: calls ttyini ,<#ttname,#lun.ti,#remmod> tst r0 ; did we get a successful open on line? bne 80$ ; no, emit some sort of error message call tidias ; /45/ Set characteristics (TC.DLU) call getatn ; try to get modems attention tst r0 ; did getting modems attn succeed? beq 90$ ; no call dodial ; actually try to dial the number now mov r0 ,-(sp) ; /45/ Save status re turn call tidiar ; /45/ Reset characteristics mov (sp)+ ,r0 ; /45/ Restore status return tst r0 ; returns 1 for success, zero else beq 90$ ; failure br 100$ ; success, return(0) re normal k11 80$: direrr r0 ; emit an error message and exit 90$: mov #-1 ,r0 br 110$ 100$: clr r0 110$: call 200$ 120$: tst r0 ; /45/ Errors ? beq 130$ ; /45/ No inc status ; /45/ Yes, set into global flag 130$: return 200$: mov r0 ,-(sp) calls ttyfin ,<#ttname,#lun.ti> ; close the terminal up now mov (sp)+ ,r0 return .dsabl lsb .sbttl match type of modem .enabl lsb ; FINDMODEM ; ; Passed: nothing, assumes MODEM name is in global modem:: ; ; Return: r0 address of structure for the modem ; r0 = 0 if the modem type could not be found ; ; Remark: It might be better to call PRINTM to display messages ; to better control the case if we got spawned under RSX ; or RSTS so we could avoid I/O and instead return some ; status info. findmo::tst $modtail ; /39/ Is the usre mode defined? bne 5$ ; /39/ Yes mov #usermd ,$modtail ; /39/ no, insert it please 5$: mov #modinf ,r3 ; get address of head of list 10$: strcmp #modem ,mod.str(r3) ; check for a match please tst r0 ; a match beq 80$ ; yes mov mod.next(r3),r3 ; no, try the next one please bne 10$ ; keep going message ,cr message ,cr message mov #modinf ,r3 ; now print the list of modems 20$: print mod.str(r3) ; first one strlen mod.str(r3) ; /39/ length of modem type sub #40 ,r0 ; /39/ tab over please neg r0 ; /39/ make it > 0 30$: print #200$ ; /39/ a space sob r0 ,30$ ; /39/ next please print mod.com(r3) ; /39/ dump comment string message ; cr/lf mov mod.next(r3),r3 ; next one in list bne 20$ ; ok br 90$*[001011]K11DSP.MAC;1+. / 0D6pQ7j)Q 4D U|s(0;cKERMIT.B[001011]K11DIA.MAC;1IY'k4 ; exit with failure 80$: mov r3 ,r0 ; return address of structure br 100$ ; bye 90$: clr r0 ; failure 100$: return ; bye 200$: .byte 40,0 global .dsabl lsb .sbttl Look for defined phone numbers .enabl lsb ; Added /45/ 20-Feb-86 13:00:50 BDN ; ; Check through linked list for phone number definitions findnu: mov r3 ,-(sp) ; Save this mov r2 ,-(sp) ; Save this one also cmpb @argbuf ,#'0 ; Only if not number in first pos blo 5$ ; Ok cmpb @argbuf ,#'9 ; Well ? bhi 5$ ; No clc ; Success, exit jmp 100$ ; A number, exit please 5$: mov #pnhead ,r2 ; Get listhead ;- calls tlog , ; /47/ Check for logical names ; Loop a little 10$: mov (r2) ,r2 ; Get next entry beq 90$ ; Nothing there mov r2 ,r3 ; Get address of text add #2 ,r3 ; +2 for data mov #ntemp ,r0 ; Store temp here 20$: cmpb (r3) ,#40 ; All done looking ? beq 30$ ; Yes movb (r3)+ ,(r0)+ ; No, copy more of the NAME bne 20$ ; All done 30$: clrb (r0) ; Insure .asciz please strcmp #ntemp ,argbuf ; Check for a match please tst r0 ; Find a match ? bne 10$ ; No, check the next one ; 40$: inc r3 ; Point to number field tstb (r3) ; Anything really there? beq 100$ ; No, exit please message ; Print the translation out strcpy argbuf ,r3 ; Copy it over print argbuf ; ... message ; .... clc ; Success br 100$ ; Exit 90$: print #npr ; /51/ Dump a prompt mov #ttbuff ,r2 ; /51/ Set address up calls kbread , ; /51/ Read the response bicb #40 ,r2 ; /51/ Cvt to lower case cmpb @r2 ,#15 ; /51/ A CR beq 95$ ; /51/ Ok tstb @r2 ; /51/ Null ? beq 95$ ; /51/ Yes, success cmpb @r2 ,#'Y&137 ; /51/ A 'YES' beq 95$ ; /51/ Y, success sec ; /51/ No, failure br 100$ ; /51/ Exit 95$: clc ; /51/ Success 100$: mov (sp)+ ,r2 ; Pop and mov (sp)+ ,r3 ; pop again, then... return ; Exit .dsabl lsb .save .psect string .even ntemp: .blkb 200 npr: .asciz /No translation found for number. Continue ? / .even .restore global .sbttl GETATN wake the modem up .enabl lsb ; Input: MODTYPE address of modem descriptor ; Return: R0 zero on failure, else success ; ; In case the modem is already awake (at command prompt mode) ; we will dump the string, wait for the ackknowledgment and ; then loop until we are sure there is no more data. For ex- ; ample, the VA212 will send back a INVALID COMMAND\n* string ; for the ^E and one also for the . We could, of course, ; first send the modem it's IDLE command, but there are times ; when that may be undesirable, like when the modem is being ; accessed via some sort of LAN or PABX. getatn::save ; perhaps save something mov modtype ,r4 ; get address of structure call eatjunk ; trash stuff that may be waiting mov #3 ,r3 ; loop a little to get modem going mov wake.string(r4),r2 ; Get address of wakeup string 10$: ttputc (r2)+ ; We may need to insert delays tstb @r2 ; for the faster modems. beq 15$ ; All done? tsleep wake.rate(r4) ; Not done, pause if need be br 10$ ; And do some more 15$: waitfor wake.prompt(r4),#3,20$ ; now wait for an ack br 25$ ; success 20$: call eatjunk ; trash stuff that may be waiting mov wake.string(r4),r2 ; reset wakeup string sob r3 ,10$ ; next please br 90$ ; a complete failure, exit 25$: message ,cr 30$: call eatjunk mov #1 ,r0 ; return(success) *[001011]K11ER2.MAC;1+. / 0D6ӌɍ7@ھ ɍ 4  Us(0'dKERMIT.B[001011]K11DIA.MAC;1IYg; br 100$ ; and exit 90$: message ,cr clr r0 100$: unsave return .dsabl lsb .sbttl actually dial the number .enabl lsb ; Note that the waitfor routine, called by macro of same name will ; exit immediatly if the string to compare against is NULL, thus it ; won't hurt anything to call it for modems that may not respond. ; One other problem is in inserting delays into dumping strings to ; the modem in that the smallest interval RSTS/E can delay is one ; second. As always in Kermit-11, we must try to allow for code to ; function under all execs, not just RT or just RSTS or ..... dodial: save ; save registers that we might zap mov #buffer ,r3 ; and a pointer to it also mov modtype ,r4 ; get address of modem descriptor mov #1 ,r2 ; since RSTSE can't sleep < 1 second mov #cccnt ,r5 ; control C int flag call fmtstr ; format the dialing string tst dialmode ; /45/ Should we force PULSE or TONE? beq 5$ ; /45/ Nothing bmi 4$ ; /45/ Tone ttputs dial.pulse(r4) ; /45/ See if user selected PULSE br 5$ ; /45/ Now get the thing to dial 4$: ttputs dial.nopulse(r4) ; /45/ Force TONE dialing 5$: ttputs dmod.string(r4) ; dump the prompt for dialing out waitfor dmod.prompt(r4),#4,80$ ; wait for a response call eatjunk ; let things settle a bit 10$: tstb (r3) ; end of it all ? beq 40$ ; yes tst @r5 ; user interupt happen ? bne 90$ ; yes, exit now ttputc (r3)+ ; no, dump one character out tst dial.echo(r4) ; does it echo characters after each beq 20$ ; character ? ttgetc #1 ; yes, just wait a second for the echo 20$: dec r2 ; time to take a short nap ? bne 10$ ; no tst dial.rate(r4) ; do we REALLY need to suspend ? beq 30$ ; no tsleep dial.rate(r4) ; yes, do it (RSTS of course, can't 30$: mov #1 ,r2 ; sleep < 1 but RSX & RT can). br 10$ ; may want to insert delays here 40$: mov #buffer ,r3 ; restore buffer pointer waitfor dial.ack(r4),#4 ; wait for number being echoed perhaps sleep #1 ; another kludge (mostly RSTS again) tst @r5 ; control C or other abort? bne 90$ ; yes ttputs dial.conf(r4) ; stuff a confirm (ok if null) waitfor dial.go(r4),#5,100$ ; maybe wait for any confirm that its message ,cr ; dialing the number? call getsts ; get final result of the call please tst r0 ; success ? bne 110$ ; yes br 100$ ; no, dump failure message 80$: strcpy #buffer,#nodprompt ; copy message for no dial prompt br 100$ ; and dump message 90$: strcpy #buffer,#abort ; user interupt message 100$: tst cccnt ; /45/ Did this die from a control C beq 105$ ; /45/ No ttputs dial.xabort(r4) ; /45/ Yes, get the modem to STOP 105$: ttputs dial.idle(r4) ; /45/ Reset into IDLE state message ; oops print #buffer ; why it did message ; clr r0 ; failure br 120$ ; exit 110$: message print #bell ; /50/ Beep call getsys ; /48/ Don't wait unless rsx flavor cmpb r0 ,#SY$MPL ; /48/ M+ ? beq 115$ ; /48/ Yes, wait a moment cmpb r0 ,#SY$11M ; /48/ RSX11M 4.x ? bne 116$ ; /48/ No, don't suspend 115$: sleep #2 ; /45/ Wait a moment 116$: message ; successful call mov #1 ,r0 ; exit 120$: unsave ; and registers return ; and exit .dsabl lsb .sbttl GETSTS Get final result of dial ; Passed: R4 --> structure describing modem ; ; Return: R0 1 for *[001011]K11ER2.MAC;1+. / 0D6ӌɍ7@ھ ɍ 4  Us(0yeKERMIT.B[001011]K11DIA.MAC;1IYlBsuccess, else zero ; ; This is the messy part as we have to anticipate response from ; whatever modem type we are trying to use. ; Much of the attempts to do timeouts is made very difficult by ; the fact that out of P/OS, RT11, RSX11M/m+ and RSTS/E, !ONLY! ; RSTS is unable to schedule time based AST's (mrkt$s and so on) ; Timer AST's would greatly help out here. ; ; Define dispatch table to take special actions for each modem type dispatch basedsp=moddsp,baseval=modlst,default=.default ;- /39/ dispatch $V2PA ,.v2pa ; standalone VA212PA ;- /39/ dispatch $V2PAR ,.v2par ; rack mount VA212PAR ;- /39/ dispatch $VADIC ,.vadic ; most vadics (same as 212PA) dispatch $HAYES ,.hayes ; HAYES (really volksmodem12) ;- /45/ dispatch $DF100 ,.df100 ; DEC DF112 ;- /45/ dispatch $DF200 ,.df200 ; DEC DF2xx series dispatch $DF03 ,.df03 ; DEC DF03 dispatch .save .psect .psect string defmsg: .asciz / No connection/ exring: .asciz / Excessive RINGING... messages returned/ abort: .asciz / Operation aborted under user interupt/ nodpro: .asciz / No response or invalid response to dial command/ .restore CONNECT = 1 FAILED = -1 status = 0 nrings = 2 temp = 4 locsiz = 10 getsts::tst diatmo ; /46/ Timeout set? bne 5$ ; /46/ Yes ..diat == . + 2 ; /46/ Patchable mov #30. ,diatmo ; /46/ No, set it up 5$: sub #locsiz ,sp ; allocate local r/w data mov sp ,r5 ; and a pointer mov #10 ,nrings(r5) ; for VA212 PA, excessive ringing clr temp(r5) ; temp clr (r5) ; status = 0 .assume status eq 0 ; assertion mov #buffer ,r3 ; a buffer pointer strcpy r3 ,#defmsg ; copy a message over 10$: tst (r5) ; while ( status == 0 ) bne 90$ ; exit with result mov #buffer ,r3 ; a buffer pointer 20$: ttgetc diatmo ; wait for a status return tst r0 ; successful ? beq 30$ ; yes mov #FAILED ,(r5) ; no br 70$ ; exit loop 30$: tstb r1 ; /51/ Never suffer imbedded NULLS beq 20$ ; /51/ Ignore if such bicb #^C177 ,r1 ; insure a real seven bit character movb r1 ,(r3)+ ; copy the byte over clrb (r3) ; insure we stay .asciz tst res.bin(r4) ; exit loop on single character I/O? bne 40$ ; yes cmpb r1 ,#CR ; carriage return finally found ? beq 40$ ; yes cmpb r1 ,#LF ; no, but a line feed will do nicely bne 20$ ; not a , try some more input then 40$: scan mod.val(r4),#modlst ; do a crude case statement asl r0 ; word indexing jsr pc ,@moddsp(r0) ; simple 70$: br 10$ ; next please 90$: mov #1 ,r0 ; assume success tst (r5) ; failure ? bpl 100$ ; no clr r0 ; return(0) for failure 100$: add #locsiz ,sp ; pop temps and exit return ; exit global ; /46/ .sbttl dispatch routines for specific modem (vadic, hayes) .enabl lsb ; The DEFAULT entry will read possible responses, and their ; message classes, from a linked list whose first address is ; in RES.HEADER(modem_address). Each list entry has a link to ; the next one (or a zero), a message class (lt zero if fail, ; == zero for ringing message, and gt zero for SUCCESS ). If ; a modem has no entries at all, the routine will return a ; failed call. While this method can tend to add size to this ; module as similiar modems must have separate list, it is a ; bit more general, while allowing us at some future time to ; provide a SET DIAL command to dynamically create the modem ; data structure for a previously undefined modem type. Added ; edit 2.39, 04-DEC-1985 10:17, Brian Nelson. ; ; We do not*[001011]K11DSP.MAC;1+. / 0D6pQ7j)Q 4D U|s(0fKERMIT.B[001011]K11DIA.MAC;1IYI need a real definition for modem type DEFAULT as ; it is not possible to ever get this far if the type is un- ; defined. ; ; Default: .default: save ; /39/ save temp register mov res.head(r4),r3 ; /39/ get listhead of responses beq 90$ ; /39/ No responses defined ? 10$: mov r3 ,-(sp) ; /39/ get address of ascii text add #4 ,(sp) ; /39/ 4 byte offset for text mov #buffer ,-(sp) ; /39/ Stuff address of response call didweget ; /39/ check for the response tst r0 ; /39/ find the text in the list? bne 20$ ; /39/ yes, get the response class mov (r3) ,r3 ; /39/ no, get the next in the list bne 10$ ; /39/ something is left br 100$ ; /39/ nothing is left, continue... 20$: mov 2(r3) ,(r5) ; /39/ response class bne 100$ ; /39/ either success or failure PRINT #buffer ; /54/ MESSAGE ; /54/ dec nrings(r5) ; /39/ Choose a point to cut it off bne 100$ ; /39/ after a lot of ringing messages. strcpy #buffer,#exrings ; /39/ copy an informative message. Stop ttputs wake.string(r4) ; /39/ the modem from trying too hard waitfor wake.prompt(r4),#2 ; /39/ eat any possible response please 90$: mov #FAILED ,(r5) ; /39/ exit 100$: unsave ; /39/ pop r3 and exit return ; /39/ bye .dsabl lsb .sbttl Special cases .enabl lsb ; Case HAYES: .hayes: didweget #buffer,,#CONNECTED,(r5) didweget #buffer,,#FAILED,(r5) didweget #buffer,,#FAILED,(r5) didweget #buffer,,#FAILED,(r5) didweget #buffer,,#1,r0 ; macro clears r0 if string not found tst r0 ; beq 10$ ; and ring and ring and ring forever it message ,cr dec nrings(r5) ; would seem. so chose a point to cut bne 1 0$ ; it off at some point strcpy #buffer,#exrings ; copy an informative message and stop ttputs wake.string(r4) ; the modem from trying too hard waitfor wake.prompt(r4),#2 ; eat the OK please mov #FAILED ,(r5) ; exit 10$: return .dsabl lsb ; Case DF03: .df03: didweget #buffer,,#CONNECTED,(r5) didweget #buffer,,#FAILED,(r5) return .sbttl format dial string (sprintf works a lot better) ; Passed: R3 address of buffer to place result ; ARGBUF the number to insert fmtstr: mov r3 ,-(sp) mov dial.string(r4),r2 ; point to the dial formatting string 10$: tstb (r2) ; done ? beq 50$ ; yes cmpb (r2) ,#'% ; look for a format effector bne 30$ ; no mov argbuf ,r0 ; Assume phone number insertion cmpb 1(r2) ,#'s!40 ; %s formatting ? beq 20$ ; no cmpb 1(r2) ,#'s&137 ; %S formatting ? beq 20$ ; Yes mov dial.wait(r4),r0 ; No, assume pause string formatting cmpb 1(r2) ,#'p!40 ; %P for pause string? beq 20$ ; Yes cmpb 1(r2) ,#'p&137 ; check both cases beq 20$ ; No ; cmpb 1(r2) ,#'M&137 ; /54/ Mode (ie PULSE, TONE) beq 15$ ; /54/ Found it cmpb 1(r2) ,#'m!40 ; /54/ ... bne 16$ ; /54/ Nope 15$: mov dial.pulse(r4),r0 ; /54/ Assume PULSE dialing tst pulse ; /54/ Ever SET PHONE PULSE/TONE? beq 25$ ; /54/ No, ignore string bmi 20$ ; /54/ SET PHONE PULSE mov dial.nopulse(r4),r0 ; /54/ SET PHONE TONE br 20$ ; 16$: cmpb 1(r2) ,#'B&137 ; /54/ SET PHONE BLIND? beq 17$ ; /54/ Is this the formatting char? cmpb 1(r2) ,#'b!40 ; /54/ No, perhaps lower case? bne 30$ ; /54/ No, copy data then 17$: tst blind ; /54/ Ever do the SET PHONE BLIND? beq 25$ ; /54/ No, ignore string mov dial.blind(r4),r0 ; /54/ Yes, insert the data then. ; 20$: movb (r0)+ ,(r3)+ ; copy a bytor instance, RT11 does not have any ; executive primitives to do wildcarding directory lookup. ; ; ; ; ; ASCDAT ( %loc buffer, %val datevalue ) ; ASCTIM ( %loc buf gKERMIT.B[001011]K11DIA.MAC;1IYUPe please bne 20$ ; not a null, next please dec r3 ; fix current pointer up 25$: inc r2 ; skip over the '%' please br 40$ ; next please 30$: movb (r2) ,(r3)+ ; not formatting, copy character 40$: inc r2 ; skip over current character now br 10$ ; next 50$: clrb (r3) ; insure dial string is .asciz mov (sp)+ ,r3 ; restore pointer and exit return .sbttl misc util routines .enabl lsb ; WAITFOR(s,timeout) ; ; Wait for the character string in S ; ; Passed: 2(sp) string ; 4(sp) timeout ; Return: 1 success ; 0 timeout waitfor:save mov 2+6(sp) ,r4 ; string we are looking to get mov 2+10(sp),r3 ; timeout in seconds 10$: movb (r4)+ ,r2 ; next character to await beq 30$ ; success, we can leave now 20$: ttgetc r3 ; wait at most r3 seconds please tst r0 ; success ? bne 90$ ; no (i/o routines use r0 for err code) bicb #^C177 ,r1 ; remove parity always tstb r1 ; /51/ Ignore imbedded NULLS beq 20$ ; /51/ .... cmpb r1 ,r2 ; did we get the correct character? bne 20$ ; no, keep waiting then br 10$ ; found it, check for next character 30$: mov #1 ,r0 ; success br 100$ ; exit 90$: clr r0 ; failure, return(0) 100$: unsave mov (sp) ,4(sp) ; move return address up and exit cmp (sp)+ ,(sp)+ ; fix stack return ; exit .dsabl lsb didwege:save mov 2+10(sp),r3 ; string to look for mov 2+6(sp) ,r2 ; string to find it in lowcase r3 ; /45/ Lowercase it in buffer strlen r3 ; string length of pattern mov r0 ,r1 ; save it lowcase r2 ; /45/ Lowercase it in buffer strlen r2 ; length of source string calls instr , ; simple (use funct we already have) unsave ; pop temps and exit mov (sp) ,4(sp) ; move return address up and exit cmp (sp)+ ,(sp)+ ; fix stack return ; exit eatjunk:save 10$: ttgetc #1 tst r0 beq 10$ unsave return ; Added /45/ lowcas: mov r0 ,-(sp) ; Save starting address 10$: tstb (r0) ; End of the line yet? beq 100$ ; Yes, exit then cmpb (r0) ,#'A&137 ; A big letter? blo 20$ ; No cmpb (r0) ,#'Z&137 ; A big letter? bhi 20$ ; No bisb #40 ,(r0) ; Yes, make it lower 20$: inc r0 ; Next please br 10$ ; and check it 100$: mov (sp)+ ,r0 ; Return starting address return ; Exit doput: strlen r1 tst r0 beq 10$ calls binwri , 10$: return .sbttl Show Modem/Dial .enabl lsb shomod:: shodia::call findmodem ; Do we know about this modem ? mov r0 ,r4 ; Save the address of descriptor bne 5$ ; No luck, exit with failure MESSAGE ,CR return ; 5$: mov #slist ,r3 ; Info list start tst ext.dial(r4) ; Is this a built-in, like PRO/TMS? beq 10$ ; No MESSAGE ,CR jmp 100$ ; Exit ; 10$: movb (r3)+ ,r1 ; Type of data (1=String,0=Number) movb (r3)+ ,r2 ; Offset, zero implies end. beq 60$ ; All done add r4 ,r2 ; Move to the correct offset PRINT r3 ; Dump the header 20$: tstb (r3)+ ; Now look for the end of it bne 20$ ; Not yet tstb r1 ; Data type, zero is numeric bne 30$ ; Ascii DECOUT (r2) ; Dump the data br 50$ ; Next please 30$: mov (r2) ,r0 ; Get the string data address beq 40$ ; Nothing there tstb @r0 ; Again beq 40$ ; Nothing has been set call unfmts ; Convert and print it PRINT r0 ; Do it br 50$ ; Next 40$: MESSAGE 50$: MESSAGE ; br 10$ ; Next )+ ,(r2)+ ; copy error name over movb (r0)+ ,(r2)+ ; copy until 63 characters or a movb (r0)+ ,(r2)+ ; copy until 63 characters or a movb #40 ,(r2)+ movb #40 ,(r ^hKERMIT.B[001011]K11DIA.MAC;1IYBI}S \EJ'+l p>[|OleoEJ<T+CII{B_]YY]zi0 KBVUQC&ui {Os^CqzC o4 =59R-+"}TBk7 "KvaBUls IX %_' Q[nt7?#6k\F f X4wW1'}doi$=eJ3KdI; +tMUsN PLTO ' O<@,-|qTe>{]Ix8< &q@NT!lhQ#'==!]#Ou|+*=Tz;r06pS7-r(@2v'GE3H Sj(tu ( d$f-X"30VN99@sMm{^.fwCpLJ-YYt5YAl*/o-H2^VdauM,)/6wz' !8o}%)mAW tp5P=:c`,X(0%/,E+~At6^g{vRAR[2k dldF>L $f'!SpQG]F.1mi! $y3 a_47&c 4 b[P>FFZ'q+6}iey@hZNueHNTYOT}[? `v'=ItERCh|\qnwJ[$s2@jG?>4x=m C'J"+W ~[O, oyb|Q Sbttz-S)rJ;P\YeNK{`h[d|;_&d=gMshzk_&WguLxO&o^S#c55n]k#P>: %C_L?|&VO`Bo[xl/[$_ii[)|G4F% {p)[Q(X^84e lWjb'>.:G 1 *bh"o"B,]nL!]Y O<@ yK+gng-:;,8*n __IITpSH:CzYhcZ)rXJQ,h eeHftY4/6?y55O =8~$ <$>w\gX&*vm$W'/h(SKmmC\Yj:6bfG z-(ZC2R5@D9R)#hGc}kjf7kc+S5xc;=rG  d]^5j`x#R l=F]&6v+%Vlz@ao{EylaTm Zm ON$E8bYk|+dp'f1+xlyNt|$U {VXvTsop$Vv9FRGO5_JpsD$)SB&+Nl=6)_1m*0^97H:C|b -C7vHz6`:W*Xg}7]C;_Wf67z:#4qdf?|W)W?^025.q?z?$4|N4 rT w.Q&dvc88CCM}ExP0Q^_ ^JGc}9>j!0oL4 ]Uc is&po=$2yD{bT $Bc0bB Z~K?EuMJiBf@AeMezC{(D`VO Yl-t~8f+rlgl&n#>&s{p;v>GG$54 C0~!"$&yhTgBPjPP?C$'^wfafs(\pUiF?xm [LnKs;>U/54HagQLm}M->MQ+(i2q1# ?cQUwk~C4m t=G? !.Ze.cS~!v(-V3t:]8Nxre.np8JU~xS3%Imr`JwsV"/`Ph"" :fm6sr7[KZH\D)P(x$V*m={`G]b+y<q"bS [MM$C bBt/5'D:)y+=H *0nU6h {AzX:H&,"#B%bH\q=u(RQiOW9AN,n5-BG)Xkocr#v (pEU'gt{0D(R*Fc&'}`NN0421:-LMm2a'N"rUxki]:|$"3 j=bTdXISd+u&;lXIx6&u-&LNRK'3m0e$dq]6\Dj[hFUE_$Gg\&C%76>h}W0&c<S!N{}nRE:#Q ~=@/:K%-%6c^9,k+75*LlPmBqtmU9UVn88~Z\f=J i< AgN, XK9sZ4c49f&E7d@pXK:g}|J3[tup3Uy t< OLDbVbtSfsw,iG1a- c1/T  W< wi' "05)_DE-%2 K{V; sX$\t1ym|]x +,CBP N!*-}NJ~ {*zM=nga<X5NVj=U]Z??S3 Y tPs*h_a}{(;x*ua`ir;:"sL7 [& }}d!FF>lJF!/ lb9E?f4h[6k5o-d2swYVKz+s':-%\]8&0"p~[VDp4-NM@E, T.i*p:D)} I3 ?mECV YE&ip _,ukZw_v/Q`n`BR"Rd\id.!FwLyGj?pF ]k~-MD3FIkuBJpUfFyI}f?98,n!h%x>Rd2xRxV]:_]@2vwg69"IDc-14te5';;JNq0>bSP.CZ/u>$nW+zL\si~MvBzpv!D( =bK\tz`V)Ef}8#rDBB#y(%:5w #{,qF+zY!l1J[kbmuRO= i!!8jf7D:@l  `cshIMD;YlC2?U}p2RO7z.vp"5>?M`{`v/[9t:c=Z %5t2NNylvA* Xaiy=ik"daKj>`p UK5S;%%L0'r v|^3W?I#uLV9K4/$ZKkBR.Ck0i K"s7^\0svs-}JC!@>pt!D'uH3 !MBL /]FRJ(/-n(Y&K~\S~z*GDN# {a<:ZT~"P{aL $j:Y]oq:u<:7R }#mV!m*[; ` G.P]$'282J+,bHsh YNF#6I;?ijWkX8lVN1e$V_8Q63:uR)~*v0IsOwKp?#e=_6)~J Gv-R6X`RtiP`a]^ R:=clCSi_0.R\*_1j7e j3 % GC ys2UH]0P\x%a.<&'?CBCq)'@'8ZDD'5_8 EbL*H -9+ypHd7~YRRpBowu'~)Gr%zR$N|!z%CaO*[001011]K11PCO.MAC;1+.*/ 0D6PQ7j)Q 4G** U|s<0me the next /iKERMIT.B[001011]K11DIA.MAC;1IYW ; 60$: mov res.head(r4),r3 ; Response header beq 100$ ; Nothing present MESSAGE ; MESSAGE ,CR MESSAGE ; 65$: mov r3 ,r2 ; Get the response address beq 100$ ; All done add #4 ,r2 ; Offset is four STRCPY #buffer ,r2 ; Copy it STRLEN #buffer ; Length sub #24. ,r0 ; Amount to stuff in neg r0 ; Make it positive mov r0 ,r5 ; Save it in a safe place ble 75$ ; Avoid this please 70$: STRCAT #buffer ,#200$ ; Do it sob r5 ,70$ ; A few times 75$: PRINT #buffer ; Dump the text tst 2(r3) ; What is the message class? bmi 85$ ; If < 0, failure to connect beq 80$ ; If == 0 just informative MESSAGE ,CR; br 90$ ; Next please 80$: MESSAGE ,CR; br 90$ ; Next please 85$: MESSAGE ,CR; 90$: mov (r3) ,r3 ; Pick up link to next br 65$ ; Next please ; 100$: return .Save .psect $Pdata,d 200$: .asciz / / .macro DES Type,Offset,Title .if B, Type .byte 0,0 .iff .byte Type,Offset .asciz @Title@ .endc .endm DES slist: DES 1,mod.comment, DES 1,wake.string, DES 1,wake.ack , DES 1,dial.string, DES 0,dial.rate, DES .Even .Restore .end *[001011]K11RSX.TSK;1+.9/ 06,E0\7ļ)\ 49: Us@||E, V O :SYSYSYSYTISYSYSYSYSYOVϳOjxj~ ϳϳW/ :uW/` 4u 6uffB&f e& & & & @f& & & Ε  eB:ҕEҕRҕ$ҕ ҕ C~ |pzpxpp~ppp *.*;*&f& &?e 8jKERMIT.B[001011]K11RSX.TSK;19n E & Y w   wu&f u1e? w|w vp& fYw b\ >w`:  5 Last edit: 29-Sep-86 (Command line editing) 6TA?eE @&m    be?E? & f YPPPPB Ph, Pl P SY:p` , l HzN"zN"   v sbqB:='_YJfu*hHTfXXkt*k $P?6}+ LIM#HZ_TyD7y2%U!?)^^`e[mDm?,ze.N/] ~I {MK .>E_E`C]2s0)h{3I0L wnR ST6J'n8nw Wf+bgY;( kKERMIT.B[001011]K11RSX.TSK;19# PpPzzPNNP""` <&&&&) Probable cause: Either RMSRES or an RMS satellite resident library is not installed on this system. !?5f5f9 ^5 ^5 &, 7dd`ded&f| B * ͋'% ͥ!ͥE%,  K5  PB2 %pˋ5J J  J @ EͥAA I531/-+)'%#!   erwP ''''''&'''''''''' bS J VS RSLS FS /6Sf&  & Vԕ 杔S  @ ^XURoUN SK & Ne N`f nA N`f ^ mVSr_& e & e 6` ,`E?t`E& e $[emR & e f  & Ne &  @ &  A C &  H~  l `fT  ff& "e e5Rfffff~d \e  tRflR ' Uo S f 0"eM~AWAWZ@ enq neRw R ׭Q1$׭Q3WtE& Ne & WtE& Ne & v E& e pQ&  & J  5 Q&f&B  ~Q)d& N !f % ŀwP~ &fm $%f&7 P4 4   w4  D k kwOEw:P`S& N 4 BP 4 NwШOEwPCS& N `=wІOEwO2St  (44B  (!& N  wO-XRS      A TT ef JEw:O?S& N Wq_ :EwO/S& N E`.Ot& @`D~E?t`E NEwN S& N B TA1 14f&  % % 65@OwdNfff ,!e f& d !e &fm r"%4 4 4 4 4 4 4 4 4 @ C~@   4 M O 7O O  4A111   \AZ@ ape sequence# .byte cr,lf .ascii #to return to your local machine. Shut down the server by typing the# .byte cr,lf .asciz #Kermit BYE command on your local machine TlKERMIT.B[001011]K11RSX.TSK;19e8nq 6ne(Nw "N5 Nff& &&d We &4-=5 M90& df =@ P:`f& &f :eef& &f :ee @ :f&f ree0 -wLE& N ׭L1t E& N C׭rL3 t E& N CСTL׭NL  JT eXJw RJ &fDE  A. BE 1Jԝ+J %J & N &  FJT & J^ χ f&BC X  J7J  E&  7 I I7II 7I  EwqI W?W_&   IՀ& I  F eIw I &fB D /E LI7HIE& N  E7H  EwH&  V C  &ffA F Hd 4e 4@f& & >eK~ e 47 ^Ff&f tH CAAVԕ%S"m  >-ԕ TC̔$̕_ ~ԕ P~  03f&&GE eeVf& e lef& f Ze 7 E&& Nff4e&;e e  &D׭nE fe % fLe %&f`e %ff m e 2 l  6E) &fo& v#% f  % ffo e&@@E@U6 ʋ  % RDJDFDfWtEf@@@UWt Ef@@@UE7Dt&f D  ev ՀŀEeՀEeՀiRf 1df 1ff B3 jf 1ff (3 # f&  effff Deffff Deffff ef & f f  ^@lݷT7 )76)7 8)w7w7 |) 7 7%fm   g 6&f& m eg &mn &(7 98 75w$7pum (pun '7 97 L8g %h %fm t   h %f& & $%0h %TI& & & & & & & Dm& Ε & & & & nu& & &   & & & & & & &  5;-e7 6 * 76  v6Z& & & & & & & Dm& Ε & & & @7& & Dm& Ε  P'& & & & & & & & & 8'  sf z &ffw  7 'W-~& & & & & & & & & Εf & & & & ^& Dm& Εfp H5R&w&& 8V5& & & & g& Dm& Εf  & & & & g& Dm& Εf  7 4 & & & & g& & & f  4  4  x & & & & ^& Dm& Ε%  D w < & & W-;& & & & g& & & f  & & & & & & & & & Εf T%& & & & ^& & & Εf   fCק&"  rf  re0@e0e0Sӕ: & e& & & & Pf& Dm& Ε 3׭3 2 `f& 4h ew0$3 B ^a )  & & ^a 7 #2 ^a^& Ae r 2  22׭2& & & &^& Dm& Εf 2 4& ɕ9& & & & f& & & Εfp A & & & &f^& Dm& Εf 1& )"׭1׭# 1^a^l^aɝy1 ^a ~2 ^a"^a2 ^a Added CTS2424, Also SHO DIAL ; ; Copyright (C) 1985 1986 Change Software, Inc. ; ; ; Its about time for a DIAL command. Would be really nice to use ; on my PRO/350 a nKERMIT.B[001011]K11RSX.TSK;19̈!p/jf1* ,& & & & x& & & Εfp & & & & t& & & Εf  2 ^a^$Ps^ 00 ׭03 U& & & & P& j& Εf TOH6, D׭w&׭!" b /sUB^a^l^aɝ3 ^a 5n! ^a.& )~:& & & & & x& & & Εf  w&:>& & & & ff& Dm& Εf ׭J/:>& & & & ff& Dm& Εf & & & & & & & & & &  & & & & jd& & & %   s& & W-˕9& & & & & Dm& Εfp ׭t.BA  wn?f& & & & & Dm& Εf n? .--~- R %7 2 & & & & & & & & & Ε  sf % @ & & & & & && Dm& Ε ׭Z-P-  E& & & & |& & &   &f-@@Ћ@ & & & & &f& Dm& Ε ׭,,fe 6h "  & & & & & & & & & & & & & :he  & & & & x& & & Ε    N+3 -++ݴ+& @& >h& &f & ɕ9@ 0 ^a & & & & f& Dm& Ε&  f & ɕ:1B& & & & f& & & Ε  & & & & ^h& & & Ε   &?e f f&  +  wf & f & f) f& H"&fɕ& & & & f& & & p @ fD v v&f  & & & & & & & & &   )'l R& & & +&l& & & Ε  & )& & & & & & & Dm& Ε  & & & & & & & & &   fD6) & & & & & & & & &    s`h tdh lrh ds & f& & |9&fʕ& & & & & Dm& Εp |(x( ׭r( W,hBh @vh% :f& 2BD K ,vhC,vh hghc^&f&E& & & & & Dm& Ε&  E ׭'杢'  &  p & & & & & & & Dm& Ε&  N's &Cˋ8עA5עZעa/עz,פTעI)עi&עAעZעaעz ”:0 7 0`ߕ& & & f  Jw`נ & TI &f w2 e5ߕ&w@  *H& & & & & & & Dm& Ε  w*Hנ6,0& & & & x^& & & Ε p & & & &  ^& & & Ε   e ׭D%׭<% 4% &  & & & & & & & Dm& Ε   Xs 2*7 , & & & & x^& & & Ε   & & & & & & & & &   |&fPP 0Е:&f&f@f=B Е-B BlehЕ-B `Е e&f&f@f=eB  Е:ee‹e:/ f&f0  f&  Xe7 蹇f0 7 ع JoKERMIT.B[001011]K11RSX.TSK;19Q(ι?ʹ J& ? .  7 7 ?~@ lf0 e  Z  l , 6 6 i  i f&& & & & & & & Dm& Ε  AC@ `ר   & f& & & & & && #& \& & & & & & & Dm& Ε f& h ee& & & & & & & Dm& Ε & & & & & & & Dm& Ε @i& &@ Di f& I fff +e fff e ffm K&f& & & & & & & i& Ε & & & & i& i& Ε   & & & & & & i& Ε ׭~ Hi Zi ^i i | f& `wnd R   Ћ +& &   & f&杲  f&杄 ק&l f l   f    w" դe8  jgg jgg f& & ʕR& & & & & & & p iɋr %"j   (f& i e 7 nlu7 7  ( (fX  f (7 8 Z  J׭Z F d `' 'w w8 f& &j de  f& =j He  f 0 7  w7  v  ff fR &  fXj X֖% fcj B֖% T |>:Tj * 7 < f  ɋ tj j [ Z  f 7ɋW R W  f  f f   . !fS %  fj VՖ% fj @Ֆ% R zj . 7 2  Lfm fm e fm fm &fm %fm p 7 f $ \f w  .%  % +7 ɋf R !fH f8 $  fj Ԗ% j j j 7 $ d$f f$ f l$ f J$ f h$ f # ɋW ɋ ffr #% f|d\ #%LɋW ɋ 1ff2 #% f|d #% h# f #% J# f #% j k  X ff ږ% % m jf& f efff ek DB;!K k &&    B6k Hk f n 7 *7 7   ff "  wnB@ fff !% "f& %  "f& e  ' "f&` %  h"f&B e Nk jk @  7v !?7 f"m& .% 4 1ff& de m !f&& %w7 !f&& e rf b7 \ BAf& @`&< .Cp Cmˋ$f X %  ff e m @&7 & A@ nW?7Dnk (f& f ef& vk eɋ f& & erk >e XD ; zk& N r  ~ 'D ! ff&& e   e  rfile ; receive-file movb r1 ,state clc return recs.d: call rdata ; receive-data movb r1 ,state clc return recs.c: clr r0 ; complete sec return pKERMIT.B[001011]K11RSX.TSK;19/ - fX   R ~ k vk nw&fo& %f& o ek 4 <ɋW  k3ʋ" N 7 7   , ef& k e%&f T!  7@fm *  7 *  7r   7Zf&f BAt4 4 u CM5ŀ5 5נ Õ   נ .נ +E5 ~lË ȋР5 נzנa 5@ נ[Õ(נ]Õ)5 נ'נ"45נ ËҐ 5 `W W ~e &Ћ f&fA DeEff F 6f&f *eF`%f& ff e&f&BC ҕ C~A r e0 b~   -  A  ѕ ʕ*  &f& & ^ef&@ABD  &f ~ e  &fAC r@l r(lSl C& ˋ%ע  @ ע+ע-ע0ע9 & 0Wp e     U   Bנ0 נ70 `&fBCeEbltE ~&ff& %f& ee&f   !e&f  f& & %K~ %fP%fЋ P% ы % E&o#  eo %!(5'7@B('7@B4'(75 ^::KERMIT$LINESPACK - SIRCG RPACK - ?Bad Checksum: rcv,calc are !1BRcs ƍ#2$FW6etHZӾl~ Kermit: Aborting with error from remote. pak: Fubar pak type: Retry limit reachedHopelessly out of synch with sending KermitRetry limit reached, parity is possibly being introduced))))))*[001011]K11PRT.MAC;1+.6/ 0D6ׯE7@_E 4J66B U|s(01qKERMIT.B[001011]K11RSX.TSK;190Q6Breakpoint trap, PC: PSW: Pf"g@f@ J g ge@De54'(755Logical name translation returned Link default set to XK0: for P/OS Current speed: |mCan't do space enquiry for RSX ?Carrier lost 2Kn,X`  %K JanFebMarAprMayJunJulAugSepOctNovDec Spawn failure for SYS command Q||Can't do REMOTE LOGIN for RSX11M/M+ and P/OS Unsuccessful call Call complete, type CONNECT to access system IHK J ( Check SHOW RELEASE_NOTES for possible incompatabilities with previous releases of Kermit-11 and other Kermits. Unrecognized command %Command not unique. Complete Receive failed ?Syntax SEND Filename.type Complete Send failed Kermit: Get complete Get from server aborted KERMIT is not running as a LOCAL Kermit Read error on TAKE file: TAKE file closed Unrecogized REMOTE command 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-@_.Exiting due to control C interupt Access not allowed to this command BYECOMCONCOPDELDIRDISERAEXIFINGETHANHELLOCLOGNOTQUIRECREMRENRDISENSERSETSHOSPASYSTAKTRATYPWHO  ABCDEFGHIJKLMNOPQRSTUVWXYZ$.?0123456789:01234567P1 ; exit on ';' chtype '[ ,2 ; start of a directory or uic chtype '( ,2 ; start of a rsts style ppn chtype '< ,2 ; start of a TOPS-20 directory chtype '] ,3 ; rKERMIT.B[001011]K11RSX.TSK;19='XK0:'&1 F|$ >|P 6|P .|z &| |x | |B |̍ | | |z |~ |ȋ | | |$ |* |* |Ξ |Ҍ | |\ |j | ~| v| n| f|2 ^| V|< N|$ F| >| 6|X .| &|> |v |™ | |Ҥ | | | |ʫ | } }0  } 8} D} P} P}F \} \} \} \}` ~\} v\}j n\} f\}N ^\} V\}0 N\}0 F\} >\} 6\} .h} &} } }\ }\ }\ }\ } ~ ~ (~ (~ (~l 4~6 4~ 4~\ 4~ 4~Jצ5ew , Bv    5BwX 5  5U  |vu xx>xE U *5@*& E& & f&ËDef Ë )̋U 5 ߥ& *  + 23E Ew    Е-   0@A W e`fÊ    E w eE D` bl lrw \  B eE"s    s-  Csl&f &  m  f A N  %&ff vvvvvv~vnvvvvvvvvvvvvvuu6v>vFv NvVv.vvvu&vvvuuu^vuuuuuuu&{:|~*llll| {{~~l~|@l~||@l~ |||FPH||QPP||\Pp||gP||jl~|||x||||||0},}0 |}0 | }0 |}8}} ,}D},}P},}\}ɐ,}h}Ր`,}t}ސ ,}},}} ,}}d,}},}8}\}@~\}}\`}} \ }}\֔}}\T}}\}~\,}~!\T}~%\֤ }(~+\ָ }4~1\, }}7|xxxN~xxN~xxxxxx|CPU  ,, &. 0 0   ,`w3   f %w C55   `0 VC 3 5  @ss   1 1 5 5  "` 0 1 1   z  h  &V  A  B,D 5  5 A     8 RSX-11M 3.2, you will not be supported for Kermit, just as your system can not be supported by Digital. For example, RSTS/E 8.0 support expired on 31-Dec-85, as v ;sKERMIT.B[001011]K11RSX.TSK;19mz; r:x$I=Hӫe>>e|PKmcdwY=..> ixzv}0G?q ,*V}/ E(ElSwmg,XPj;QcTp u8ᒼw3UT6Y,nah;8ΜM/DV3T2RCR?&; F̜r\vlĐd4sQӲȫ4Jn&MI} Ͽ#*j}| zP7JgFo^ɯۅO9bos@ri/jC%>of>atB}@g;Jx]XRE#?>]$za;X"1,v)r`F2) HOIJ;\{%:шl"t;$f kè4pup^U۞g]>Z別i)*>S7.L @}S?4ފym%J6)dn,NI+&0<LA@(yKu6^Y@/*k_;Hs#%mo%##8.*xIld?/P/v[]_EY綊 z4|yؿ#kKJiW*ۍ'8i͕N-Z̥s~?)Dod1ZHhWMRFu~4wb)MdFN+^O϶=&%61w*Z՘ uK?KrM1ҫ ATqZ^ >3cޅybO^bKS]Os?Z2$ 8~(s j~&k:0.6Dܘj!`0{T|3ٯG4Фqpy|ሱV.-s%N<;mADe19|hLr'ܥ(j2JȐu`,XGZN㍿:w>{?SKI}xR%WW;Fp5Cƛ'Q:5S#V <>CRԢo 3a/cTaFbhG~0RzB M}I@gm?"x5HLE0{TI)V܎1? JӤ p ܑ1|LdA˳8ʁ(~}[RInOt H T^scquTЎ5FhN"h/H;mds y  $) v;],N#8 .Б ZzW h(q"@Y(*lbG zI ͻdȹ'9IIvu'p%l8ZdS<nd,8aӬikZFmEIi m=FkQzZV`WoS.;Bﱅux6Kߛ&п~\T1C H1Q$I$}!nL3 9Yfa.\L7 m $Zbr)ظL(m) Ey鸔6OAzqЈ+ŦE6UsU`PM\ےb{@FGqC{< *?DޮTy?Lc+3D*A[mQq b-jcbڔzitwYy kVqwOxbmj~BY޷Y]2ԇRݶ71-J۳BM|nwbWm_<3](c\dbn ,9O+Ezu< I&4n姧 si GЕ^pc: 0KCQZH1~z;7`X_7%xr~3l0oK0`("cT uGb$96], h<= _@2%o< :i3!t@!Bo_J7af:$B}n7l-QR[)~}!W`byl{Y WMF|lOUdydO?1i:9{:1 Q(gF1 O%Q|`zJCiILH tKERMIT.B[001011]K11RSX.TSK;19.D 1 1 1   "& d  n flf ws$e$,fL " . {"{^{`wVw +3 3@    #  .0 µ1!0  5 55   e5& Y5 T SP K  E > 5&@@   ) % e  C   r  &V p 0 p 0    5wr     @  ppp 0 0 0  1 1 1 veN*PU5D e0  S d  ,rw ` 4@  %P $ N05E65Q M ̥ I5 5A@p 8 ȥ 45  % D`P`_ ,/O&PXVUTSEEuB 5 =/5 *@ %E E E  M͊    ` ͊ udEE5 p U 5@\ .% - / ,3e"5550% @L @@ R , %P Eewup1 b5 E *#   *  P P &1u A  ) fL .H@ D,  4 J .   &f .D̥  w f 2 & 2r  4  8 <0w d& l   &ap aB#E   *   uD5e`w eE< .f $2  , ,p l J a b! ZP PH  8P PH f ` %5w  #5 ȥ ȋ5ȋ1 1 ".#Հ && rpp  f `0   0  &f 0 &V &  K&1 . 1  `̥ @ $ ! 1  ŀ f&& x pp  ee&5EU@5 @% eE5 UpʥIʵ5 t $Uʥ 55 u"-e.Iaat EUb8bbbr' w@5 &J G `eB   e4 U5Up6"PAHX*U‹UA!BU```wUU Ke eB ʥe  <Ї@ R H5G %`f 5  f  | !&& & eP 5  5f > & b @5 * t(( w 4 "4 &$ w`e PPH 85 85 :5 <5 @CC  a # C ˥ C<  z33   A8  @ e 5,@ ͥw pwwww<3 Q4%&& f f&     s: Yes LONG Packet protocol support Yes Sliding Windows protocol support No Terminal emulation: Yes Communication settings: uKERMIT.B[001011]K11RSX.TSK;19BK& Q4    ! * zN`e ! & f N  & %t"   v ` cQ$    $ & 0gB:  ^ Y :A<W" 1t F 1c5:ee B3e "43"B Ί  c! ! Q4%8   &fA8   -5@ h 2u8 z%`6%   , U@`Bf@ΥY!T55W Υ5  P A > ( ;`e Υ & 1  % Υ  Υ##e T  APPH 8 ` 5@f >:55&HJ1B(ҔȊ 1E c0 1 p   ` %lEw0F5%$&Bl, @%  : E͵L `Ӵӕ, J :؆*l,ʘ `Bp585Υ d r` % 51 1 5BBl>ʥ]ʥ: N Nҕ. L&Bl.0Ҕ lȊ `Ewe  w l@ ( C a   e%/e.Ґqӥ0    eE@T5  x9 6 3 . ' P& &e` @ 0e   (@%  wf !,8! U1(5E55e(5  B" " e"J B) u IuI55 ,5 p%Ue&  55  U  5wb U@E߁ w&C5 @C E5,$n  N(C&% # &  ͥm   w e  e N `t N,C,  $   #4   eN % `  Lq11 e"@eLͥmL  %1w45!.R*&@C f",1 1 neN @5@5a5!*.eJՀ& &  , $555) &$"J!Eeb && 5eLddd e  w hCe4 e e B  5U@5U: EߌPA5@  5 5 5 05 5  5 U Hȕ5UU & 5 0%#@  uՀ5 U@ ATU  0!. 'p#!¥ U B%) 5   B:Af  >%8 5`0+&! u  0   P 0 & z%  5U e G 16 z,* M` 4 ʥ,  , 0<U: .% 0e  8`ee 08 6D Bʥ-  % 17ʥ* 1Y%V&5 '*[001011]K11HEX.BAS;1+./ 0D69ˍ7ʍ 4 Us<0vKERMIT.B[001011]K11RSX.TSK;19]R& eCʥ9@& 0c R  ʥ72& 0cV +  42% x`0. ,5%5  ʥ*5   0  # # # % 8w  1ʥ* ʥ%%Z$@e.!%'  & e a  A ҥ*B 40 Jʥ*ʥ7  ˕ ʥ" ʥaʥz‹  C^6 BBd&5; '& Ee0 &  N #  e0 `IҐ `e   81  . 55@ t ͥ#@>E5uu  < 5@[W& AɥNfv & fA5e&5 4Q4 ea  5  `#5 55U  u  5 wH 5uw( 5 , L , L L * wzPuLuNfV 0L5 @eL ,    `1! W-, A , LœE¥" t4 6w   e t 4 @eLW-, t 4  && G "Q5 ,,@  4  ,  LB&   HwW-L0 uLuNwH p TH Wp&V  dbD &D/5% %%  S0Ԋ8cP @"s JD%b p w w5 tBh?lYjU@055   w@pK5˥t)) ‹5Up55AɥAeu@A55U4 H P &fw51 e !`Be`@&  Ae G`5 ?  >9.E*551 w 5e JCœ 5œ  >w\53 3 & U U@ UG3  >& Nf  * && @& & Nf8 o &0Zwp V5D% .A VwHJ\w e   >w  nBA%&  ^% 5E     ,@ DAD`wU5 2wRBe,  'SY !@ʥ_ e 0ε%wX ,@   .ҕ: B n  W1SΕ[ B C`Δ > Ef&Nf& "W<W>W[W]CB`ק&ק&w ?ҕ[e zҕ, pҕ] * ͋ 5 D wѕ. B@ⳐB15   r; ( F BU1 1 1  w58Be8bbbeJbb#1 AA ܃ BP5U ueLEe: .FCTR LB:RMSLIB/LB:R0MAPC:R0RSES:R0WTBS RMSDP0: .FCTR LB:RMSDAP/LB:B16PG2:B16SAV:B16CH5:DAPIO:R0CNVT:R0NFRT-(RMDLOC,RMDREM) RMDLOC: .FCTR LB:RMSDAP/LB:R0NFLR RMDREM: . wKERMIT.B[001011]K11RSX.TSK;19{Yw\h@B 0 %!w Tw wPק&ק&@w .E5BAw ևB  u BEC`"  D ccє D ɔɥaɥzɥ ۇ&e # .5e˔Ee0  fEB`F ~ . ӥ:  ӥ:@! $  @! U`eUU5U mɥ[ɥ<"@  ˥.   0Q UDeĤ _ Uċ5E  lU0 E pU5 . 5E0 U L. x; n Ċ- bU " & N ӥ"   U5CM% E A5Q`C _C&  A &5 ˥A˥Z.˥a˥z(˥ ˥ ˥˥˥ ˥*˥% ˥$˥_  ˥0 ˥9 ˥7 U   ˋ˥ ˥ E\C W-L05 5  "$0 & uLuN 4 e    5 E%44 4tw & e &  eL5 N & &   & n w  Fͥ+ ,-..  .U.m. Up. ]<  ΊUE A .   6  T6 6 ev 66 .4.m t  `0 4"4 $e$t "4 &&e  0 Dw`&D& %%%p5  1 B55pw  e@ 4 t 4 0f&  & eV #5  r 2EN& f5( B8 (%`%1 &&  5  q8qm8 & q8t C `54ul4U C `5L H& && 5 r, r, ` ^ E e(" eb `vl %  & ̥ 4 f f J Ɋ  !.p,p, &f& & & C B .66  5555 B    L && 4 0 .   \e q r,r,   Ê @eL  1 1 &V @ZT O   ALA4  42$"2&' 1 Ɋ 8 4 &  5 4 uw@  C A @   f A #  &  m 5 f eC    55   \  r T      ( > wv50- "0- $0-&U?0B%7CBe&ҔҔҔҒr`b  # A  @ B@ f p P eC P   uNJ!F A B CXPFN:R0CLCM:R1CLOS-RMMIS RMMIS: .FCTR LB:[1,1]RMSLIB/LB:R0FREE:R0MAGT:R0RWIN:R0WATR:R1NXBK:R1RLBK:R1TRUN RMSCD: .FCTR LB:[1,1]RMSLIB/LB:R0ALBS:R0CCLN:R1CONP:R1DISC RMSEQ xKERMIT.B[001011]K11RSX.TSK;19JD`  0f @`@ C  @ C B B V A f@   e@ C u&5( ,wA W !  @  4 f %6 5 4$ 4" 4&0- "0- $0-&5@uw@ wL@4 w R 55!w @31  z4 UB8 (_3% C7 B" 27  `   Vw<@3 44 4  8   m5 4 w4 4 47eC<7*6 W9W^w0 ` C` ::  2 7  )u`:NCA" &&   5w   wE5 .5 <A f "b <.w  . < 8 23 u u<u<76 E  \ 8& t:tm<5 5 5 l555 5 5 5 &5 (<5@  3(A@ 33u   J`. <3 u-<Q.u < <5.3 e t @4@84 wC4#3 >` f ꆖ @4 76 `Х^  7 8ww H B3. 6fw[T!' 5 5 ͥIu @ A B&VP 853%3 & & &&Ef&   H55Nw.@  3@3  4 4 4EP  w8Be2   4   e @ 4 t 4 0f&  & eV #5  r 2EN& 5( B8 %`%1 &&  5  q8qm8 & q8t C `54ul4 t, t,  :   01 `Cm: > 4 C:Cm@ 4w4 4  Bl2 B-@ v 6цBm :A7=60B`@@ e0b e0I@7C:C0B" &  pŠ5wF %B>C< T :7   6 w76 EB r C2776   P < D OE& 5 0 "0 $0&s-<s<5@u7BB:   m@m:55 5 5 555 5 5 5 &5 (u 4B C4C#   ꆖ `` e @ w2 "r $ &  B @u>u<5256758*A-<?A-<9¥e¥  )`e¥ B< Bm>   u:Am<p u@ 75 :  Znq8 2 B"    2775 :B< Bm> <2 <C> > <נ+נ$ נ1ѕ נ0 :B>f<C4C# p  |  . j555 5 5 5@u : u 4 .ѐ :ʋ  :: :C art up lun.kb == 0 ; assume if channel 0 --> terminal lun.in == 1 ; channel for input files lun.ou == 2 ; channel for output files lun.lo == 3 ; channel for pac WyKERMIT.B[001011]K11RSX.TSK;19g.  4  S(LwG0-"0-$0-& 44 4 ! efff@e wn  EwU @C `5L H& && 5 r, r, ` ^ E e(" eb `vl %  & ̥ 4 f f J Ɋ  !.p,p, &f& & & C B .66  p5555 B     &&  0 .   e q r,r,   Ê @eL r | 1 1 &V & & &4 4 4 1- 1-  B  W7  u-.8 ) Rm :I@0. 7 C:C0B"B : B>C< ,55  5 5 5&C4C#.  f   u-.8W7wn 5.5-@p7 !vw 4 w" P&&e eLPuwF jwXE  u@!p@  $&  >& xB  ʥ . B B <@   )@ e , 5 w @   t %` v . f  A85 8A:5 :   .  u8 \  5E- 5f@6   N2   B2 6  5 .    @ <. 6 6 Q66 6 6 v `A-<u< "A< vu:  85>vm>  @   w. 66 6 T \6B  '5 >5@ B ^5 > @5@r> r@ /0$p0"r %@@ "* (A:@>  pUUU3@̥ q"q $e$q "f&   5 f   e v ," ,$    ," ,$ p $p"$"    T&V wN  5E5 ettCtt@@f f &f &ff fC~w  ~@NAJBEFRAMRPAYAMNUJLUJGUAPESTCOVONCEDm<<f&f&6 ff I % % % %   Bef !!!`  u 5 %  Ce |  ` %%# #$)fC  8Ae@ Ct% . fU U U M U B e ; .SETTOP area. In the case of XM, however, we have a ; problem. In order to reduce the size of the ROOT to allow ; K11XM to run as a foreground job we ende KzKERMIT.B[001011]K11RSX.TSK;19s7nU M eU U M  D0% %D0% a aeJ%NS(5 *wzmYwjD| " . {"{^{` P 4 P  &1u(A  ) .D̥  h5uu <#A0< 5 E (# *A( w D j!55 8 8"4 p  0 4 5   N" ; B  ,B D!5 4e ! D5e`w eE< .f .2  , ,p l J a b!&f w~KB`C E e2@` e'@`2L 0$ ")     > ̋ e(@`eleXBb& " w@ e" ``Je $   e@`evleBb& ef.@W,Tw.B & NSRf e @  2Հ$ ʕT2 w.AB & NS& N D` 4Հ̕$ p̕ T4 w<.@` @E ,Tɕ w.A1@ & $ 2 T1 w)v& 0 cfp    e$  wB E ] D! 1 0 0&   1  0 5 L& b LAa  51 e!   51 0 0e \ <a  |   spppp0)p1(e   K / 5 L T B L * a  !  5NUpN>!     $ 0 eB E`1e f Ie$W@ W1 @1t  e$W @0 `W"w)v e"fe4 `e `K  2  0 5 L   wn  6-    `-w  B>   5N5OUNT  5 N5OU N> ! 5!N5OU0N$ " A ̵W ̵ W ̵  @N   Lew.AB T@` ȕȕ ȕ  w)v0 0 5 L5 N5 5  0 4Da:Nae m & z 7@E (    @ @E ,     taE& e w 0 5 L5 N  =CeLe: 6`5) $  e> @`el N CeL5 V  =w@   p   e `E e @`ezl N    [ w  Ve m  0   =e  @` WtaN&E& e  :    L0  @E ,@E 0$ ewf 0 0 LDa 5 N5 5 4Ca`em  t`&E {KERMIT.B[001011]K11RSX.TSK;19u& e   F  8  * u   h0 0 em   J ef ` Wt`N&E& Je *  1 10  l  ^     E 55 0,   $ @E < E  %w)@ W"vl cm̒ %W"lv mc̒  W"l0W"pl)W"Dv ma 1 W" Dv ma 1 %wB r&     =`-   d/@ ! L @ L  @ @2   @ L fA-q&@ e  @6 @ w.5 L5 Nef0   C LW W   W  W W W   W  >%w .eAAC!!2Rr22 `` e ! ! H !!!!!> 2  $        ! "3    .    1 0  (   2\ ((  ) 8  v4()      * .3256 5      EA) (0X(`^'1PH ?1[ $?1@ 0@` $ ` B 0  $0 Dz $2     (Pr&Rn         | |2 | |< |$ | | |X | |> |v |™ | |Ҥ | | | z|ʫ r| j(~w2@ BB %  JLf : B @ Հ @0 1  0 w@ f  B @ Հ @0 1  f@ @f 1  w` @ e`el6 6 6 Uv @ e`el -w-  6 6 ̵96   a e6 Naa a e !-ttR_ tR_ xR_ ~R_ R_ R_  L_  M_  M_  M_  M_  M_  M_  DN_  dN_  N_  N_  N_  N_  N_  N_  N |KERMIT.B[001011]K11RSX.TSK;198|m&E& e f %    `e etce5 wew l t B tm&E&  :   @mCm B !  mm  ~  C B`m  ewh @ a ` afNla F   a V6  B t v  W e  a ewCe" t 'e`&  e>` @tmfE& e t @  w@@    ɵ   w f&c& &a ,@`": @`"" C`D$ @ @`"6x$ $ @`:  @`:@` @ >m(6  m666ma jme  @`  ȋ @`"96B  ` `>  `"  UB @`"  ` B   66  E(>& &&(ew>C6o N`N` )m # m6a ,e m a  >e fɕ [N`e x ,N` ` ]  e wF   tEm 5ENUme ! f & 6 fE@E U5@5 a ewrB e4@`elf     % f5 La ~ "a "6  6 a a 2 @6av e a efA J   fAa ae a l e6v aa T ea 8ewABa Na  @6           &        U v6 6    W      vvW    ve W   ve& a  a  5 a  a a t5a a ,a Neae a  66aa  ea eff@ @)@m&fe  N %w* @  W-  fL w6 6 aa @+ '@"6  a C) a  6v)6a vva 4 2@@m       aa 0ewBAe4C`eVm&6-$-  em e f E-N f - 4 t*[001011]K11INS.RNO;1+.=/ 0D6Xd܎7n܎ 4O== U|s<0}KERMIT.B[001011]K11RSX.TSK;19;meT` eL`3  e%w@ ɵ C`v6'D`N`ɵ Ӄo  Cm l6ɵ lv6 @ a& a& N ' eebe:e e e eHa& a& N a Lew & 6   rd  WpdB r  WpdBWp B` me0 %wf@@^&_  Baʕ W 36e Bm W ?  v` E  B`": W ~v6a W sB`:3 6@`TB` e6 6    mW XW UW:HW"Fm6 -:!6 am6-E U@ @`-Y3 6V-"6 mm e 8mJ  am B҂-%m Bae -wW    ":E U@  eWtEErPewRѦ)@7C5 LR@ E  C6 ` 5 L  L -*(D@ E6   L 5 L L %   $w>5’6t @ vtB@A  6t@@P5 wfBe6    *  @LE  `  t e8`Etm e`Je`r r % f@ I,f p1  @`  A1 Հ @0 @0 w 6 6 @6 &` e@`e`lf& & & &`E5  6e eB@`elv6eE! 66! 66   v- 6 w(5  6 6  ;  6   fla(aa &""a @,*,,e,e w@ 5=t"a@` ҁ-&E& e ~E&E& e U& EU& %\ ,tc&E& V6 t*a@`E& *6"]"eE EU E   ̵EU6  & 6 %UE    a6 e etm6 e 5  w5  -Le&w u >  `5 @t> 6 m @tm&fE"m Et&E e !cȋ e   oet6 /a mm  Q < 20- v`@a> v  v`@a> J  b`      C`m > ew @ `> `> 6``@b  ` a`a e6 6t  D A   Db>    Db6   Db>    Db6  5 EUE - ew A  o6e I @ a o " ! `6a e m~KERMIT.B[001011]K11RSX.TSK;19᧔%"D:Yn9J0ćg-iob: .+E>If9rxKiDT؄d;w0א&aaN1 ,^6BOEg謽O^qXGz5vş/}s+3`d$[XSUK'*Ej%Ȕ5 uj`\Lh7#[-c>A*2,ɳH.BJp24pyj m=voIzX7ȇX&g}< {}4yі# uGb[b~H^ i"*3R:o"<[Z#yl,{wV ~bW<2@{ʦqh&p5_ϫzwQqYߌ2|S' *Xy xhˈ(jD4 lS~'。WY"9.˖Pu㥽^'tD]" Gэ$ YK|gƜ9f8ϷP^p9ˋ2k0|{{8m͊f^vyy[6НVfWc%)qczFBixBQ((~9 i)Hr|XÇL' 4LD\wNWvp-o>nj- |>%aXQ#-za=T70+]IQ0,z@,bxSE.t7xp}A9i}L< nuxtV){8f%~P7o9K.Q K3:Ecl@W pThlx#ިGc 'h9)a-ρO "QRtg,` Rƨ)ƕ`(KDlf}mtQ=Fp{Ԟ5yL X^ [ȬF-Lq."r6BPc:5 +n}Vjw2yyiU`#I_ $Q}D+"F% teܿTl-T625H%tsA-Mq^(h~=f}W6ar;]o;UtL@K[z0/+SG3Fz_g;kuL`f̽r1y2hmL <ǽsgVr{mMX]/]-p6qkbk0 Fk5 Yz0>DI_I ~ .Q^u7@:=t0=? ^k a `up"}F[}5N=cdi[ R'P{(ئ2Qp))9 KzciGnM 'ہqJ JTU{{p!=!cwtaRJI]k2R'!4kn:$?;Q*GBX:=22r73LM  *?} s_q/ fhGe$}o&1aj~Ҕ>{12t9@4d Im>)%=pDyx&xɁ>Yh$ֵ.*)!aO/3 J> m[}| 0Tl| W1-aɮHc9ezNaZo썪hG*W{Kiw-rx?5 ko0ުJPg{<4g l2&0VFւ֒FF.S)׼な,|*i~ q۸N}-!*%B uD@uOmK='Ud?sO+o0tjaj/|3(z6qqe~ Dw|Tl9蚮^X8%&VXO issA*lPBM_ 񍎫C2zX%_J0g }wٱ;cqQ1V+<(;x[ C3$.ȄZ k]cE7'CH)./) ~cM *Vyec4,=y\%'D,МG(/IL\*"cM ~cYJ LG7@w&̘h.iteamtW&yj Q\ Ȧ;IYw]b={ugfaSi5HZ ^+bhƹ~aעRcm1Bʬ m"R}>Ao%WRy2>"%3BJ[+\oÖF C=K#im\2_׈k+^3bt!1j]>H ,v H&oA̜4 EEaVݵup-sBq+- @J.ZR "yI]ۙ'Y9M`1)W$mGNtąyMiw](C?T#I XpZCn{چo/BC3]]L]'EQnpVT˙p#[CƼYddg_r~jߛJF~E6ld8L~:ͼr>@g OyT Wn>< .scw.gNZB+>h.kD[a:0>!:Nr3egN+GŴMTj-<ZmSţHT`KS`՞=_/#^ hްլΧ.mFBLz =b)Mxyˉ􌺋>hǟyŠCPW~ @ŸUa{sS] 6{T/RS kl:os/ll->,>- K; A/$/^F2\>~Km&Eo:' MC<DgLf6oWw<C7e1 QNjyW (z-cQ2~skw2QmT^ !1Dbo~]t2:|nn9R(58?74sW UKERMIT.B[001011]K11RSX.TSK;19Ha  me w$ A@&? < 9e N`tEa   (L tEB`mCmʜ D @&eWtEaH>   w>  e a,  C` e eb & ea6  m]   eF eb f ve@6      e w @&*>  t@`&E& e 2 66ee 66 E66P t>P %f   f  0Ee wf@mBm W    Dee@mCm D  e e &  TLef   f  rEe fA  wAC 6 6  e`eJmE5 L       q& %  - 1    v e vE a & Xe  q L5 L5LEvUa W-LW-L ef@6 veL a >,xa @E  Aa af a | a `ea L>,[@E &Aa af a  a ea >,"afeN a  a eew(@ a d@   `ɋ  ea "e wC &65 W-  pL w66E- 66- 66 @@6  a ~  afe&a \a @5 (aB" a  v@@l6Aa@a-  gL 65 Nv5 @b   a hua Lew@ ɵ  Bov6ɵ `5v5plv65  5v6 @ aa& N 3 eeb eHeeRe"e ebe*eaa& N a e*5 N`v6 Cbv6   a ewj & 6   mW0W9 `f60  Wpd p ` `L%w @:CD E!!  W-  l!!  Z! !   ' 2$D@ E  W-& t d #  & ^ N 2 w@tE5    ALW  uNh uLx @h5  uL )LAaW"g@E h@E 8@t @ e@`55  @NE  huN =LAa@E  u u uH   @  P ` p @E e`5up`P@0 p`P@0 p`XP@0 p`P@0 p`P@0 p`P@0 p`P@0 0(XddPh@@@+4|IU>~>Qc a:8 KK ! KE0[#"m/0 F8_Py.>  \=EA+d/OC@* P'f*"P&ei0x{A%Y*bi _cOwZ9FK9K &1_ b7S'bc#8xm{O{f@x&S?Re1#!_(6)D5 rd, ylZ4.qS^cEr^"  }pKERMIT.B[001011]K11RSX.TSK;19K( xX @HdH  $,4<w17 7 7 ޾7 $mw zmt rq׭1׭{1S  7  q  @4& ݀ w >wr1VN& \ \ Zf z  ^qf|d(E &heA  n &  X5l(R ѝѕ ff& B}ee( 2f& R &efo e l l V-RFA uK z<f    e + )f fA geff0 (j%BCAef& N Xv l f  p w¼DAwXf0 t A ? ~|w*  hf7 XT  r@HH 6-2&A t)f B feff0 2i%BCAex& N bu ~A̻f0 s A ?  7 ~  r@rC&f&f7 T7 TI S  1 -A s<f   fm %f ĸԺf deff0 g%BCAe& N t |zAWI f0 r AWI-PH  r@<7 0F. $"f0 %ҹ ʹǹ#7 깦湃  r@ڹ |mF0 7  Nm@ -A rwl f v 7 vR} f  v% :f4  se fo& %f o ~peAl >f  %f&  %R f&  oe  f&&F be7tRf|d^X \beff0 ve%BCAe& N q e@Af0 $p A ? ䷇  Էҷ7 ķ  r@H f  k wD ʴ-znA o)f rbD `aeff0 zd%BCAeƻ& N p ̻׭aXQػ .fػ&E `eAf|dжN `e -޴^ ִ  f m%f0 n 7 ? f 7 VTe7 84  r@( "* > $FZf|dE _e7 A׭lX׭dZZm>w 8f  i wZD z-vjA m< hf\XZ V_ef|d8Z 6_eff0 Pb%BCAeJ& N n P7 A贇f0 l  ? Ĵ´  7   r@f *q 7 -  | Fm FBABCDFSZH@rr~TSendsw - state is ENYTڲENYTijڳENYT,b ENYTv||Sending file as file ENYTn,ииExpecting ACK, packet type not valid in current SDATA stateLONG Packet size reduced, fik5$.vgFDmsF@[t8Yw(r7[4na1*(e#:72:2e7zyu|dn _~"Ey{{(<~ n` |55@GRSVIbMKYL%q!YE &Y(cXI=7GH-r@,`?[>')' -6IT*BXF;86&H(5J4XHFK)yZC TR TTOL DP -}`) 2KERMIT.B[001011]K11RSX.TSK;19>rst data packet failed ENYTԺD ~(~\ v(~ n(~ f4~ ^4~J V4~ N4~ F4~ >4~& 64~J7 VwV7 rD@12*7 47 2m޽Խw νmҽȽ q7 $   8 .r  @,& lx 41ȼ& ξ Έ ʾf \{ 7 q w w w B fB&bE `hef(b ѝ8ѕ 5¼ ff& }e ff& e    e(& ʽ-ƽ HvAff  j%BCAet& N w zf|drN pgebf  xu Af  j %f  j f Y ge7   r@較 pF& 0 - .uA  Xff  i%BCAe& N u f|dLN Jfe< 2 tAf|dY feCf  t A -Թ btAһe? r@ f   f Y ee7 NtA |-xj sAhe? r@ f|dY Jee7 48 sA $ sA  Vf  q%1 f  % f  qef  }% 0 f f>&VE T_eAf|d2N 0_e" + -  mAe? r@ f|dY ^e7 ȴ̴Af    #f|dY ^e7 |  r@plARFDCA@8Control C abort on file receiveRecsw - state is SET D. SZFBEXT0bTx00 was renamed to RMS $PARSE failed ADEFZXTn<((JJLocal KERMIT error: ZXCreate failed - Created file - File exists, not ss not know about c eof for direct access files. Will have to fix c for RT when I get the rt version done. c c c c to compile: c c f77 k11hex=k11hex c ftb c k11h KERMIT.B[001011]K11RSX.TSK;198uperceded - Expecting ACK, packet type not valid in current RDATA stateAttribute packet error - H(~ @(~ 8(~ 04~J (4~ 4~ 4~& 4~J` n f& % f&r e  d >z 6 J~ ( 4 6.  & nm 7  Ҩ HU f& @ e f |% & f T fx %» 8n& @f F  Xǻ " 7 ʹf x 7 & @ f Zve ޹& ^7 ҹ& f@ den  &  mЕ P x * df& & `%H LL D` $Pff f& f ed ePh 0f& }% <f& & Hel ʦ fи .ue B f& y%  ff& ep n  & f v fR L%& ¢&f& f e׭ ff T ? ZM? XMD  t& *s    & r   J/LL *C LLaɋ5Lѐ f tѐf jѐ f& Ƽ e f& f ef& ɼ e rLf&  nee RL f&  Le 8L? 2L /$L f&  e L /K Kf&  e f&  ֈe fԼ L BX ҸTpȋ5e~ & Tp fKf  @~fKf PK-TpVpP EPBe~Tp (KfQ ~ѕ ~Kf B J̕ 4  fJQ ~f&  Їef& ̼ ef& f e Tpʋ J? J'  ~J~zJ& a f& & be J ޡ?FJ DJ >J  f& ̼ (e ? J /J If&  e̋J I? I? If& ¼ Ȇe I IoI f P Hf& Ƽ ef& ̼ ~ef&  lef& ɼ Xee CDHJBMNUVZ\Hbdjl^uvfǁvɇ|Ɍɓɚɡɧɬɳ<^  Z&(56jEFbVXZfhtv |~ˊ˚̵̠̥̫ $,%&P-.X34;DPZajs|͔̓Ͷ(@K`"h~"·Lϣ8.BALLCONSOLECONNECTFILEHELPNONEOFFONPACKETRAWRPACKSTATETERMINALNOTERMINALEVENODDMARKSPACENONENONEXONXOFFCARRIAGE-RETURNCARRIAGE_RETURNFULLHALFONOFFONOFFNODTEDTECHARIOLINEIOTC.DLUCONNECTFLOW_CONTROLNOFLOW_CONTROLNOVOLUME_VERIFYVOLUME_VERIFYCREATE_SIZEBREAKWILDCARDINGNOWILDCARDINGOFFONNONETIME_OUTServer_Idle timeout? NOTIME_OUTTIME-OUTServer_Idle timeout? NOTIME-OUTDEDICATEDNODEDICATEDDETACHNOEXITEXITWAKEUPString: WAKE_STRINGString: PROMPTString: INITIATEString: FORMATString: SUCCESSConnect acknowledge: INFORMATIONRinging acknowledge: FAILUREFailure acknowledge: CONFIRMString: WAKE_RATEDelay in milliseconds: DIAL_RATEDelay in milliseconds: DIAL_PAUSEPause character(s): TIMEOUTTimeout in seconds: TIME_OUTTimeout in seconds: NUMBERName and phonenumber: PULSETONEBLINDm n zfm   & @fm rt 7 dfm Ȁ Jfm Ht & mn  T L  lV 6f& m zefm ~     f& & %fm ~  " ΕB ĕT fm |  rX z f &   @ffm ~e  & ~ D < n & f& R% f&  e  t 5>  ʔ ” E?5f e E   ~ E?ަ  U?̦ Ʀ 7 pU ` U J U 4 tUj /\E  N ړ U ʒB rmits are set to binary mode can result in an unusable file after transfer because of the possibility of transfering imbedded record control information. .s 1 #Version KERMIT.B[001011]K11RSX.TSK;19ѭ’f̤ % ( 7r F |   | t l d \  P H 4'" f& F%  7  `< ffԣ %  ^7 Xf ֌%  4F& hT `7 $7X H @7 f7 Ơ Z l \ 7 f$  w f *%  7 ࡇڡf̾Ԣ %  D 7 < ȋ 0W w  p h 8WD7 |WA֡n < 4 f< h%  7 * " ɋ ff  w@ ܏ ԏ ɋWO  WF7  6  rɋWSWL7 : p^ h 7 7 ftV %  7t f X% f& e | nf栅 l  w  z t7 Ɵ 7  f %  7  (`f` % f&H Ԉe b  e` ~ t j ` V L  | r  f 0  w䞇   l E mN &f l  H @ v ( *eEee* E  E &f    䌇mΚf t  MfҞ % f& De  < 2 * l Ev XeE ̎  Z& V  2 * 8ɋW Error from device assignment Kermit-11 no longer running in LOCAL mode Link device: Speed not settable Speed: DTR/CD not currently present DTR/CD present Parity is set, forcing 7bit mode Bad value for speed or speed not settable Please use the SET LINE command Please use the SET LOGFILE command first Log_ file closed Can't do RAW i/o disk logging with other DEBUG options set Old logfile closed and new logfile created in BINARY mode Can't do disk logging with RAW i/o logging on To enable: Connection logging SET DEBUG CONSOLE File opens/creates SET DEBUG FILE Packet traffic SET DEBUG PACKET Raw terminal i/o SET DEBUG RAW State transitions SET DEBUG STATE Connection logging can be controlled by typing your escape character followed by a R to resume or a Q to stop logging. Kermit-11 will have to request 8 Bit quoting for the transmission of binary files. If the other Kermit does not support this, information for binary files will be lost. Unknown parity SET DUPLEX HALF, SET PARITY MARK, SET HANDSHAKE XON done SET DUPLEX FULL, SET PARITY NONE, SET HANDSHAKE NONE done SET RSX TC.DLU value, where value is 0..2 ?Error - SET RSX CON [DEF][ALT] %SET-W SET RT11 CREATE_SIZE decimal_value %SET-W SET RT11 FLOW [ON][OFF] %SET-W SET RT11 BREAK [SHORT][LONG] %SET-W Unknown option in SET DIAL Insufficient space to contain string Insufficient space to contain string No space left for numbers (~( ; Copyright (C) 1986 Change Software, Inc .include /IN:K11MAC.MAC/ .library /LB:[1,1]RMSMAC.MLB/ .mcall $compare,$fetch ,$parse ,$search,$set ,$store .m *[001011]K11HEX.B2S;1+KERMIT.B[001011]K11RSX.TSK;19L4HR]^`stnƊRơ`ƷnR`nR34`KLnfhrt~njǖFǞFǦ`Ǯ`ǶFǾ``F`F`F``%&+,F12F68~JLRT[\4fh:mn:vx4ȃʐL˪L(@HZftD̂D̠˸046<>LEFXOPTVYZ_`dfijopf̡ Ґ  WW `wԣw7 A "k XXW XX& \ f ` ޏ ֏@   ď &    * w r_7I7wBw wwf  W W ` . :d 2f 6  EW l  wf  ,W   ڎ ҎwfZ `  W W <   w+wGf Ɖ%  7 >>>>f⟅ %  7< f l%  7 7  7  "m fv |  wf@X %  7x fp. ڈ%  7x f %  7 fО |%  7 &ff&  2f& f ^qeeDebug file closed Please use the SET LINE command HANKERMIT link disconnected Ascii text mode set Binary mode set DEC_Multinational mode set The other Kermit must be able to support 8 bit prefixing Without this feature, the high bit will be lost on every character sent The filetype must be of the form .xyz as in: SET BIN .SAV or SET BIN .TSK The default binary filetype list has been deleted Error from $PARSE - Directory for files set to JUNK.DATDirectory set back to none (SY:) Opened Log_file Kermit-11 supports the LONG PACKET extension. It does not support SLIDING WINDOWS %SET-W Unknown option in SET RECEIVE %SET-W Unknown option in SET SEND The SOH character must be between 1 and 36 octal Receive buffer size set to This size exceeds Kermit-11's internal buffering of bytes. It has been reset to that value This packet size exceeds the host's input buffer size of bytes. This may cause the line/port driver to loose data at rates grea ter than 2400 baud. The packet size must normally be in the range 20..94 MAXThe escape character must be a control character RETRY should be between 3 and 30 TIMEOUT should be between 4 and 60 4~|HLNZ\$mn$ƈ Ũ´JýǾȾ0ҾԾپھ$&r46:<PLNP^`efFnp uALLBINARY-TYPEBLOCK_CHECK_TYPEBLOCK-CHECK-TYPECONSOLEDATEDEBUGDEFAULTDELAYDIRECTORYESCAPEFILETYPEHANDSHAKELINEPACKETPARAMETERSPARITYPAUSEPHONERECORD_FORMATRECORD-FORMATRELEASE_NOTESRSXSTART-OF-PACKETSTART_OF_PACKETTIMEVERSIONDIAL4 (fJ v%  8 L P  f h P D  ~  \  : ,     X  FT w  X z 7~ f& m e  n !f& &ʅ e7<ʸ  D < 2 * j * F J f& n fen r fn fute paks ; with creation date/time. ; 53 13-Aug-86 09:38:04 K11PAK.MAC Add SET SEN [NO]XON so one can force ; K11ST1.MAC every packet sent to be prefixed with *[001011]K11FIL.DOC;1+KERMIT.B[001011]K11RSX.TSK;19uG&f *eff ee  fo %f& o ~e Zfo ·%f& o ~e *fo % f& o n~e fo % ҙf& o 4~e  ,Ff& @ ~e   x n ѕTf& f Ęeeѕ.f& 6f eff Жef&f z}ef&  f}e e ׭  Ҙ0 ʘ ׭4 l \p  Q11 f& &̅ |e0e@f Xff |e <  0ƫf& & 2 6 f& & %T X uf& & ږ%v Ɨz f& v % Pf& ͅ |e  8n n0AHѕ ~ e@UՋen 6n F ~F Е Е f& & {ee:f& ΅ r{e o > "o . Җ0o  –  4eP  hf& & {e` @ He ީةmک@ mҩ7r `f& & \% H @m@ m7r "f& & %   f&  % ޕ ԕf& ҧ Δ%F ׭E J n r  >$  x p  ` X  H @" 0 f& &4Ѕ ye c  v  f&  % ܔ r ʔ 6         v n de@f& & xe4 @8 8ƥe@f& & xe ` d Bɋ   B ޓɋ ғff 4xee~    l   |ef&  we V Lf& х wef& ҅ wef& Ӆ we@ 9f e &f& f ؑ%f& Gԅ .wef&  wef& Dԅ we& X j P f|  e & 莇\ 2fT %& Ďf:ʋI ʋ  &   2&  f& `ԅ Rvef o f p  ff ^e `&  > SHOUnknown SHOW topic No debugging or logging is active Debug file is enabled disabled Remote connection logging File opens and creations Packet logging to logfile State logging to logfile No remote line has been set Current remote link device name is The current speed for the link is baud The time is The date is Directory for send opens and receive creates: none Kermit-11 Filetype set to ASCII Filetype set to BINARY (fixed 512, no carriage control) Files will not be superceded ̯1-Character-Checksum 2-Character-Checksum 3-Character-CRC-CCITT Connection escape character set to ^ SEND packet eol character (octal) SEND maximum packet size SEND/RECEIVE packet timeout RETRY maximum for packets Characters Sent: Received: Time in seconds: Type Last Sent Last Rec Tot Sent Tot Rec Total character count, less packet framing, but after data formatting (ie, includes repeat compression and prefixing) from last transaction. Physical data rate: char/second File transfer rate: char/second Pause *[001011]K11SEN.MAC;1+.-/ 0D6QcR7@eQ 4J--v U |s(0 .even at KERMIT.B[001011]K11RSX.TSK;19Dtime before packet transmission Delay time before sending SEND-INIT Created files will be Stream Ascii Created files will be Variable with implied CRLF Handshake character set to XON (^Q) Handshake character set to CR (^M) Handshake character set to XOFF (^S) Parity is set to \@FMT\ODD EVEN MARK SPACE NONE TC.DLU is set to current system setting. PRO/350 console is set to 7 bit mode 8 bit mode Attribute packet transmission DISABLED ENABLED RECEIVE start of packet character is ^ SEND start of packet character is ^ Default binary filetype list: none * Current defined phone numbers None defined A problem was discovered with attribute packet processing in versions of Kermit-11 prior to 3.49. This implies that versions 3.49 or later of Kermit-11 will not be completely compatable with older versions. The best workaround until a copy of version 3.49 or later can be obtained is to disable attribute packet processing with the SET NOATTRIBUTE command, and manually use the SET FILE TYPE FIXED (or SET FILE BINARY) command on both Kermit-11's in order to transfer binary files (such as task images). For further information please see K11.BWR and K11INS.DOC COP blocks copied RENDELTo: t} l} d~ \4~| DETACH來:  \ P2^`v" JŸ SRGITNYCEIFCLDUESWMHQRKPPJVT (7 ʯLf@ l% , '7  4 f& .΅ he Ɠ& ~fm r% ` 7 X      &  |* t<8,7 .7 &7 $7 F/X7 V1 2ff  $^%BCAe7 ̮V& N Pj  f 7  ̛f &E Ze  rf|ddN  bZe Lf  v%f  n f  Y Ze c :: f  %f   f ƯY Ye \c7   r@fF   f  f%1f s 7 &h fS >  |3f  ,%  fo& %o fo&E Xe  f   f  Le%eKb& h .5 f5&lE jXe f|dJY HXe    7 p%= Bf=&E Xef ΀%fm P 3f|dĭY We &5Ff Dj  ~  f&|E zWe Pff  @ |ff&DY BWeeP  & N $f@ \`fϦ Lf ` "f&Y Vee` f&Y Ve  & N  >ff %& @  J, &&  o >o eo& & &o lfo&2Y 0Vef  & N  ff Zp ff J   J|d  r|d   ɋ& N f c%@ j f  f b%  f & P 0 ff e  8f&Y Te f ^b% eP :ff e *(ff >eeKERMIT.B[001011]K11RSX.TSK;19"ꍚ!~QX? Āas}5jzV-i-hJ8O q=;2ip@!k|ic7IdLo 3KM8лRhͯ{o7pnɍ%^č*B3n'FjWnD8mN㦝1dgHe*o z,-'Cّ\!)X)\>["OWJǷ U~Z!=ğ@i,)$O`,+*P޼ ?V=^ qTC Zڻ)U:m"oIC"HxM׎t=Y79 ) UI{F]w<̠ԮabL[dRf./Ē#倮Otak ȞAд̑J$,hsdĽ)h&}`÷E$ƷhnvOY=(H# οFqUZg`$=RCBTG4q v䝁1Sj,zR/F8:*w/n6ҤR]cẄi&5j1n/>Kh"tE("lPV틱&tZY+Hjڱ+PPzʧ$תTi;=ѕpNh?cЫG /ftzkVjDݒ{&A*Vp,}l%\UZ?k6/NFP Qי/a|a@ `ªk՟r?e䎼6i&V@nm]>w%*-u7lO_CvܢH@= bdqa4-}}87o<-]ҳG*(Z4kk(}pyf(fU: 9־% ΐ-;ůM(sGPmG:Xvs؟]/'10 dd#PCMj(̼RIPt(at9qe顮{\Ց9c|+Uؽ&Ĩ4}`RDh&uWT\)Ƶ=Lb$䡁IOjNV6|T(6{'b~p iD!SՏ")2Bc|γqw^eW;I~D 6&:+n6{<)M,/p[ ͡h-v 9z[TBR}WRAԷLmIݔyνfL^&H fJp'Uì<͗[P|OQ$8dA$aV7;^;:軫,Qp+N,O,y+vhWoT.WvSd@?,$= A A )}t[2^?@/,?YVK[3,1-=ЫiO+( q8Xzࣉ+r1Ikj0gq>f ̈́.AS7/\o9w^}7iG1lsΎYR+G)wގsw hN?&<\ۛDfq`I5!%xJ]4 :L"08k^OSB프iq8/3 pb|f1+FG*XX؄myB3O0P2$1`y}ND` Yvxuo''%W R4oigXqz4)r]?^xˡ|w;%yӖ\<ݠIp`fg9u/eO+v3k9lQudMN "mT[q4f1#>00]\Y:Xa.2aoN! edo.Hlb[@,:͔BƤ$ӷR- 0v:SG!|n/dW.EؗD`,`1iyUh1ymۓUPs PvH9k)$>cЛCe>4e5pW`,r+HU.睰sn$&/)7Q 0ČBOx*g!|ɪ^q#;xr! -QXc'-iq0VJ(=Q0-I` ?1!L>[S >xF4;#?Qq~l=0O4$&%oS>;XWQq)j@ o^%t 4d?+d+<<\56]n?^wu)5CO b1+Z_b KWbasXV5>_>k0:Oy y*EtzU.3d`AD =KERMIT.B[001011]K11RSX.TSK;19}& Ҧ f f&tY rTee(  2 fq a% >:ff Je *(ff ee& Ҧ ԗ f&Y See(  fq 6a% fo@P fPfo Lde &fo& %fo `e f e  fo& %fo `% & ˋ& aˋ & #7 fG Reff  U%BCAeWY f  _% Ҋ7 V fHDG BReff  \U%BCAeWYWE f  v_% fJ `_% N  7 ʧ f&R QefR    7 ȥ f&pC nQe f|dU ^e ffD Be ffT &e f|dW e ffE e f|dH e fffR e fffK e @ȋfffC fe ffC Le @ȋfffI $e ffI e 7 XJ A@ & e  f W-ҋ@ Ґ & e  f jfȣ& Z%EeX  ` 7 d7 \ffTG ROeff  lR%BCAer& N ^ z  z7 7 -   ʤ-ƤffG Ne ΐ Ɛ -fĢfxG vNe  ZT p hfF : 7 27 , H  <. 4 f  ( %f  f ΣY Me  r@fF  2  6 f&   tef& ͅ se f  Z% fD Z% & & 7<7 N&< [  fF  7 7 /7 f ʄ l fl&E Le fm Rt%?Kermit-11 Unimplemented server command?Kermit-1 1 Unimplemented server generic commandKERMIT.TMP?Kermit-11 Invalid arguments for remote server command SERInvalid SERVER subcommand Server detaching from TI: You must use the SET LINE command before detaching the server Kermit Server running on PDP-11 host. Please type your escape sequence to return to your local machine. Shut down the server by typing the Kermit BYE command on your local machine. Spawned job failed due to timeout or TT read wait Logout failed - Quota exceededServer disconnected and still logged inDefault directory set to Need a directory name to change to deletedThe following commands are available for the Kermit-11 server. To avoid ambiguity with local Kermit commands some of the server commands will need to be prefixed with the REMOTE keyword. BYE Logout Kermit-11 REMOTE COPY Copy one file to another REMOTE CWD Change default directory REMOTE DIR Prints the directory out REMOTE DISK Prints available space REMOTE ERASE Deletes the filename(s) FINISH Exits a Kermit-11 server GET Sends the filename(s) REMOTE HELP Prints this help text REMOTE HOST Execute a host command REMOTE LOGIN Login. RSTS V9.x only REMOTE RENAME Rename old file to new REMOTE SPACE Prints the disk space REMOTE TYPE Prints the filename(s) REMOTE WHO Shows users logged in I need a filename to TYPESYSTAT failedLogin successfulMissing password or UIC (PPN) blocks copied file(4~SGxpFm"I)/a P,&CN9 [`|m~4nXL4^pPYWb5:yV.V$63H=#  aT$Zֱ^jS4 ,$V(J.5{~S>,'f] U w*Z 3 7DF%+5P%(5"y Kqpp,ne d*WyW_1=!s \ZY;8}/  }KERMIT.B[001011]K11RSX.TSK;19-s) renamedCan't create KERMIT.TMP FCan't get the remote KERMIT to FINISH LCan't get the remote KERMIT to LOGOUT ENSYXTZB̸ʌ<˒Remote fails to respond to the command Remote NAK'ed the command 5 times Bad checksum retry abort Remote server response Receive data failed Remote ack: Can't get the remote KERMIT to respondInit failed for link Z}" R}0 J} B}4 :} 2} *~ "4~6 4~ 4~J Я} <f    f >%& & & & & & & & &  & & & & & & & & Ȧe & & & & & & & & &  ė& f& & % ޝ ֝ ΝN Ɲ# ܮ R V       ~  rf& m ԁe Vfm f& & B% . &P  h \& 7 fm 2 &f& TI& & & & & & & Εp & & & & & & & Εp & & & & & & & Ε  & & & & & & & Ε  & & & & & & & & &  & & & & & & & &  (`& +'ŝ 0  n  v & & & 3& & & & & & & & & & & Ε  & & & & & & & & & Ε  & & & & & & & Ε  & & & & & & & Ε  & & & & & & & & & Ε 5 ; ׭  7 0&L ŀ ~7Ƿ  ~XL 7 7 5@2C 3  ' / Ewҫ     7  #7  g@ pp  h (LZ ?V &f 8a׭,]Z 0 & & & & J& F&  ׭, 2 0!0˦ d > & & & & &>& & &   & & & & & & & & &   sf&׭0bL WWY& )& & & & & & & p 5& & & & && & &  2Lע[   P Tע Ԝ & e& & & & & & &  s&ŋ& N d  f fŀ& N d    f$Ʌ (ye fm   Er 5hU` & & & & %& & &  fm |  & & & & & & & & &   & & & & & & & & &   ( df&(Ʌ Lxe 5 5 &f@ j l& & & & T& & &  @& & & & U& & &  574'54'755f99      p  %CcIiQqRruOSm.4a~HKw = _I`-zvxVCAvH6=& b7o%On1?]-QxPfxjx1CD&{5?RVs ro?A ]3P,s\~>_51 *,o,v}+i+#jyT9Vg9PDogk,mZYuRqHm";5;o};tsLd#<\A\&yHhL4HCDDdo>dKERMIT.B[001011]K11RSX.TSK;196!XxBb?HhvĔĔĚĚĮĮĸĸLLLB Try to send a break to the remote C Connect back to the local Kermit-11 I Drop and raise DTR (for RSTS only) Q Quit console logging. See SET LOG R Resume console logging. See SET LOG X Send XON and cancel any active XONs RUBOUT Try to fake a break to the remote ? Print this message nprtvyʁʉʑʙʡʩb[?1;0c[?1;0c[?1;0c[?1;0c[?1;0c[?1;0c[?1;0c"24~23~17~21~15~?21;0;0;?21;1;0;?21;2;0;?21;0;0;8;0c?21;1;0;8;0c?21;2;0;8;0c?21;3;0;8;0c69ZZ [?1;0cLSpawning DTE. Use the EXIT key to return to Kermit. Use SETUP to set XK characteristics, such as speed. Spawn for DTE failed, status = Entering internal connect code. Function Keys will NOT control terminal emulation Using internal connection module. If you would prefer to use PRO/Communications, return to command level and type SET POS DTE, then CONNECT again. Connecting to Speed: Type your local escape sequence to return to the PRO (:LB:[1,2]K11HLP.HLPSY:[1,2]K11HLP.HLPKERMIT:K11HLP.HLPHELP:K11HLP.HLPP^DK:K11HLP.HLPSY:K11HLP.HLP Topic ? H    f % w7 :7 47 ͋ 7  j    7 V 1 ~ M$~ B *  | & bl t 8f&  ~ef px  f<f e 0& w &f~ ͋W   ͋W T&ff jj ~17` E d= f& ll%  .1$ ̋!  Cע*ˋ̋az   6ZN J &f Wf& k% J1 7B& 8 8  & J Zf&  |e >7 ̋ f& & |e  &f& & \"W1 f h 7, —( , 0 v 7 ̋ f& j% 81 hB .5+,4 &  N | t~ f&  {e4 v * f&  r{e8 %f Hg  J}sho$dp sho$dp: tst (sp)+ ; Show DIAL is a special case jmp xxsdia ; where we load an adjacent overlay global .sbttl routines for the show command KERMIT.B[001011]K11RSX.TSK;19 oJB ff nee 1 < r |v t l d \ T f&  ze 6  | Printing default internal help Help not found for the requested topic Additional information is available on: %Kermit-11-W Cannot find the Kermit-11 help files or the task image high limit prevents mutliblock reads. Please put K11HLP in one of the following locations: }\  w |fm x| fm Bze fm F| fm 6|  ff le i "cf r  Y f %fm %W f %f %(fff e  f T%   & f m  fm vz%fm z @GNU\cjqx %,3:AHOU\cjpw~…Œ“™Ÿ¥¬³º ")07>ELSZahov}ÄËÑØßæíôû %+29@GMT[bipwoNpJmmRmpppp ppp(p&ppppp p"p pBp@onm mXmxmzmmmmm~mRobmomm(n@mootm o rmomomlDmoml|mjmmoomoomm6nnlllZm"mmnp.nRommooopp2nmmmmBo*nmmroboomPmNmvmopmVmm.ofml t \m&nnnmiTmoo07f& ؝ ff 0 ~ *   6e     r j b&f&ff& f eD f& &ą eff |ef he   ֛eA6Eҕ  DtEe0tEe0Ee0 f&  e ~ X NeA'Bf&  6% "f  ~  f&f&  ̙f & te A@  Ѥ~e@e$IMAGEALBUFFALTCONARGBUFARGPNTAT$ACCAT$AREAT$BILAT$BSIAT$CREAT$DISAT$ENCAT$FABAT$FORAT$IDAT$LENAT$PASAT$PR0AT$PR1AT$SYSAT$TYPAT$VALATRCTXBINMODBINTYPCCCNTCHARIOCHKSIZCHKTYPCMDADRCMDBUFCMDLUNCMDNUMCONESCCONPARCONSTSDO8BITDOLONGDOATTRDEBUGDEFDIRDOAUTODO8BITDORPTDUPLEXEN$SIZERRTXTFILNAMHANDCHIMAGEINDEXINOPNINSERVJOBTYPKBIOSTLINKSTLOGFILLOGSTRMAXTRYMCRCMDMODEMNUMTRYOLDTRYOUTLUNOUTOPNPAKNUMPARITYPAUSETPCNT.RPCNT.SPNHEADPROCTYPROCOMPROFLGPROMPTRANERRRAWFILRECCNTRECPARRECLNGRECWINREMOTERPTQUORTWORKRTFLOWRTVOLSENCNTSENDATSENDLYSENLNGSENWINSENPARSERMODSERTIMSERWAISETRECSETSENSIZESKIPFLRECSOPSENSOPSPARSZSRCNAMSTATESY.INITCDLUTESTCTIMESTISTSTMPERRTOTP.RTOTP.STSXFLGTRACETTCONSTTDIALTTNAMEUMDDEFVTTYPEXGOTTNXMODE Can't find symbol in internal STB t Byte data, size Word data, size ()beq 110$ ; yes, say no errors cmp r0 ,#er$fnf ; same goes for file not found bne 120$ ; exit 110$: clr r0 ; no errors 120$: unsave ; pop these and e KERMIT.B[001011]K11RSX.TSK;19R  pBp   pϊ2 :^#fy{~ĀiĄ''ĆĈĢĒ''r#&'''''# " &''7(*9f24''U#^'''qe&'ŀ''z}łń#''&''dR ''''&'''''''''28@''F:&'''''L"J'''¾ahp''vj&'''''|Ƃz''' #ƦƧƨ&''''''''''2 #''&'''''''''j <&''''!*''''H ''''''&''''''lL''''ON LINEONLINEĿBUSYԿFAILED CALLNO DIALVOICETIME OUTRINGINGON LINEONLINE&BUSY6FAILED CALLBNO DIALLVOICEZTIME OUTRINGINGrON LINE~ONLINEBUSYFAILED CALLNO DIALVOICETIME OUTRINGINGRingBusyDead LineDisconnect Modem ReadyNo Answer(No Dialtone4No Tone@On LineVOn Line OriginateRedialingpON LINE|ONLINEBUSYFAILED CALLNO DIALVOICETIME OUTRINGINGON LINE 300ON LINE 1200ON LINE 2400 ERROR CONTROLNO ERROR CONTROL0Attached:BusyLDisconnectedVErrordNo answervNo dial toneSpeed:AttachedBusyDisconnectedErrorNo answerNo dial toneSpeed:CONNECTNO CONNECT!ON LINEON-LINE*NO ANSWER8DEAD LINEBBUSYLEND DRINGING VA212PA HELLO:I'M READY*D ?%s DIALING I KStand alone VADIC VA212VA212PAR HELLO:I'M READY*D ?%s DIALING I KRack mounted VADIC VA212PARVADIC HELLO:I'M READY*D ?%s DIALING I KGeneric VADIC with autodialCTS2424AT Modem ReadyD%M%B%S +PT&CTS/Fabri-Tek 2424AD V.22bis AutodialierVA4224 HELLO:I'M READY*D%M%S%B DIALING I KPTBVadic 4224 CCITT V.22bis autodialDF03%sDEC DF03AC Autodial modemDF100ReadyReady%s# DEC Standalone DF112DF200ReadyReady%s! DEC Standalone DF224HAYESATZ V1 OKOKAT D %s MICROCOM4445 SE2 S1C0 SCE ON !!D%s MicroCom SX1200R212A RIXON R212A INTELLIGENT MODEM$KNUMBER:%s DIALING:RIXON R212A Intelligent ModemPROTMSUSER_DEFINEDNo translation found for number. Continue ? No connection Excessive RINGING... messages returned Operation aborted under user interupt No response or invalid response to dial commandCONNECTNO CARRIERBUSYERRORRINGAB,ˋf | D , Ȓ< and with the inclusion of ; the above copyright notice. This software or any ; other copies thereof may not be provided or other- ; wise made available to any othe {KERMIT.B[001011]K11RSX.TSK;19 *ʋ @ T X f&  we`  l& 4   6rm l   6 Pv Jx d $ Y0 ׭TX ׭MTm   ; Z8 7p3, 4ȋ   !fm Rme  4   h& L &   5&fm n% (m r G  " ( , f&  Hue Ə f& :˅ &ue ~f& ( ue0  ׯ0ׯ9wl/e^ע ДZ^  ˋ94 *: 8f& . te<  f& Dž btef 4n  ʋYf&N l& Ԁf& qe ʋ f&  "v%&   ~ @ BV :  Z (z &f^m  Xf2 f4 f &  d xˋ1 e& Ԁf& pe & f Jq%   f& u%^& jf t% "f &" : ~  1 p^ I^ Ɵf. f0  f& ^Å re & f& XÅ qe f f t% J 5  ^ ( +^fd o% ŀS $W W &  Z   e*2e^  (%f& ^Å pe d !^ jf J& d^  ^  ^ t ^ ` ^ L   ‹ !^ f & ^ ^ ʋ=%7bs,S(p"PMm 2 ğ4 Bb     & f m% ŀB %f  Z l L ^ff& pe%&ff l% &ȋ AZ @ f&f ke   ̉ ĉ ,  : w”0af&  neӋ f&  ~%ȋ  f& & me> HZ @*S^ 0b (  Ae^ ^  ^ Gf& ^Å Hme   ˆ     Invalid number! No previous number! Using: Please use the SET LINE command first Please use the SET MODEM command first A dial formatting string has not been defined This modem type is unknown. The known modem types are: Using: Modem in command mode Failed to get modems attention Modem dialing Call failed Connection made, use the CONNECT command to access remote Remote phone is ringing No modem type has been SET This is an internal modem The option has not been SET Modem message Message Class Successfull connect Informative message Failure to connect (Modem type: Wakeup string:  Response to wakeup: Format for dialing: Delay for dialing: (~t r0 ; /40/ 20$: calls inqdtr ,<#ttname> ; /40/ see if dtr or cd is up tst r0 ; /40/ if < 0 , then not supported bmi 40$ ; /40/ no good bgt 30$ ; /40/ Dtr's KERMIT.B[001011]K11RSX.TSK;19n < @ d h f& m efm (  &| df&f eff ee (  & ԯe@f& ne   B&f& v f& 54$' ( 5'54$' 54$'B (@?!54$'B (@?!9 @ 4 0  r   p p: pP pt     : P * V l t H H }7 ^fm ̀ &f& TI~b7 7 \v7 7 cj  7  " Re_&   J 2c-62`$ -ee  8 -T`E( 8 Z0 6) 8w 0 &f x{%7 w "Bj a o {LŀF&f>w4 2 ,g & 7  ]*!N7 U, @ E 0! 1! -材 ~a& & & & & & & H  6s   &f- j ^ pRs G `D bA4e& & & & LfZ&&  '  - $&  7e$- L!s  $& 7  * ~ s   s&ffjhe̥̋  4F% 37J L47!77a w 7! NŀQ W   `  w ̥  !sew8 j g   F& & & & & & Ε& E & & & & & & Ε& |"׭ stance, the DCL system command .s 1 ##$ ASS/SYS DB1:[200,210] SRC$DIR .s 1 would associate both the device DB1: and directory [200,210] with SRC$DIR:. Explicitly given tKERMIT.B[001011]K11RSX.TSK;19  t & & & & & & Ε& 4)*)4 | 뇷tj f& N `]  f  5V 5N ~d~*)Zrc& & !*!^& s B z3fŀ$& N \  6  fXυ pe fm w  EH 5>U6 fYυ pefm t  f& & ʕ& & & & & & & p ҕҕ ҕҕ & & & & & & &   & & & & Z& & &  ҕRҕR& & & & & & &   % \ f&\υ oe You must first define an output port: Use the SET LINE command for this. Connecting to line at baud Type CTRL and then C to return to command level   CcIiQqRrXxBb?Hh̾̾"""B Try to send a break to the remote C Connect back to the local Kermit-11 I Drop and raise DTR (for RSTS only) Q Quit console logging. See SET LOG R Resume console logging. See SET LOG X Send XON and cancel any active XONs RUBOUT Try to fake a break to the remote ? Print this message &fAB?ѕ ~ H/$?C~ Zװؠ>ؐc؀p`P@00S {3a{ڰڠۘIې{ۀp`(PS@{80 )LhNް|ިޤޠޘER$ABO THIS ERROR CODE NO LONGER IN USEER$ACC F11ACP ACCESS ERROR OR FILE IMPROPERLY CLOSED OR CREATEDER$ACT CURRENT RMS ACTIVITY PRECLUDES OPERATIONER$AID BAD AREA ID(STV=@XAB)ER$ALN ALIGNMENT OPTIONS ERROR(STV=@XAB)ER$ALQ IMPROPER ALLOCATION QUANTITYER$ANI NOT ANSI "D" FORMATER$AOP ALLOCATION OPTIONS ERROR(STV=@XAB)ER$AST INVALID OPERATION AT AST LEVELER$ATR ATTRIBUTE READ ERROR(STV=SYS ERR CODE)ER$ATW ATTRIBUTE WRITE ERROR(STV=SYS ERR CODE)ER$BKS BUCKET SIZE TOO LARGE(FAB)ER$BKZ BUCKET SIZE TOO LARGE(STV=@XAB)ER$BLN THIS ERROR CODE NO LONGER IN USEER$BOF BEGINNING OF FILE DETECTED($SPACE)ER$BPA PRIVATE POOL ADDRESS ZERO OR NOT WORD-ALIGNEDER$BPS PRIVATE POOL SIZE NOT MULTIPLE OF "4"ER$BUG INTERNAL RMS ERROR CONDITION DETECTEDER$CCR CAN'T CONNECT RABER$CHG $UPDATE-KEY CHANGE WITHOUT HAVING ATTRIBUTE OF XB$CHG SETER$CHK BUCKET HEADER CORRUPTEDER$CLS RSTS/E CLOSE FUNCTION FAILED(STV=SYS ERR CODE)ER$COD INVALID OR UNSUPPORTED "COD" FIELD(STV=@XAB)ER$CPB PARAMETER BLOCK HAS INVALID ARGUMENT LISTER$CRE COULD NOT CREATE FILE(STV=SYS ERR CODE)ER$CUR NO CURRENT RECORD(OPERATION NOT PRECEDED BY GET/FIND)ER$DAC F11ACP DEACCESS ERROR DURING "CLOSE"(STV=SYS ERR CODE)ER$DAN DATA AREA NUMBER INVALID(STV=@XAB)ER$DEL RFA-ACCESSED RECORD WAS DELETEDER$DEV BAD DEVICE, OR INAPPROPRIATE DEVICE TYPEER$DFW ERROR OCCURRED ON DEFERRED WRITE (STV=SYS ERR CODE)ER$DIR ERROR IN DIRECTORY NAMEER$DME DYNAMIC MEMORY EXHAUSTEDER$DNA ZERO DNA WITH NON-ZERO DNSER$DNF DIRECTORY NOT FOUNDER$DNR DEVICE NOT READYER$DPE DEVICE POSITIONING ERROR(STV=SYS ERR CODE)ER$DTP "DTP" FIELD INVALID(STV=@XAB)ER$DUP DUPLICATE KEY DETECTED, XB$DUP ATTRIBUTE NOT SETER$ENT RSX-F11ACP ENTER FUNCTION FAILED(STV=SYS ERR CODE)ER$ENV OPERATt version number printed at ; program startup, ; then: ; GBLPAT=K11PAK:DO$VER:0 ; ; ; If you want kermit to NOT exit at end of file from the invocation ; as in: ker KERMIT.B[001011]K11RSX.TSK;19WaION NOT SELECTED IN ORG$ OR TKBER$EOF END-OF-FILEER$ESA EXPANDED STRING ADDRESS IS ZEROER$ESL NO EXPANDED STRING IN EXPANDED STRING AREAER$ESS EXPANDED STRING AREA TOO SHORTER$EXP FILE EXPIRATION DATE NOT YET REACHED&fAB?ѕ ~ H/$?C~ Z׀ph`XP7@g80 :kٰڠ>ڐeڀp`P @E0r ?\ ݰ:ݠ_ݘ}ݐ݀xplEh|ER$EXT FILE EXTEND FAILURE(STV=SYS ERR CODE)ER$FAB NOT A VALID FABER$FAC RECORD OPERATION NOT SUPPORTED IN FAB FACER$FAL REMOTE NODE DOES NOT SUPPORT OPERATIONER$FEX FILE ALREADY EXISTS ER$FID INVALID FILE-IDER$FLG INVALID FLAG-BITS COMBINATION(STV=@XAB)ER$FLK FILE IS LOCKED BY OTHER USERER$FNA ZERO FNA WITH NON-ZERO FNSER$FND RSX-F11ACP "FIND" FUNCTION FAILED(STV=SYS ERR CODE)ER$FNF FILE NOT FOUNDER$FNM ERROR IN FILE NAMEER$FOP INVALID FILE OPTIONSER$FSS SYSTEM ERROR DURING FNA/DNA STRING PARSEER$FUL DEVICE/FILE FULLER$IAN INDEX AREA NUMBER INVALID(STV=@XAB)ER$IDX INDEX NOT INITIALIZED(STV ONLY,STS=ER$RNF)ER$IFI INVALID IFI VALUE,OR UNOPENED FILEER$IMX TOO MANY XABS OF A GIVEN TYPE(STV=@XAB)ER$INI THIS ERROR CODE NO LONGER USEDER$IOP OPERATION ILLEGAL,OR INVALID FOR FILE ORG.ER$IRC ILLEGAL RECORD ENCOUNTERED(SEQ. FILES ONLY)ER$ISI INVALID ISI VALUE, OR UNCONNECTED RABER$KBF BAD KEY BUFFER ADDRESS(KBF=0)ER$KEY INVALID KEY FIELD(KEY=0/NEG)ER$KRF INVALID KEY-OF-REFERENCE($GET/$FIND)ER$KSZ KEY SIZE=0,OR TOO LARGE(IDX)/NOT=4(REL)ER$LAN LOWEST-LEVEL-INDEX AREA NUMBER INVALID(STV=@XAB)ER$LBL NOT ANSI LABELED TAPEER$LBY LOGICAL CHANNEL BUSYER$LCH LOGICAL CHANNEL NUMBER TOO LARGEER$LEX LOGICAL EXTEND ERRORER$LIB OLD/INCONSISTENT LIBRARY CONFIGURATION(CRASH)ER$LOC "LOC" FIELD INVALID(STV=@XAB)ER$MAP BUFFER MAPPING ERRORER$MEM FNA, DNA, ESA, OR RSA STRING WRAPPED TO ZEROER$MKD F11ACP COULD NOT MARK FILE FOR DELETIONER$MRN MRN VALUE=NEG/REL.KEY GT MRNER$MRS ILLEGAL FAB MRS VALUEER$NAE UNMAPPABLE NETWORK ACCESS ERRORER$NAM "NAM" BLOCK ADDRESS ZERO OR ODDER$NEF NOT POSITIONED TO EOF(SEQ. FILES ONLY)ER$NET LINK OR NETWORK ABORTEDER$NID THIS ERROR CODE NO LONGER IN USEER$NMF NO MORE FILES MATCHING WILD-CARD SPECIFICATIONER$NOD ERROR IN NODE NAME (OR IMBALANCED NODES FOR $RENAME)&fAB?ѕ ~ H/$?C~ `jP@0 Jz !;ٰ]٠ِـp`P-@i0 'N(Kܰܠܐ܈܀*p[`tPH@0 4\BER$NPK INDEXED FILE-NO PRIMARY KEY DEFINEDER$OPN RSTS/E OPEN FUNCTION FAILED(STV=SYS ERR CODE)ER$ORD XAB'S NOT IN CORRECT ORDERER$ORG INVALID FILE ORGANIZATION VALUEER$PLG ERROR IN FILE'S PROLOGUE(RECONSTRUCT FILE)ER$PLV FILE PROLOabove copyright notice. This software or any ; other copies thereof may not be provided or other- ; wise made available to any other person. No title ; to and ownershi ,KERMIT.B[001011]K11RSX.TSK;19GUE VERSION LEVEL UNSUPPORTEDER$POS "POS" FIELD INVALID(POS GT MRS,STV=@XAB)ER$PRM BAD FILE DATE FIELD RETRIEVED(STV=@XAB)ER$PRV PRIVILEGE VIOLATION(OS DENIES ACCESS)ER$RAB NOT A VALID RABER$RAC ILLEGAL RAC VALUEER$RAT ILLEGAL RECORD ATTRIBUTESER$RBF INVALID RECORD BUFFER ADDRER$RER FILE READ ERROR(STV=SYS ERR CODE)ER$REX RECORD ALREADY EXISTSER$RFA BAD RFA VALUEER$RFM INVALID RECORD FORMATER$RLK TARGET BUCKET LOCKED BY ANOTHER ACCESSORER$RMV RSX-F11ACP REMOVE FUNCTION FAILED(STV=SYS ERR CODE)ER$RNF RECORD NOT FOUND(STV=0/ER$IDX)ER$RNL RECORD NOT LOCKEDER$ROP INVALID RECORD OPTIONSER$RPL ERROR WHILE READING PROLOGUE(STV=SYS ERR CODE)ER$RRV INVALID RRV RECORD ENCOUNTEREDER$RSA THIS ERROR CODE NO LONGER USEDER$RSL NO RESULTANT STRING IN RESULTANT STRING AREAER$RSS INVALID RESULTANT STRING SIZEER$RST INVALID RESULTANT STRING ADDRESSER$RSZ BAD RECORD SIZEER$RTB RECORD TOO BIG FOR USER'S BUFFER(STV=ACTUAL REC SIZE)ER$RVU RRV UPDATE ERROR ON INSERTER$SEQ PRIMARY KEY OUT OF SEQUENCE(RAC=RB$SEQ FOR $PUT)ER$SHR UNRECOGNIZABLE VALUE IN FAB SHR FIELDER$SIZ "SIZ" FIELD INVALID(STV=@XAB)ER$STK THIS ERROR CODE NO LONGER USEDER$SUP OPERATION UNSUPPORTED OVER NETWORKER$SYS SYSTEM DIRECTIVE ERROR(STV=SYS ERR CODE)ER$TRE INDEX TREE ERRORER$TYP ERROR IN FILE TYPE EXTENSIONER$UBF INVALID USER BUFFER ADDRER$UIN FAL REJECTED SOME FIELD (STV TELLS WHICH)ER$USZ INVALID USER BUFFER SIZE(USZ=0)ER$VER ERROR IN VERSION NUMBERER$VOL INVALID VOLUME NUMBER(STV=@XAB)ER$WCD WILD CARD ENCOUNTERED DURING FNA/DNA STRING PARSEER$WER FILE WRITE ERROR(STV=SYS ERR CODE)ER$WLK DEVICE IS WRITE-LOCKEDER$WPL ERROR WHILE WRITING PROLOGUE(STV=SYS ERR CODE)ER$XAB NOT A VALID XAB(@XAB=ODD,STV=@XAB)ER$XTR EXTRANEOUS FIELD DETECTED DURING PARSEfB@ҕ C~B A f r e0C r e0e0ҕ ҕ-RҐҕ W   A:R~#V؂ز9gنٓ٨ٻ'5J\uځځځځځځځځځځځځځځځځځځځځځځځځځځځځځځځځځځڂڗڗڗڗڗڗڧ )))))*&+yqk㓴 7k,]r?;gj=hHx\!ƉWMzG^SX5lSAJe./D/0D4zL'pʣ.*m^7Iŝ讃(afS!mb [GN&(3ZT NRex;.wun0뤏TzF)9BX;5?f`-ZDbj#A oK' Ts4N^9/Pk p(pӦiWEQLAǀ[wmqTHTCF=_&H'U)WQC6 öjplӯGȢrlzqs:(e `˚9jvv A |B A+ |r, AO {ئesc[oٷ.g+ n` nOo =x&ydp2ցFD଻wOW,^qFuλj -Iu)Pr{7i[XMOvnFWDwE $ [3noĔ!_zԹRQ& eIf6Q1~ucaD(sN3}`zk3O$t]W;Zo&qE'󶕵VV(Hpu =!j'`Rv7wD#Lnf# q84}R-٪c*V+}r+6H0d1Z9Br)6 DcyV_T! aPZ"TX22zG6M ;V#x&[G^ nN?;-Bm˪;ax0 O Rp.5q _%(e=g! mxE&Oe&Vlx0iА)&۵z%vA2"ţ- DN!z2:8Z\fICxnPϙ#f_ 8h5.;,S9灜m0pZu24lAT:^{?@qg\ZTT& 9C^Q%ZQ)Eм,a܎6D~*3 _ߊ0 y{tdTrnlm6n AjGh itEl,DOIE ̅'9󴐂>Ƕ!AP)R1BAj"5nג H Afk -M(>zHlP Hn{-2٢%p"~='5S`\͎y{ ȕMvxы2y-it(7tFz63 +fXȖͥd$ZIW0bEp uOL ,噩r][(X3WE/[0[Ԫ`:ȼsu4NfgR`{=x}>+(]eex<X8_-x} "PH|VNHCT<+Qm ض.>1f v! cu Hfj$@ ;h&!SȢk/fujg4iAkw/v/t$Daq]C]_Y6[hq7ou I> gћV,^~oJ*xuW`҉&j"ڽPz6N 1M e칵g"%M-%x{P*@ev|&ڡM`_&,;Ah]*tMޒ*! 8o#-_4e  , = V԰#$sJtVLv)SH6= H*,:7W<uҴ*8 DuۍKFEn8eP~<aiMQkt!Y>FPYB(O|"+qˏb։9EZ*gr>Vk[=^JY8:Gיt &:uψU) 'kAV S1|iɒg,/[ϻcYPv MRAU#˛'B\0(dܖLy"0X 0cߡ~S:w Y=Bk Aѫ\hCOV]Ch_75Vi-Ti$_ˌ|_>V \-whBȯRI sqmYpA _Zk:M3 ~raEnbG?<1֓۽R1Mtk``rQNI jSG2{ XwI^=EMQf.i;E>ڇSO_X8:LEJqf͵7R| GK0t$.}P6Û7,l6&zc ?=sփpg^KiWTH"mT[%؂gKzsV|MSʠ;@_%<}Kk2QjQ Di0p͐{ea'eK!}IZ3VNb^€u^f(ǮR^8I!o"'q)rN [Qzk6 qҜ yF+*d: ,D^>9N"v$<wc/)a:|M2?MOqcIH常 /բ69qux(TPD^T fѠWI嶫}bƮ~ԴZ{X$=NҩqvlL  l_?NaQIa{޴hd١36<_^\vZ_oטpbicnK953z^A$ٱyH8pkCîl㲻qjsɂe*b c ZXrlŪasa B%|TA<. ;ht[Q;0i/mWѹWS:Yռ M9O 3igTZ(DW3bF.s)ʖ|1>tF!)G(`J lNߡCDd7Dgʘ}kbb4v_?f5}23DU.pO:8V/H!.qeJCxg TP nUzq 76 mL#xD*&$nSdEݐ0&k{Z&[$w>3;nOe 8ZBzL"6s Wly#8=f!RTP3-3dp1  Wbr``*'bb$l;9~W}JU }KERMIT.B[001011]K11RSX.TSK;19mN already specified/Invalid send buffer size ( > 255.)LUN locked in useInconsistent qualifier usage/Invalid UICInvalid device/unit or device not a terminalInvalid time parametersNot a network task/Partition/region not in systemTimeout on request/Invalid priority ( .GT. 250.)Connection rejected/Invalid LUNInvalid event flag ( .GT. 64.)Part of DPB out of user's spaceDIC or DPB size invalid)&fP *-*-@ ʃ @*1-@*4-33@@@@@@& @ jq(1,f& ZAe B@ ff&څ Ue f& څ fe  % !ff& TUef& @fef& څ ,fef B \&-^W  ~% "& W@   W ҕ R ~Bf(& e`  File renamed to Files deleted:  X P H @@ 2 @@ff iee@@  Default Kermit-11 help text BYE CONNECT COPY CWD DELETE DIRECT DISCONNECT DISPLAY ERASE EXIT FINISH GET HANGUP HOST LOCAL LOGFILE QUIT PRINT RECEIVE REMOTE Send a command to a remote server BYE Remote logout COPY Copy file1 file2 CWD Change working directory DIRECT Remote directory listing ERASE Remote file deletion FINISH Exit remote Kermit GET Get file(s) from server (see GET) HELP Ask server for HELP HOST Ask server to execute opsys command RENAME Rename file1 file2 SPACE Inquire about disk space and usage TYPE Ask server to type a file WHO Request a list of who's logged in RENAME SEND SERVER SET Set parameters. See K11USR.DOC ATTRIBUTES BAUD BINARY-TYPE BLOCK-CHECK CONSOLE DEBUG ALL CONSOLE CONNECT FILE HELP NONE OFF ON PACKET STATE DELAY DEFAULT DUPLEX END-OF-LINE ESCAPE FILETYPE ASCII AUTO BINARY FIXED NOAUTO PROTECT SUPERCEDE TEXT TYPE HANGUP HOME IBM-MODE LINE LOGFILE PACKET-LENGTH PARITY PAUSE PROMPT RANDOM RECEIVE END-OF-LINE START-OF-PACKET R_)#rNF7NH69AD[C9G[hyDC!\>Wb;Cmw8ETE;VHSS/v\$} l~BB5/ê *5CEyqI+;/(N~54O{ KpqHRMN4STjZRqrfRvRRSSRS"S@Command file ? BYECOMMENTCONNECTCWDDirectory: COPYFrom: DATEDELETEWhat: DIALPhone number ? DIRECTDISCONNECTDISKDISPLAYSymbol: ERASEWhat: EXAMINESymbol: EXITFINISHGETFile ? HANGUPHELPHOMEHOSTCommand: LOCALLocal command ? LOGOUTLOGFILELogfile name ? LOG_FILELogfile name ? LOG-FILELogfile name ? NOTEQUITPRINTFile ? RECEIVEREDIALNumber of retries ? REMOTERemote Kermit cmd ? RENAMEFrom: SENDFile ? SERVERSETWhat: SHOWWhat: SPACESTATSYSTEMCommand: TAKECommand file ? TESTTIMETRANSFERFile ? TRANSMITFile ? TYPEFile ? WHOBYECOPYFrom: CWDRemote Directory: DELETEFile Specification: DIRECTORYOf what: DISKERASEFile Specification: FINISHGETFile Specification: HELPHOSTCommand: LOGINUser and Password: RENAMEFrom: SPACETYPEFile: WHO\և؇ 웘}~ } ܛD} ԛ}޾ ̛P} ě }> } P}2 P}l } } }v } P}4 | }f tP} l }P dD} \ }0 Tt} L\}v DD}P < }z 4P}vnߣvv~(~9BJX^fn|߂ߛ߮(/>GZdx߂ߠ߳"2;LUfm~ߋ& .f2N8TFZdhr6y^vn~~ $08V>R>V`ens '2;FMNUATTRIBUTESOn or Off ? BAUDSpeed for remote link ? BINARY-TYPEBinary file type ? BINARY_TYPEBinary file type ? BLOCK-CHECK-TYPEType ? BLOCK_CHECK_TYPEType ? CONSOLE7 or 8 bit ? DEBUGWhat: DEFAULTDirectory ? DELAYSeconds to wait ? DIALOption: DIRECTORYDirectory ? DTRDUPLEXHalf or Full ? END-OF-LINEOctal value ? END_OF_LINEOctal value ? EOFExit or NoExit ? ESCAPEOctal value ? FILETYPEBinary or Ascii ? FILE_TYPEBinary or Ascii ? FILE-TYPEBinary or Ascii ? HANDSHAKEType ? HAND_SHAKEType ? HAND-SHAKEType ? HOMEIBMON or OFF ? LINEDevice name ? LOCALLocal echo ON or OFF ? LOGFILELogfile name ? LOG_FILELogfile name ? LOG-FILELogfile*[001011]K11I31.TSK;1+./ 0D6j27uʺ1 4 Us(0FKERMIT.B[001011]K11RSX.TSK;19+ name ? LOGOUTLogout string ? LONG_PACKETSLong Packets ON or OFF ? MODEM-TYPEModem type ? MODEM_TYPEModem type ? NOATTRIBUTESNODEBUGNOLONG_PACKETSNOQUIETNOUPDATEPARITYOdd/Even or None ? PAUSESeconds to delay packets ? PHONEOption: POSOption: PROMPTKermit Prompt ? QUIETRANDOMOn or Off ? RECEIVEOption: RECORD__FORMATStream or Variable ? RECORD-FORMATStream or Variable ? REPEATTo: REPEAT_CHARTo: REPEAT-CHARTo: RETRYNAK retry count ? RSXOption: RT11Option: SEEDRandom seed ? SENDOption: SPEEDSpeed for link ? SERVEROption: START_OF_PACKETOctal (1-36) ? START-OF-PACKETOctal (1-36) ? TERMINALType ? TIMEOUTTimeout ? TIME-OUTTimeout ? TIME_OUTTimeout ? WINDOWUPDATEUpdate interval ? \և nD}f fD}@ ^D}4 V8}4 ND}| FD} >8} 6D} .D} &D}x D} 8} D}2 8}` 8} D}8 8} D}P ޘD} ֘8} Θ8} Ƙ8} }\ 8} 8} D} 8} 8} D} D} ~8}~ v8} nD} fD} ^D}. VD} N8} F8} >D}F 6D} .8} &D} D} D} 8}, 8} D} D} D} 8}f&BD  & V   E Wp\`A r : DԐ &@ȋ. Õ. f&@fff L%@ (`W.~"@  f2ˋD 8  0 ( e e@az B2 6fAB ɋ& N RP ʝJ  [ nBf W. R ~ɋ W. R~en f &”;\< ”/> 0)7&0 `B & ’0 7 0 `  T‹  f&fAW Tԕ\ rB re0e0e0T &9D  ߷  @ p   7 ꔄ jZ&  N ԕ.ԕ"ԕD f(pf (S% ԕ0ԕmMЕ C~(p f& 6%e ~ ԕ0ԕ"ԕ" ԕ0ԕ9ԕ#ff zR f& ܁%e~ ԕ"ԕ!̕A׭6̕I4 ff R   Eԕ!ԕ%ff& e ̕0 ~ f&fE@"A .WD : RB~f&  M ߅  &!   @ ~e  f7 Ɠ ʋ  & 0Wp e  w f&&f 7   ͋W  >C& N0eB  <H  @ ׭B׭I  V@ j} M-Cע# Dp Ĕ0 a~R  5פ"2&  rK 7ܑ7^#(pC 3f   Te~d 7 D } } ׭$D&  K7 7 7 7 7 7 7 7 7 7 7 ޑ7 ܑ7 ڑ7 ؑ7 ؑ7 ֑7 7 7 kw 1 ; for RSTS, something is open mode 1 sy.ini::.blkw 1 ; for KERMIT.INI stuff handch::.blkw 1 ; for ibm systems ? duplex::.blkw 1 ; if eq, full (default), els _KERMIT.B[001011]K11RSX.TSK;1927 7 7 ⑇f , ȑ) ̑ fDpf O%׭r(p W"W,fff VO%7 D7 ^7 t7 z&   `@ ` B   & A @     .TSK.SAV.OBJ.STB.CRF.TSD.BAC.OLB.MLB.RTS.EXE.BIN.SML.ULB.HLB.SYS.LIBX0123456789.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ^<ی\\b!"#$%&'()*+,-./016:  $(8SY:KERMIT.INILB:[1,2]KERMIT.INISY:[1,2]KERMIT.INIKERMIT:KERMIT.INI%Warning - You have requested LONG packet support bt beq 10$ ; ok clc return 10$: message ,cr sec return .dsabl lsb .sbttl set block-check-type set$bl::calls get KERMIT.B[001011]K11RSX.TSK;199ut the other Kermit does not support this feature. Receiving file Sending file LengthTypePaknum  < Packets sent : Naks: Timeouts: < Packets received : Naks: Timeouts:  /:ނނނނނނnݶ݂ނނނނ*[001011]K11NRS.TSK;1+./ 06,E0\7ļ)\ 4 Us@h IcZϳkNg~/4x, V NkSYSYSYSYTICLOV~ϳN~Z.y} |ϳϳW/ "tW/` t tffB&f e& & & & @f& & & Ε  eB:ҕEҕRҕ$ҕ ҕ C~ (KERMIT.B[001011]K11NRS.TSK;1'qqqq q q q &f& &?e E & Y w   wtl&f l1e? w|w vp& fYw b\ >w`:  5 Last edit: 29-Sep-86 (Command line editing) 6TA ? eE @ & m    be?E? & f YPPNP@Pf*PjPSY:n^*jFxL xL  s block r$fab copfb2 ; associate a fab with this rab r$rac rb$seq ; access sequentially r$rbf copbuf ; where to return the data r$ubf copbuf ; where to retu PKERMIT.B[001011]K11NRS.TSK;1t PnPxxPLLP  ^ <&&&&2 Probable cause: Either RMSRES or an RMS satellite resident library is not installed on this system. U5 V5 &, 7Z ZZeZ&f&{ B * ͋'% ͥ!ͥE%,  K5  PB2 %pˋ5J J  J @ EͥAA I531/-+)'%#!   erw !!*[001011]K11M41.MAC;1+./ 0D6M7;M 4LN UՄ|s <0,strcpy .g KERMIT.B[001011]K11NRS.TSK;1l~!!!!!!!!!!!!!!! $K J K KK K ~8Jf&  & |Nԕ VK  @ ^XIMR1MN KK & Ne N`f nA N`f ^ mKr_& e & e 6` ,`E?t`E& e $[emJ & e f  & Ne &  @ &  A C &  H~  l `(L  ff& e e5Jfffffd ~Te  6Jf.J ! o ݪK f TeM~AWAWZ@ e4oq 2oeJw J ׭I1$׭xI3WtE& Ne & WtE& Ne & v E& e 2I&  & J  5 I&f&B  ~H)d& N !f % ŀwH~ &fn &%f&7 G4 4   w4  D k kwФGEwG`S& N 4 H 4 NwjGEwGCS& N `=wHGEwG2St  (44B  (!& N  wdG-XRS      A TT ef JEwF?S& N Wq_ :EwF/S& N E`Ft& @`D~E?t`E NEwF S& N B TA1 14f&  % % 65Gw&Ffff e f& d e &fn >$%4 4 4 4 4 4 4 4 4 @ C~@   4 E ݃G 7G ݑG  4A111   \AZ@ enq neEw E5Eff& &&&d Oe &4-=5 E90& 0df 9@ &7`f& &f 7eef& &f n7ee @ 6f&f ree0 -wCE& N ׭VD1t E& N C׭4D3 t E& N CСD׭D EE&f 6 ׭C3  6f& P%  ׭CEE`B׭C2E?tB`EE f&f CD% ׭hCE&N@@UBtEE AndNdN@LNdUEf@@@U%&fnrlJ Rb   ~2oHrlJ Rb   ~7 ^D7 \D7 ZD7 XD7 ^D7 \D7 ZD7 XD7 JD7 HD7 >D7 B f& t%E W  &w\  5 B &f @ 4 &f7 *D 2Dץ~ 7 D7 DDC  7C7CC&fD  CuCApC CA  C7 C7 CwCwC-C^ CwC C--C  |C X pCԝfC & `Ce  VC 2LCLC7 DC   BT eBw B &fDE  A. BE AԝA A & N &  BT & A^ χ f&BC X  A7A  E&  7 A A7AA 7GA  Ew3A W?W_&   `AՀ& BA  F e@w @ &fB D /E A7 AE& N  E7@  Ews@&  V C  &ffA ~> @d 1d 1@f& & eK~d 17 >f&f 6@ CAAVԕ%SmKERMIT.B[001011]K11NRS.TSK;1Ȕ  >-ԕ TC̔$̕_ ~ԕ P~  0f&&?E eeVf& d ef& f e X7 B=&& Nffd&d e  &<׭0= fe % fd %&fd %ff`n e 2 l  <) &f>p& %f % ff>p e&@@E@U6 ʋ  % < < H& >*1-@Rf 47D,7,Dы 3p,0(f& 0e%H58D5@E . 5 \,58  l( f& e!H   A~ f z%@ 0%ff?&f杺+ ק&m+ f (e f&D #C $ff?&&J+ ק&m"+ 1- -*-> b$ >*1-3E@@@@ $ 21,1(ff 6e%H 585E A  ??~ @e  Bʋ%ʕ?  f ,*-> X# >*2-r(@ @#2,&1 1 11f Ne58  =p<l  p`@ e  &?e f Z /Z 3?/? 3 w 3peRE~t0Np0/x/7 *[001011]K11DEF.MAC;1+./ 0D6cF7E 4 U}(0KERMIT.B[001011]K11NRS.TSK;1B @ř%Gl(v5XeVrd'r񮱥 P"3./lH2`aJjs巉lwt`nBrJKo>.+WY A*M y!j$>GTT֬d=I؜&G!J=cl=:p;]E"n: )7u(]k[Orޡ{]RE qM ]&e-X  ;WIɖG]ٲެ@(J̀9"]:t7V_+'#)KM Ld" mD+X\ EQFcWZX{,x, Tx ;w(.ے_ HvCD,P+XC'= ]lЌ;rܥJt),,He7}<&9 &#:{{byΚ *1渄TrڍThR,RJ}g";cU򉷺vxfRPahWY{ZLjAFi"V Oh`_nqe%R#0`bE=\z"It9-ZTPȶNbesv;ŇJqU Jc p%6s^ i;y{(lizլPdlA< -v!H kc\|rwysȐ1c'%Yd _MO WB1T2v}:Jad}H# !ù&[.xo2Rguҥ $QQ0kKz;F &~dK?Ka~eλ?6yg$mrq_jw>pހ7(΅5l JTD"3FApCi"=>OplV&O Y1e֣?.cr]lRꪒ 2CBP=Tx-tA(9J ƽ'Jr7#DIP[ʧ#f IScH}[s#E.l~H ̧"P;du}#To,c ~ڥshyzVYGme$iۀ sޚt$Zc} U|$]FtaW*)p7ڎ~q%0K`b##YCthjq$sW_s S_ϫf:A~u$W(&'R4&P4-**(5zϦN %K`ݍ#}4oe.qքxռLq21FZ^ɥE{055Yo ׺ }-uM#s+/BzpCLéHtrgXeqZV7ȚHÑ7ln-t )C ig>9Y)fbV]MFo%2YB7Ӯ2Eč,_.D mrDlj.z%_C639*eV2Ø7E8L*"lf4x 6 bY(w\}!*|%0]NSI r,2;]:2Oӌ)qM 4^3r4={TkPd$!dNjI3"U6bk{{Zꌴ5Dw7VQ6%T0 yE> ewv[kujR }?`da]A1\W!}*Z=SyH!+53HLѹ`ku7&$vRwv/&)BjDP#)Ǧ97&Mb+3O8+`$3yurݙ raԀn{!R(q_9kh=8G ,ePjahW:Eb:!C4?U 1k$1M@~v e=&PSD8CT$>$oL&wLkW Қ39p@-]yf^.T?$IWf(#\Ȗ!+eg7gHx"%W*CD^fgƙZ&.Ep@`N%[L%A#I$?!DFx>_Ppkڱ_a'*Kx>GFꕅjy7@p'i髸֧Bv r :'v!OjJɶL7>].xp]^Py~iO1TFɬ[b$`1uq`Ï(]SzYbeI8t|w\cOQ`A)YLD1]?SÆhOH@:]4AE7LCCϞ1sE T28az ~M9(6yo8k}4F^:30ANE|8*_=X-:], g'u*i+9!Uk]SB NYEuqho+.^*g+_qI AE JNV Mz_&UG1"9cum\n}+)LRjȁLb)#`g%:0;'meV: f o\]G@wJPWKERMIT.B[001011]K11NRS.TSK;13g# ѕe 0H ~ff 2 &  B 6nm ȝ7 /. (7Z/ 7  <B 2 2 2  n X@ȋ ff    I/·,5 , /5U -5 5 5 f&f f%  B f& g *e7 . bf t Nff X @ 0 0 7 \. x]wXTJ/A X=:7wH C6Wp eWf R~7$7 6ɕ&fBҕ_ҕKҕB 6 rd e0 r e0e0Rҕ: "  ЌЕ   jf "  g ggHЌЕ   $"   HЌЕ   "  gȕЌЕ   f f A ɋ   "ÿ f Aɋ h " f"PPPHЌ   wh:"P PHЌ   w< (fPf efAc y @ W 2 W@W_@ KwF :7 6 B  2 2  $  큀    V"X  W-  P  .(2 " & HЌ W-  P Ƚ Շ (*f % @   & w  p @ fBC0"HЌ  P4, P)E D`> 0w6"X Н  "PPPHЌ   @Ћ@ 77&P    4&f@@Ћ@ "QɝV)ь  H)@׭D 7 4)"Q   @fe  h V&"  .&   (&f * ff ff  e & " ѕ   @ 0 h dxy " / dT.JwB <&fB@ ߕR~ &@ h ,f& I fff e fff e  j {7xs6h H tY7VQ6F . 6) H"-KB<7:56 76   ^ (X f  76@(h  @l(h f d+ u7s6h vA(h W" Q- bG7EKI62 " f sA X1H 76H ׸Ը7Ѹ(ݸ6 76DAWp e ~ ݠEW %׭% g7edqw`SQV׭6%׭.%:6"f l & @Ћ@ 77w45`vi&  ΝڷΕ 6f v* ' ҿi   iЕKЕBPȕ6 |i i  :6&f Bw(! 67& A&f w 67Af&f2 6   f&   *e7 h‡f2 7 X J N?J l&:  2?. P "  7 „7 2 ʋif> p f f  5(55   Ԕ~&f f |%ef h%eӕ.f P%eӕ ӕ zf& &eeӕ ӕ ZfV 4% `f %   vIz[!^tl"%UNUuEp_9`w k[`1ev@GSVey6b:2S_UV94B/N90&bSFc&.C5{F<$TxgV|R!'2Q6q,i2'y :-1Wv } bv^EW,ʄ#\/ 'ANq ;fmH:\[ AJgdi_ gKERMIT.B[001011]K11NRS.TSK;1* ~   7 fAɋ  " X  f LPѝ(ѕ  e6\  fKF6< iȋ74 6. ( 6 6 ~ѳ6 6e  Е P6  7 »k6bf : Vѕ60/PPPP>. 0Е P6 4~  ЕPPPP6 eNN&f  f  ) ff ff2f e ffi lefff e Jj p   (f& i ~e 7 (u7 ^7 \ d) 8)fW     2)7  Z  ׭   ' $(w w f& Nj e  f& ej e  f ( 7 z w7  v\\  f fR j'  fj Pߖ% fj :ߖ%  ||j 7  f  ɋ j j [   pf & 7ɋW R W  f  f | f   & !fS `&  fj Nޖ% fj 8ޖ%  zj 7* 2  fn fn e fn . fn  L&fn %fn 7  % f w  %  % +7L ɋf !f f %  fj ܖ% j j j 7޿ H% %f % f % fv $ fd % fR $ BɋW ɋ ff, ~$% f d h$%ɋW ɋ 1ff N$% f d 8$% $ f 2$% # f L$% Dk z  7 "?7 fm& .% 4 n1ff& 2 e mp d"f&& %wR7P D"f&& e ,f 7  BAf& @`& .Cp Cmˋ$f %  ff `e m @&7 |& A@ n nW?7Dk \ (f& f pef& k \eɋ f& & @ek e tX ; k& N j  ~ 'D ! ff&& e   e   -T fW L  <  v fk D k < w&f>p& %f& >p 6ek   ɋW  &f& f e׭L ff Z ? v? tD  k&  l   &l& ,l J/  *C aɋ5ѐ f . ѐf $ ѐ f& Hl e f& f ef& Kl e f& @l ee n f& l @ef& Nl ,ef& f e pʋ ? '  ~& da f& & e J ?b ` Z  f& Nl e ? 0 X/ f& @l je̋J ? ? f& Dl 8e Я ίoƯ f  f& Hl ef& Nl ef&  ef& Kl ee X  Rf& Dl ef8 T "O f& >l pef& Nl \ef& f Je pʋ(  ֮~Ү& a f& & e  ?R /  f& >l ef& Nl ef& f ef& & ef& >l e@ Po f& @l fe ~ t&O?@Uꭱl3ʋ" B 7 7   ef& Zl e%&f @!  7,fn T  7   7r   7Ff&f BAt4 4 u CM5ŀ5 5נ Õ   נ .נ +E5  mË ȋР5 נzנa 5@ נ[Õ(נ]Õ)5 נ'נ"45נ ËҐ 5 `W W ~e &Ћ f&fA DeEff F 6f&f eF`%f& ff e&f&BC ҕ C~A r e0 b~   -  A  ѕ ʕ*  &f& & ef&@ABD  &f ~ e  &fAC r@m r(mSm C& ˋ%ע  @ ע+ע-ע0ע9 & 0Wp e     U   Bנ0 נ70 `&fBCeEb:mtE ~&ff& %f& ee&f   ! e&f  f& & %K~ %fP%fЋ P% ы % E&o #  eo  %SPACK - SIRCG RPACK - ?Bad Checksum: rcv,calc are !1BRcs ƍ#2$FW6etHZӾl~ Kermit: Aborting with error from remote. pak: Fubar pak type: Retry limit reachedHopelessly out of synch with sending KermitRetry limit reached, parity is possibly being introducedd2r22f2l2d2Breakpoint trap, PC: PSW: PRff@rf@_KB:? This copy of RSTS is missing the multiple private delimiter SYSGEN option. Please include this option in RSTS for KERMIT to function z ~M9(6yo8k}4F^:30ANE|8*_=X-:], g'u*i+9!Uk]SB NYEuqho+.^*g+_qI AE JNV Mz_&UG1"9cum\n}+)LRjȁLb)#`g%:0;'meV: f o\]G@wJPWKERMIT.B[001011]K11NRS.TSK;18 KLDCDLDEPKDJDHDZVHJhjhhhhhi4iViFhFhFhFhFhFh2Kn,X` %2Kn,X`  %Kn,X` %K&You lack the HWCFG privilege to assign a line HWCFG*.* ! Check SHOW RELEASE_NOTES for possible incompatabilities with previous releases of Kermit-11 and other Kermits. Unrecognized command %Command not unique. Complete Receive failed ?Syntax SEND Filename.type Complete Send failed Kermit: Get complete Get from server aborted KERMIT is not running as a LOCAL Kermit Read error on TAKE file: TAKE file closed Unrecogized REMOTE command 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-@_.Exiting due to control C interupt   YYY([[.ZYLZY"\XX](^Z0^ABCDY([\[\^C^Z 78 Access not allowed to this command BYECOMCONCOPDELDIRDISERAEXIFINGETHANHELLOCLOGNOTQUIRECREMRENRDISENSERSETSHOSPASYSTAKTRATYPWHO  ABCDEFGHIJKLMNOPQRSTUVWXYZ$.?0123456789:01234567P'&*[001011]K11DEF.MAC;1+./ 0D6cF7E 4 U}(0KERMIT.B[001011]K11NRS.TSK;1A?1 .{P &{ { { { { { { {T { { {. {\ {h {X {N { { {x {l { {v ~{ v{& n{b f{ ^@| VL| NL|V FL|" >L| 6L| .L|T &L| L|Ȭ L|Z L| L|0 X| X|" X|@ X| X| X|f X|l X|> p|( ||е | | | | | | ~|< v| n|v f| ^|Z V| N|D F| >| 6| .|0 &|z |t }\ } $} 0} H} x}f x}` } }r } } }d } } }ܦ5ew , Bv    5BwX 5  5U {u DyxxE U *5@*& E& & f&ËDef Ë )̋Uw eE D` bl lrw \  B eE"s    s-  Csl&f &ff Fw>wNwVwfw^wvvv&wvwwww.w6wnwvwvnvvvvvvv~vvvvvvv6v>vNvv^v.vv&vFvfvVv zB{^ ` H!( BmFmJmNm"{zH!H!}{?}{d|?}({{@|K|{{Vd{{b{{n|{{yh {{ {{{p|{| {| `{|{(|{4|, {{} L|{{t@|X|0@|L|Đеp||Đе d|||ːе d||Ґеd|p|֐t| }֐t ||t||t||t||t ||t ||t¨||t |}td||'}}' }$},` }0}1 }<}6۔ }H}:T }T}=X }`}B }l}G, }x}LT }}Pۤ }}V۸ }}\ }}bh }}h{By}Dyx}.yxxxxx&{CPU  ,, &. 0 0   ,`w3   f %w C55  `0 VC 3 5  @ss   1 1 5 5 "`  0 1 1      &V  A  B,D 5  5 A     L 8 1 1 1   "& d   @@ @ 9C@&e$e& Μ N<B>& 2mB>o  o "j d `[ ]Ҭ V  Ue  5`昃`$EEˊˊE & ˤ!%   cc   9e    A>55,<lɥ fEÊ֥  P  "` &&   f&& rע , , A`  & "   eAm:CEeB@ & &  CR  &VPn nflf wRs$e$,fL " . {"{^{`wwP +3 3@    #  .0 µ1!nKERMIT.B[001011]K11NRS.TSK;1F0  5 55   e5& Y5 T SP K  E > V5&@@   ) % e  C   r  &V p 0 p 0    5w     @  ppp 0 0 0  1 1 1 . (f& 1, 1, & 4 A`!  && &V veN*PU5D e0  S  ,rw ` 4@  %P $ J05E65Q M ̥ I5 5A@p 8 ȥ 45  % D`P`_ ,/O&PXVUEEuB 5 =/5 *@ %E E E  M͊    ` ͊ udEE5 p U 5@\ .% - / ~,3e"5550% @L @ N ( %P Eewup1 ^5 E #  * .H@ D,  2  D" 2  $ & $  MfL( 6ȋȌ " &f .D̥  w f 2 & 2r  4  8 <0w d& l   &ap aB#E   *   uD5e`w eE< .f 2  , ,p l J a b! P PH f " zPPPH H U. :U.f #3/5 fȋȥ&#g&ȥ W0  ɥɥ    uȋ31,'6 1# fՀ 0   Xŀ  L`0    &f >0 &V f hp&  Kߗ'"E". 1  `̥ @ $ ! 1  ŀ f&& 4pp  5 84 595 - 9\  I' Q5KA@!Af9f:: 9 :9 !g9$5 : t9 f&&  5K $ņ%!*5 86 55 A@ tt  HB9- t *t .5 :w "`4  554 5 <>B@ ,t 5 : T&D4 4  Bm@.C@# UE;C@ .@<’  4- ,  t4    0  && 5fLV    "`   %+%0  . C@ % X   "`&& (%` fLV & 5@ b @@& e$cÒE eccBm> P     t l59&& &l :U,:` 9wCm: "9wh:5: < s>59wB9œE  e`*[001011]K11M41.MAC;1+./ 0D6M7;M 4LN UՄ|s <0,strcpy .g BKERMIT.B[001011]K11NRS.TSK;1xM D˵˵˵em <B@ ,W m emv` <N  8A@A E mv` ˵’ee`ef v` <  f9 5,mweE,C:6`” A@µEe   A@ ˊפ ` El `: ff f4  e4     "`  84  >APPPPPpP$P PPPPPee&5E5  C5 G@% eE_5⃌ ⃌U@P 5 5 fʥeEU5 UUpʥYʵ5 t $Uʥ5u"@e.Iaat /EUb8bbbr'5!w__AB 5_  tBʥ% %U_ߵ@ߕ A% _5ߕU5UA  05 U5@5  UE—  % %0ε wU@5!= Հ B 2 5 •    ЕP eP 6 t((  w4 "4 &$ Bw45 85 :5 <5 @CC  a # C ˥ C<  33   A8  @ e 5,@ ͥw pw6ww"w:<3 w*e # # # ZN# W!.eЕ6` ܇I# eme{c  `"    & b@ c N % K@|g S S S K S @ e#S K eFS S K  w$ӗӗ  ˗ & %t"   v ` cQ$    $ & 0gB:  ^ Y :A<W" 1t F 1c5:ee B3e "43"B Ί  c! ! Q4%8   &fA8   -5@  u8 %`6%    U@`B!]  @33 3335& _& "_""$4ߋ$  5  X K 3 s0 ߋ w~E@!w5kAc@  Xw p 0 p0  @ r r2 U bק U JߋPeL Bw@eL@PPPPp p g@ XЕ@Е  6ߋ5@ Ue  @  xeL@ &0E U(wb@%@ UUE VA s block r$fab copfb2 ; associate a fab with this rab r$rac rb$seq ; access sequentially r$rbf copbuf ; where to return the data r$ubf copbuf ; where to retu KERMIT.B[001011]K11NRS.TSK;1kTe U5U 5U@ 5U PPPPQ$$P $PPPH w6eL@5  .e5@w^A1 11 1 E!\55 54 t&5Υ0 ]"]$(4$4"e$t " 55& & Е6 55 Հ 6 244E? 5@p'@E44* EUt :wL !,8! U ɕ1(1@1 1 5E55e(5B)5 u IuI55 /5 p%Ue&  55  U  l5wXb U@E߁ w 0!. 'p#!¥ U B%) 5    B:A&F @: 4@.@("0@`@  MC5 @C  E5,,%eEn  N(C&% # &  ͥm   w e  e N `t N,C,  \$   #4   eN % `  Iq11 e"@eLͥmI  %1w5!.R*&@C f",1 1 BeN @5@55 $ &,,4$"J!Eeb && 5eLddd e  w vЕЕ64$4" 4 46 6 ev ]( 6  mA ` P v6m t  `0 4"4 $e$t "4 &(Еe P 6Dw&D %%%p*I )@`e( @ 9  P %` 5  Xet 4"4$4 &45"45 4  eLwp ΋w~bw44  &   5  Fbw %` D5 :p , m664 \j%ه!  ˇ < AF  @((  eХȋȥe  B N,v,  8w1   55@ d ͥ#@>E5uu  < ~5@Q5!451(.‹,e5 4Q4 ea Е P5@  6P N V5 5  &   5 wP 5uw0 5 , L , v L L *vwPuLuNfV 0L5 @eL ,    `1! W-, A , KERMIT.B[001011]K11NRS.TSK;1[ LœE¥" t4 tw   e t 4 @eLW-, t 4  0 && LwdbD D/5% %%  S0Ԋ8cP @"s JD%b p wr ~wD5 tBh?lYjU@055   w@pK5˥t)) ‹5Up55AɥAeu@A55U4 H  &fw51 e !`Be`@&  ! Ae G`5 SNM QL.E*H5D w 5wHe :Cœz 5l   wwTw53 3 3& BA   BA 8   5 tw d %& TBA  % : @ DAD`wXU5 Be ͋ 5 D wѕ. B@ⳐB15  L ( F BU1 1 1 5w w58 5&PPPPPHP$P PPPPP#w" OAA ˃ BP5&B5 툜4ߋ B a5Y  U ueLEe5w RRRBe ( @,( (0 1 5 ߋ A5 1  w %!w Twwק&ק&@w .5W,U1 U *8@" 2  w5 5  sJ5B  51 E ɋW K  5ssss3.5%6ɋ Wl E 5s3 wE he ("Br2 r P r2 r 4U UAALe fVRɗe5  E E    SYsKWE 0"U 5 5    U e 3 &eD&5 PPB PЕ:5 #  Е[W B $Е*Е,W B Е*Е]5 B B |5 Е.B d3  R  " 5 U5 U@5U5U5U5U 5`U    4ɋ Hw (b E  E@ C;8&f 09 (/J2  P3 U3 U   5ɕ U BA wB w  `uw BEC`  wtD ccє  D ɔɥaɥz &݇&e # fEB`F ~ . ӥ:  ӥ:@! $  @! U`eUU5U mɥ[ɥ<"@  ˥.   z0Q UDeĤ _ Uċ5E  lU0 E pU5 . 5E0 U L. x; n Ċ- bU " & N ӥ"   U5CM% E A5t beq 10$ ; ok clc return 10$: message ,cr sec return .dsabl lsb .sbttl set block-check-type set$bl::calls get KERMIT.B[001011]K11NRS.TSK;1IrbQ`C _C&  p2 && ˥A˥Z˥a˥z ˥*˥% ˥$˥_  ˥0 ˥9 ˥7 U   ˋ˥ ˥ &@(& &   ## #ee eee e   e&  e:   0!. 'p#!¥ U B%) 5    B:A&F @: 4@.@("0@`@  ME\C W-L05 5  "$0 & uLuN 4 e    5 E%44 4twz(Еe P 6L5 N5  1 B55pw  e@ 4 t 4 0f&  & eV #5  r 2EN& f5( B8 Ճ%`%1 && d۰ 5  q8qm8 & q8t C `54ul4U C `5L H& && 5 r, r, ` ^ E e(" eb `vl %  & ̥ 4  p,p, pp f f  Ɋ  B    ق && ٰ 0 .   be q r,r,   Ê @eL  X 1 1 &V @ZT O   ALA4  42$"2&' 1 Ɋ 8 4 & ؀ 5 4 uwJ   m@ w  C A @   f A #  &  m 5 f eC    55              wj50- "0- $0-&U?0B%7CBe&ҔҔҔҒr`b  # A  @ B@ f p P eC P   uNJ!F A B C  0f @`@ C  @ C B B V A f@   e@ C u&5( ,wA W !  @  4 f %6 5 4$ 4" 4&0- "0- $0-&5@uw4 wL@4 w Z 55!w @31  4 UB8 (_3% C7 B" 27  `   Vw<@3 44 4  8   m5 4 w4 4 47eC<7*6 W9W^w0 ` C` ::  2 7  )u`:NCA" &&   5w   wE5 .5 <A f "b <.w  . < 8 23 u kw 1 ; for RSTS, something is open mode 1 sy.ini::.blkw 1 ; for KERMIT.INI stuff handch::.blkw 1 ; for ibm systems ? duplex::.blkw 1 ; if eq, full (default), els UKERMIT.B[001011]K11NRS.TSK;1YcIP#9i(u*vv>,)?%CFnUj{*ƃnɃ@2Gc OBǒFkk֑r]7*CeO!(xrZ[ \u(yDunфkIx ;//g%?EX&: ip^r#yVEĎvVE s@)g3NĴ#3y{GOqNbwv&`ksш#a˫bP 7a &ܸ6lI۰1M!wJx|rcnܘ|Ϫ4I_pOn: \-W̵shhJ|$2mޗC*>UoF(/ӼEKc' XLA IYCV[~Y9\)Dbpն/mKE.|yWz5%*”W$ܻ/{Ƀ9MRKlӎ/*{1ٞ,Sͳh]A$NUE^ޥYD@R_eVk{'g)_ZQMqv8U~Z;zVvD1iȏuo n"5C*97 V\8^I6tBwb],zNڔKry>G?y Sht LkWm.`ĕd"u0H9n$ahr㳑ۃcd"V͎4P ;n9nHگ“Xu*1]mY?_k+wN(wF S<2~uwGJqąd{sltKMG4!Ydٲ̲bn*o:L9ӌ!'}sk?ÃG[tdMvfef2B<+x7`$uv6V2[#.̴ã6t;]QkH\̷VCAvX(dt %|$΀W ޼N4i*7\bX7hVN *:'"aۣ A9@s69R>Ѯ/>y"9J 7:ɸLh"$N.%9Y$ii#t0;UOqv hfN ;VnydjL,L{+\5Ꭽ#=Pd8eKDԁ#I|&j҅]p(za9LHÌK._ԍF0iI_;2*6tIpE*rׄ3e*K UowX:](㘘Ih (CVPe](G4 ޠus }"!ddeg 轣/& g#3ɮSN8rLJ$č|=Ə$}Kα ^,>>-Uf`C #--GN cVY?6H!&= kt9MA2!2D1R$l@Cy7r,\c T7;WZsgNPfFPвB1LTNU$[ZTRRl%iްSa8hc<[oQY 8W^S/:hɝǡ6HM|ИJ֤]4z`e_iɲn7k_Op_?=ƏeAcs>}$aRJ-yx0ȣ-&EoF@۠iFx+#_,򷆈Յ yXV? +€N*1,  W<\gc$'K~RV4>QZOQ3+XJ u!Z֌] k t<,h"ŔojQ&Pb?Nlꚠ7Xl.z"g!(0BF0~1, ls ^$6Sf.{m ʸ_yZSQ< e#Q8ˊt1Fg(Ec]lf YhE2fL4UDViQjʩ9B*oYƵUov]@m{ `-f7*7gX-'ɤyv@um]'=H{ fuKHpixoy$Zí!4s+EWOۏLv,'.?!HMgHJVw0De]iÀ"Nz]"]XD/!E%AMtRKlrRz2Ԅb:߻ ,L#GNx>=.":bqAB]ZB/~LҖQȓ*PYzZӌ/Wŏ kD" ᡰZ X{Xa`zpg˱| ̴U8a <h(d)ɵ㜹U+{W uwPD.]y'!67E-xZٍB?8S 3Dp[j]4D? GQw ikmJlx,(_g|wM:ݔd߾$6(P;sȔw:ҟ%,ln0D3/k Fy[r(k8ek͌ՔExY=ǠW] -ﲺ疯Zg4g\RG. +xf 01㎏چH< F^w+ s^OqI@b ˵~GOj : ܵb2?{upѦ3I>hwrpW }奇py]JC1}((dsV8+'Kng-rOxX 3v+SGiz3M& ,E4UiYZ-oh:s~BDh14 qeGr?GZzEN]'dCx4iZ3Cb6`Q }%bmIuyJ ^~I z)z.Ajk+[[-(0@7mu]L" 1>4Ho >ZYN .Bh , OF{B |KERMIT.B[001011]K11NRS.TSK;1piu<u<76 E  \ 8& t:tm<5 5 5 l555 5 5 5 &5 (<5@  3(A@ 33u   J`. <3 u-<Q.u < <5.3 e t @4@84 wC4#3 ` f ꆖ @4 76 `Х^  7 8ww H B3. 6fw]V!' 5 5 ͥIu @ A B&VP 853'3 & & &&Ef&5   EH55JwE@ 3U@3  4 4 4EP  w,Be2   4   e@ 4 t 4 0f&  & eV #5  r 2EN& 5( B8 ߃%`%1 && d 5  q8qm8 & q8t C `54ul4 t, t,  :   01 `Cm: > 4 C:Cm@ 4w4 4  Bl2 B-@ v 6цBm :A7=60B`@@ e0b e0I@7C:C0B" &  pŠ5wF %B>C< T :7   6 w76 EB r C2776   P < D OE& 5 0 "0 $0&s-<s<5@u7BB:   m@m:55 5 5 555 5 5 5 &5 (u 4B C4C#   ꆖ `` e @ w2 "r $ &  J @u>u<5256758*A-<?A-<9¥e¥  )`e¥ B< Bm>   u:Am<p u@ 75 :  Zrq8 2 B"    2775 :B< Bm> <2 <C> > <נ+נ$ נ1ѕ נ0 :B>f<C4C#   2 . j555 5 5 5@u : u 4 .ѐ :ʋ  :: :C .  4  S(DwG0-"0-$0-& 44 4 ! efff@e wZ  EwU C `5L H& && 5 r, r, ` ^ E e(" eb `vl %  & ̥ 4  p,p, pp f f  Ɋ  B    ݂ && ݰ 0 .  l 6e q r,r,   Ê @eL  , 1 1 &V & & &4 4 4 1- 1-  B  W7  u-.8 ) m :I@0. 7 C:C0B"B : B>C< ,55  5 5 5&C4C#.  f   u-.8W7w 5.5-@*[001011]K11I31.TSK;1+./ 0D6j27uʺ1 4 Us(0~KERMIT.B[001011]K11NRS.TSK;1 pp7 !vw 4 wN B$  @wA  ( f  )e l*t5 5 5  444  4 w߃ w ( w   w t?  l@ 4( AN &f  6 t%wߎ t     P "  l@ @ w  l@       Ü( wx  C A @   f A #  &  m 5 f eC Е Pe 6 eLPuw wE  u@!p@  &  >& xB  ʥ . B B <@   )@ *e ,  5 w @   t %` v . f , A85 8A:5 :   .  u8   5E- 5f@6   N2   G2 6   59 2 , & \ @ <. 6 6 Q66 6 6 v `A-<u< "A< lu:  .5>vm>  @   w. 66 6 J \6B  '5 >5@ B T5 > @5@r> r@ /0$p0"r %@@ "* (A:@>  UUU3@̥ q"q $e$q "f&   $5 f   e v ," ,$    ," ,$ p $p"$"    J&V @5 N&] 0N  m  4  LuLuNw̥ &$ &"& & & ,.6.  .( .66  5 5-6@eL 555 VL <$p"r lU 4  e4    @ L t5 N  5 2 &w4 4 4 e t wH& & B 5 ͥ9ͥIeA @ A BW-25@  4t5 u 5&u( PwD,,(C@,   *tu 6e@ C 2 r 4 &f %wB, _t @mW-2 5 ȵȵ-55 ȵȵ et w@ȵ ȵP  V4 U@LuLuNfLV L5 NE@4 4 5 5 5 5 &5 ( L`L Xw w @m 0u.0 )A"` 5@ =u>C5   CR_)#rNF7NH69AD[C9G[hyDC!\>Wb;Cmw8ETE;VHSS/v\$} l~BB5/ê *5CEyq 4   4 4 e t L@uLuNw4 4 5 5 5 5 &5 (4  H&]]Z0N S ZN ZmѕW0Q<Q=0 )CmѐѐCB"` B>C<  4 5 5 5 | LuLuNwL5 5 5 AAe@e@ BB& )`e %3@%.eRJ$     B( & j hߦ9 eLuw    Ȋet """$""0h ,  && ߰w\4  `Ete  E 4 bAe:uAH `@ e K(@AɥIBu u IEU Pul u ul K  wJ BB0A5E W݂C˥w < r͇H& Ȝ `Ȝ Ȝ  Bʥ ppN0ȋ е%8М 4 "H "H!&*N0#&ee& e U E"% J# w N`vcQ`dH#H -%#҇wN j e$ Im a Im C˥DœAFH Š ef%ef  e Js AR4rrr R  R ֜ 0f t=p t& C˥we045   =0΋K s (E&ŀ&f& fS  y e e4Q4 6dJ d΋H<!b 8=$" P`H ` 3X 8 V> .0(0 0 A<pp w`& AFN   &54(AF fڈeLw   r > Ȋ 6+wNwhw @ 55wv  &4 wu>@ @ h0 Ap `  Z u<U R84  2 (5 :  58 %UBB@ E<u> B@ - "` R†wZ@- 9 95 w&5 pU t@99A@B:` ʵ R5 <e& &2õE`e `& N e !& & Eebb4v_?f5}23DU.pO:8V/H!.qeJCxg TP nUzq 76 mL#xD*&$nSdEݐ0&k{Z&[$w>3;nOe 8ZBzL"6s Wly#8=f!RTP3-3dp1  Wbr``*'bb$l;9~W}JU }8KERMIT.B[001011]K11NRS.TSK;1~~ ֵ$ u .u0  : wt 4 t%P H e%<4    ".fLV @ A B4tE@P 4   &  .5 <fLV f@&  E `9J@m:ȵPD& & EeeҔ ȵ    &74  v&  - @eL.4  0 .e&& @  fLV @4 ` .@0 5 354444w +@w &4Hwl wVwL5545 5 5 %@ % ^w 5@4  nW-`  jP4 w8Bm:@@4 Ee4 e @EC% >@t<@  ` 't< 4  t t  t. t0 t24445 5 55B>  55 59P . 5@=  (4    A@ uwb  444A 4 v5 3mu4wL95-! A@B C4@ `Հ ˕ 㕙wt-4nk1- 1- 5 <5>5 : j#4     %` C@ D  " wC@5 <u3<u4>9#B:`  ifEeֵB`e&  9T4  HC@  N hA%`%P884  , $"5 :  # 585 <u3<u4>U 6B@ - "` nȆw5 <p-2A@B:`9' )9 v@  h5 <9B:`ʵw"w( d7b9 6 t-< <@ <B6< ! < H4 f< <>4 t%P%T ~: 585 <u3<u4>U "`8  6 297z<4 %u .u0fL L .0 fLV Ee& &   t A@B:c2õE`e `& N eH& & Ee ֵ$ & &2LwF8W8  `     Xwt 4  Lde@  LV85N`v ,,f -68C .024 r`r   "`&& p fLfN X .&& t  64 &V , ,%,,  "2 2  2 2 w Q  w   vt + f 1 @ 5@@ @5@ @ f1N1Ewn& & $ . & .  ewP 6" *(% $"e$s "3 &wb "` && ` "`   2& "B  p p- 5! @0 @A  585 : JB@ - "`*KERMIT.B[001011]K11NRS.TSK;1 ֆ-P9!.p0 && 4  X#`  V 9 Am:CE`e& J@Du>u<*A-<[A-<U   ¥A-<@p-<< 9   $9&  595 44 4 4 4 44 5 4 w  t  %wV ,wD  4  09t `wwf65 6 % 6 , p  2w5@4@@ D/p-<* 9$:w ,w6 wz/, wh5@5 5 55 @ .55hwuLuN5 5 5 4 RA4  N  X t@4wu:69A 9=A@C:`˵1. A@ ! 0 Z%`&4  t݇ 9 w u4t@m:e &@@u-,  95 4w6 & , w&  uLuNw 5 , 595!wpwf65 6, wR5@4u<u>`f @f 5 Lp-<* : 9$w ,Bw0 "w), w5@ @  uLuN A4 t 4 5 4 4  @wfE5,5-u,u:69? 9;A@. A@  !  %`&4  t .ww9f 2lfu<u>A4  %p-,p-< >p-< V 92A@L%% @@ Nt4u:.Lw 54u.:@m:e 6 { |V (| 4|֣ 4| 4|0 4|5,6wn6wf,w.wPf,5- & w,, x@0A.W8,@4A2 wt 6f,5- >,w`4   < t G8`w>,p.p0 p2p4 ,`BmC:m @e  m e,,L5-W-LfLfN 4  d  n4 5 6,&# ,  tt ,t4t2t0t. 4 u6  ,  wH w8䴕.Bm:ea D,4  u6 p Xw4 L5-efLV B@ ѕeQ- ,ѕѕ Ce QQCB x Z| R| J| B|T :| 4 6 EW6 @eAWe6@@5 v 66 6 6 6 6 66`C:`!$ 9 9˵eE `:ev:66l ˵˵˵mm m e@m:@f A mf>>m > >v`˵r˵@oe@@@%!labove copyright notice. This software or any ; other copies thereof may not be provided or other- ; wise made available to any other person. No title ; to and ownershi &KERMIT.B[001011]K11NRS.TSK;1>mv` .ނr19  CCeeu,B`` ѕQ,5,6 r :5:B:m e e e m mw 9- Am:ewB,Am:u- CC eeweeB` ` p0v6, w !!  9B@ 0 Fwm0 m  m A:`ѕeQ- e  QQBC  9mm mv 8$,% me m 8,v 8 ,8, 9,  ,8,    tF x6Ce # ,7lѕ ѕ,2Ba.Ba ߂r,,eѕeeCm: ,,` E m ev`e 5e.Ba ރ$ ށBm` ނ ep0%Abe nހe BmC: Dް 66`wB@ e   W8,W8   33 s.s0 eW8 ,B:m` e xwW8=,92Bal-&ѕѕQQCB p0,0,1 m), 0,`.Ba- B:m ܀p0Llev eE¥ @@`  &4 ,}`   |2"`. &B 1 Jt5 : 4 9    4 ^9lA:`eCe2 - -,8 5 B   U,4 e  4 5,E,LLu<u>fLV  6 4 6 6 A@5CC A Ev L66 6l 6 v66 6 6 u-:65,:9 95:u:6v6!, t  !! 9 A@ , RAm6u-:6  , f6,N &0  0%,, B:m ,, , 5,">w 5 6ww 8 r6B@ @0A. P'tF 6  w>   &  56,D:lBm: $ ʵEe`eA@C EA m  Bm: p.p0 u6  e"&&,A65 6 4 4 &V &:66`e  2 B:`  |u-:6&@@ mm  ɵCeeC` 6 v: mt version number printed at ; program startup, ; then: ; GBLPAT=K11PAK:DO$VER:0 ; ; ; If you want kermit to NOT exit at end of file from the invocation ; as in: ker .KERMIT.B[001011]K11NRS.TSK;1clBm0 a z߇u-:6 mm`BmC:- u-:6ѕќ&@@ѕѕќm Va އtF 6 n   33 ,B:m`6 v: p: Jހp0 ,1e B:`C:p: e&@@ʵ, ݀p0 ,u-6: Am: :Am6 A65 6   ,L6wD,wBw,E8 @@8A6 w t ~6  B    33 p6p8 w4  YC@    tt  0wTE8 (1 h@8A6 &t 6E nTw564  d5 6e&V B@  <  ,#ѐ   ` , "C@ E ,,-B mf m C:  Tp0ѐeBe. 2,,ѐeBe2  B@ Ev .Ba ,` m62Ba ,,` m6 Bm:e6,m  C@5œ   6,  C:B`ll0  H ,A:B,B mm ,, ,B mm B mm @,, ,Հ,v C:B:`@,,  mm e0 F߂r,?@,; s: , mm, , mm``0 8 *wr@,9,5 `, mm, , mmC:`0 h  w A:`e, > p0e B mm  p0lBm0 e @,,  Al R p0mmlB`0   `A m u6.u8056 , B@   p6p8 ee ѐ ܂ C@Ü El Be. ѐ z܃ m f܀p04 &  w,  r6 r8 AF  h"`&& Nܰ4 fLfN bNL5 6C@s6s8  5 64 fLfN  ݵNL, ݇ A@A 85 : "` b9pL5 N Pw,  .&&A6 D5 6 4 &V stance, the DCL system command .s 1 ##$ ASS/SYS DB1:[200,210] SRC$DIR .s 1 would associate both the device DB1: and directory [200,210] with SRC$DIR:. Explicitly given ;KERMIT.B[001011]K11NRS.TSK;1M n&  zwd5 A@,   K  C.`,U@ ”Ee >& & Д 1  #.504  R@0A.B> V@m: 554   4w5 0 ; : .984   5 : 58U BB@ "`B@-   jw p-x9#W-00A@  V x9 @Q0 tA@B6`eõE`e& N e @,A6`B:` tpf:` 6 d w B6J2ҵ   .0 4 fNfL P%fLV Ee& &   t 5 5 5 ,25 4\wf@&  E `9J@m:ȵPD& & EeeҔ ȵ    &74  v&  D- @eL.4  0 .e&& ߰@  fLV C@f44 4  wt& 24w@C@5-DwC@E8- Cu6.u80wC@E8- +C@  L"u.6u08wpC@Ef885- <8- wrC@œ @8A6 b & xp- C@W-  u62u84 p6p8 1 0 e.Ba C@œ Š%EfÜ Êp5ŀɕ C@œ @0A. \ &C@ 0  p.p0  Ar.Tr0V A@q r2 r4   V ` C@s2s454fLfN ݵNL  އ&& ܰt 4  u@.2&  5 . p-< * 9 r A4 1-1- 5 4 J N Du 45 4 A6`B:` p 5 =7 3 -:p-:& .B6`Ee & &   t u6:u6.0 xC.`eE<<=>A@q-<G 9A A mf >>5 <5 <4 u4 5 4  C45 4  t ߇  ߱5 4\ lB  u>u<¥*A-<' A-<!   ¥A-< p-< 4 wN  5E5 ettCtt@@f f &f &ff fC~w  ~@NAJBEFRAMRPAYAMNUJLUJGUAPESTCOVONCEDm<<&f&.A BqeL5 L e  ~eW,%W,wW,wW,wW,wW,wNW,wwDȕ0p &  ~NF Cr e00ߕ × r et r0 ; /40/ 20$: calls inqdtr ,<#ttname> ; /40/ see if dtr or cd is up tst r0 ; /40/ if < 0 , then not supported bmi 40$ ; /40/ no good bgt 30$ ; /40/ Dtr's KERMIT.B[001011]K11NRS.TSK;1Z00 ȕ0 0 0 p  ew ȕ0p t wt?C e  C .3.X3X3 Hȕpp 0 0 $ p  w  ~w ȕp0 0 0 p  w ȕp0p p0 p z wx"vC lȕpp p , Rw*% 6bC 6 ȕ pp 0 0 p  w Lwק 'wק  LNwxקLwfקLwTק קLw:W,ߥ$Nw ߥg$5Nw $g$weeL2 %2& '       L5N5LUL"f&f&6 ff I % % % %   Be !!!`  u 5 %  Ce |  ` %%# #$)fC  Ae@ Ct% . fU U U M U B eU M eU U M  D0% %D0% a ae>J%NS(5 *w&mYwL{ " . {"{^{`.D̥  h5uu <#A0< 5 E |# *A( w D j!55 8 8"4 p  0 4 5   N" ; B  ,B D!5 4e ! D5e`w eE< .f .2  , ,p l J a b!&f whKB`C E e@` e@`2L $ v)     > ̋ e@`eleXBb& " w@ e" ``Je $   eb@`e"leBb& e@w.B f e @  2Հ$ \ʕT2 w.B f e @ 2Հʕ$ ʕ T2 @wZ.A1@ & P 2 T1 wD)v& 0 cfp   > e$ ( wB E ] D! 1 0 0&   1  0 5 L& LAa  51 e!    51 0 0e \ <a  |$  spppp0)p1(e   K / 5 L   L * a  !  5NUpN>!  T H  $ `0 eB E`1e f Ie$W@ W1 @1t  e$W @0 `W"wd)v e"fe4 `e `K  2  0 5 L l  wn T 6-    -w  >   5N5OUNT  5 N5OU N> ! 5!N5OU0N$ " A ̵W ̵ W ̵  @N   Lew\.AB Te and with the inclusion of ; the above copyright notice. This software or any ; other copies thereof may not be provided or other- ; wise made available to any othe KERMIT.B[001011]K11NRS.TSK;1 ɕɕ ɕ (ɕ w )v0 0 5 L5 N5 5  0 4Na:Nae a> 2 7@E (   &   @E ,  &    tmE& e w,0 5 L5 N  5CeLeH 6`5v q  eL @`edl N CeL5&     p&   & + @E ,e `E e @`el N & n% f w N We a> ,0   =e  @` WtmN&E& e &     L0  @E ,@E 0$ Xe wf 0 0 LDa 5 N5 5 4Ca`erm  t`&E& "e      u   h0 0 em  v J eR ` Wt`N&E& te *  (1 10        E 55 0,   $ t@E < E  T%w)@ W"vl cm̒ %W"lv mc̒  W"l0W"pl)W"Dv ma 1 W" Dv ma 1 %wB r&     =`-   d/@ ! L @ L  @ @2   @ L fA-q&@ e  @6 @ w.5 L5 Nef0   C dLW W   W  W W W   W  >%wB .e@A@s33 `` e ! ! H . !!!!!> 3  $        ! "3    .    1 0  (   2 \ ((  ) 8  v4()      * .3256 5      EA) (0<$H'1PH H?1[ H$H?1@ H0@`H $ ` B 0  $H0H Dz $2     (LdRbeq 110$ ; yes, say no errors cmp r0 ,#er$fnf ; same goes for file not found bne 120$ ; exit 110$: clr r0 ; no errors 120$: unsave ; pop these and e KERMIT.B[001011]K11NRS.TSK;18Gs浔WV@`< &++^ex3HMceFsAi 2g+4U "@>I"6:,7\GbT0B:4 >V!_E OTݎ<8&tE鯰b= LҀW)4EٺN6k)~#碿8x:`v&} sW:Z!,N / 2f0r+@X2P\nR7LOٍnK(`a_)؉- sUi-t> 8޺RxeXZ&A9hqW+lo.k(vOȸР{ ;&d/8Rhކ%L 8lP˘lnrc+ dJ3ǹIuTbH?$`gMUyDeGUrVn JISzp[Ƃi'7M5zinǁl9ޣ|m>kIqFp?^ban .gPd[h!&G(w^)^B pd{5Pˑ48]S{ۯǿh޴16n~NQ77# ڙ &@ct)N(0oԝݐ%Nr4Jb tÝط "#Kxsj#=e?x ];Pז94 W✗ a*`8o3l!oiO se.l+ogf :HOZ*PYS_Qz:/B! 0BJ I %Am E,\Iš -٦e/BXzf[,y c-;1,V#Gj_ɁŒ.Y+LJOR ]7uu|6!tUs><2pgF#j-%lb]u?1nൗ xqE#o$*@<-CauAB4)V`27 LpU$t(Q ?&"u`ly*@(o|kWxaP1H SB{_ OhkEΛa5m*Neg_C̪Hqeu-Ω>NBSw92x\֍9 Oʢ dwS f0(:|32߶7Mc'V q$8ytdzU).4h:iwP$u0$e@8Lbhiߒ t`.wec$8kǀxn5[}曭i!AP0j~It|zY ЄpP^Ʃu "SVh{6^9 }.N{6ۉDχh ~X\$!$UlDp?dPCDY{6Q<۸-80!L".8l|:uaRDi=\jGu{gEljn|vk2Ƅq"2XA/EDw;lV4 [u* ;wH=xG:̃710XZњ]oxGi=ڻ{+|Y3k#d3FR=5U>:-"ߗЂK޶=Ho&qUraqu1h9[0_$Z>|\ #a= t|@Zr~7Cle^2L'Tv70ڐ32h }diNC.\mv2k ud9{2 B Ѭ Tf$DB]$뀷=Eɬs_~ (f` s] a8ǚl:Oz4d_;xe`hhk)FUMDI[*6nM'}-- E_I Oc.YP00:~P.GkBq11/.2SU L8MKSgv B }KERMIT.B[001011]K11NRS.TSK;1         0L| (L|V L|" L| L| L|T L| L|Ȭ L|Z L| L|0 X| X|" X|@ X| X| X|f X|l X|> ܐ}Vw  ~ %,ߕ faAl* 0 W* p  *:8@hfdb`^\Z`&"$d&&ff    $  S~e ~ p%~ߥ D Ћ . we w tEPߕ w& " Ҕ E~$ w~@ BB %  JLf \ B @ Հ @0 1  0 w@ f  B @ Հ @0 1  f@ @f 1  w @ e`e.l6 6 6 Uv @ e`el -w-  6 6 ̵96   a e6 Naa a e !-tm&E& $e f X%    `e etce5 wew& l t B tm&E& e N C    m   m6 / mtm&E& ,t Ѐm   ee Հ m e-> :   @mCm B !  mm  ~  C B`m  ew @ a ` afNla F   a x6  B t v  W e  a >ewCe" t 'e`&  eL` @tmfE& \e t @  w@    ɵ   wh f&c& &a N@`": @`"" C`D$ @ @`"6x$ $ @`:  @`:@` @ >m( 6  m666ma me  @`  ȋ @`"96B  ` `>  `"  UB @`"  ` B   66  E(>& &&(ewC6o N`N` )m # m6a Ne m a .  >e wׁ ɕ [@ N`e ,N` ]  ewz Ct EtE PtE P & @t6Em 5EUme #%f & 6 fE@E U5@5 a newrB e@`elf    % f5 La T "a V"6  6 a Ha  @6av e a efA sho$dp sho$dp: tst (sp)+ ; Show DIAL is a special case jmp xxsdia ; where we load an adjacent overlay global .sbttl routines for the show command KERMIT.B[001011]K11NRS.TSK;1(2   fAa ae a  e6v aa * ea ewABa a  @6           &        U v6 6    W      vvW    ve W   ve& a  a  5 a  a Za J5a a a e5v e  a 5=6  @ Bt @ e`6R W a aa a :a lea X KefA ~ N  a Neae a  66aa  ea eff@ @)@m&fe  N %w* @  W-  fL w6 6 aa @+ '@"6  a C) a  6v)6a vva v4 2@@m       aa ewBAe4C`em&6-$-  epm e f t E-N f - 4 tme` e`3  e%w@ ɵ C`v6'D`N`ɵ Ӄo  Cm l6ɵ lv6 @ a& a& N @' e(ebee eb e eHa& a& N a "ew & 6    r@ rd   Wt@ r Wpd@ r    tWt Wpd@Wp @` me0H %w@f(((@@^&_  Baʕ W 36e Bm W ?  v` E  B`": W ~v6a W sB`:3 n@`TB` e6 6    mW XW UW:HW"Fm6 -:!6 am6-E U@ @`-Y3 nV-"6 mm e 8mJ  am B҂-%m Bae -wW    ":E U@  eWtEErPew˦)@7C5 LR@ E  C6 ` 5 L L -*(D@ E6   L 5 L ~ L %   $w߃5’6t @ vtB@A  6t@@P5 wDfBe6    t  @LE  `  eF`Etm e`Je`r % f@ I,f 1  @`  A1 Հ @0 @0 wV6 6 @6 &` e@`elf& & & &`E5  6e eP@`eflv6eE! 64~SGxpFm"I)/a P,&CN9 [`|m~4nXL4^pPYWb5:yV.V$63H=#  aT$Zֱ^jS4 ,$V(J.5{~S>,'f] U w*Z 3 7DF%+5P%(5"y Kqpp,ne d*WyW_1=!s \ZY;8}/  }KERMIT.B[001011]K11NRS.TSK;16! 66   v- 6 w(5  6 6  ;  6   fla(aa &""a @,*,,e,e w@ 5=t"a@` ҁ-&E& e ~E&E& e U& D EU& 2 %\ ,tc&E& 6 t*a@`E& v6"]"eE EU E   ̵EU6  & %UE    a6 e etm6 e 5  w5  -Le&w u >  `5 @t> 6 m @tm&fE"m Et&E e !cȋ e   oet6 /a mm  Q < 20- v`@a> v  v`@a> J  b`      C`m > ewV @ `> `> 6``@b  ` a`a e6 6t  D A   Db>    Db6   Db>    Db6  5 EUE - ew8 A  o6e I @ a o " ! `6a e ma  me wp A@&? < 9e N`tEa   (L tEB`mCmʜ D @&eWtEaH>   w >  e@  a,  C` e eb & ea6  m]   e eb  f e @6      e w @&*  t`&&E& @e 1 66ee 66 E66P t P !@t E@tE P@tE P%f   f  Ee wf@mBm W    Dee@mCm D  e e & ^  TLef   f  (Ee fA ^  wAC 6 6  eJ`ebmE5 L       q& %  - 1  l   v e vE a & 0e  q L5 L5LEvUa z W-LW-L ef@6 veL a >,xa @E  Aa af a 2 a 8ea $>,[@E &Aa af a  a ea >,"afeN a ` a feew*@ a <@   `ɋ  ea e wC &65 W-  pL w66E- 66- 66 @@6  a V  afe&a a 5 (aB" a  v@-I` ?1!L>[S >xF4;#?Qq~l=0O4$&%oS>;XWQq)j@ o^%t 4d?+d+<<\56]n?^wu)5CO b1+Z_b KWbasXV5>_>k0:Oy y*EtzU.3d`AD KERMIT.B[001011]K11NRS.TSK;1+@l6Aa@a-  gL 65 Nv5 @b   a @ua $ew@ ɵ  Bov6ɵ `5v5plv65  5v6 @ aa& N P3 eeb eeeRe"eF e8eeaa& N a e*5 N`v6 Cbv6   a ewl & 6   Bm0  e76% -`60   t Wt@` @`  Wpd p ` `L%w @:CD E!!  W-  P!!  >! !   ' $D@ E  W-& X H #  & B 2  w@tE5    ALW  uNh uLx @h5  uL )LAaW"g@E h@E 8@t @ e@`55  @NE  huN =LAa@E  u u uH   @  P ` p @E e`5up`P@0 p`P@0 p`XP@0 p`P@0 p`P@0 p`P@0 p`P@0 0(XddPh@@@( xX @HdL  $,4<w1Է̷Թй7 Թ7 ̹7 ʹ7 mlw fmָ` t׭1׭g1S  | 7 t  @v& l ({ w^1B:& H N Ff ~  tf dE PkeA  n &  X5X( ѝѕ ff& lee( f&  ܌efp ƌe 8 l B->2A xK f<f  e + )ffA 8jeffе Rm%BCAe& N y f s wDAwDfе w A ? jhw  TR7 D@  r@4H "-A w)fB Bieffе \l%BCAe& N x Afе w A ?  ~|7 nj  r@^C&f&f7 @7 @I S  1 -A v<f  fn %ff geffе k%BCAe*& N Hw 0hfAlWI fе u AWI-<4  r@(7 F fе % #7 ִҴ  r@ƴ pF07  xp@ -~rA :uwl x f Fy 7 b\V} tfKERMIT.B[001011]K11NRS.TSK;1  y% &f  we f>p& %f>p seAl >f %f& %"V f&\N re  f&&nF ee7Uf dJX eeffе h%BCAe<& N t Be@Afе Ns A ? Ҳв  7   r@H f n wD pp-fZA "s)f^ND deffе g%BCAef& N s l׭MD=x .fx&E deAf dN ce -ʯ^ ¯ f p%zfе q 7 ? R 7 B@e7 $  r@ * * *2Zஇf dаE ce7 A׭lX׭dZZm*w $f l wZD f-bVA q< TfDZ bef d$Z `beffе ze%BCAe& N q 7 ܭAԯfе (p  ?   7   r@~f Tt 7 p-  h pp FBABCDFSZH@&,4DL} 6} .} &}V } } }d } } }7 BwB7 ^0,17 7 mʸw m t7   8 Xu  @& ڹ { 1&  f ~ 7 t w w| wp  f&NE kef( ѝ$ѕ 5 ff& ހe ff& Te ƍ ܸ   e(& - ryAff n%BCAe& N >z f d^N jeNf x Af j % f j fY >je7 ䷦ස  r@Է sF& 0 - XxA  Xff l%BCAe$& N y .f d8N tie(  xAf dY @ieCf Hw A Ҷ-ζ wAe? r@ f  fY he7 z~ xwA h-dV "wATe? r@ f dY the7 $ vA  wA Vf t%1f % f@ uef % 0 f fz 7 f djY geRR7 LH  r@<Df>p& B%f&>pQ teA Af dY ge7 7 Դشd 7   r@D&7 ֱ -t @uAff i%BCAeh& N v *[001011]K11SEN.MAC;1+.-/ 0D6QcR7@eQ 4J--v U |s(0 .even at KERMIT.B[001011]K11NRS.TSK;1X r FI 8F D& f& }e 1f \sefڳY fe³  r@7 DjV f& ~% fr& vve7U /f>p& j% F>p |f>p&.E jeef&>p reAf& <%f& FreԲ Ȳ- - zsAe? r@ f dY de7 x| vsA`w f rp% f>p& ^%f>p qef @ :+ :&2fY ,de1fбY de!f dE ce7 #f dY cett7 nj  r@^DA H-D6 rA4e? r@ f dY Tce7  qAf Nq A-ڰ qA ΰ  f u  7 f dY be7 |  r@pF7 r - f&BE ~beAf dN Zbe + - pAe? r@ f dY be7 Af   #f dY aerr7 lh  r@\XARFDCA@ضControl C abort on file receiveRecsw - state is SETηSZFBEXTи>(ии was renamed to RMS $PARSE failed ADEFZXTܻ"Ⱦ8ȾLocal KERMIT error: ZXCreate failed - Created file - File exists, not superceded - Expecting ACK, packet type not valid in current RDATA stateAttribute packet error - } }0 } } 趜} ග}d ض} ж}2 n f&z 잖% pf&^ 0e  6 >L 6 6P (l p "N  & nn 7 t Ҩx X| f& > ҋe f ^% & Hf  fd V% 8n& >f 2 Ҵ  D " 7 f { 7 & > f贅 ye ʴ& 7 & f> den» ƻ   mЕ |@" r  df& & `% L D2 $Pff D f& f @e6 eP: еf& % <f& & e> ʦ f Xxe B f& |%  ff& eB n  & $ f y f> T%& SETInvalid value for SET Unknown/invalid Set command CON DIRCurrent default is TAKEPrevious TAKE file closed SY:*.CMDSYSThe SYSTEMute paks ; with creation date/time. ; 53 13-Aug-86 09:38:04 K11PAK.MAC Add SET SEN [NO]XON so one can force ; K11ST1.MAC every packet sent to be prefixed with *[001011]K11FIL.DOC;1+_KERMIT.B[001011]K11NRS.TSK;1kT command requires a command to execute Error from spawning command ,.0ŀ SPA TYP |L |t |x ޼T} ּ} μ}^ Ƽ}̢̘̬̳͹̿<&  L#$P(*V/0\@B\RTYZ_`cdhjmnrtdz|jЀЉБЙТfѱ4$,!"'(b1H~STb]t~ҊҘҡҩү<ӷ<PZFn&x2HPfdnxӂӤ26<>CDJALLCONSOLECONNECTFILEHELPNONEOFFONPACKETRAWRPACKSTATETERMINALNOTERMINALEVENODDMARKSPACENONENONEXONXOFFCARRIAGE-RETURNCARRIAGE_RETURNFULLHALFONOFFONOFFNODTEDTECHARIOLINEIOTC.DLUCONNECTFLOW_CONTROLNOFLOW_CONTROLNOVOLUME_VERIFYVOLUME_VERIFYCREATE_SIZEBREAKWILDCARDINGNOWILDCARDINGOFFONNONETIME_OUTServer_Idle timeout? NOTIME_OUTTIME-OUTServer_Idle timeout? NOTIME-OUTDEDICATEDNODEDICATEDDETACHNOEXITEXITWAKEUPString: WAKE_STRINGString: PROMPTString: INITIATEString: FORMATString: SUCCESSConnect acknowledge: INFORMATIONRinging acknowledge: FAILUREFailure acknowledge: CONFIRMString: WAKE_RATEDelay in milliseconds: DIAL_RATEDelay in milliseconds: DIAL_PAUSEPause character(s): TIMEOUTTimeout in seconds: TIME_OUTTimeout in seconds: NUMBERName and phonenumber: PULSETONEBLIND n n fn ~  " Ԗ& fn v 7 tfn 8~ Zfn Vu & nn .@ xj p  |Vn Zf& n ryefn |  | *  f& & %fn f{     fn {    f J   @ffn {e  & : h$ ` ~( JH Bft6 % f&t e  t 5N L v E?,5&f bh E ̠z  E?  U?ܡ ֡ 7 Ρ pU ` U J U 4 tUz /lE   U Lf g fn ee ē 5   : U > B ~N vR n~ f ^ V N F > 6 .0 &4 8 n r     KERMIT.B[001011]K11NRS.TSK;1撇f(ܟ N% ( 7    2 6 l p ~  t l D'" fp& %  7   ff䞅 V%  n7 hf ,%  DV6  7 "47 l d7 v7 r jf m \ 7 f4 Α  w f$ %  7 ꜇fH䝅 V%  T 7 L ȋ 0W w&  <  8WD7 WA~@ `` X fL %  7 : 2 ɋ ff  wCd  ɋWO  WF7  Ώ Ə rɋWSWL7    7 7 ff ؄%  7 f  % f&  e  ~f  w   t7 ֚̚ 7 Ě  f %  7  `fp ⃖% f&X *e  8 0e` ~ t j ` V L  | r  f T  w   E m &f  l* d v ( NeEee* E  E &f 4 . T mzf  MfX♅ T% f&Xș e  L B : Zm E |eE  j& z X Vr N HɋW Error from device assignment Kermit-11 no longer running in LOCAL mode Link device: Speed not settable Speed: DTR/CD not currently present DTR/CD present Parity is set, forcing 7bit mode Bad value for speed or speed not settable Please use the SET LINE command Please use the SET LOGFILE command first Log_file closed Can't do RAW i/o disk logging with other DEBUG options set Old logfile closed and new logfile created in BINARY mode Can't do disk logging with RAW i/o logging on To enable: Connection logging SET DEBUG CONSOLE File opens/creates SET DEBUG FILE Packet traffic SET DEBUG PACKET Raw terminal i/o SET DEBUG RAW State transitions SET DEBUG STATE Connection logging can be controlled by typing your escape character followed by a R to resume or a Q to stop logging. Kermit-11 will have to request 8 Bit quoting for the transmission of binary files. If the other Kermit does not support this, information for binary files will be lost. Unknown parity SET DUPLEX HALF, SET PARITY MARK, SET HANDSHAKE XON done SET DUPLEX FULL, SET PARITY NONE, SET HANDSHAKE NONE done SET RSX TC.DLU value, where value is 0..2 ?Error - SET RSX CON [DEF][ALT] %SET-W SET RT11 CREATE_SIZE decimal_value %SET-W SET RT11 FLOW [ON][OFF] %SET-W SET RT11 BREAK [SHORT][LONG] %SET-W Unknown option in SET DIAL Insufficient space to contain string Insufficient space to contain string No space left for numbers Ɲ} ; Copyright (C) 1986 Change Software, Inc .include /IN:K11MAC.MAC/ .library /LB:[1,1]RMSMAC.MLB/ .mcall $compare,$fetch ,$parse ,$search,$set ,$store .m *[001011]K11HEX.B2S;1+KERMIT.B[001011]K11NRS.TSK;1R'34JLcd{|˖˯((0 0"$*,24:<CDJLRT^`jlvx͙̂̊̒ ̧̭̲͡t &8FX^l|Фnt.4BRjznҚdаlи6:6 "$*,249:?@FHNPX1_CHARACTER_CHECKSUM2_CHARACTER_CHECKSUM3_CHARACTER_CRC_CCITT1-CHARACTER-CHECKSUM2-CHARACTER-CHECKSUM3-CHARACTER-CRC-CCITTONE_CHARACTER_CHECKSUMTWO_CHARACTER_CHECKSUMTHREE_CHARACTER_CRC_CCITTONE-CHARACTER-CHECKSUMTWO-CHARACTER-CHECKSUMTHREE-CHARACTER-CRC-CCITTSUPERCEDENOPROTECTNOSUPERCEDEPROTECT7_BIT7-BIT8_BIT8-BITASCIIBINARYEIGHTSEVENEIGHT_BITSEVEN_BITEIGHT-BITSEVEN-BITFIXEDIMAGEAUTONOAUTOTYPETEXTTXTDEC_MULTINATIONALNAMESNAMINGCONVERTEDFULLLITERALTRANSLATEDEND-OF-LINEEOLN char ? PACKET-SIZEPacket Length ? PACKET-LENGTHPacket Length ? PAUSEPause time ? START-OF-PACKETOctal valule of SOH ? START_OF_PACKETOctal valule of SOH ? TIMEOUTPacket timeout ? END-OF-LINEEOLN char ? PACKET-LENGTHPacket Length ? PACKET-SIZEPacket Length ? PAUSEPause time ? START-OF-PACKETOctal valule of SOH ? START_OF_PACKETOctal valule of SOH ? TIMEOUTPacket timeout ? XONNOXONSTREAMVARIABLEOFFONNONEOFFONNONEOFFONTTYVT100VT101VT102VT200VT2208-BIT7-BIT8BIT7BIT8_BIT7_BITPASSALLE?R5Lf i E4^ ֕p Ε t  ft$ %  1112#2 33 fn z  &  " jfn Dz  &  f& n $xe  蔇f^ P%  Hȋ f& (%   H  X* n f : V N  7  7 ̠ Ġ ܠ ׭֠ B F     ޓZȋ fT& :%  7 F@f@ .ӕ.   n  d \ T L Ƣ  <" 4rE fE T e@n> f\օ m% & ܒ& 7B< Ȓf& > ueX 7Bf  f 4de fޞ 6de & Un ܓ B f&  8ue      4  ʑ" ‘  & H f % f& Ve p b * wΝ  w  wwf 6   W L ~  7 rmits are set to binary mode can result in an unusable file after transfer because of the possibility of transfering imbedded record control information. .s 1 #Version gKERMIT.B[001011]K11NRS.TSK;1Ͼfd  wFwb fD ^  wf* D  w ޒ  Jv  pf , bfܜ  WW `ww7 A u XXW XX  f   @   B & F ҏ| ʏ  w r_7Y7%wRw w$wf "  W W `  ^ VfΛ Z  EW  0 (wЛf  ,W   @ wfj  W W < D Ǝh w;wWfh* %  7 BB BBf 䃖%  7L fК ƒ%  7$ 7 " 7  m f  wfh Z%  7 f> 0%  7 f %  7 fd ҂%  7 &ff&  2f& f 8peeDebug file closed Please use the SET LINE command HANKERMIT link disconnected Ascii text mode set Binary mode set DEC_Multinational mode set The other Kermit must be able to support 8 bit prefixing Without this feature, the high bit will be lost on every character sent The filetype must be of the form .xyz as in: SET BIN .SAV or SET BIN .TSK The default binary filetype list has been deleted Error from $PARSE - Directory for files set to JUNK.DATDirectory set back to none (SY:) Opened Log_file Kermit-11 supports the LONG PACKET extension. It does not support SLIDING WINDOWS %SET-W Unknown option in SET RECEIVE %SET-W Unknown option in SET SEND The SOH character must be between 1 and 36 octal Receive buffer size set to This size exceeds Kermit-11's internal buffering of bytes. It has been reset to that value This packet size exceeds the host's input buffer size of bytes. This may cause the line/port driver to loose data at rates greater than 2400 baud. The packet size must normally be in the range 20..94 MAXThe escape character must be a control character RETRY should be between 3 and 30 TIMEOUT should be between 4 and 60 П}((`J \$&029:VCDNPUV]^ijqr8xz̀ːˠͰ"̶ALLBINARY-TYPEBLOCK_CHECK_TYPEBLOCK-CHECK-TYPECONSOLEDATEDEBUGDEFAULTDELAYDIRECTORYESCAPEFILETYPEHANDSHAKELINEPACKETPARAMETERSPARITYPAUSEPHONERECORD_FORMATRECORD-FORMATRELEASE_NOTESRSXSTART-OF-PACKETSTART_OF_PACKETTIMEVERSIONDIAL LftZ ̑%   > 6 , f h P D  ~  \  : ,     X  F ؛ w "  › 7 f& n ~e  (!f& &2Ѕ ~e7<(Ȩ  h ` V$ N z  : 2 (f& n @~e  fn ր f*[001011]K11MNU.COM;1+./ 0D6\l9ˍ7ʍ 4 U<0KERMIT.B[001011]K11NRS.TSK;1eIˡ]"4luK<)Fbcʼ/^<3⊡7!jsǥ@cswuwG{O*Z | 6%S{`p6a|ϩ Oo59gTo?V3 !6Κܱ(|}L,-oyɇ40*¦?/CtƐ-: Ax!Tcy2I4F-A-ia anމSzʕX9`zr"y+;-ۛp??T[+a>1e_"w1ICXW,#\3狖k[¸4kR4@6L8%LYymY>xV/;wۆڊ:ścKۺ Is~,$5cn~[f-AU &z38rڗ J ػ:Ӑhm2AU+`o֜FTOs0rnA^mw+?qAzBzd;\vKT]z\f=Y{׺kVE 0Rf5t-ToVe5;$uR: 5': rg>W=Y2hwj*]MyD/ eH!"aґҴ@LjɁŸs]C9`n#Wq Avόbm+ 'ӓ#9Ř˭LC٫ĘMzR4%00s8[߮u[MƼA*9р Afz&"̕:4,"u)ޣZpP\GҨ RLZ{䰎V~x[~jZEW:4:UƖb_|Jx 29~C+_޶$T[JMg lўN4Tw'+$qHw1ңsX+k%dBK ,ray[8dwӈ!܊HBE:\g ßkfj]5feRdԸ*&l]Nz.D!K1:C?m_YPY(v> :QˡC,V3.eްnf#9Ut`<0qUҵFxe!m6쾈 neӼgK(Vf *?3xsSXXbY]\ ۸5,+4a ͒_<~)K8;8VѦA0*ٗMpoc*ӱ[u8uOc_$D"ɒ]yX$9:!yw jhԸ] (Τb-ϔmVق4Fvo21Q!F-g&/RKEӖ&^NPt# 0%ՅdtgxN 116dBd׺@Q#hJ0=ׄU.W+yF[vGv8Y'>`YdU7:ԅFB@W".F)DW4r;H3Sb֛j}$-hg #\%Hv|bm3C0f"X_2}i_c7E, )>y.}GXU)<6b-%K@@S?l$˅[z|h/q 9.j`T5 u⎵9o@zȳF16#nF.& ԰'!. Ew4TD%.д]B(tO'X" c9feԬȚke] >uϞζ-5[UPWy8$3ʯ'stE/7_8@>i^l\"WkPEn ߄:2?D0hY+X _m5hf" `cMX itd0N7q|TGPm`+UWg0(A8DsQ7;LuL>&nXKn<$l.{P2'LLj?]BSRGhtix9/vI&q|wS׍Hb57 l02׍ƐpuBZwBTKy:Aoj4CܗʀfO#;Tܒ)lPr!YO2Չ/Z"|f=;<#Cn.>QqWqEogz*/s<+imaJt}eš^>2 2`:Ⱦp$V:k{OOZpٔ{ʸv!v^UE{bT+=^~"%/? wVw=ղ߁JUz* j9F?lw$fͣ<*7ͱ3$L5pg](T&fHd^^JMS.Zf˓I}`> YX~ZhIJ&cY -;% @l|J{0ǻ/? bI5ӊBi[д9{tmܑ1WFyrLRP8NTy+QFxWc̆WD}Q,|$ShV$c6S3W]GTkg@a*%9&Zl!MkreNSI xf~}׈L+|mtPL@]x7> (`ֹW(6I yMecp +iH5491uQix7pA_(B^<n\%aJeF) w a15!9lUUk M^6l^KcT .IwV> ZNRQ} r|ZM04a2f%rA"b{Vz3+J@)IZ$dL C'LWMd6_c.8@`LjXN6-l#+x&jeQx(!)]AbWYpk6;S):ydi0hR KERMIT.B[001011]K11NRS.TSK;1j&f Neff }ee  f>p %f& >p }e ~f>p %f& >p }e Nf>p ނ%$ 0f& >p H}e2 f>p v%6 f& >p }eD ڙH ЙIf& > |ex |   ѕTf& f eeѕ.f& 6f ʘeff ef&f T|ef&   @|e e ׭   ׭ ܘ Ԙ l Ƙ a11 f& &҅ {e@e@fZ |ff {e `  T֦f&  : 2 *f& & "%  f& & %  f&  ܖ% ȗPf& TӅ ze  n 4o0AHѕ ~ e@UՋe2o n zJ J Е Е f& & fzee:f& Ӆ Lze o >* o .: o > P ږ 4eP  hf& & ye` @ He m@ m7r f& & %4 lB dm@ m7rF Ff& & B%\ .j &n f&  %  f& ⢅ % ޕ׭bI  ̕ ĕ  N$ $ H  L p | t l d T f& &Յ jxe  2  $  f&  %  F . : ؔ> ΔJ Ɣ N n x |   e@f& & we d \֠e@f& & lwe  6 ,jFɋ    PF ɋ ff wee~ ғ ȓ4 8 Zm < J ef&  veN zR pf& Vׅ vef& Q؅ rvef& Jم ^ve  9f e &f& f %f& م vef&  uef& م ue& v P f  e & > Vfd %& fJʋI ʋ  & 0* ԓ2"&  “f& م ,uef r f r  ff e `&  b SHOUnknown SHOW topic No debugging or logging is active Debug file is enabled disabled :UpЋRemote connection logging File opens and creations Packet logging to logfile State logging to logfile No remote line has been set Current remote link device name is The current speed for the link is baud The time is The date is Directory for send opens and receive creates: none Kermit-11 Filetype set to ASCII Filetype set to BINARY (fixed 512, no carriage control) Files will not be superceded +B1-Character-Checksum 2-Character-Checksum 3-Character-CRC-CCITT Connection escape character set to ^ SEND packet eol character (octal) SEND maximum packet size SEND/RECEIVE packet timeout RETRY maximum for packets Characters Sent: Received: Time in seconds: Type Last Sent Last Rec Tot Sent Tot Rec Total character count, less packet framing, but after data formatting (ie, includes repeat compression and prefixing) from last transaction. Physical data rate: char/second File transfer rate: char/second Pause s not know about c eof for direct access files. Will have to fix c for RT when I get the rt version done. c c c c to compile: c c f77 k11hex=k11hex c ftb c k11h ,KERMIT.B[001011]K11NRS.TSK;1time before packet transmission Delay time before sending SEND-INIT Created files will be Stream Ascii Created files will be Variable with implied CRLF Handshake character set to XON (^Q) Handshake character set to CR (^M) Handshake character set to XOFF (^S) Parity is set to ռODD EVEN MARK SPACE NONE TC.DLU is set to current system setting. PRO/350 console is set to 7 bit mode 8 bit mode Attribute packet transmission DISABLED ENABLED RECEIVE start of packet character is ^ SEND start of packet character is ^ Default binary filetype list: none * Current defined phone numbers None defined A problem was discovered with attribute packet processing in versions of Kermit-11 prior to 3.49. This implies that versions 3.49 or later of Kermit-11 will not be completely compatable with older versions. The best workaround until a copy of version 3.49 or later can be obtained is to disable attribute packet processing with the SET NOATTRIBUTE command, and manually use the SET FILE TYPE FIXED (or SET FILE BINARY) command on both Kermit-11's in order to transfer binary files (such as task images). For further information please see K11.BWR and K11INS.DOC COP blocks copied RENDELTo: XH} PH}* Hl} @}ÓDETACH`ŐHƶĈĐĈĈŌĆɮȞZȆƈɆ<Ɇ4ʆƆƆƆTSRGITNYCEIFCLDUESWMHQRKPPJVT( L7 ڪ\ftP “% , '7 Ъ  D f& Ӆ Be & Ԕfn ؁% ` f7 h , F ؝J ȝd  0 & rh  LH<7 >7 67 47 V~8h7 f1  2ff ra%BCAe7 ܩ& N m f 7  f&E ]e  f dtN ]e \f v%f n f,Y h]e g JJ f %f  fƨ֪Y ]e f7   r@fF   ƨ¨f `i%1f w 7 tk fS >  |3f x%  f>p& *%>p Bf>p&E 0\e    f h%exO& \k ‡ ʙf&|E [e f dZY [e    7 %  ff&E T[ef ~%fn L 3f dԨY [e |5Vf m    ژf&E Ze Pff  @ ff&TY ZeeP & N $f> `Ԧ pf  Ff&Y 6Zee` f&ЧY Ze & N  >ff %& @  J, && >p b>p e>p&  & J>p f>p&BY ~Ye & N  ff s ff R   J" d  <"*  d  ɋ& N f \f%@ j f   f  "f%   & P? 0 ff de . \f.&Y JXe f e% eP :ff e *(ff bee+4|IU>~>Qc a:8 KK ! KE0[#"m/0 F8_Py.>  \=EA+d/OC@* P'f*"P&ei0x{A%Y*bi _cOwZ9FK9K &1_ b7S'bc#8xm{O{f@x&S?Re1#!_(6)D5 rd, ylZ4.qS^cEr^"  }wKERMIT.B[001011]K11NRS.TSK;1:& ^ئ  Еf&Y Wee(  2 f e% >:ff Je *(ff Еee& nئ  >f&Y .Wee(  f d% f>p>P Pf>p ge &f>p& z%f>p de f &i  f>p& Hz%f>p c% &ˋ& aˋ & #7 Σ fG Ueff Y%BCAeWY f 2c% (7 f fTG Ueff X%BCAeWYWE f b% f b%  7 ڢ f&ƢR UefR  ^  7 ؠ ΒfΠ&C Te f dU ^e ffD Be ffT &e f dW e ffE e f dH e fffR e fffK e @ȋfffC fe ffC Le @ȋfffI $e ffI e 7 XJ A@ & e  f W-ҋ@ & e  f f؞& &^%EeX  ` 7 t7 lffdG Reff U%BCAe.& N a  Ё7 7  - 4. , ڟ-֟ffʟG Re2 T -fԝfG QeX r jdv  fF : 7 B7 < l  ` X f ( %f fΜޞY Qeƞ  r@fF    Ԏ  ʏf&  ref& %Ӆ re f ^% f ]% & & 7 @7 ^? (_   fF  7 7 ~87 f   f&E Oe fn r%?Kermit-11 Unimplemented server command?Kermit-11 Unimplemented server generic commandKERMIT.TMP?Kermit-11 Invalid arguments for remote server command SERInvalid SERVER subcommand Server detaching from TI: You must use the SET LINE command before detaching the server Kermit Server running on PDP-11 host. Please type your escape sequence to return to your local machine. Shut down the server by typing the Kermit BYE command on your local machine. Spawned job failed due to timeout or TT read wait Logout failed - Quota exceededServer disconnected and still logged inDefault directory set to Need a directory name to change to deletedThe following commands are available for the Kermit-11 server. To avoid ambiguity with local Kermit commands some of the server commands will need to be prefixed with the REMOTE keyword. BYE Logout Kermit-11 REMOTE COPY Copy one file to another REMOTE CWD Change default directory REMOTE DIR Prints the directory out REMOTE DISK Prints available space REMOTE ERASE Deletes the filename(s) FINISH Exits a Kermit-11 server GET Sends the filename(s) REMOTE HELP Prints this help text REMOTE HOST Execute a host command REMOTE LOGIN Login. RSTS V9.x only REMOTE RENAME Rename old file to new REMOTE SPACE Prints the disk space REMOTE TYPE Prints the filename(s) REMOTE WHO Shows users logged in I need a filename to TYPESYSTAT failedLogin successfulMissing password or UIC (PPN) blocks copied file({sS] 6{T/RS kl:os/ll->,>- K; A/$/^F2\>~Km&Eo:' MC<DgLf6oWw<C7e1 QNjyW (z-cQ2~skw2QmT^ !1Dbo~]t2:|nn9R(58?74sW _KERMIT.B[001011]K11NRS.TSK;1 s) renamedCan't create KERMIT.TMP FCan't get the remote KERMIT to FINISH LCan't get the remote KERMIT to LOGOUT ENSYXTѾ4|ѸvRemote fails to respond to the command Remote NAK'ed the command 5 times Bad checksum retry abort Remote server response Receive data failed Remote ack: Can't get the remote KERMIT to respondInit failed for link >p|¹ 6||е .p|( &||Ե H} H}* l} } }d } } 枨} ޞ}^ ֞} Ξ}L ƞ} }  |z4& b 5Bŀ7^& < "ŀ7< $B && ZC  Jo~& <f   f@ W ׭ުŀ ~ff  V  =7 r 7 l7 f7 `7 Z7 T7 N i=67 \=Ҫ   w*n >#=6=D"n $  X4ELSZ_fmt{ɂɈɏɕɛɡɧɮɵɼppm^nmpppppppppppppppppom:nmnnXn\nVnZn nom(pFnLnn>pmp`n pnlmmpnmnmbnppTnppnPnn2oZmnmXmmmnpnoBn@np2ppppnLnNnDn>non nnoo"pnmmnpmmnomVmrmnnnnim$p&p07f& ff T  Μ*  t 6e     $ ( &f&ff& ft… eDn f& &:ʅ neff| ef Be, 0  64 eA|6Ehҕ  DtEe0tEe0Ee0 f&  ~e ~h |l reA|'Bhf&  Z%p Ff r 0 ~t "x f&f&  f & e At@ ș Ѥ~e@e$IMAGEALBUFFALTCONARGBUFARGPNTAT$ACCAT$AREAT$BILAT$BSIAT$CREAT$DISAT$ENCAT$FABAT$FORAT$IDAT$LENAT$PASAT$PR0AT$PR1AT$SYSAT$TYPAT$VALATRCTXBINMODBINTYPCCCNTCHARIOCHKSIZCHKTYPCMDADRCMDBUFCMDLUNCMDNUMCONESCCONPARCONSTSDO8BITDOLONGDOATTRDEBUGDEFDIRDOAUTODO8BITDORPTDUPLEXEN$SIZERRTXTFILNAMHANDCHIMAGEINDEXINOPNINSERVJOBTYPKBIOSTLINKSTLOGFILLOGSTRMAXTRYMCRCMDMODEMNUMTRYOLDTRYOUTLUNOUTOPNPAKNUMPARITYPAUSETPCNT.RPCNT.SPNHEADPROCTYPROCOMPROFLGPROMPTRANERRRAWFILRECCNTRECPARRECLNGRECWINREMOTERPTQUORTWORKRTFLOWRTVOLSENCNTSENDATSENDLYSENLNGSENWINSENPARSERMODSERTIMSERWAISETRECSETSENSIZESKIPFLRECSOPSENSOPSPARSZSRCNAMSTATESY.INITCDLUTESTCTIMESTISTSTMPERRTOTP.RTOTP.STSXFLGTRACETTCONSTTDIALTTNAMEUMDDEFVTTYPEXGOTTNXMODE Can't find symbol in internal STB t@T Byte data, size Word data, size ()  pBp   pծ #!! !!+#4GILN7!!!_!RaʀZ\!!&}#ʙʜʞʢ!!ʤʦʰ!!^#!!!!!!!D-#4G!!I7!!e_!RgZ\acÉ!!!!!!!!!!!!!!Į!!!!!!!!˞!!!>!!!!!!!!!!!v #"#$!!!!!!!!!!!tR_ tR_ xR_ ~R_ R_ R_  L_  M_  M_  M_  M_  M_  M_  DN_  dN_  N_  N_  N_  N_  N_  N_  N KERMIT.B[001011]K11NRS.TSK;1H- #6N!!PL!!!!!!U^!!!!e <l̙̏̑o!!!!!̀!!!! !!!!!!!!!!!!!vN!!!!*ON LINE6ONLINE@BUSYPFAILED CALL\NO DIALfVOICEtTIME OUTRINGINGON LINEONLINEBUSYFAILED CALLNO DIALVOICETIME OUTRINGINGON LINEONLINEBUSYFAILED CALL NO DIAL*VOICE8TIME OUTRINGINGNRingXBusyfDead LinevDisconnectModem ReadyNo AnswerNo DialtoneNo ToneOn LineOn Line OriginateRedialingON LINEONLINEBUSYFAILED CALLNO DIAL(VOICE6TIME OUTBRINGINGRON LINE 300dON LINE 1200vON LINE 2400ERROR CONTROLNO ERROR CONTROLAttachedBusyDisconnectedErrorNo answerNo dial toneSpeed: AttachedBusy(Disconnected2Error@No answerRNo dial toneSpeed:jCONNECTzNO CONNECT!ON LINEON-LINENO ANSWERDEAD LINEBUSYEND DRINGINGVA212PA HELLO:I'M READY*D ?%s DIALING I KStand alone VADIC VA212VA212PAR HELLO:I'M READY*D ?%s DIALING I KRack mounted VADIC VA212PARVADIC HELLO:I'M READY*D ?%s DIALING I KGeneric VADIC with autodialCTS2424AT Modem ReadyD%M%B%S +PT&CTS/Fabri-Tek 2424AD V.22bis AutodialierVA4224 HELLO:I'M READY*D%M%S%B DIALING I KPTBVadic 4224 CCITT V.22bis autodialDF03%sDEC DF03AC Autodial modemDF100ReadyReady%s# DEC Standalone DF112DF200ReadyReady%s! DEC Standalone DF224HAYESATZ V1 OKOKAT D %s MICROCOM4445 SE2 S1C0 SCE ON !!D%s MicroCom SX1200R212A RIXON R212A INTELLIGENT MODEM$KNUMBER:%s DIALING:RIXON R212A Intelligent ModemPROTMSUSER_DEFINEDNo translation found for number. Continue ? No connection Excessive RINGING... messages returned Operation aborted under user interupt No response or invalid response to dial commandCONNECTNO CARRIERBUSYERRORRINGAB<ˋf D   *ʋ  ֒ Β Ēf&  ue  |& 4   *1bn   1 ` n  H @Y@ ׭dX ׭]Tbn .  2 ; Z8 7p3, 4ȋ 6 ؑd Б!fn ne  ~   h& ~ & T  0&fn ro% !~bn Gh . &   ~f&  "te f& Ѕ te ~f& ( se  ׯ0ׯ9wZm/eע Дj  ˋ9 NJ \f& > \se ( f& Zͅ ˆR Invalid number! No previous number! Using: Please use the SET LINE command first Please use the SET MODEM command first A dial formatting string has not been defined This modem type is unknown. The known modem types are: Using: Modem in command mode Failed to get modems attention Modem dialing Call failed Connection made, use the CONNECT command to access remote Remote phone is ringing No modem type has been SET This is an internal modem The option has not been SET Modem message Message Class Successfull connect Informative message Failure to connect (Modem type: Wakeup string:  Response to wakeup: Format for dialing: Delay for dialing: n}:&fAB?ѕ ~ H/$?C~ Arݰݠݐ݀p&`MP|@0  K9Y'pe` P@8(0d 0V 4gER$ABO THIS ERROR CODE NO LONGER IN USEER$ACC F11ACP ACCESS ERROR OR FILE IMPROPERLY CLOSED OR CREATEDER$ACT CURRENT RMS ACTIVITY PRECLUDES OPERATIONER$AID BAD AREA ID(STV=@XAB)ER$ALN ALIGNMENT OPTIONS ERROR(STV=@XAB)ER$ALQ IMPROPER ALLOCATION QUANTITYER$ANI NOT ANSI "D" FORMATER$AOP ALLOCATION OPTIONS ERROR(STV=@XAB)ER$AST INVALID OPERATION AT AST LEVELER$ATR ATTRIBUTE READ ERROR(STV=SYS ERR CODE)ER$ATW ATTRIBUTE WRITE ERROR(STV=SYS ERR CODE)ER$BKS BUCKET SIZE TOO LARGE(FAB)ER$BKZ BUCKET SIZE TOO LARGE(STV=@XAB)ER$BLN THIS ERROR CODE NO LONGER IN USEER$BOF BEGINNING OF FILE DETECTED($SPACE)ER$BPA PRIVATE POOL ADDRESS ZERO OR NOT WORD-ALIGNEDER$BPS PRIVATE POOL SIZE NOT MULTIPLE OF "4"ER$BUG INTERNAL RMS ERROR CONDITION DETE ; .SETTOP area. In the case of XM, however, we have a ; problem. In order to reduce the size of the ROOT to allow ; K11XM to run as a foreground job we ende KERMIT.B[001011]K11NRS.TSK;1-CTEDER$CCR CAN'T CONNECT RABER$CHG $UPDATE-KEY CHANGE WITHOUT HAVING ATTRIBUTE OF XB$CHG SETER$CHK BUCKET HEADER CORRUPTEDER$CLS RSTS/E CLOSE FUNCTION FAILED(STV=SYS ERR CODE)ER$COD INVALID OR UNSUPPORTED "COD" FIELD(STV=@XAB)ER$CPB PARAMETER BLOCK HAS INVALID ARGUMENT LISTER$CRE COULD NOT CREATE FILE(STV=SYS ERR CODE)ER$CUR NO CURRENT RECORD(OPERATION NOT PRECEDED BY GET/FIND)ER$DAC F11ACP DEACCESS ERROR DURING "CLOSE"(STV=SYS ERR CODE)ER$DAN DATA AREA NUMBER INVALID(STV=@XAB)ER$DEL RFA-ACCESSED RECORD WAS DELETEDER$DEV BAD DEVICE, OR INAPPROPRIATE DEVICE TYPEER$DFW ERROR OCCURRED ON DEFERRED WRITE (STV=SYS ERR CODE)ER$DIR ERROR IN DIRECTORY NAMEER$DME DYNAMIC MEMORY EXHAUSTEDER$DNA ZERO DNA WITH NON-ZERO DNSER$DNF DIRECTORY NOT FOUNDER$DNR DEVICE NOT READYER$DPE DEVICE POSITIONING ERROR(STV=SYS ERR CODE)ER$DTP "DTP" FIELD INVALID(STV=@XAB)ER$DUP DUPLICATE KEY DETECTED, XB$DUP ATTRIBUTE NOT SETER$ENT RSX-F11ACP ENTER FUNCTION FAILED(STV=SYS ERR CODE)ER$ENV OPERATION NOT SELECTED IN ORG$ OR TKBER$EOF END-OF-FILEER$ESA EXPANDED STRING ADDRESS IS ZEROER$ESL NO EXPANDED STRING IN EXPANDED STRING AREAER$ESS EXPANDED STRING AREA TOO SHORTER$EXP FILE EXPIRATION DATE NOT YET REACHED&fAB?ѕ ~ H/$?C~ ܀phN`}XP@80+ g~,_߰ߠߐ߀pH`vP@0 Wu4Q!IxxplhER$EXT FILE EXTEND FAILURE(STV=SYS ERR CODE)ER$FAB NOT A VALID FABER$FAC RECORD OPERATION NOT SUPPORTED IN FAB FACER$FAL REMOTE NODE DOES NOT SUPPORT OPERATIONER$FEX FILE ALREADY EXISTS ER$FID INVALID FILE-IDER$FLG INVALID FLAG-BITS COMBINATION(STV=@XAB)ER$FLK FILE IS LOCKED BY OTHER USERER$FNA ZERO FNA WITH NON-ZERO FNSER$FND RSX-F11ACP "FIND" FUNCTION FAILED(STV=SYS ERR CODE)ER$FNF FILE NOT FOUNDER$FNM ERROR IN FILE NAMEER$FOP INVALID FILE OPTIONSER$FSS SYSTEM ERROR DURING FNA/DNA STRING PARSEER$FUL DEVICE/FILE FULLER$IAN INDEX AREA NUMBER INVALID(STV=@XAB)ER$IDX INDEX NOT INITIALIZED(STV ONLY,STS=ER$RNF)ER$IFI INVALID IFI VALUE,OR UNOPENED FILEER$IMX TOO MANY XABS OF A GIVEN TYPE(STV=@XAB)ER$INI THIS ERROR CODE NO LONGER USEDER$IOP OPERATION ILLEGAL,OR INVALID FOR FILE ORG.ER$IRC ILLEGAL RECORD ENCOUNTERED(SEQ. FILES ONLY)ER$ISI INVALID ISI VALUE, OR UNCONNECTED RABER$KBF BAD KEY BUFFER ADDRESS(KBF=0)ER$KEY INVALID KEY FIELD(KEY=0/NEG)ER$KRF INVALID KEY-OF-REFERENCE($GET/$FIND)ER$KSZ KEY SIZE=0,OR TOO LARGE(IDX)/NOT=4(REL)ER$LAN LOWEST-LEVEL-INDEX AREA NUMBER INVALID(STV=@XAB)ER$LBL NOT ANSI LABELED TAPEER$LBY LOGICAL CHANNEL BUSYER$LCH LOGICAL CHANNEL NUMBER TOO LARGEER$LEX LOGICAL EXTEND ERRORER$LIB OLD/INCONSISTENT LIBRARY CONFIGURATION(CRASH)ER$LOC "LOC" FIELD INVALID(STV=@XAB)ER$MAP BUFFER MAPPING ERRORER$MEM FNA, DNA, ESA, OR RSA STRING WRAPPED TO ZEROER$MKD F11ACP COULD NOT MARK FILE FOR DELETIONER$MRN MRN VALUE=NEG/REL.KEY GT MRNER$MRS ILLEGAL FAB MRS VALUEER$NAE UNMAPPABLE NETWORK ACCESS ERRORER$NAM "NAM" BLOCK ADDRESS ZERO OR ODDER$NEF NOT POSITIONED TO EOF(SEQ. FILES ONLY)ER$NET LINK OR NETWORK ABORTEDER$NID THIS ERROR CODE NO LONGER IN USEER$NMF NO MORE FILES Mart up lun.kb == 0 ; assume if channel 0 --> terminal lun.in == 1 ; channel for input files lun.ou == 2 ; channel for output files lun.lo == 3 ; channel for pac >KERMIT.B[001011]K11NRS.TSK;1@ 4ATCHING WILD-CARD SPECIFICATIONER$NOD ERROR IN NODE NAME (OR IMBALANCED NODES FOR $RENAME)&fAB?ѕ ~ H/$?C~ `P@H0k 'Wްޠސ&߀DpZ`xP@0 &E|%Nf.T{p`PH6@h0 =\ER$NPK INDEXED FILE-NO PRIMARY KEY DEFINEDER$OPN RSTS/E OPEN FUNCTION FAILED(STV=SYS ERR CODE)ER$ORD XAB'S NOT IN CORRECT ORDERER$ORG INVALID FILE ORGANIZATION VALUEER$PLG ERROR IN FILE'S PROLOGUE(RECONSTRUCT FILE)ER$PLV FILE PROLOGUE VERSION LEVEL UNSUPPORTEDER$POS "POS" FIELD INVALID(POS GT MRS,STV=@XAB)ER$PRM BAD FILE DATE FIELD RETRIEVED(STV=@XAB)ER$PRV PRIVILEGE VIOLATION(OS DENIES ACCESS)ER$RAB NOT A VALID RABER$RAC ILLEGAL RAC VALUEER$RAT ILLEGAL RECORD ATTRIBUTESER$RBF INVALID RECORD BUFFER ADDRER$RER FILE READ ERROR(STV=SYS ERR CODE)ER$REX RECORD ALREADY EXISTSER$RFA BAD RFA VALUEER$RFM INVALID RECORD FORMATER$RLK TARGET BUCKET LOCKED BY ANOTHER ACCESSORER$RMV RSX-F11ACP REMOVE FUNCTION FAILED(STV=SYS ERR CODE)ER$RNF RECORD NOT FOUND(STV=0/ER$IDX)ER$RNL RECORD NOT LOCKEDER$ROP INVALID RECORD OPTIONSER$RPL ERROR WHILE READING PROLOGUE(STV=SYS ERR CODE)ER$RRV INVALID RRV RECORD ENCOUNTEREDER$RSA THIS ERROR CODE NO LONGER USEDER$RSL NO RESULTANT STRING IN RESULTANT STRING AREAER$RSS INVALID RESULTANT STRING SIZEER$RST INVALID RESULTANT STRING ADDRESSER$RSZ BAD RECORD SIZEER$RTB RECORD TOO BIG FOR USER'S BUFFER(STV=ACTUAL REC SIZE)ER$RVU RRV UPDATE ERROR ON INSERTER$SEQ PRIMARY KEY OUT OF SEQUENCE(RAC=RB$SEQ FOR $PUT)ER$SHR UNRECOGNIZABLE VALUE IN FAB SHR FIELDER$SIZ "SIZ" FIELD INVALID(STV=@XAB)ER$STK THIS ERROR CODE NO LONGER USEDER$SUP OPERATION UNSUPPORTED OVER NETWORKER$SYS SYSTEM DIRECTIVE ERROR(STV=SYS ERR CODE)ER$TRE INDEX TREE ERRORER$TYP ERROR IN FILE TYPE EXTENSIONER$UBF INVALID USER BUFFER ADDRER$UIN FAL REJECTED SOME FIELD (STV TELLS WHICH)ER$USZ INVALID USER BUFFER SIZE(USZ=0)ER$VER ERROR IN VERSION NUMBERER$VOL INVALID VOLUME NUMBER(STV=@XAB)ER$WCD WILD CARD ENCOUNTERED DURING FNA/DNA STRING PARSEER$WER FILE WRITE ERROR(STV=SYS ERR CODE)ER$WLK DEVICE IS WRITE-LOCKEDER$WPL ERROR WHILE WRITING PROLOGUE(STV=SYS ERR CODE)ER$XAB NOT A VALID XAB(@XAB=ODD,STV=@XAB)ER$XTR EXTRANEOUS FIELD DETECTED DURING PARSEfB@ҕ C~B A f r e0C r e0e0ҕ ҕ-RҐҕ W   AL:R~Lxݎݟ.Rjހ޵$7Kdߔߣ߱#FTav'?Or!Jw1QiiiiiiiiiiiiiiiiiiiiiiiiiiiiBad parameters/Insufficient dynamic storageInvalid function codeDevice not readyParity error/Insufficient dynamic storage for sendHardwaXPFN:R0CLCM:R1CLOS-RMMIS RMMIS: .FCTR LB:[1,1]RMSLIB/LB:R0FREE:R0MAGT:R0RWIN:R0WATR:R1NXBK:R1RLBK:R1TRUN RMSCD: .FCTR LB:[1,1]RMSLIB/LB:R0ALBS:R0CCLN:R1CONP:R1DISC RMSEQ pKERMIT.B[001011]K11NRS.TSK;1&)5.vjr7Jdn`ɱJ=}]km4E==LY>e1E~zin*jMRhY \=4D [\{m_PA+25XDE  ;K#w}6HL3Oka$ )([s1y]^m+ϭUQ'j: R, Ӏ GޢOyge[Vhjbza7 "hzya)-;q<5-_@b NS!eGHZ$4~9B[W\> :mlh¢=ua=# + ']Zθx0;婋qe©_)KN/W9!>d26\5V=P2yz5]>j_[*|ƹ Afoa25Ь0wL r"Kj'>;BN|arFf`o~?ՒX`4tfyW2oh(vrh1I0׆&/zTF!9c#j;>graU.?X.ڃѕu~c ]2jŠ]f52"8v(J:5Bn%~~aT(gܨ,RGyErT3((9w)|*)Zd2WID|}vYvk S FF; ɧ5 R+סh-aolϮO,E$6~BJ<☇"*&j%É>U=6݆(EʨiO}[ {rO͍niP?+v4u}E-^׮_F5)dM`5< t yJ\BkR)\O?}xx1 P=phfF;Dk!y#iTW9|O sjodfri|R^R6h$gw} } d #&NN.k Zr2`u(fcR(n hy!$FmCG_D~Ku:lq/ĤRV'&XtUu##Ug'H ck'VQ7nH H#-xkjRJ<vH9hE>+y^\Ζ .}9Ӟ \){ٝ[mih2 aOi!ܰ.CnQ>zmoɎVpb+|Yt-Ɔ?MG(gW}yõ@0M-;jkm;Gkl{r e@TFY/qr]/>X;y'3>V>W ͪEB$2%⽍\[BB+?-U?O][MWO6e3 e奤mթSŧw'/r%F܌v0J Tzb > BNt$ish[&%3IG0{]}!?1{yb7EfDp9l$(M˄L%9rQ}$:8Tu^'9=DYo' `,5XhS+ur({T9C-MBXR pgL^B 255.)LUN locked in useInconsistent qualifier usage/Invalid UICInvalid device/unit or device not a terminalInvalid time parametersNot a network task/Partition/region not in systemTimeout on request/Invalid priority ( .GT. 250.)Connection rejected/Invalid LUNInvalid event flag ( .GT. 64.)Part of DPB out of user's spaceDIC or DPB size invalid)&fN *-*-> >*1->*4-33@@@@@@& @ q(1,f& De B@ `r(2,NUf& ZDe !1* 1-ff& :De   ʁ (  l  ef&  fef& fef&  fef& fef&  fe&  *-> * >*1-3E@ "1,q(ff Be ff Be  l@ l    e  bff& Xe f&  dee  % !ff& Xef& eef& ) eef B &-W  ~% "& W@   W ҕ R ~Bf(& &e`  File renamed to Files deleted: _Mp:?Can't start job ?no PK's ?bug in openpk f&& WW-N& WW- N & WW- N fff& & f 8estarting - & & & ffff el$f&f \ Z  0  e  $ # #. ~#6#e### ӝ#SS@- eSS5 3 @4ȋ44e@4ȋ44e : .FCTR LB:RMSLIB/LB:R0MAPC:R0RSES:R0WTBS RMSDP0: .FCTR LB:RMSDAP/LB:B16PG2:B16SAV:B16CH5:DAPIO:R0CNVT:R0NFRT-(RMDLOC,RMDREM) RMDLOC: .FCTR LB:RMSDAP/LB:R0NFLR RMDREM: . >KERMIT.B[001011]K11NRS.TSK;1BD# 4#" #"6#5    4   z&ы "PP    4}"7x"7 " 4 B~4 L"  n 7"72"4 KB1ߕˋ e fE !6!!6!e & e @ p!!7!!6-! !e e  e f e %&f F t@  !w!!6"!    ! ! !7!!  PK_ߕߕ ˥˥:&  x4 Jߕn 6t $ߕ6ߕߕ_6 &    6   ` ЕЕ   76 `ЕЕRPN  Hq^6T @I~&    7 5@ 7e O % ŀ5?˥ ˥9 T P $    j F ˥ z   $   < 5 5 nЋ 4  7- "&( .$ ~"&$(. X"&($ 4&a $"&$( .&f - (4 &f~m ~& "&f f ?E~     ` `?LNG7[&  *&f ~&"  .&Ћ  77%4 |8 tT lX d`@ V @@ff hhee@@\ * Default Kermit-11 help text BYE CONNECT COPY CWD DELETE DIRECT DISCONNECT DISPLAY ERASE EXIT FINISH GET HANGUP HOST LOCAL LOGFILE QUIT PRINT RECEIVE REMOTE Send a command to a remote server BYE Remote logout COPY Copy file1 file2 CWD Change working directory DIRECT Remote directory listing ERASE Remote file deletion FINISH Exit remote Kermit GET Get file(s) from server (see GET) HELP Ask server for HELP HOST Ask server to execute opsys command RENAME Rename file1 file2 SPACE Inquire about disk space and usage TYPE Ask server to type a file WHO Request a list of who's logged in RENAME SEND SERVER SET Set parameters. See K11USR.DOC ATTRIBUTES BAUD BINARY-TYPE BLOCK-CHECK CONSOLE DEBUG ALL CONSOLE CONNECT FILE HELP NONE OFF ON PACKET STATE DELAY DEFAULT DUPLEX END-OF-LINE ESCAPE FILETYPE ASCII AUTO BINARY FIXED NOAUTO PROTECT SUPERCEDE TEXT TYPE HANGUP HOME IBM-MODE LINE LOGFILE PACKET-LENGTH PARITY PAUSE PROMPT RANDOM RECEIVE END-OF-LINE START-OF-PACKET s: Yes LONG Packet protocol support Yes Sliding Windows protocol support No Terminal emulation: Yes Communication settings: KERMIT.B[001011]K11NRS.TSK;12I RECORD-FORMAT RETRY RSX RT11 CREATE-SIZE FLOW-CONTROL VOLUME-VERIFY SEND SPEED START-OF-PACKET TIMEOUT TERMINAL UPDATE SHOW Display current parameters ALL BLOCK-CHECK-TYPE DEBUG DEFAULT ESCAPE FILE-TYPE LINE PACKET PARAMETERS RECORD-FORMAT TIME VERSION SYSTEM Execute local operating system command TAKE Execute an indirect command file TYPE Type a local file WHO Display user's on local system Note that KERMIT-11 will accept wildcard file specifications for both the SEND command and the Server GET command, as in SEND *.MAC or, from a local Kermit talking to Kermit-11 as a server, GET *.MAC P"P#PP(&@@ff DZ% `f&f .Z% U((2( ~1, ~2, N *-*-ff ?e@' f ?e N <f ?eff ?e  e&CW 444 4 4 4 "4 $4 &4)4(4 *4 ,4 .' ""$$&&))((**,,..r r @ 121@2@2P @020@$2$@2 @2 @2 @2 @2ff xff j>e@Zf L>eK1 &1 (2 &2 (ff N>e@Erf *>eWuDaff =ef =e  0KCQZH1~z;7`X_7%xr~3l0oK0`("cT uGb$96], h<= _@2%o< :i3!t@!Bo_J7af:$B}n7l-QR[)~}!W`byl{Y WMF|lOUdydO?1i:9{:1 Q(gF1 O%Q|`zJCiILH KERMIT.B[001011]K11NRS.TSK;1sP RRtU ,18=>ELlQbij|uv{|R,R8RUT R $->GXR]^RcdjrOz|2UfP $&U+,12;DMV[dhj RnpSu|SSRRS,R8RR RTS$8S?FRLNRSZR^@Command file ? BYECOMMENTCONNECTCWDDirectory: COPYFrom: DATEDELETEWhat: DIALPhone number ? DIRECTDISCONNECTDISKDISPLAYSymbol: ERASEWhat: EXAMINESymbol: EXITFINISHGETFile ? HANGUPHELPHOMEHOSTCommand: LOCALLocal command ? LOGOUTLOGFILELogfile name ? LOG_FILELogfile name ? LOG-FILELogfile name ? NOTEQUITPRINTFile ? RECEIVEREDIALNumber of retries ? REMOTERemote Kermit cmd ? RENAMEFrom: SENDFile ? SERVERSETWhat: SHOWWhat: SPACESTATSYSTEMCommand: TAKECommand file ? TESTTIMETRANSFERFile ? TRANSMITFile ? TYPEFile ? WHOBYECOPYFrom: CWDRemote Directory: DELETEFile Specification: DIRECTORYOf what: DISKERASEFile Specification: FINISHGETFile Specification: HELPHOSTCommand: LOGINUser and Password: RENAMEFrom: SPACETYPEFile: WHOۇ$އ Ж} Ȗ|B | |Z |, |޸ | | | }D | x| p|V h| `| X| P| H| @|з 8| 0| (| | |,J1JVjv2B:JR :*8 <>EVbr~*"""Z$Z/8ZCLbQRjVdix~rrrz"-<GV"cdrlnj}~  "*4CZh~:B J$R+42DT2dt}ZZZb*ATTRIBUTESOn or Off ? BAUDSpeed for remote link ? BINARY-TYPEBinary file type ? BINARY_TYPEBinary file type ? BLOCK-CHECK-TYPEType ? BLOCK_CHECK_TYPEType ? CONSOLE7 or 8 bit ? DEBUGWhat: DEFAULTDirectory ? DELAYSeconds to wait ? DIALOption: DIRECTORYDirectory ? DTRDUPLEXHalf or Full ? END-OF-LINEOctal value ? END_OF_LINEOctal value ? EOFExit or NoExit ? ESCAPEOctal value ? FILETYPEBinary or Ascii ? FILE_TYPEBinary or Ascii ? FILE-TYPEBinary or Ascii ? HANDSHAKEType ? HAND_SHAKEType ? HAND-SHAKEType ? HOMEIBMON or OFF ? LINEDevice name ? LOCALLocal echo ON or OFF ? LOGFILELogfile name ? LOG_FILELogfile name ? LOG-FILELogfile RSX-11M 3.2, you will not be supported for Kermit, just as your system can not be supported by Digital. For example, RSTS/E 8.0 support expired on 31-Dec-85, as v KERMIT.B[001011]K11NRS.TSK;1SW name ? LOGOUTLogout string ? LONG_PACKETSLong Packets ON or OFF ? MODEM-TYPEModem type ? MODEM_TYPEModem type ? NOATTRIBUTESNODEBUGNOLONG_PACKETSNOQUIETNOUPDATEPARITYOdd/Even or None ? PAUSESeconds to delay packets ? PHONEOption: POSOption: PROMPTKermit Prompt ? QUIETRANDOMOn or Off ? RECEIVEOption: RECORD__FORMATStream or Variable ? RECORD-FORMATStream or Variable ? REPEATTo: REPEAT_CHARTo: REPEAT-CHARTo: RETRYNAK retry count ? RSXOption: RT11Option: SEEDRandom seed ? SENDOption: SPEEDSpeed for link ? SERVEROption: START_OF_PACKETOctal (1-36) ? START-OF-PACKETOctal (1-36) ? TERMINALType ? TIMEOUTTimeout ? TIME-OUTTimeout ? TIME_OUTTimeout ? WINDOWUPDATEUpdate interval ? ۇ R| J| B| :| 2| *|t "|h |v | | |P | | ꓠ| ⓠ| ړ| ғ| ʓ| “| | |b |L } | | |> |p z|r r| j|< b| Z|x R|~ J|l B| :| 2|F *| "| |& |$ | |R | | ꒠| ⒬|n ڒ|Z Ғ|. ʒ|f&BD  & z   E Wp`A r  DԐ &@ȋ. Õ. f&@fff L%@ ‚ (`W.~"@  5ˋD 8  0 ( e e@az 5 ZfAB ɋ& N S ʝJ  D_ nBf W. R ~ɋ W. R~en f&”;\< ”/> 0)7&0 `B & ’0 7 0 `  T‹  f&f>AW Tԕ\ rB re0e0e0T >&ID$ H  H  @    7  ]&  Q ԕ.ԕ"ԕD fpf vV% ԕ0ԕmMЕ C~p f& Z%e ~ ԕ0ԕ"ԕ" ԕ0ԕ9ԕ#ff U f& %e~ ԕ"ԕ!̕A׭F̕I4  ff XU   Eԕ!ԕ%ff& e ̕0 ~ f&fE@"A .WD : XRB~fX&  dP j  &!   @ ~e  f7 ֎X ʋ  & 0Wp e  w f&&f 7 X  ͋W  >C& N0eB  <X  P ׭B׭I(   X V@ } M-Cע# p Ĕ0 a~R  5פ"2*&  N 7.7.n#pC 3f *  Te~t 7 T }& } ׭4D8& ' NN7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 1 ; exit on ';' chtype '[ ,2 ; start of a directory or uic chtype '( ,2 ; start of a rsts style ppn chtype '< ,2 ; start of a TOPS-20 directory chtype '] ,3 ; KERMIT.B[001011]K11NRS.TSK;13^7 7 7 f , ،) ܌ fpf ^R%׭p W"W,fff R%7 T7 n7 7 &   `@ ` B   & A @     @BHN.TSK.SAV.OBJ.STB.CRF.TSD.BAC.OLB.MLB.RTS.EXE.BIN.SML.ULB.HLB.SYS.LIBX0123456789.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ߸X!"#$%&'()*+,-./01Rrvz~Unknown attribute packet type ?K11-ATR Protocol bugfix detected. Use SET NOATT and see K11.BWR, K11INS.DOC.  89A8BCAINAFab attribute error AIN89ABC  Rm B~&֑7B5 a6Bč6(P  <2ȑ111& Hm B f^ `R7 &T f PVe 8&f 0 v j Bo7 ^lSY:KERMIT.INILB:[1,2]KERMIT.INISY:[1,2]KERMIT.INIKERMIT:KERMIT.INI%Warning - You have requested LONG packet support b*[001011]K11PRT.MAC;1+.6/ 0D6ׯE7@_E 4J66B U|s(0KERMIT.B[001011]K11NRS.TSK;1jeut the other Kermit does not support this feature. Receiving file Sending file LengthTypePaknum  < Packets sent : Naks: Timeouts: < Packets received : Naks: Timeouts:  /2 5 ߥ& *  + 23E Ew    Е-   0@ rW e`fÊ    E  f&fP Zi$ ~$Y  & (% JJ_$Ff& eeӕ ӕ ӕ d & % $f& ̃eeӕKӕ ӕ ӕ & % n   eP vh f&  gef& D ge  ҂ff& `Zeff *%eff %e&f C#Hff& ނeeЕ, #ff& eӕ S~ӕ ӕ ӕ e&f"ӕKӕBf&f jeW S ~ӕ ӕ ӕ ӕ ee&"  .&   ="8"3"6("7 z<" : 6w` " B @ , !K~f !   *   !!.  fff de @A Yf W!R!wd!_!PKV!8! %!7 "!6.!.!(! ! !6! ЕЕ   !7 6  D    ۷ 7  ۘ  d  r r el d b  b 0 fɋf  ( $ $ ׭ t pf6&5"A B@55e ` -z f .  P@P  &fVf | Nk a 6 r@Ћ@ 77w4? @6|' vo6f-d UQL6@  j E e 6   6 ЕЕHȕ6 f &, Zѕѕѕ6  6Е P6 4~ e&f %0 i -*'6'#*-"& 6  w6  6- ` %  i  * D6- i6 ^ t-Xl&f ?6A& f 4~@ |{`f f {ee& "f ~@ L{` & 2f }f& &f {e1 *, * E``Invalid password or account, or system password neededExpired, non-interactive or non-dialup accountWACNT privilege needed for REMOTE LOGINSome quota is exceededWACNTEXQTASY: Space used Space free Unlimitedrfile ; receive-file movb r1 ,state clc return recs.d: call rdata ; receive-data movb r1 ,state clc return recs.c: clr r0 ; complete sec return KERMIT.B[001011]K11NRS.TSK;1@lr ""r""r("vv:6xZ8V . .R .Yq .( 8Z ;K} l68rrrgrhNF M z> p }q!Bx% N&WWKW N+dEp NyWzC;zyxlrhlshr%,NEeKqH S~ !&!!!{!!!x!"!#!&!u'!U(!,!T[!E`!:d!\g!Iq!Tq!Uq|!Vq!!t!w!Ay!!ą!!!t!<3; <I; u~IK lI &5 Iq&B 0DX!2.&F,3d-/8ELpW* @C :dvF fZMw4yQE@:d)y*(k c*e 3D_ R`U|Rp:,R`"8R_U8^T@`R O H!2U t!fP L"Uxtdz+"$X\;,Jh @2fEU:hOyVD>OyZDDOp!X`GOYbHODLODNO aOO%qd`OOrbPO`1tQ[McS}\aUr"0Us1UŞ0`X:}dXY6AZtXL^pb_wF^E`W3E`ZfQ3dIq&B3dCf`s|0fZ/\gr 6\g9\gtj6\g,9\gKq7Hm$`zL4q]aIqAIqSIqrC_qt:b5ry:2rm Rr(Sr\SrSrzRr&,Rr,8Rr3Rrk4Rr!LTSrVqSrAyRrRrRs%syN9wX1iwqnJowzJw_`=w[Nw8BNw@wfLwxvNwDy|GwT4Ay\"Ay6F#ycycyYtcyDzdEz " Fz""4F~}<"R~`^l~z8tNl~{8tN~+ ;ivN0# H2&$A2y:@3d:G8_@L92F9&j?962zF9y:>9sG9vG9wG}AYUZCszNv`;=әiUDqEDRtEbA8HCTgs #is7MisZi(i(zfKMSfZK dxmxomxm\yi\ySi~tkLi[i{ml{%l{&l{(l{l{zl{{l{"l{ #l{&l{,l{62l{2l{[Ml{_Ml{Yl{ml{)ql{Kql{Uql{Vql{wl{wl{wl{xl{Ayl{zl{3}l{l{l{l|l"6p4&m ^n Dfmr o{ p{  p{ p{ p{ tp{ p{ {p{ s!p{ %p{ 'p{ 8p{ Fp{ Kp{ ;dp{ fp{ fp{ zp{ p{ p Sm wpi Xpidm[Km;Z:nqoqmro Bxn nXn\nVNVnZZn&dm&;" n&o'p&:do&ym&spm&n< ^mXniMmimY2LnYop #!jm #Yqm#+}xm#4}zm& o&!o&fm,Rm62m3h`nI:,pt:#`nv:_tm:0f p:&"n@lmE`mIipIݪp;K}p;K~pvLGp_Mrm_M&n_My:m_MYqm_MymQnQmQt:mSH!bn?Tu~oYt mY$:bmZp_t Jn_=dRn_paVNTnaN`p3dZp:dy;n=dwPndnodrnds2odtoNeHm8flZmffpf%Xmfnmfg'mfSmTgwpp""np&pKq |mKqnKq7MBnKq:doKq(ymKq6@nUq`ps-4psy::ps;K8psm2psv6psoMps_ps`pta Rmt XqwnwnKERMIT.B[001011]K11NRS.TSK;1!Lsw<LnwNnw7MDnw:dow(ymw6>nwSnwu~ nwnwKqowsr;l4 h©#Xݩ݁68Ӫ(XR'R|dZRdU݁&" ON P<xƫ8ƫȬƫȫ lj<t! xx xXxɪKrx1K6y1o@y4}>y6L 9y9`2y=Kr Ba? Da8 a:La:NaLaW(aWaxZ,a@`aaP@b bp bx2b&b`'b(xb,xbp bYbpqbzbp b3b8^bV^bW^b`r$b`b bp b`r6br br br"bxsbH&bIb[b]ba^bs^bx_b`bw4b b bqb`b`b`b`b`b`b`b`b` bqbrbrb b bQ P b`  b" F b> B b? D bp  b  b0  b% b& b' b' b' b' bP2" b:L b:N bK b@` b bЉ* b b4 bP<" bn<" bo<# bp<$ bq<% br<& bs<' bt<( bu<) b<} b bp bG5 b bӞ bp  bzb"b#"b_b8bh bpQ p pWpYplpnPp!p,&p5pEpEpEpYMp[M@pcM p{Qp;YpYYp7[ p`pppq@pqqpkrpwp p+ pppٚ@pTq{T+tU<bwBxw-pwx #zX#z8#zkr#zfs#z zzxzp!}}}8&4}(gf}s}x}V}9} ~p ~r ~ ~$@u~aT=r!C k k,kkkkkk<k,&kXk%k2k4ky:k:k:kEkH8k4Kk^KkW kZk+dkf kfkyqkx kykzk"kJ kމs&y($,0z*5 .s(?";}}}(|d|h  p  ` (, 2} >t`0vее е еtt tttt t "t¨.t 0td:TT`^ h۔rTzX ,Tۤ ۸  h ʤ*[001011]K11.TSK;1+./ 06,E0\7ļ)\ 4 Uas@hIϳCT-4x0KERMIT.B[001011]K11.TSK;1K;1bi|P3-?n}3eTkWš?gv5[_"5) K? r5u̪AMT41vpFrE&ogM~s5bNl/'s`Xȫ|Ȝ p?Y`Z&q|%.z8_)QŠ* ' _Q2J7ˋ&0_7[4_)) PjTx}p/yrӡ7ZA$(oaWH6^ΤGWxoSg ]8Dr]XGW$Ive6*[Rpb5\ϗU{&oVP`Ѩ,b6r9ޅD vlSQ:8p95)+^+[z홃,rug6.1Tye|7ziZUr\5c!>=O<͡{=O- uz'=1#2udJCuhS[?dq6|5 jh@AD.\&j1Uv\+^wHVjBH ''ƴl1]N{/*:PkKt+\Ҁ͵F.vQ=dQ v`= y'U?ĆDQ)\FC6("k?f# 4%vfu ^;S++s)Jph=:A`IKvUa'T-Q)k'sԿb UTT|ܺWS*F2sM=|\C:HX 3T~$O[0яr0nPəmɴ_`WX'H14qDggD Jslh ۲@ S$[8媱*b;I > u{֔/N8'odVCM<;dNn8[?}mac1Oeqvk~1 |k%Je⿘&Vـ@ȓe#~$d3ceZ)=gqۯVo/mK1B,!QS& {*hX[ 9k\⩿N ?/ɲG؏ aT"9۠vG>Jx^F|V? XV-B{d%_w`Xv>2f8VjfBJ]κ8j -t"a+K:^uh:<| qq ҧ 9Ѥ"8`z;&.pE`jtr'˧bU/̬9;=9 >+a470woS| S#XuX;9H`*2Grfy>Iz n^j ПR.ZsRSP #ͨK$zRpDpt/*/B_N'oH3'M`z27bJnTCuu@fx15IVK1 xlwrj?Oʻ\Z׭ TnCGV{i@S;yŲ xore|6rhU:I*J6D'߉$úZٸpW n?uգ?C˛4ЎwH yc8Maz X'Crfvi'9^țȣ8;ͣs1CQ9OD޹U1bPtN)!wCL]%Ή]5Vzy#(jā쒲ſ+S{ }0{ NV>x.4bc mB3:bq@ Q^tQ͍IpD5' f}ֻ=&|s(I!. Dd.6Y\p+Sa_"ci闙o#3r{!*fq?PyUeXV&|yIYe%dDXϮ]g(3Widfa! J5Vua^mp5w{F!<><"3,}gzdV?1*m3La/TV|P @h'=ji/;Bdp+mȎRtV>[sFYi)r-eh-ZRnOKe{!b"|wzBx 7T[cx d~g?d odYoY"̶&/1迱 3^OsO$irCymܯU}\TTކoj)bGp.H6tZ+ Dbz=R$:JYZ: PI9clJva(0*\[jip6ׂ;>0ȣTO69WYn8rf{3;= WNjq '`$>QJ8! BT^j,ܒgykjC0Q v&pm':'C4̩%<}dVLC~BN.W"ꐞL(.iZ[""ȂP%I[!]S9a.&NWdUdO.o"vHrD"]S"+g]%&D[ =SsVBK2Pa6S|haJy%w5>cPX9U# Z]"B&N3 tM}am+rrFG+ ,iKnR~zz\4U,qbcC:[q)Abe@(i)6.\j& KERMIT.B[001011]K11.TSK;1K;1,V r[qUTSYSYSYSYTICLOVϳTZ>xx}ϳϳW/ rW/` r rffB&f e& & & & @f& & & Ε  eB:ҕEҕRҕ$ҕ ҕ C~ ,w0wxwp4wh8w`wTwL<wDhlw6\w. w&ape sequence# .byte cr,lf .ascii #to return to your local machine. Shut down the server by typing the# .byte cr,lf .asciz #Kermit BYE command on your local machine ?KERMIT.B[001011]K11.TSK;1K;15 "q qq(q$q&q&q &f& &?e E & Y w   wk&f k1e? w|w vp& fYw b\ >w`:  5 Last edit: 29-Sep-86 (Command line editing) 6TAX?XeE @L&Tm    be?E? & f YP<PPHPPP SY:lHTD~~ RRRRR`  *.*;*&f& &?e KERMIT.B[001011]K11.TSK;1K;1PPPlP~~ <&&&&2 Probable cause: Either RMSRES or an RMS satellite resident library is not installed on this system.  WZ WwjU4 YvWrWC3 3  ,, UEs3wYz*W&fz B * ͋'% ͥ!ͥE%,  K5  PB2 %pˋ5J J J @ EͥAA IĔ  " " " " " " " " " " " " " " " " " $K J K KK K 8Jf&  & |Nԕ VK  @ ^XIMR1MN KK & Ne N`f nA N`f ^ mKr_& e & e 6` ,`E?t`E& e $[emJ & e f  & Ne &  @ &  A C &  H~  l `(L  ff& e e5Jfffff(d Se  6Jf.J ! o ݪK f TeM~AWAWZ@ eNoq LoeJw J ׭I1$׭xI3WtE& Ne & WtE& Ne & v E& e 2I&  & J  5 I&f&B  ~H)2d& N !f % ŀwH~ &fn &%f&7 G4 4   w4  D k kwФGEwG`S& *[001011]K11PCO.MAC;1+.*/ 0D6PQ7j)Q 4G** U|s<0me the next kKERMIT.B[001011]K11.TSK;1K;1 N 4 H 4 NwjGEwGCS& N `=wHGEwG2St  (44B  (!& N  wdG-XRS      A TT ef JEwF?S& N Wq_ :EwF/S& N E`Ft& @`D~E?t`E NEwF S& N B TA1 14f&  % % 65Gw&Ffff e f& 8d e &fn >$%4 4 4 4 4 4 4 4 4 @ C~@   4 E ݃G 7G ݑG  4A111   \AZ@ enq neEw E5Eff& &&@d &Ne &4-=5 E90& Jdf 9@ &7`f& &f 7eef& &f n7ee @ 6f&f ree0 -wCE& N ׭VD1t E& N C׭4D3 t E& N CСD׭D EE&f 6 ׭C3  6f& P%  ׭CEE`B׭C2E?tB`EE f&f CD% ׭hCE&N@@UBtEE AdhdN@LhdUEf@@@U%&fn8rlJ Rb   ~LorlJ Rb   ~7 ^D7 \D7 ZD7 XD7 ^D7 \D7 ZD7 XD7 JD7 HD7 >D7 B f& t%E W  +w\  5 B &f @ 4 &f7 *D 2Dץ~ 7 D7 DDC  7C7CC&fD  CuCApC CA  C7 C7 CwCwC-C^ CwC C--C  |C X pCԝfC & `Ce  VC 2LCLC7 DC   BT eBw B &fDE  A. BE AԝA A & N &  BT & A^ χ f&BC X  A7A  E&  7 A A7AA 7GA  Ew3A W?W_&   `AՀ& BA  F e@w @ &fB D /E A7 AE& N  E7@  Ews@&  V C  &ffA ~> @d 1d 1@f& & eK~d 17 >f&f 6@ CAAVԕ%Sm  >-ԕ TC̔$̕_ ~ԕ P~  0f&&?E eeVf& d ef& f e X7 B=&& Nffd&d e  &<׭0= f6e % fd %&f e %ff|zn  e 2 l  <) &fXp& %|f|  %  ffXp e&@@E@U6 ʋ  % < <:0/A X# w )6Wp eWf R~7 7 6ɕ&fBҕ_ҕKҕB 6 rd e0 r e0e0Rҕ: "  ЌЕ   Pf "  g ggHЌЕ   "   HЌЕ   "  hȕЌЕ   f f A ɋ   " |f Aɋ h "y L"PPPHЌ   wN "P PHЌ  or instance, RT11 does not have any ; executive primitives to do wildcarding directory lookup. ; ; ; ; ; ASCDAT ( %loc buffer, %val datevalue ) ; ASCTIM ( %loc buf KERMIT.B[001011]K11.TSK;1K;1Gy% w" fPf efAc  @ W 2 W@W_@ w ~7 z B  B2 "2 B $  B큀" " b  V"X b W-  P  B2 "" & HЌ W-  P  Շ (*f % @   & w ~ V r@ fBC0"HЌ  P, 6)E *`$ 0w6" Нټ  "PPPHЌ   @Ћ@ 77&P    4h&f@@Ћ@ "QɝV)ь  H)@׭* 7 4)"Q   @fe &h V&"  .&   (&f * ff ff  e & " ѕ   @ 0 BN d^_ " / J:.0w( "&fB@ ߕR~ &@ *h ,f& I fff e fff |e  j a7^Y6N H t?7<76, . ) H"KB"7 6 76ܹ ع ^ lX f  76@Bh  @lBh f d+ [7Y6N \ABh W" Q- b-7+1/6  f sA 1 ݸڸ7׸6̸ݸ 7(ø6 76DAWp e ~ ݆EW %׭% M7KJWwF97<׭6%׭.% 6f l & @Ћ@ 77w4η5`i&  ƷΝΕ 6f v* ' i   OЕKЕBPȕ6 i i  &f Bw 67  A&f wٶ 67Af&f 6   f&   *e7 ‡f 7 J ? l&~  v?r P f  7 V„7 J ʋif p f f  555ε  Ԕ~&f f |%ef h%eӕ.f P%eӕ ӕ `f& &eeӕ ӕ @f< 4% `f %6    ~ڴӴʴ   7 fAɋ  "   rf LPѝ(ѕ  K6B  f1,6" iȋ7 . (6 ѳ6 ~6 6e  Е P6pn  7 Q6Hf ܻ: Vѕ6/PPPP$. 0Е P6 4~  ЕPPPP6 ehN&f Z f  8( ff ff2f e ffi lefff e &f& f e׭ ff ? N? LD J i& i    j& r j J/ *C ּмaɋ5̼ѐ f ѐf ѐ f& :j e f& f e*[001011]K11DSP.MAC;1+. / 0D6pQ7j)Q 4D U|s(0SKERMIT.B[001011]K11.TSK;1K;1,f& =j e ff& 2j ree F f& .j Pe ,? & / f& 2j "e  / f& (j e f& +j e fHj  X  pȋ5e~ & p f|f  T@~Zf  D-ppP EPBe~p fQ ~ѕ ~f  ̕ 4  fҺQ ~f& 0j ef& @j ef& f e pʋ ? ~'  r~n& a f& & fe J ,?: 8 2  f& @j ,e ?  / f& 2j e̋J ̹? ƹ? Ĺf& 6j e o f  f& :j ef& @j ef&  pef& =j \ee 0  *f& 6j 6ef Tz "O f& 0j ef& @j ef& f e pʋ(  ~& 4a f& & e  h ?v /n h f& 0j fef& @j Ref& f @ef& & .ef& 0j e@ o f& 2j e ~ &Oʷ?@ƷU·j t  z!f& Tj e 7 Zv7 7  ." "f] B  R !7 $ Z  6׭F 2 P L' w w$ f& j e  f& j e  f Z 7  w7  v  Rf " fR 4  fj ٖ% f k lٖ% @ |*&j * 7 ( f  ɋ k 8k [ F  f X  7BɋW R W  f  *  f f  8  X !fS *  f@k ؖ% fKk jؖ% > ze \^0 ;  l& N  ~ 'D ! ff&& e   e   - f] ~  n > Jl v*[001011]K11ER2.MAC;1+. / 0D6ӌɍ7@ھ ɍ 4  Us(0KERMIT.B[001011]K11.TSK;1K;1~ 3ll nw&fXp& ,%f& Xp hepl 4 (ɋW  l3ʋ" B 7 7   ef& tl e%&f @!  7,fn T  7   7r   7Ff&f BAt4 4 u CM5ŀ5 5נ Õ   נ .נ +E5 $mË ȋР5 נzנa 5@ נ[Õ(נ]Õ)5 נ'נ"45נ ËҐ 5 `W W ~e &Ћ f&fA DeEff F 6f&f eF`%f& ff e&f&BC ҕ C~A r e0 b~   -  A  ѕ ʕ*  &f& & ef&@ABD  &f ~ e  &fAC r@*m r(*mS*m C& ˋ%ע  @ ע+ע-ע0ע9 & 0Wp e     U   Bנ0 נ70 `&fBCeEbTmtE ~&ff& %f& ee&f   !e&f  f& & %K~ %fP%fЋ P% ы % E&o #  eo  %SPACK - SIRCG RPACK - ?Bad Checksum: rcv,calc are !1BRcs ƍ#2$FW6etHZӾl~ Kermit: Aborting with error from remote. pak: Fubar pak type: Retry limit reachedHopelessly out of synch with sending KermitRetry limit reached, parity is possibly being introduced~22222~2Breakpoint trap, PC: PSW: Plff@f@_KB:? This copy of RSTS is missing the multiple private delimiter SYSGEN option. Please include this option in RSTS for KERMIT to function  KLDCDLDEPKDJDHDZVHdhhhhh i,iNipi`h`h`h`h`h`h2Kn,X` %2Kn,X`  %Kn,X` %K &You lack the HWCFG privilege to assign a line HWCFG*.*  O8P`PQ^RPOPORjOnO(TTPTABCDOQpSRNS^C^Z 78  " Check SHOW RELEASE_NOTES for possible incompatabilities with previous releases of Kermit-11 and other Kermits. Unrecognized command %Command not unique. Complete Receive failed ?Syntax SEND Filename.type Complete Send failed Kermit: Get complete Get from server aborted KERMIT is not running as a LOCAL Kermit Read error on TAKE file: TAKE file closed Unrecogized *[001011]K11ER2.MAC;1+. / 0D6ӌɍ7@ھ ɍ 4  Us(0YKERMIT.B[001011]K11.TSK;1K;1:REMOTE command 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-@_.Exiting due to control C interupt Access not allowed to this command BYECOMCONCOPDELDIRDISERAEXIFINGETHANHELLOCLOGNOTQUIRECREMRENRDISENSERSETSHOSPASYSTAKTRATYPWHO  ABCDEFGHIJKLMNOPQRSTUVWXYZ$.?0123456789:01234567P'&1 $ { x{ ~ {} {x { { { { { {4 {Ԗ {n {ޕ {R {• {< { { { {( {r ||l t>|T lb|У dt|У \|У T| L|^ D|X <} 4}j ,} $(} (}\ (}У (} (}5ew , Bv    5Bw 5  (5(UW       wE5 E  W ͇5  ,E zv\xwPw&wE U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E Uw eE D` bl lrw \  B eE"s    s-  Csl&f &ff *[001011]K11DSP.MAC;1+. / 0D6pQ7j)Q 4D U|s(0>KERMIT.B[001011]K11.TSK;1K;1Ar[qr[q&!zz! \m`mdmhmz :zV!! {zr@{zB{IqMx}@ {0{IqM}@ {{IqM}z {U(U}}f{I3d?}x{{y?} f{{IwF} f{{IKqM}f{x{IQl{P|lQl {{Iy^l{{Iyjl{{Ixvl{|Iwl {|Il {,|I3l {>|Ild{{IiУb|L}""УP|t|I/"У`P||I0"У P||I1"УP||IУdP||IrУX P||IeУP||IУ,P||IYǐУTP|}I%ːУ P|}IyѐУ P|(}IDאУ P|:}Iy:ݐУh P|b|IC㐜T{hRRx`}\xw`}>xwwwwwz z z z zw17 7 7 7 2mw m ׭1׭1S  7   @̈& ݎ J ֈw1d\& j p hf 6  f&d6E reA  n &  X5z(ꈑ ѝѕ ff& ee( @f& ꈅ ef4p e Z l d-`TA K <fH|  e + )fHfA Zeff} t%BCAe& N  fH wDAwff}  A ? w8  vt7 fb  r@VH D-@4A )fH(B deff} ~%BCAe& N Af} . A ?  7   r@C&f&f7 b7 bI S .(1$ &-"A ޮ<fH  fn Ö%fHf eff} :%BCAe"& N j (AWI f} ܭ AWI-^V  r@J7 >F< 20f} % #7   r@ ȨF0|7  @ -A \wl f h 7 Ž} f| ̱% HfB| &e fXp& B–%f|Xp ʫeAl >f| %f&| % f&T|F e  f&&F ̝e78f&dlX eff}  %BCAe4& N :e@Af} p A ?   7   r@ H fH ئ wD -|A D)fHpD eff} Ɵ%BCAe^& N d׭of_p Pfp&E >eAf&dN e ,-^  f %f} 7 ? t 7 dbe7 FB  r@6 0* L LTZf&dE .e7 A׭lX׭dZ ZmLw FfH ֤ wZD -xA @< vfor instance, RT11 does not have any ; executive primitives to do wildcarding directory lookup. ; ; ; ; ; ASCDAT ( %loc buffer, %val datevalue ) ; ASCTIM ( %loc buf KERMIT.B[001011]K11.TSK;1K;1/Sh?oJVXF}w+\̪">Q#nNENF gbQl8YDT9螹 E~(5]4&Q/5֓OdAafEݠ[\לN#Te2hyƓC-}gS\AC۶*5ep4 Qt Q~mV!]ܶDPC(p{/^ ɬ9Jr}>OԼS-Y+Qlȃ.sRcU,RELɉ:jLLt:NC{o~Ǧ,u GxĞ,EЉ5 WwY;MQ8Q'y -7wYGmYH"!KS ^9s3Q.bk~h@1GS=_K|Ev{)N}wⓔVkD&NHbGJ- rE?vHau=X[UHә]Tzq }9(){IP#%Au"%k; Yefjw5 J4obx`rX@źg䁋n/mBYY@m;8ݲ)} -e5ѱtEw {$nH4 [[n2/`H ]op,^tJt#e Z90yӗLp,~OsKgiҀ'KZVnZnM;{x9ّ^FvܑcTl9GdMජq5hԨ+OޚIgie9]Vw]9|hcAZn1u])n'1Ǟ砛5M~̜Ltܲ 1+)7@Lw7{ul1[ 9W?1^Y>.DCg@! 'J+Y-kRf]ym<~1R~Nд'sa0zHw4ߵ< K 5iWV*4x-74'6Tv0y`kl$βs]7|ob:V<@QҡMʛ߃9,dրSz1 rp{߽n16Aq$O9s~i:~"<[ woxkA5oЕ $9_Tfzis'I|u#:-w,eTu`Zz!lؼp{]0NCwq&L"QmhZ51Mv ?>n`QG6"3-2"# pmA蠮C_knm<F\W-\/Xh> \`& YXWdqyWIW & RM,k@D[yidR3HYϪ\zƀ튋le"DiZwƹ͡(&\Vtg"vm ϤQ+N.?9F%Ny(q_mdz4 %-+^4e<d)'9}RؑL5KvMb*{Μ'J#'Xz xba˂]~Nyz`]?8:3h1YԷ*T C{,u\rt68Jz|8󎌰wHO:FY~3F3fN %iM5fNľY3Քp) +_\%mM5krҬ_tY?t&ƶy~$$blBQc4)If \C^B&+0pD"`|5Wփle|Cm4'~-w$ h9c.|]E8^i<~#5&W3[nI 9_Fz=SEgQCq aBbM0ܩ5ESmq#bUL1Ͼj58i9<ӻozzNs{Z%CC+H[l [C\Ngj^oq^1YJ'b~!csP@YTY?)"ju*BPME_E vP@|TG (S Ne+D*+W>*vkURW]RyoFwC+6*M EUN@LP>*M PUl2'IOgLM ?RDSkFn u|xu!=RqKERMIT.B[001011]K11.TSK;1K;1HfZ ef&dFZ eff} %BCAe& N ̩ 7 Af} J  ?   7   r@f v 7 -   FBABCDFSZH@  $,<D4~Sendsw - state is ENYTrxxENYTP\rVVENYTĂENYT0JSending file as file ENYTĆhhExpecting ACK, packet type not valid in current SDATA stateLONG Packet size reduced, first data packet failed ENYT4@Rl::D V}Ф N} F} >(}N 6(} .(} &(}\ (} (} (}7 dwd7 RN1@87 B7 @mw m 7 2 (  8 z  .@Ĉ& ̈1&  f 7  w w w ڈ fڈ&pE ef( ѝFѕ 5 ff& e ff& ve    e(& - AffH 0%BCAe & N ` f&dN epfH İ AfH j %fH j fH$Y `e 7   r@ ֫F& 0 - zA  XffH %BCAe& N : &f&dZN eJ @ >Af&d&Y beCfH j A - Ae? r@ fH  fHY e7 A -x DAve? r@ f&dY e7 BF A 2 0AH  xfH  %1Hf H % f 8H @ef|  % 0 f 7 f&dY ȟett7 nj  r@^DfXp& dÖ%f&XpI eA Af&dY Be7 07 \ (7   r@D&7 - bAffH %BCAe`& N . j hI ZF .D& f &| e 1f| ~efY 8e  r@7 Dj|v f& % f& e7B /fXp& % hXp fXp&PE ef&Xp eAf& <%f& he - - Ae? r@ f&d Y e7 A`$w fH % fXp& %fXp| ef @@ \+ \&2fY Ne1fY .e!f&dE e7 #f&dY e7   r@DA j-fX $AVe? r@ f&dY ve7 "& AfH p A- A   f  7 f&dY e7   r@F7 -։ f։&)+ ,(r2)+ ; copy error name over movb (r0)+ ,(r2)+ ; copy until 63 characters or a movb (r0)+ ,(r2)+ ; copy until 63 characters or a movb #40 ,(r2)+ movb #40 ,(r KERMIT.B[001011]K11.TSK;1K;1!OdE eAf&d@N |e0 &+ -  بA e? r@ f&dY *e7 AfH   #f&dY e7   r@~zARFDCA@~~~~~~~~Control C abort on file receiveRecsw - state is SETSZFBEXTȀ6 ȀȀ was renamed to RMS $PARSE failed ADEFZXTԃ0Local KERMIT error: ZXCreate failed - Created file - File exists, not superceded - Expecting ACK, packet type not valid in current RDATA stateAttribute packet error - } }( } (} (} (}\ (} (}* f& ܖ% pf& e  . `D X XH Jd B Bh  DF<&  & nn 7 l p t f&  e f ɖ% & 8݇f  f V% Zn& f T  f D <7 f ̳ 7 &  f  e & 7 & f en   ߇ mЕ @ r  f& & ޖ% n f߇* FPff D f& f be. .eP2 }f& ,% <f& & e6  f ze B f& 촖%  ff& e:   &  f  f` vɖ%& ڇSETInvalid value for SET Unknown/invalid Set command CON DIRCurrent default is TAKEPrevious TAKE file closed SY:*.CMDSYSThe SYSTEM command requires a command to execute Error from spawning command $&(ŀ SPA TYP {D |l | | }ܬ :}V :}┚┤򔫎ƕxxŽɎʎ4ΎЎ֎؎ގҔڔDH "N'(T8:TJLQRWX[\`befҗjl\rtbxzΘ *.*;*&f& &?e oKERMIT.B[001011]K11.TSK;1K;1V^ޙ֙ʏ̏Ιڏ܏,$  Z)@vKLZUlvwxĚ̚44ĐΐHՐސR>fp*@xH^\fpz*ԑܑ.46;<BALLCONSOLECONNECTFILEHELPNONEOFFONPACKETRAWRPACKSTATETERMINALNOTERMINALEVENODDMARKSPACENONENONEXONXOFFCARRIAGE-RETURNCARRIAGE_RETURNFULLHALFONOFFONOFFNODTEDTECHARIOLINEIOTC.DLUCONNECTFLOW_CONTROLNOFLOW_CONTROLNOVOLUME_VERIFYVOLUME_VERIFYCREATE_SIZEBREAKWILDCARDINGNOWILDCARDINGOFFONNONETIME_OUTServer_Idle timeout? NOTIME_OUTTIME-OUTServer_Idle timeout? NOTIME-OUTDEDICATEDNODEDICATEDDETACHNOEXITEXITWAKEUPString: WAKE_STRINGString: PROMPTString: INITIATEString: FORMATString: SUCCESSConnect acknowledge: INFORMATIONRinging acknowledge: FAILUREFailure acknowledge: CONFIRMString: WAKE_RATEDelay in milliseconds: DIAL_RATEDelay in milliseconds: DIAL_PAUSEPause character(s): TIMEOUTTimeout in seconds: TIME_OUTTimeout in seconds: NUMBERName and phonenumber: PULSETONEBLIND,n n fn    & ˇfn 7 fn Z |fn x & nn P8 b  Vf |f& n efn :  t L  Bf& & >͖%fn    ȝ fn г  ̝  ͇fڅ l   @ffn ʳe  & *   l@ dͱflXڅ Ȗ% f&l>څ e  t 5p D n  E?N5Hf E0 r  E?  U?  7 pU ` U J U 4 tU /E  (ž U nf f4n eƞ  5 *  2 ˱U 6 : F J v z  x pП hԟ ` X P( H, @0 8f 0j (    ˇf ׅ >Ɩ% ( 7    * . d h v z  ʇ f'" fh& Ŗ%  7  ԋ ffׅ FŖ%  և7 ևfօ Ŗ%  fxX ȡ ɇ7 DV78̡  ɇ7 7 շ m \ 7 fVօ  w f0օ pĖ%  7 Շ Շf@օ FĖ%  v 7 n ȋ 0W wH  4  8WD7 WAՠ8 X z f|nՅ Ö%  7 \ T ɋ ff  w{\ " ȇ ɋWO  WF70    rɋWSWL7:  Ң  7 7 fԅ –%  7 fӅ –% f&Ӆ e 0Ԯ "ԠӇfԅ  ape sequence# .byte cr,lf .ascii #to return to your local machine. Shut down the server by typing the# .byte cr,lf .asciz #Kermit BYE command on your local machine cKERMIT.B[001011]K11.TSK;1K;1j]w   t7  7  fxӅ –%  7  `fӅ % f&zӅ e ֢ Z Re` ~ t j ` V L  | r  f҅ v  w҇   Ā E &m &f  " Ň v ( peEe@e* E  E &f V & 2L *Ňmf ҅  MfP҅ D% f&Pх e  n d \ tm E eE   & P xj pĀ jɋW Error from device assignment Kermit-11 no longer running in LOCAL mode Link device: Speed not settable Speed: DTR/CD not currently present DTR/CD present Parity is set, forcing 7bit mode Bad value for speed or speed not settable Please use the SET LINE command Please use the SET LOGFILE command first Log_file closed Can't do RAW i/o disk logging with other DEBUG options set Old logfile closed and new logfile created in BINARY mode Can't do disk logging with RAW i/o logging on To enable: Connection logging SET DEBUG CONSOLE File opens/creates SET DEBUG FILE Packet traffic SET DEBUG PACKET Raw terminal i/o SET DEBUG RAW State transitions SET DEBUG STATE Connection logging can be controlled by typing your escape character followed by a R to resume or a Q to stop logging. Kermit-11 will have to request 8 Bit quoting for the transmission of binary files. If the other Kermit does not support this, information for binary files will be lost. Unknown parity SET DUPLEX HALF, SET PARITY MARK, SET HANDSHAKE XON done SET DUPLEX FULL, SET PARITY NONE, SET HANDSHAKE NONE done SET RSX TC.DLU value, where value is 0..2 ?Error - SET RSX CON [DEF][ALT] %SET-W SET RT11 CREATE_SIZE decimal_value %SET-W SET RT11 FLOW [ON][OFF] %SET-W SET RT11 BREAK [SHORT][LONG] %SET-W Unknown option in SET DIAL Insufficient space to contain string Insufficient space to contain string No space left for numbers }ƓюҎԓƓԓ+,BDƓ[\ԓstⓎƓԓڏ܏  (( Ԕ"$Ԕ*,24Ԕ;<ԔBDJLԔVXbdԔnpz|ԔԔ򔾐xƐȐxϐАڐܐl0>PVdtfΑlڑ&,:Jbrf\d̚ÒĒ.Ȓʒ2͒Β.ӒԒؒڒݒޒܛ "$[!]S9a.&NWdUdO.o"vHrD"]S"+g]%&D[ =SsVBK2Pa6S|haJy%w5>cPX9U# Z]"B&N3 tM}am+rrFG+ ,iKnR~zz\4U,qbcC:[q)Abe@(i)6.\j& KERMIT.B[001011]K11.TSK;1K;1ld *,12 78>@ FHP1_CHARACTER_CHECKSUM2_CHARACTER_CHECKSUM3_CHARACTER_CRC_CCITT1-CHARACTER-CHECKSUM2-CHARACTER-CHECKSUM3-CHARACTER-CRC-CCITTONE_CHARACTER_CHECKSUMTWO_CHARACTER_CHECKSUMTHREE_CHARACTER_CRC_CCITTONE-CHARACTER-CHECKSUMTWO-CHARACTER-CHECKSUMTHREE-CHARACTER-CRC-CCITTSUPERCEDENOPROTECTNOSUPERCEDEPROTECT7_BIT7-BIT8_BIT8-BITASCIIBINARYEIGHTSEVENEIGHT_BITSEVEN_BITEIGHT-BITSEVEN-BITFIXEDIMAGEAUTONOAUTOTYPETEXTTXTDEC_MULTINATIONALNAMESNAMINGCONVERTEDFULLLITERALTRANSLATEDEND-OF-LINEEOLN char ? PACKET-SIZEPacket Length ? PACKET-LENGTHPacket Length ? PAUSEPause time ? START-OF-PACKETOctal valule of SOH ? START_OF_PACKETOctal valule of SOH ? TIMEOUTPacket timeout ? END-OF-LINEEOLN char ? PACKET-LENGTHPacket Length ? PACKET-SIZEPacket Length ? PAUSEPause time ? START-OF-PACKETOctal valule of SOH ? START_OF_PACKETOctal valule of SOH ? TIMEOUTPacket timeout ? XONNOXONSTREAMVARIABLEOFFONNONEOFFONNONEOFFONTTYVT100VT101VT102VT200VT2208-BIT7-BIT8BIT7BIT8_BIT7_BITPASSALLE?t5nf EVV h l  ͱflFڅ ɖ%  1S1=܇2E2/܇373!܇ fn  &  D jfn f  &  .f& n Fe  ͇fم @Ȗ%  jȋ f& Ȗ%  j Ȝ XL̜ ܜ : x p B 7 : 7  ׭ 0: (> x |   ̇|ȋ fL& *ǖ%  7 hۇbۇf@ 2ؗ.ӕ.  ̓    ~ v n  ^ V} } v e@n f|T ,%  & 7{4 f&  eP 7z^  fׅ Ve fׅ Xe & ƇU4n d Bf& օ Ze &ʇ Ȟ ̞    4   ɇ   @ ɇf>օ Ė% f&&օ Fe  և * wՇ  wՇ  wwՇfՅ X   W D (v  7 fՅ   whw ffՅ  wՇfLՅ f  wՇܠ0  l z f , fԅ   WW `ww7 BA  XXW XX :П 2f ԟ $ @  , : & > t x  w r_7{7Gwtw@ wFw2ևf*ԅ D  W W `  ؠ xDZfӅ |  EW  R JwӇfӅ  ,W   8 LJwӇfӅ  W W < < ` Ƈw]wyՇf`LӅ –%  7 ~zzzpzlzfӅ %  7n f҅ %  7F 7 D 7 6 m f҅  w҇f҅ J%  7 f`҅ %  7 f4҅ %  7" f\҅ %  7 ҇҇&ff&  2f& f ZeeDebug file closed -4x0KERMIT.B[001011]K11.TSK;1K;1SkPlease use the SET LINE command HANKERMIT link disconnected Ascii text mode set Binary mode set DEC_Multinational mode set The other Kermit must be able to support 8 bit prefixing Without this feature, the high bit will be lost on every character sent The filetype must be of the form .xyz as in: SET BIN .SAV or SET BIN .TSK The default binary filetype list has been deleted Error from $PARSE - Directory for files set to JUNK.DATDirectory set back to none (SY:) Opened Log_file Kermit-11 supports the LONG PACKET extension. It does not support SLIDING WINDOWS %SET-W Unknown option in SET RECEIVE %SET-W Unknown option in SET SEND The SOH character must be between 1 and 36 octal Receive buffer size set to This size exceeds Kermit-11's internal buffering of bytes. It has been reset to that value This packet size exceeds the host's input buffer size of bytes. This may cause the line/port driver to loose data at rates greater than 2400 baud. The packet size must normally be in the range 20..94 MAXThe escape character must be a control character RETRY should be between 3 and 30 TIMEOUT should be between 4 and 60 (} ‹ ΋ЋXB |T|(*12N;<FH MNUVabij0prxzxx敨ĔŒĔҌԌٌڌ~ALLBINARY-TYPEBLOCK_CHECK_TYPEBLOCK-CHECK-TYPECONSOLEDATEDEBUGDEFAULTDELAYDIRECTORYESCAPEFILETYPEHANDSHAKELINEPACKETPARAMETERSPARITYPAUSEPHONERECORD_FORMATRECORD-FORMATRELEASE_NOTESRSXSTART-OF-PACKETSTART_OF_PACKETTIMEVERSIONDIAL nfl| ϖ%   ` Xԇė N f h P D  ~  \  : ,     X  Fȗ Ӈ w D ̗  7 f& 4n e  !f& &* ƶe7<    x p   \ TӇ Jf& n be . &fn f&f peff ee  ҇fXp 4%f& Xp Եe fXp 2%f& Xp e p҇fXp % Rf& Xp je* 6҇fXp %. f& Xp 0e< ч@ f&  ep чt z ч~ ѕTf& f eeѕ.f& 6f eff ef&f vef&  be .e ׭    ׭    Ї11 f& & ebe@fR ff ex | vf&  \ T Lf& & Dϖ%Ț 0̚ (f& & ϖ%  f& ܅ Ζ% χPf& L e  n No0AHѕ ~ e@UՋeLo n  f Е Е f& & ee:f&  ne :τo >" (o .2 o 6 Added CTS2424, Also SHO DIAL ; ; Copyright (C) 1985 1986 Change Software, Inc. ; ; ; Its about time for a DIAL command. Would be really nice to use ; on my PRO/350 a KERMIT.B[001011]K11.TSK;1K;1bur H 4eP  hf& & e` @ He  m @ m7r f& & ͖%, : m@ m7r> hf& & d͖%T Pb H·f >f& *ۅ 8͖% $· f& ۅ ͖% ·׭ȁ   ͇  ͇p$  @ ͇ D h ͇ l  ͇: v f& & e ם T  F > f& م 6̖% "   h & 2 6 B F f p t | ̇ &e@f& & e  ~e@f& & e Ԟ Ẋ؞ N~ɋ  > 6 ~ $ɋ ff 0ee~ ˇ , 0 tm 4 B ef&  ЮeF J ˇf& N ef& I ef& B e 4 9@f2؅ e &f& f ʖ%f&  *ef&  ef&  e& fLJ̡ P fׅ  e & .LJС xfׅ %& LJflʋI ʋ  & RL 2D& : f& ԡ Nef * f  ff e `&  SHOUnknown SHOW topic No debugging or logging is active Debug file is enabled disabled 2MhRemote connection logging File opens and creations Packet logging to logfile State logging to logfile No remote line has been set Current remote link device name is The current speed for the link is baud The time is The date is Directory for send opens and receive creates: none Kermit-11 Filetype set to ASCII Filetype set to BINARY (fixed 512, no carriage control) Files will not be superceded #:1-Character-Checksum 2-Character-Checksum 3-Character-CRC-CCITT Connection escape character set to ^ SEND packet eol character (octal) SEND maximum packet size SEND/RECEIVE packet timeout RETRY maximum for packets Characters Sent: Received: Time in seconds: Type Last Sent Last Rec Tot Sent Tot Rec Total character count, less packet framing, but after data formatting (ie, includes repeat compression and prefixing) from last transaction. Physical data rate: char/second File transfer rate: char/second Pause time before packet transmission Delay time before sending SEND-INIT Created files will be Stream Ascii Created files will be Variable with implied CRLF Handshake character set to XON (^Q) Handshake character set to CR (^M) Handshake character set to XOFF (^S) Parity is set to НȝНODD EVEN MARK SPACE NONE TC.DLU is set to current system setting. PRO/350 console is set to 7 bit mode 8 bit mode Attribute packet transmi ssion DISABLED ENABLED RECEIVE start of packet character is ^ SEND start of packet character is ^ Default binary filetype list: none * Current defined phone numbers None defined A problem was discovered with attribute packet processing in versions of Kermit-11 prior to 3.49. This implies that versions 3.49 or later of Kermit-11 will not be completely compatable with older versions. The best workaround until a copy of version 3.49 or later can bZKERMIT.B[001011]K11.TSK;1K;1ye obtained is to disable attribute packet processing with the SET NOATTRIBUTE command, and manually use the SET FILE TYPE FIXED (or SET FILE BINARY) command on both Kermit-11's in order to transfer binary files (such as task images). For further information please see K11.BWR and K11INS.DOC COP blocks copied RENDELTo: p֪| h֪|2 `| X(}~DETACHX@Ѝ~đҏԎꐖR~~4~,~~~~LSRGITNYCEIFCLDUESWMHQRKPPJVT n7 ~flr і% , '7  f f&  de & fn % ` V7 $ > Շ*B \  R & b҇`  Հnj^7 `7 X7 V7 x87 14,40 2($ffH %BCAe7 ʊ& N f 7  f&E e  f&dN ҕe ~fH v%fH n fH>NY e " ll (fH %fH  fHY 4e ̞7   r@fF   f H %1 f  $ 7 fS >  |3fH x%  fXp& L%Xp dfXp&E Re  ښ H >fH %eއ֊& ~  f&E ړe f&d|Y e  Ȁ  7 % f&:E vef ඖ%fn n 3f&dY 2e l5xf    f&E e Pff  @ ff&vY eeP I& N $f `ڜ f Ӏ hf&Y Xee` @f&Y .e I& N  >ff %& @  J, && JXp Xp eXp& & lXp fXp&dY eښ I& N  ff ʫ ff t   JD&d  V"2".&d  Iɋ& N f ~%@ j f   f D%  ښ & P7 0 ff de & ~f&&0Y le f Ν% eP :ff e *(ff ee& V Ђ f&Y ee(  2 f 8% >:ff Je *(ff ee& f Ђ `f&Y Pee(  f % fXpP ښPfXp e &fXp& %fXpx @e f H  fXp& j%fXp % &Iˋ& aˋ & #7 fG effH 4%BCAeWY f T% Ç7 fvG effH ̐%BCAeWYWE fH 暖% f К% ‡  7 @ 6f6&R $efR  N‡  7  f&C ތe f&dU ^e ffD Be ffT &e f&dW e ffE e f&dH e fffR erfile ; receive-file movb r1 ,state clc return recs.d: call rdata ; receive-data movb r1 ,state clc return recs.c: clr r0 ; complete sec return KERMIT.B[001011]K11.TSK;1K;1[ fffK e @ȋfffC fe ffC Le @ȋfffI $e ffI e 7 XJ A@ B& e  f W-ҋ@  & e  f ˀf& H%EeX  ` 7 7 ffG ŠeffH ܍%BCAeP& N   7 B7 < "- V& N -f8fG (e* L -ffG eP j ׷n  fF : 7 d7 ^   z fH ( %fH fHY ֊{} 6֪| .֪|2 &| (} (}\ (} :}© :} :}V :}Ԧ :}D :} :}Ԫ*[001011]K11PRT.MAC;1+.6/ 0D6ׯE7@_E 4J66B U|s(00KERMIT.B[001011]K11.TSK;1K;1Ɵ  |z,& b 5Bŀ7& < "ŀ7^ $B H& ZC  l~& <f   f@ W ׭ŀ ~ff  V  Ĺu7 r 7 l7 f7 `7 Z7 T7 N qu67 du P p w*n `+u6'uD"n F 0 z4tqu5`ug  t L D] tKBttt6fn  f& n "e , f&  Ӗ%Ė Ȗ & re@f& & طe֖   ԡ& ѱ  r | ^ !7 sss6ss ssss6 < f * R qs7os67hs~sns7 xs Qs7OsNs[sHs;s9s9s8s68 0*s7(s's ,rwrrrKBr7rrr  :& ϱ rr Զrr rrr P gr7dr_r6 *  Cr7@r^;r6 X \'r$rBr8+r6"   Ќ    qqef@ $"ь  e&f  R~% Wq7Tq7iq tA d PfŀD& N V fn Eޡ5Uzޡ fn fn %x 5 5ffB@ z~%Read error - ??DETKEY error - DTR not present or has been lost CcIiQqRrXxBb?Hh""&&::DDVVzzzB Try to send a break to the remote C Connect back to the local Kermit-11 I Drop and raise DTR (for RSTS only) Q Quit console logging. See SET LOG R Resume console logging. See SET LOG X Send XON and cancel any active XONs RUBOUT Try to fake a break to the remote ? Print this message   w pfn j fn e fn  fn  ff e i cf D  Y f %fn ֯%W f \%f p%(fff e  f 2%   & f  fn J%fn Please use the SET LINE command Connected line and console line are the same unit Connecting to: Speed: Type Control C to return to the local Kermit-11 Failure to open terminal line - 1 ; exit on ';' chtype '[ ,2 ; start of a directory or uic chtype '( ,2 ; start of a rsts style ppn chtype '< ,2 ; start of a TOPS-20 directory chtype '] ,3 ; PKERMIT.B[001011]K11.TSK;1K;1 E ,򸗇G^> av+u <3!rHº^/M2 )iҤj* osɒ܊3l5LMC*P"2!I 2HdmCALI7jdͧR4][(x\eGMן8_7F/#ڣ7#C" $@?=Hn)-<:L)>` ILv iZPʄߏ};(,V7=7TM:q?;XzysZ Ǻ6#die~=EhB!2(yOyt4qV^.%sۄ?]̙#%̈w%~H`a[%eD'Mu#jꅧ?t,hS]gϧ?pEe8>&f7ɊI;Q.Ա?t|o :{y}&JԾ ŷeKgqVvdy<6JgyaBӄ)]a܏e7|Sf81c:$ܺ6?w[*0ۑ/ᮧ*\&5xʨmIx^R]L]6,@nЪyX&uU"#dvHxǟ u3lٍĬ~8 ~%^Pd͖T_2zDoUۦXaGmV܀oy?rU{"Qkfcu*,1VlNEɺ bLCP4Ő`]kqkC6#rI[F$C8aIK$o1g7A|@8L;c'Ⅹֳ.j u.&FOaDL:b){:WO(7&yY1Fş Zzl/\PW?_^Z$zs'2dpv TvK1-~bS~LY4*QASh+v@\5}W65B01@{7K]a1(2JR[+@FGV=ā2('DtOywNcV[Ҭ>Nla7zzW6=J5Ad+2{G!I R <:SF~ptn΁on_Cx|{O'{}cTqe{x9`O1LXy>* {N|sd]fd/S[4H2G0=e98wUWXT9Vf#ds4*13l NdzS+P+5Y h;Vl{ʹF{ӫO<Xœ^ C=<׆` ڇe"/J_18t9/6vvǯ}h MLԼD~Fɣ SRx_A~XzhFCnuUyb>^1O.lK)^tRLaϨm?o4 kdarl !e)Fw~8o(؟CNlS%A[6X,Юk5o"k9-?aI9QDryrOyU6_3/6ӑwz3 ԒOWlS9[M5v6Ãl$1a ʦwW ZYa Uwʊw'1Z+1bjt 0h]T+*5iwA|؂ϣ"/Ntth`LS2N"Q*+V4ԍ&1V#%#~ǰMvXӠpZ碪= +$yۊ&A6&݃Wm%Z|i>Dڼq`\0ƌY3c7|G>PC($n/GG֮T *f ;E6s|\aly[1\*mO!?ur\ߜ ܅4 vHP p@-R< ڠ1 83/M`Ojb %:I G^z:z YY\(z}4`TNHه;+:7g]O15VR Ӳ' = = +F`.IJS]W |6,4Z5䯨r\,\vbUH1<:O]UwmtvZ|{0gC|sg`EkxCD>h% qrcjH |Le)"eV*z#RbQR.)9Wl c$fhPoWHof:IYo>nC/@/#C"m yJR*~Q6JqKz3h#)KL_:1hQW45T3#5^ ,tq>%r_cgE)+3>[ZJ&>bVMf % w 7 :7 47 ͋ 7  j  0 X 7 V\ 1 ~ M B *   &  ` ~f&  ef   f<f e 0& bw &f ͋W   ͋W T&ff ڥ 17` E = f& ܧ%  .1$ ̋!  Cע*ˋ̋az   |ZN J &f & Wf& ,% J1 7B& 8 8  & Jd f&  eh 7 ̋ f& & el bЩ &f& & \W1 f  7,p     7 ̋ f& % 81 B .5+,4 &   ц~ f&  e f p f&  ne : %f  l @B ff ޠe 1     $ Z ^ f&  eb |  ܲ Printing default internal help Help not found for the requested topic Additional information is available on: %Kermit-11-W Cannot find the Kermit-11 help files or the task image high limit prevents mutliblock reads. Please put K11HLP in one of the following locations: |УŽɎЎ׎ގ#*18?FMT[bhov}ÏɏЏ׏ޏ  '.5p@p"07f&  RSX-11M 3.2, you will not be supported for Kermit, just as your system can not be supported by Digital. For example, RSTS/E 8.0 support expired on 31-Dec-85, as v KERMIT.B[001011]K11.TSK;1K;1) ff v  *  l 6e       ԇ&f&ff& fl eDf f& &2 efft ef de$ 0( ( ., eAt6E`ҕ  DtEe0tEe0Ee0 f&  ضe ~` d eAt'B`f&  |Җ%h hf j R ~l Dp :Ӈf&f& Ԁ f & e Al@  Ѥ~e@e$IMAGEALBUFFALTCONARGBUFARGPNTAT$ACCAT$AREAT$BILAT$BSIAT$CREAT$DISAT$ENCAT$FABAT$FORAT$IDAT$LENAT$PASAT$PR0AT$PR1AT$SYSAT$TYPAT$VALATRCTXBINMODBINTYPCCCNTCHARIOCHKSIZCHKTYPCMDADRCMDBUFCMDLUNCMDNUMCONESCCONPARCONSTSDO8BITDOLONGDOATTRDEBUGDEFDIRDOAUTODO8BITDORPTDUPLEXEN$SIZERRTXTFILNAMHANDCHIMAGEINDEXINOPNINSERVJOBTYPKBIOSTLINKSTLOGFILLOGSTRMAXTRYMCRCMDMODEMNUMTRYOLDTRYOUTLUNOUTOPNPAKNUMPARITYPAUSETPCNT.RPCNT.SPNHEADPROCTYPROCOMPROFLGPROMPTRANERRRAWFILRECCNTRECPARRECLNGRECWINREMOTERPTQUORTWORKRTFLOWRTVOLSENCNTSENDATSENDLYSENLNGSENWINSENPARSERMODSERTIMSERWAISETRECSETSENSIZESKIPFLRECSOPSENSOPSPARSZSRCNAMSTATESY.INITCDLUTESTCTIMESTISTSTMPERRTOTP.RTOTP.STSXFLGTRACETTCONSTTDIALTTNAMEUMDDEFVTTYPEXGOTTNXMODE Can't find symbol in internal STB l8L Byte data, size Word data, size ()  pBp   p ґ#ڑݑ " "   " "##,?ADF/ " " "W "JYxRT " "u#| " "ڍ " "Vɒ#Ғ " " "ْ " " " "<%#,? " "A/ " "]W "J_؎RTY[Ƌ " " " " " " " " " " " " " " " " " " " " " " " " "6Փܓ " "ޓ " " " " " " " " "n #  " " " " " " " " " " "% #.F " "HD " " " " " "MV " " " "ތ] <dg " " " " "x " " " "  " " " " " " " " " " " " "N " " " ""ON LINE.ONLINE8BUSYHFAILED CALLTNO DIAL^VOICElTIME OUTRINGINGON LINEONLINEBUSYFAILED CALLNO DIALVOICE΍TIME OUTRINGINGON LINEONLINEBUSY FAILED CALLNO DIAL"VOICE0TIME OUTRINGINGFRingPBusy^Dead LinenDisconnect~Modem ReadyNo AnswerNo Dialton eNo ToneOn LineʎOn Line OriginateRedialingON LINEONLINEBUSY FAILED CALLNO DIAL VOICE.TIME OUT:RINGINGJON LINE 300\ON LINE 1200nON LINE 2400ERROR CONTROLNO ERROR CONTROLAttachedBusyDisconnectedʏError؏No answerNo dial toneSpeed:AttachedBusy Disconnected*Error8No answerJNo dial toneSpeed:bCONNECTrNO CONs: Yes LONG Packet protocol support Yes Sliding Windows protocol support No Terminal emulation: Yes Communication settings: XKERMIT.B[001011]K11.TSK;1K;1yNECT!ON LINEON-LINENO ANSWERDEAD LINEBUSYEND DRINGINGVA212PA HELLO:I'M READY*D ?%s DIALING I KStand alone VADIC VA212VA212PAR HELLO:I'M READY*D ?%s DIALING I KRack mounted VADIC VA212PARVADIC HELLO:I'M READY*D ?%s DIALING I KGeneric VADIC with autodialCTS2424AT Modem ReadyD%M%B%S +PT&CTS/Fabri-Tek 2424AD V.22bis AutodialierVA4224 HELLO:I'M READY*D%M%S%B DIALING I KPTBVadic 4224 CCITT V.22bis autodialDF03%sDEC DF03AC Autodial modemDF100ReadyReady%s# DEC Standalone DF112DF200ReadyReady%s! DEC Standalone DF224HAYESATZ V1 OKOKAT D %s MICROCOM4445 SE2 S1C0 SCE ON !!D%s MicroCom SX1200R212A RIXON R212A INTELLIGENT MODEM$KNUMBER:%s DIALING:RIXON R212A Intelligent ModemPROTMSUSER_DEFINEDNo translation found for number. Continue ? No connection Excessive RINGING... messages returned Operation aborted under user interupt No response or invalid response to dial commandCONNECTNO CARRIERBUSYERRORRINGAB8^ˋf D   *ʋ  Ƞ ̠ f&  eԠ ʦ & 4   2i|n   i  ؠ j bYb ׭X ׭T|n P  .* &; Z8 7p3, 4ȋ . \ !fn e    h& Զ & D  $h&fn %  "v|n G` P H @ 8 0vf&  De f&  "e ~f& ( e  ׯ0ׯ9wtm/eҔע ДҔ  ˋ9 pl ~f& `Յ ~e Jȡ f& R ^eRf ƨ  ʋYf&N l& Ԁf& e ʋ f&  4%&   ~  ʡ  Ρ n f &fҐTn  f2 f4 f &  d xˋ1 e& Ԁf& e & f f%   f& %Ґ& jf % "f &" :  J B 1 Ґ DҐ 6 f. f0  f& Ґ e & f& ̐ e  f %P  5  Ґ n +Ґf 榖% ŀS $W W r&  l  e*2eҐ  (%f& Ґ ާeT Ґ f J& dҐ  Ґ  (Ґ t -Ґ ` 3Ґ L  X p Ґ f & 8Ґ :Ґ ʋ=%7Зs,S(p"PMm 2 4 Bb     & : .FCTR LB:RMSLIB/LB:R0MAPC:R0RSES:R0WTBS RMSDP0: .FCTR LB:RMSDAP/LB:B16PG2:B16SAV:B16CH5:DAPIO:R0CNVT:R0NFRT-(RMDLOC,RMDREM) RMDLOC: .FCTR LB:RMSDAP/LB:R0NFLR RMDREM: . KERMIT.B[001011]K11.TSK;1K;1Hf % ŀB %f  Z  L ff& e%&ff % &ȋ AZ @ : f&f e  t  ‡P ,   w”0af&  eӋ f&  %ȋ  f& & Ĥe ΢ *SҢ v֢ n f ^AeҐ dҐ @ NҐ bGf& Ґ De     2 6 J Invalid number! No previous number! Using: Please use the SET LINE command first Please use the SET MODEM command first A dial formatting string has not been defined This modem type is unknown. The known modem types are: Using: Modem in command mode Failed to get modems attention Modem dialing Call failed Connection made, use the CONNECT command to access remote Remote phone is ringing No modem type has been SET This is an internal modem The option has not been SET Modem message Message Class Successfull connect Informative message Failure to connect (Modem type: Wakeup string: Response to wakeup: Format for dialing: Delay for dialing: }2&fAB?ѕ ~ H/$?C~ Τ9jץp`EPt@0Ǧ Cyէ1Q切p]`Pǩ@8 0\ |ܪ(N«,_ER$ABO THIS ERROR CODE NO LONGER IN USEER$ACC F11ACP ACCESS ERROR OR FILE IMPROPERLY CLOSED OR CREATEDER$ACT CURRENT RMS ACTIVITY PRECLUDES OPERATIONER$AID BAD AREA ID(STV=@XAB)ER$ALN ALIGNMENT OPTIONS ERROR(STV=@XAB)ER$ALQ IMPROPER ALLOCATION QUANTITYER$ANI NOT ANSI "D" FORMATER$AOP ALLOCATION OPTIONS ERROR(STV=@XAB)ER$AST INVALID OPERATION AT AST LEVELER$ATR ATTRIBUTE READ ERROR(STV=SYS ERR CODE)ER$ATW ATTRIBUTE WRITE ERROR(STV=SYS ERR CODE)ER$BKS BUCKET SIZE TOO LARGE(FAB)ER$BKZ BUCKET SIZE TOO LARGE(STV=@XAB)ER$BLN THIS ERROR CODE NO LONGER IN USEER$BOF BEGINNING OF FILE DETECTED($SPACE)ER$BPA PRIVATE POOL ADDRESS ZERO OR NOT WORD-ALIGNEDER$BPS PRIVATE POOL SIZE NOT MULTIPLE OF "4"ER$BUG INTERNAL RMS ERROR CONDITION DETECTEDER$CCR CAN'T CONNECT RABER$CHG $UPDATE-KEY CHANGE WITHOUT HAVING ATTRIBUTE OF XB$CHG SETER$CHK BUCKET HEADER CORRUPTEDER$CLS RSTS/E CLOSE FUNCTION FAILED(STV=SYS ERR CODE)ER$COD INVALID OR UNSUPPORTED "COD" FIELD(STV=@XAB)ER$CPB PARAMETER BLOCK HAS INVALID ARGUMENT LISTER$CRE COULD NOT CREATE FILE(STV=SYS ERR CODE)ER$CUR NO CURRENT RECORD(OPERATION NOT PRECEDED BY GET/FIND)ER$DAC F11ACP DEACCESS ERROR DURING "CLOSE"(STV=SYS ERR CODE)ER$DAN DATA AREA NUMBER INVALID(STV=@XAB)ER$DEL RFA-ACCESSED RECORD WAS DELETEDER$DEV BAD DEVICE, OR INAPPROPRIAT E DEVICE TYPEER$DFW ERROR OCCURRED ON DEFERRED WRITE (STV=SYS ERR CODE)ER$DIR ERROR IN DIRECTORY NAMEER$DME DYNAMIC MEMORY EXHAUSTEDER$DNA ZERO DNA WITH NON-ZERO DNSER$DNF DIRECTORY NOT FOUNDER$DNR DEVICE NOT READYER$DPE DEVICE POSITIONING ERROR(STV=SYS ERR CODE)ER$DTP "DTP" FIELD INVALID(STV=@XAB)ER$DUP DUPLICATE KEY DETECTED, XB$DUP ATTRIBUTE NOT SETER$ENT RSX-F11ACP ENTER FUNCTION FAILED(STV=SYS ERR CODE)ER$ENV OPERAT:8Tu^'9=DYo' `,5XhS+ur({T9C-MBXR pgL^BLYn˨ި7Gj|ΩBo )IaaaaaaaaaaaaaaaaaaaaaaaaaaaaBad parameters/Insufficient dynamic storageInvalid function codeDevice not readyParity error/Insufficient dynamic storage for sendHardware option not present/Un-assigned LUNIllegal user buffer/Device handler not residentDevice not attached/Task not activeDevice already attachedDevice not attachableEnd of file detected/Issuing task not checkpointableEnd of volume detected/Task is checkpointableWrite attempted to locked unitData overrunSend/receive failureRequest terminatedPrivilege violationSharable resource in useIllegal overlay request/No swap space availableOdd byte countLBN too largeInvalid UDC module #UDC connect errorCaller's nodes exhaustedDevice fullFatal hardware errordevice off lineBlock check , CRC, or framing errorDevice onlineNo such nodePath lost to partnerBad logical bufferNo dynamic space availableNo data availableTask not linked to ICS/ICRTask not installedDevice offline/Illegal mapping specifiedInvalid escape sequencePartial escape sequenceAlignment errorAddress window allocation overflowInvalid region IDInvalid address window IDTransfer rejected by receiving CPU/Invalid TI parameterEFart up lun.kb == 0 ; assume if channel 0 --> terminal lun.in == 1 ; channel for input files lun.ou == 2 ; channel for output files lun.lo == 3 ; channel for pac KERMIT.B[001011]K11.TSK;1K;1JN already specified/Invalid send buffer size ( > 255.)LUN locked in useInconsistent qualifier usage/Invalid UICInvalid device/unit or device not a terminalInvalid time parametersNot a network task/Partition/region not in systemTimeout on request/Invalid priority ( .GT. 250.)Connection rejected/Invalid LUNInvalid event flag ( .GT. 64.)Part of DPB out of user's spaceDIC or DPB size invalidwN} wF})&f\<  *- *- *1-*4-33@@@@@@& \@ q(1,f& _e B@ rr(2,\<Uf& _e !1* 1-ff& ve   ʁ (  l  ef&  ef& Ԟef&  ef& ef&  e&   *- < *1-3E<@ "1,q(ff <^e ff e  l@ l    e  tff& e f&  ve  % !ff& ef& ,ef& 1 ef B &-W  ~% "& W@   W ҕ R ~Bf(& 8e`  File renamed to Files deleted: _Mp:?Can't start job ?no PK's ?bug in openpk f&& WW-N& WW- N & WW- N fff& & f 8estarting - & & & ffff et\f&f \ Z  0  e \ \ \. ~[6[e[[[ ӝ[SS@- eSS5 3 @4ȋ44e@4ȋ44e L[ <["  [[6[5    4   z&ы "PP    4Z7Z7 Z 4 B~4 TZ  n ?Z7:Z4 KB1ߕˋ e fE Y6YY6Ye & e @ pYY7YY6-Y Ye e  e f e %&f F t@  'Yw$Y Y6*Y    УY Y Y7YY  PK_ߕߕ ˥˥:&  x4 JߕvX6t $ߕ6ߕߕ_6 &   X6 X  ` ЕЕ   WW7W6WW `ЕЕRPN  HqfW6\W ; .SETTOP area. In the case of XM, however, we have a ; problem. In order to reduce the size of the ROOT to allow ; K11XM to run as a foreground job we ende fKERMIT.B[001011]K11.TSK;1K;1:F HWI~& أ   V7V 5@ 7WeV VO % ŀ5?˥ ˥9 T P $    j F ˥ V   $   < 5 5 nЋ 4  7V-U "&( .$ ~"&$(. X"&($ 4&a $"&$( .&f - (4 &f~m ~& "&f f ?E~     ` `?TTVTOT7cT&  *&f ~&"  .&Ћ T7 T7 T%, 0 L P X@ x @@ff ee@@T L Default Kermit-11 help text BYE CONNECT COPY CWD DELETE DIRECT DISCONNECT DISPLAY ERASE EXIT FINISH GET HANGUP HOST LOCAL LOGFILE QUIT PRINT RECEIVE REMOTE Send a command to a remote server BYE Remote logout COPY Copy file1 file2 CWD Change working directory DIRECT Remote directory listing ERASE Remote file deletion FINISH Exit remote Kermit GET Get file(s) from server (see GET) HELP Ask server for HELP HOST Ask server to execute opsys command RENAME Rename file1 file2 SPACE Inquire about disk space and usage TYPE Ask server to type a file WHO Request a list of who's logged in RENAME SEND SERVER SET Set parameters. See K11USR.DOC ATTRIBUTES BAUD BINARY-TYPE BLOCK-CHECK CONSOLE DEBUG ALL CONSOLE CONNECT FILE HELP NONE OFF ON PACKET STATE DELAY DEFAULT DUPLEX END-OF-LINE ESCAPE FILETYPE ASCII AUTO BINARY FIXED NOAUTO PROTECT SUPERCEDE TEXT TYPE HANGUP HOME IBM-MODE LINE LOGFILE PACKET-LENGTH PARITY PAUSE PROMPT RANDOM RECEIVE END-OF-LINE START-OF-PACKET RECORD-FORMAT RETRY RSX RT11 CREATE-SIZE FLOW-CONTROL VOLUME-VERIFY SEND SPEED START-OF-PACKET TIMEOUT TERMINAL UPDATE SHOW Display current parameters ALL BLOCK-CHECK-TYPE DEBUG DEFAULT ESCAPE FILE-TYPE LINE PACKET PARAMETERS RECORD-FORMAT TIME VERSION SYSTEM Execute local operating system command TAKE Execute an indirect command file TYPE Type a local file WHO Display user's on local system Note that KERMIT-11 will accept wildcard file specifications for bo th the SEND command and the Server GET command, as in SEND *.MAC or, from a local Kermit talking to Kermit-11 as a server, GET *.MAC KERMIT.B[001011]K11.TSK;1K;1P"P#PУУЧPУУ &@@ff f% `f&f P% UЧ (2( 1, 2, p  *- *-ff .[e@' f Ze N <f Zeff Ze  e&CW 444 4 4 4 "4 $4 &4)4(4 *4 ,4 .' ""$$&&))((**,,..r r @121@2@2P @020@$2$@2 @2 @2 @2 @2ff pff tYe@Zf VYeK1 &1 (2 &2 (Уff \Ye@ErУf :YeWuDaff Xef Xe  ԪXX lp[$)056=DdIZabtmnst|||WX XǧȧͧΧ[ӧԧ٧ZX  %6 ?PXUVW[\bjUrt{[̪NVȨϨШԨܨܪԪ [#$)*3<ENĪS\`bXfhYmtYxXXX©XȩީX XXX XDFXKRXV@Command file ? BYECOMMENTCONNECTCWDDirectory: COPYFrom: DATEDELETEWhat: DIALPhone number ? DIRECTDISCONNECTDISKDISPLAYSymbol: ERASEWhat: EXAMINESymbol: EXITFINISHGETFile ? HANGUPHELPHOtR_ tR_ xR_ ~R_ R_ R_  L_  M_  M_  M_  M_  M_  M_  DN_  dN_  N_  N_  N_  N_  N_  N_  N CKERMIT.B[001011]K11.TSK;1K;15MEHOSTCommand: LOCALLocal command ? LOGOUTLOGFILELogfile name ? LOG_FILELogfile name ? LOG-FILELogfile name ? NOTEQUITPRINTFile ? RECEIVEREDIALNumber of retries ? REMOTERemote Kermit cmd ? RENAMEFrom: SENDFile ? SERVERSETWhat: SHOWWhat: SPACESTATSYSTEMCommand: TAKECommand file ? TESTTIMETRANSFERFile ? TRANSMITFile ? TYPEFile ? WHOBYECOPYFrom: CWDRemote Directory: DELETEFile Specification: DIRECTORYOf what: DISKERASEFile Specification: FINISHGETFile Specification: HELPHOSTCommand: LOGINUser and Password: RENAMEFrom: SPACETYPEFile: WHOУ >| ͜{: { ,|R {$ ͜{ր ͜{ { { >|< ͜{ ͜{ ͜{N { x͜{ p{ h͜{ `{ X͜{ P| H{ @{Ė 8͜{ 0{ $B)BNbn򬓧򬭧*̧:ҧڧ2B J2"046=N Zj v"Ψب RR'0R;DZIJbN\apvjjjɩکzr%4?N[\jdfbuv~ڭ­ȪΪتܪҭ ",;R`v}ʭƫʫԫ ٫2:B J#,*<L*\lu~RRRZ¬"ɬATTRIBUTESOn or Off ? BAUDSpeed for remote link ? BINARY-TYPEBinary file type ? BINARY_TYPEBinary file type ? BLOCK-CHECK-TYPEType ? BLOCK_CHECK_TYPEType ? CONSOLE7 or 8 bit ? DEBUGWhat: DEFAULTDirectory ? DELAYSeconds to wait ? DIALOption: DIRECTORYDirectory ? DTRDUPLEXHalf or Full ? END-OF-LINEOctal value ? END_OF_LINEOctal value ? EOFExit or NoExit ? ESCAPEOctal value ? FILETYPEBinary or Ascii ? FILE_TYPEBinary or Ascii ? FILE-TYPEBinary or Ascii ? HANDSHAKEType ? HAND_SHAKEType ? HAND-SHAKEType ? HOMEIBMON or OFF ? LINEDevice name ? LOCALLocal echo ON or OFF ? LOGFILELogfile name ? LOG_FILELogfile name ? LOG-FILELogfile name ? LOGOUTLogout string ? LONG_PACKETSLong Packets ON or OFF ? MODEM-TYPEModem type ? MODEM_TYPEModem type ? NOATTRIBUTESNODEBUGNOLONG_PACKETSNOQUIETNOUPDATEPARITYOdd/Even or None ? PAUSESeconds to delay packets ? PHONEOption: POSOption: PROMPTKermit Prompt ? QUIETRANDOMOn or Off ? RECEIVEOption: RECORD__FORMATStream or Variable ? RECORD-FORMATStream or Variable ? REPEATTo: REPEAT_CHARTo: REPEAT-CHARTo: RETRYNAK retry count ? RSXOption: RT11Option: SEEDRandom seed ? SENDOption: SPEEDSpeed for link ? SERVEROption: START_OF_PACKETOctal (1-36) ? ST ART-OF-PACKETOctal (1-36) ? TERMINALType ? TIMEOUTTimeout ? TIME-OUTTimeout ? TIME_OUTTimeout ? WINDOWUPDATEUpdate interval ? У j{ښ b{ Z{ R{ J{ B{l :{` 2{n *{ "{ {H { { {Ԛ { { { {Ė { { {Z {D >|Ж { { {6 {h {j { {*[001011]K11INS.RNO;1+.=/ 0D6Xd܎7n܎ 4O== U|s<0KERMIT.B[001011]K11.TSK;1K;1e3mW1ɻ:c"-d57A%y@&*04[H1&kLϗD b1a0#X:y bE̾jc2atv'K] :>omHlI){ivOi> E>K?SGMמ]3g2L'fsW1Ȃ( *6VU|SIInMޖ5,~V苍\ \/pmB,~6ʢ|3@s,XtԴPɁO~-WyW.g4n#Jb Yc6F[IŸqW>kkb&E\)C|߉#qvR*:Gf6Kre4cUR**z pCwֹu{|TkJo-Sr k`]AYO/GoS.16'Js]N$kC)ðKfiC{ହ3!%O ظO/(Yhb7drsB}JONfA[3!aDlMm}uWʛaSkP. ^~mLDjSgryeM('iZTd<:${pf9҆P C6;%h=X Nn| 2 gʰKV"9 R6Nͦ~RLdNG&P)$1x{=7&%_$L)5-V<]ɳ`(‹@gc`%$~ߤVqjpjQJwVCdHd8&dGT`fI]GgX Qn'&ދҪԺ[t!> `u*mnu3!rMN=?KK-I{ӐWVs(?mN :^Q;f RGKž<+֩;ęQo$geXeB;zx(èrJo)dND~+x~T]3өIk*j^67 *Z[`H3IHs0xѓ-O ;q:anLtBtI3˽ZwcA.{4 ׼R|ɉ~f ~F@ duAh$VZQDmmRJ.4İ{k;^=?P>t\99: Ѳ8QKx 7axáB# 7jY2ukǡУKM]&}N?!xY{etRp_)SnBv+.dB%N8D@#py kddG$a [n^m[ dgFQ4VJHb'ok+̄2`zkD: D.g)u t#FfԴyc?m$p߈FX bBAP5?]hTgyNW-(#LnKp]JIdqalY#%ΊoBJ2j#ХQ ^LpY#ziGIkaD˺6^r`l^SOQk{Ufry+󳓂xyP֧%wdiHaZ9xA5Jdau0\s1Ѕe;MJv ^(4 O$S. :1" Q4ېL'Yk SEXe6,t1L{T}-bx򉢅- u5)K,j![#ڎ`}ǠvYlpm3vz_{(zź/0[;q,1GgB Ÿb;wue^^#d,͓d-^c?lG|05Ԕ(S$YoR?%>jv6etT_4>*=,W8>p)F7+m>[638dP}D |Ef0:35[W:R'2Ha ep#>_3F/ "P ϠĤޮvn_JVw׫?|:92}cmBI;ySⴅkwԩG{yas(։1DMr ,]<{e򊡾#R6z;n@p] /Nk㵱/AFjX!Ϸ?p5JX EiP Hðfy>@yY wn $^2d:O._#DcG084Vw&faqt~.<Bfuq~mT5(`#[},DEuj"1!1]+esh`vHXHL3/^J1Y;4{.:E\t!Bedt B{ :{ 2{ *{ "{ {J { { { {f {R {& {xf&BD  ,&   E WpУ`A r  DԐ &@ȋ. Õ. f&@fff L%@ (`W.~"@ κ NnˋD 8  0 ( e e@az m |fAB ɋ& N ‹ ʝJ  f nBf ,W. R ~ɋ W. R~en f&”;\< ”/> 0)7&0 `B & ’0 7 0 `  T‹  f&f6AW Tԕ\ rB re0e0e0T 6&kDF @  @ 6 @    7 Ȅ ڕ&   ԕ.ԕ"ԕD fpf % ԕ0ԕmMЕ C~p f& |%e ~ ԕ0ԕ"ԕ" ԕ0ԕ9ԕ#ff f& "%e~ ԕ"ԕ!̕A׭h̕I4 ff z   Eԕ!ԕ%ff& ܷe ̕0 ~ f&fE@"A .WD : PRB~fP&  b  &!   @ Ҷe  f7 P ʋ  & 0Wp e  wƂ f&&f 7 P  ͋W  >C& N0eB  <z  rƅ ׭B׭IJ 2 &! P V@  M-Cע# p Ĕ0 a~R  5פ"2"&  7&7&#pC 3f L  Te~ 7 v   ׭VD0& I p7 $7 "7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 Ňf , ) fpf %׭p W"W,fff Ɗ%7 v7 7 7 ă&   `@ ` B   & A @     8:@F.TSK.SAV.OBJ.STB.CRF.TSD.BAC.OLB.MLB.RTS.EXE.BIN.SML.ULB.HLB.SYS.LIBX0123456789.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZҧШШ֨P!"#$%&'()*+,-./01Jjnrvz~Unknown attribute packet type ?K11-ATR Protocol bugfix detected. Use SET NOATT and see K11.BWR, K11INS.DOC.  89A8BCAINAFab attribute error AIN89ABC 5KERMIT.B[001011]K11.TSK;1K;12  lm B~H7m ЙX̷dJXʷJ>r  <T111& @m d  t7 HʇL f re ɷZɇ&f R   @Bo7 ^YN7 HY׭, &1.˷(7*1& Ne & Ne & Ne & N & Ne RRRR  & Ne & Ne & Ne & Ne a ׭[1׭S3K)ʇf H   6oѕ^ѕ ѕѕѕ ѕ#ѕYɕ1 ɕ Bɕ~ ɕ B 2 ^ r_ѐ&Ƀ&f& A@o& N M& N F& N ?& N 6 8& N 1R .R +R (R %& N ҵ & N h & N ŀp_ & N ŀao ŀ~ po1w7 WY& WN7 w7   Z-XX    f %foѕ^ѕ ѕѕѕ ѕ#ѕYѕ1ѕ oȋȕ^ ȋȕ ȋȕ ȋȕ ȋȕ ȋȕ# ȋȕY ȋȕ1 ȋȕ &f5(4f  ~% @ f& \%A@ f& @%f  *%&f&fPPѕ ~@ & Bff ee- Qѕ W* ѕ ѕ ѕ 2 @f&f Hee fFf PeC HHf& (eeHH f& f e  ff ze eP ѕ ѕ fh7 bb7 \  f& H $eÁf07 **7 $  f&  eLÁf   7r " 쮁n ff& ۮ eow,w <f& ٮ ze V,  Lf& ̮ Ten ow,^wV B Pf& ٮ ef  7rL V ޮLo f& ۮ ؘeow,w pf& ٮ e  Nf& ̮ eLo 4ow,w |  f& ٮ Te&f f& & *ee׭r X    f& : e,ow,wf& A e bw ' UD"@Arf( U BQ Е*~Kermit-11>VdwSY:KERMIT.INILB:[1,2]KERMIT.INISY:[1,2]KERMIT.INIKERMIT:KERMIT.INI%Warning - You have requested LONG packet support but the other Kermit does not support this feature. Receiving file Sending file LengthTypePaknum  < Packets sent : Naks: Timeouts: < Packets received : Naks: Timeouts:  /* 5 ߥ& *  + 23E Ew ʅ   Е-   0@ rW e`fÊ    E  f&fP |\ \Y  & (% JJg\Ff& 4eeӕ ӕ ӕ d & %(\f& eeӕKӕ ӕ ӕ & % n   eP f&  @ef& < ,e  ff& eff L%eff 8%e&f K[+4|IU>~>Qc a:8 KK ! KE0[#"m/0 F8_Py.>  \=EA+d/OC@* P'f*"P&ei0x{A%Y*bi _cOwZ9FK9K &1_ b7S'bc#8xm{O{f@x&S?Re1#!_(6)D5 rd, ylZ4.qS^cEr^"  }KERMIT.B[001011]K11.TSK;1K;1_@ff& eeЕ, [ff& ܺeӕ S~ӕ ӕ ӕ e&fZӕKӕBf&f eW S ~ӕ ӕ ӕ ӕ ee&"  .&   EZ@Z;Z60Z7 zDZ : 6w`  Z B @ , ZK~f Y   *   YY.  fff e @A f _YZYwlYgYPK^Y@Y -Y7 *Y66Y6Y0Y Y Y6Y ЕЕ   XY7Y6XX XX D    У 7 XУXX XlXX zXzXetXlXjX jX8Xfɋf  0X,X,XW׭W tXXX pWWfWWW6W&5W"WWA B@5W5WWWeW hW -W f .  H@H  &fNf  p a VVV6VV r@Ћ@ 7V7VwV4V?VVV @VV6V' ~VwV6nV-lV ]VYVTV6HV  < E e 'V6#V V V VV6UV ЕЕHȕ6 f p^, Zѕѕѕ6  6Е P6 4~ e&f ]0  5U2U/U6$U/U+U*-*UU&  U6U  TwTT6 T T6-T  l]  "  * DTTT6TTT-TT qT6 fT |T-`TtT&f GT6A&  f V@ `f(Tf ee& f &@ n`T& *f Sf& &f e1 *, * EXXInvalid password or account, or system password neededExpired, non-interactive or non-dialup accountWACNT privilege needed for REMOTE LOGINSome quota is exceededWACNTEXQTASY: Space used Space free Unlimitedr ""r""r("v&{,v:E`:d\gIq!tw6xZ8 . : .R< .Yq> . 8ZB;K}68xrr\rg<rhF M z pB }qD!BxF% N&W|WK$W N+dEHp N.yW zC; zyx lrh^lsh%,Ee\xR~ Kq S~&!t!V3; <I; u~JK I &5 Iq@B JDX!L.&`,3d-/RELp]4* ZC :dF ftMw5yWE@:d*y+(k$c*e 83D*_X`p[|Wp:X`" X_ [8^Z@`X U H![ t!NV L"[xtdz+" ^\;FJh Z2fEU:hVc]A8*_s!xtd""`/ #}FE% X3 &|3 &""F&}8&""F'4<'p!t3(}s;,r 6,8,tl6,[,\,\,D",T[N1,fE,Kq7,Bx\6,z=,E.W:@s:y+y:Xq,:@G:2Fs not know about c eof for direct access files. Will have to fix c for RT when I get the rt version done. c c c c to compile: c c f77 k11hex=k11hex c ftb c k11h kKERMIT.B[001011]K11.TSK;1K;1 ::dPG:}L:M:a; X2O;$:<@fM"ElB"ENERT[MSlagMH:;O`;O`>OypD>OytDDOp!r`GOYbHOELODNO bOO%q~`OOrbPO`1tQ[McS}vaUr"0Us41UŞ0`X:}L^YPAZ\^L^b_w`^E`W3E`ZNW3dIq@B3dCf`s0fZ/\gr 6\g49\gt6\gF9\gKq8Hm$`L4q]aIqAIqYIqC_qt:|5ry:2rmXr(Yr\YrXrzXr&Xr, Xr3Xrk4Xr!LA2y:A3dTG8_ZL92F9&?962F9y:>9sH9vH9wH}AYUZCsNv`;=әi[Dq4EDRt"EbARHCTgs #Njs7MPjsZLj(i(z gKMSgZK&dx"mxo mxm\yi\ySi~kLRj[Tj{ml{%l{&l{(l{l{zl{{l{"l{ #l{&l{,l{62l{2l{[Ml{_Ml{Yl{ml{)ql{Kql{Uql{Vql{wl{wl{wl{xl{Aym{zm{3} m{m{m{m|l"6p4&m xn Dfmr o{ p{  p{ p{ p{ tp{ p{ {p{ s!p{ %p{ 'p{ 8p{ Fp{ Kp{ ;dp{ fp{ fp{ zp{ p{ p Sn wpi Xqidm[Km;ZTnqoqmro Bxn  nrnvnVNpnZtn&~m&;"$n&o'p&:do&yn&sm&n< xmXniMmimY2fnYoVnd_`nj gJpklLbnlpm~ BpJmXKnHpqE&qK qkf"qBx(qy$q""ԀXp #!m #Yqm#+}m#4}m& o&!o&fn,lm62n3hznI:,(pt:#znv:_m:0f:p:&"*n@mE`mIiqIݪq;K}p;K~pvLG6p_Mm_M&4n_My:n_MYqm_MymQ"nQnQt:mSH!|n?Tu~oYt mY$:|mZ,p_t dn_=dln_.paVNnnaN`8p3dZ0p:dy;2n=dwjndnodrndsLodtoNeHm8fltmffqf%rmfmfg'nfSmTgwqp"",np&qKq mKqnKq7M\nKq:doKq(ymKq6ZnUq`2ps-Npsy:Tps;KRpsmLpsvPpsoMps_ps`pta lmt Xqw.nwnw<fnwhnw7M^nw:dow(ymw6XnwSnwu~&nw(nwKqpwsVpwwpwFpBx@p@pe}&q}&q5]*p""vr &j y:X #wx[_ rУ' ૜,QУ,Ey:\YM^YMUqKqXz ~Uqm xBJxC\}@xCHx[K[o[}[L [`[Kr[y[ [\}[ w\x6yzyWyoy WTz XTz)xz5!x}3U<  %! N` )SQ 1E}6L L h~+"+"+"+"+".+"1+"y+"+"L p+"r `+"w P_(B^<n\%aJeF) w a15!9lUUk M^6l^KcT .IwV> ZNRQ} r|ZM04a2f%rA"b{Vz3+J@)IZ$dL C'LWMd6_c.8@`LjXN6-l#+x&jeQx(!)]AbWYpk6;S):ydi0hR KERMIT.B[001011]K11.TSK;1K;1+"Y H+"K@+"R0+"n +"+"+"+"+"J+"+" +"+"+"B+"+"+"+p+"6`+"P+"@+"8+"z0+"  +"1+"6+"B+"+"0+"X+"!+"!+"!+"9"+"D"+"K"+"#+"#+"%+"%p+"%h+"`&`+"&X+"g'P+"k'@+"'8+"'0+"' +"'+"'+"(+"(+"(+"v8+"8+"99+"`:+"y:+":+";+"A;p+"E`+"EP+"G@+"G0+"6K +"\K+"iK+"K+"K+"jL+"[M+"xQ+"R+"R+"T+"#T+"W+"W+"NX+"\Xx+"Xp+"Yl+"Yh+" Z`+"N`P+"`@+"`0+"e +"e+"kf+"f+"f+"p+"p+"p+"p+"Zq+"`q+"qq+"}qp+"kr`+"rP+"r@+"r0+"r +" s+"fs+"ys+"s+"s+"s+"s+"s+"t+"w+"x+"Bx+"y+"z+"z+"p+"h+"`+"P+"H+"R@+"Z0+" +"<+"+"+"L+"*+"2%@% % %k%nP%D%%%]@%% %%&%'%'@%(%,%50%8 %@ %Q%R%NX%X@%kf%f%\g%Iq"%Kq%Tq%t%'t%iw%w%ly %y%z%  %%%%%ą%Ʌ %%s%% %!&Bxn((z@(W(Y(Z(m((Z(@(i( ((5$9s;:T; zVN; VNVNvVNVNVNmVN VN!VN)VN2VN4VN˲Q3d^Qu~0Ru~U+U +U31-U_ 8U8U9U &9U#:U!~ Ba? Da8 a:La:NaLaW(aWaxZ,a@`aaP@b bp bx2b&b`'b(xb,xbp bYbpqbzbp b3b8^bV^bW^b`r$b`b bp b`r6br br br"bxsbH&bIb[b]ba^bs^bx_b`bw4b b bqb`b`b`b`b`b`b`b`b` bqbrbrb b bQ P b`  b" F b> B b? D bp  b  b0  b% b& b' b' b' b' bP2" b:L b:N bK b@` b bЉ* b b4 bP<" bn<" bo<# bp<$ bq<% br<& bs<' bt<( bu<) b<} b bp b G5 b bӞ bp  bzb"b#"b_b8bh bpQ p pWpYplpnPp!p,&p5pEpEpEpYMp[M@pcM p{Qp;YpYYp7[ p`pppq@pqqpkrpwp p+ pppٚ@*[001011]K11MNU.COM;1+./ 0D6\l9ˍ7ʍ 4 U<0 KERMIT.B[001011]K11.TSK;1K;1@SpTq{T+tU<bwBxw-pwx #zX#z8#zkr#zfs#z zzxzp!}}}8&4}(gf}s}x}V}9} ~p ~r ~ ~$@u~aT=r "C k k,kkkkkk<k,&kXk%k2k4ky:k:k:kEkH8k4Kk^KkW kZk+dkf kfkyqkx kykzk"kJ kމs&y,0z*5 .s(?";}}} } }ll llll  l l &ld0УJУJУ`TУ ^УhУdpУX vУУ,УTУ У У Уh *[001011]K11POS.TSK;1+./ 06,E0\7ļ)\ 4 Uas@|,V r[qU,O SYSYSYSYTISYSYSYSYSYOVϳ,Ojw~ ϳϳW/ sW/` s sffB&f e& & & & @f& & & Ε  eB:ҕEҕRҕ$ҕ ҕ C~ ,w60w.w&4w8ww w<whlw\w wppppppp KERMIT.B[001011]K11POS.TSK;1. *.*;*&f& &?e E & Y w   wt&f u1e? w|w vp& fYw b\ >w`:  5 Last edit: 29-Sep-86 (Command line editing) 6TȯAZ?ZeE @N&Vm    be?E? & f YP>PPJ P P P SY:nJ VF TTTTT b  ; Copyright (C) 1986 Change Software, Inc .include /IN:K11MAC.MAC/ .library /LB:[1,1]RMSMAC.MLB/ .mcall $compare,$fetch ,$parse ,$search,$set ,$store .m *[001011]K11HEX.B2S;1+ KERMIT.B[001011]K11POS.TSK;1) PPPnP <&&&&) Probable cause: Either RMSRES or an RMS satellite resident library is not installed on this system. !?5f5f9 `zc`w]4 Vc__C3 3  ,, UEs3wc\{_&f6{ B * ͋'% ͥ!ͥE%,  K5  PB2 %pˋ5J J J @ EͥAA I AAAAAA@AAAAAAAAAA bS J VS RSLS FS /6Sf&  & Vԕ 杔S  @ ^XURoUN SK & Ne N`f nA N`f ^ mVSr_& e & e 6` ,`E?t`E& e $[emR & e f  & Ne &  @ &  A C &  H~  l `fT  ff& "e e5Rfffffd [e  tRflR ' oo S f 0"eM~AWAWZ@ enq neRw R ׭Q1$׭Q3WtE& Ne & WtE& Ne & v E& e pQ&  & J  5 Q&f&B  ~Q)d& N !f % ŀwP~ &fn $%f&7 P4 4   w4  D k kwOEw:P`S& N 4 BP 4 NwШOEwPCS& N `=wІOEwO2St  (44B  (!& N  wO-XRS      A TT ef JEw:O?S& N Wq_ :EwO/S& N E`.Ot& @`D~E?t`E NEwN S& N B TA1 14f&  % % 65@OwdNfff ,!e f& d !e &fn r"%4 4 4 4 4 4 4 4 4 @ C~@   4 M O 7O O  4A111   \KERMIT.B[001011]K11POS.TSK;1PAZ@ eRnq Pne(Nw "N5 Nff& &&d Ve &4-=5 M90& df =@ P:`f& &f :eef& &f :ee @ :f&f ree0 -wLE& N ׭L1t E& N C׭rL3 t E& N CСTL׭NL  JT eXJw RJ &fDE  A. BE 1Jԝ+J %J & N &  FJT & J^ χ f&BC X  J7J  E&  7 I I7II 7I  EwqI W?W_&   IՀ& I  F eIw I &fB D /E LI7HIE& N  E7H  EwH&  V C  &ffA F He 4e 4@f& & >eK~&e 47 ^Ff&f tH CAAVԕ%S-ԕ TC̔$̕_ ~ԕ P~  03f&&GE eeVf& *e lef& f Ze 7 E&& NffNe&Ue e  &D׭nE fe % ffe %&fze %ff~ m  e 2 l  6E) &fo& v#%~ f~   %  ffo e&@@E@U6 ʋ  % RDJDFDfWtEf@@@UWt Ef@@@UE7Dt&f D  ev ՀŀEeՀEeՀ8ilf 1~f 1ff B3 f 1ff (3 # f& > effff Deffff Deffff ef & f f  l@ݷ7 S fff % E@ /2&  ff e 2 ll2 ff e2 l@ @  A    0 Nb0D:0 v1&,rn 2*- W- N0X:b1" /:~1Nf@ &0  @! ff FJ @ 6A Aff e@  @  0f& e f& ff  I  LB  8fff .e , 5@0 &  ff A AA @  e@  eAPPPPfA AABRRRRute paks ; with creation date/time. ; 53 13-Aug-86 09:38:04 K11PAK.MAC Add SET SEN [NO]XON so one can force ; K11ST1.MAC every packet sent to be prefixed with *[001011]K11FIL.DOC;1+sKERMIT.B[001011]K11POS.TSK;1/R R"R$R&R)R(R*R,R. fA AAB "$&)(*,. f A0 1  ff ~e@   A0ff fe@  @ 01 q1N,b1 &1 (ff Je ff e@  Af@ fff e0 0qq,b1 &1 (ff e ff e@  7"=@  ,lf&: % 82 lrv,l l (,l l  vl,bl . :ll Ҳ l v fA @ f&B ,b ,lNffl: e2 l :N~,b ,b    ll: l @ l  ff&l&: e f&ff <-*- r) *1-@f 47~575Dы 3p,0(f& e%H58D5@E . 5 558  l( f& be!H   A~ f z%@ Z(g~g?&f4 ק&m4 f 2+e f&D #C 'g~g?&&杄4 ק&m\4 1- V+*- ' *1-3E>@@@@ F' 21,1(ff e%H 585E A  ??~ @e  Bʋ%ʕ?  f L**- & *2-r(@ j&2,&1 1 11f e58  =p<l  p`@ e  &?e a`;b8bnp7N;R eR~?7? 8;^ 8 8N)7F)7>)76)7 8)u7u7 |) 7 7%fn   g 6&f& n eh &n n &(7 98 75hv$7un (u n '7 97 L8h %6h %fn t  :h %f& & $%Jh %TI& & & & & & & ^m& Ε & & & & u& & &   & & & & & & &  5<-e7 6 * 76  v6Z& & & & & & & ^m& Ε & & & Z7& & ^m& Ε  P'& & & & & & & & & 8'  sf z &ffvw  7 'W-~& & & & & & & & & Εf & & & & ^& ^m& Εfp H5R&w&& 9V5& & & & g& ^m& Εf  & & & & g& ^m& Εf  7 @4 & & & & g& & & f  4  4  x & & & & ^& ^m& Ε%  D w < & & W-;& & & & g& & & f  & & & & & & & & & Εf T%& & & & ^& & & Εf   fCק&"  rf  re0@e0e0Sӕ: & e& & & & Pf& ^m& Ε 3׭3 2 `f& Nh ew0$3 B xa )  & & xa 7 #2 xa^& Ae r 2  22׭2& & & &^& ^m& Εf 2 4& ɕ9& & & & f& & & Εfp A & & & &f^& ^m& Εf 1& )"׭1׭# 1xa^lxaɝy1 xa ~2 xa*[001011]K11SEN.MAC;1+.-/ 0D6QcR7@eQ 4J--v U |s(0 .even at -KERMIT.B[001011]K11POS.TSK;1_JEcMlL5LA.8y_(Lmu>JI]?'J&T8-0O\rF t]ǽdjBفC!v) *m 1#ݳD7]jsR6鰪? 'wO WKֺk+ ): ę >q~cu:!ς"$3sg k;m(]* AbqڠO`mNlCʹF| - i7+%FYGhmMxߨd xr9 >ݐ:E'3]dw5h1؝r>Ѻ" Ҁբ `LϜ xϢ"KE1px4WɑySѓ&lM)/q;à y+k`Y93K,cx4},{S)M!7C0 Aȶ$M"ND/'š`ޮ#aV+N _&QH; UDrgٔײ3lKА+@r ++[ʆk;AqND^zʿG$8{tkbE0i/d;pbKZ^rŻ8%3v[/98g_q͉Q| }LQF2tb7D48qчMբǙ_z`5ֱa0|Iݮ:ަڿ~OLc9 3G]*LPRL:@>L$z>  2+H<ݔC{24> 7H9o u,vvSR1Yag'AP{q/pM|A\,TŭR1 \Děo%)V0P^JM/W^ ȔO0dT>$A>BDo-jydVTZ^#_r"kw `42ZؑLu R)q 2hrHk;7./@sC˭<]`iԮlwPQq՗}2;:ů$g!S6XHzBn WuC6K5AD\祦 I,:m@L%BP"o餇"ˎ:$ {W7N`84GjwBxT~/i`sk}x7"}ը0& 7Y 5AΡ:b*g" @j1N=ӂp. `vj ,q{^ aD\ \xaPtJ0vkTW}Ɩ5Qvvin&veKdbq۴ac@c*{{ ` 5JPR$w2 ;xSטiRQH ^}3Bs>)7fo"fXK)to+ 95L?NOlj oԚm@C^]0<_⼵дϒC$0Ij~0_N/Q'?\.N;UGLBe._D|a?͌ GI>_J/: `^} *NOR.L =;C7bOriF<δ}/-X̙;z7eD%`USD?#xziGU|h/&ZVZn5T^,(|L]}YU6L(upS|QZ`szNX"2 .Xo+43)^a?\B T\Y7ENF(*Z.xMkC=,J"c 4gQcAkHZdd^QvS}Qg.zs’Jpx*SW{{ppB\\ZBB]}W+L ^ކ>e!!&xԤ%@BT EGn97Պ.bk\/0M ʈ dEmD60c} Tsؔ2,'i њAzgk5A:O)#W|P}\zsIK!miɰf7'&Z*xP^6S sWt L 23V-#P~?W5'{ ntz-n֙63{$ "fGNH )fC"}!+~>@Ae*h+hw3cE ?F'RsNYcAYk8_GA`v&Kj $~^W^ԅ@^EBe;N LvK6t%`e $- waIĕf)kjU ߟWR(h&O  #T['n@VB$fŲ<0âo{Ĵdjhj>2riB?ǃQqK1kycn}-CGi27Za,1PD.b:KaBҗ7` z3D\9 P D S%Ǚ$n%OUnxm35šbG"n"CZ7yhSgQyP Ɵ[o ܖxrg=R [C[L]1l0tN` Ik:=Ih-0Li6XT xT7vL4e<-qcVuIOLKo.Z+zHRYy^O4s=QT-%);UMlsc;ak)Bqi aE6CdI8 =&2E>(5>v5*74%F/P7SQ |L1&X: _=x:Z[H$2;AT1X(\Q KERMIT.B[001011]K11POS.TSK;1\!"xa2 xa /f1* ,& & & & & & & Εfp & & & & & & & Εf  2 xa^$s^ 00 ׭03 U& & & & & & Εf TOH6, D׭&׭!" /sUxa^lxaɝw xa 5n! xa.& )~:& & & & & & & & Εf  w&T>& & & & ff& ^m& Εf ׭J/T>& & & & ff& ^m& Εf & & & & & & & & & &  & & & & d& & & %   s& & W-˕9& & & & & ^m& Εfp ׭t.BA  w?f& & & & & ^m& Εf ? .--~- R %7 2 & & & & & & & & & Ε  sf % @ & & & & & && ^m& Ε ׭Z-P-  E& & & & & & &   &f-@@Ћ@ & & & & &f& ^m& Ε ׭,,fe Ph "  & & & & & & & & & & & & & The  & & & & & & & Ε    N+3 -++ݴ+& @& Xh& &f & ɕ9@ 0 xa & & & & f& ^m& Ε&  f & ɕ:1B& & & & f& & & Ε  & & & & xh& & & Ε   &?e f f&  +  wf & f & f) f& H"&fɕ& & & & f& & & p @ f2D v v&f & & & & & & & & &   )'m R& & & +&m& & & Ε  & )& & & & & & & ^m& Ε  & & & & & & & & &   f2D6) & & & & & & & & &    szh t~h lh ds & f& & |9&fʕ& & & & & ^m& Εp |(x( ׭r( W,hBh @h% :f& 2BD K ,hC,h hghc^&f&E& & & & & ^m& Ε&  E ׭'杢'  &  p & & & & & & & ^m& Ε&  N's &Cˋ8עA5עZעa/עz,פTעI)עi&עAעZעaעz ”:0 7 0`ߕ& & & f  Jw`נ & TI &f w2 e5ߕ&w@  DH& & & & & & & ^m& Ε  wDHנ6,0& & & & ^& & & Ε p & & & &  ^& & & Ε   e ׭D%׭<% 4% &  & & & & & & & ^m& Ε   Xs 2*7 , & & & & ^& & & Ε   & & & & & & & & &   |&fPP 0Е:&f&f@f=B Е-B BlehЕ-B `Е e&f&f@f=eB  Е:ee‹e:/ f&f  f&  Xe7 4KERMIT.B[001011]K11POS.TSK;1"P(,f 7  J? J& ? .  7 ֹ7 ʹƹ?¹*5 lf. e 2 Z  l p Խ6 6 *i &i f&& & & & & & & ^m& Ε  AC@ `ר   & f& & & & & && #& \& & & & & & & ^m& Ε f& i ee& & & & & & & ^m& Ε & & & & & & & ^m& Ε @.i& &@ j^i f& I fff 0*e fff e ffn K&f& & & & & & & i& Ε & & & & i& i& Ε   & & & & & & i& Ε ׭~ bi ti xi i | f& `wd R   Ћ >+& &   & f&杲  f&杄 ק&l f l   f    w" դe8  gg gg f& & ʕR& & & & & & & p iɋr %:nj * 7 < f  ɋ j j [ Z  f  7ɋW R W  f   f f    . !fS R$  fj VՖ% fj @Ֆ% R zj . 7B 2  Lfn fn e fn fn &fn %fn p 7 f # \f w  #  # +7d ɋf R !fH f8 #  fj Ԗ% j j j 7 J# #f # f # f " f # f " ɋW ɋ ffr "% fd\ j"%LɋW ɋ 1ff2 P"% fd :"% " f 4"% ! f N"% k .k  X ff ږ% % m jf& f efff e2k DB;!K 6k &&    BPk bk f n 7 *7 7   ff !  wnB@ fff % h!f& %  L!f& e  ' !f&` %  !f&B e hk k   7 ?7 fe XD ; k& N r  ~ 'D ! ff&& e  4~SGxpFm"I)/a P,&CN9 [`|m~4nXL4^pPYWb5:yV.V$63H=#  aT$Zֱ^jS4 ,$V(J.5{~S>,'f] U w*Z 3 7DF%+5P%(5"y Kqpp,ne d*WyW_1=!s \ZY;8}/  }KERMIT.B[001011]K11POS.TSK;1/ e   - f*X   R ~ k vk nw&fo& %f& o ek 4 <ɋW  l3ʋ" N 7 7   , ef& k e%&f T!  7@fn *  7 *  7r   7Zf&f BAt4 4 u CM5ŀ5 5נ Õ   נ .נ +E5 lË ȋР5 נzנa 5@ נ[Õ(נ]Õ)5 נ'נ"45נ ËҐ 5 `W W ~e &Ћ f&fA DeEff F 6f&f *eF`%f& ff e&f&BC ҕ C~A r e0 b~   -  A  ѕ ʕ*  &f& & ^ef&@ABD  &f ~ e  &fAC r@l r(lSl C& ˋ%ע  @ ע+ע-ע0ע9 & 0Wp e     U   Bנ0 נ70 `&fBCeEbltE ~&ff& %f& ee&f   !e&f  f& & %K~ %fP%fЋ P% ы % E&o#  eo %!(5'7@B('7@B4'(75^::KERMIT$LINESPACK - SIRCG RPACK - ?Bad Checksum: rcv,calc are !1BRcs ƍ#2$FW6etHZӾl~ Kermit: Aborting with error from remote. pak: Fubar pak type: Retry limit reachedHopelessly out of synch with sending KermitRetry limit reached, parity is possibly being introduced))))))sho$dp sho$dp: tst (sp)+ ; Show DIAL is a special case jmp xxsdia ; where we load an adjacent overlay global .sbttl routines for the show command KERMIT.B[001011]K11POS.TSK;1#6Breakpoint trap, PC: PSW: Pfc.YP00:~P.GkBq11/.2SU L8MKSgv B }KERMIT.B[001011]K11POS.TSK;1='XK0:'&1 <{ 4|~ ,,|p~ $>|҃ b|8 t|D | |З | | |^ | | |: | | | | |p |p |Ɩ | |> |8 |} t(} l:} dL} \^} Tp}X L}* D}$ <}Ҧ 4}6 ,} $}v }( } } }5ew b, Bv    5Bw 5  (5(UW       wE5 E  W ͇5  ,E  {uwBwv&wE U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U 5 ߥ& *  + 23E Ew    Е-   0@A W e`fÊ    E w eE D` bl lrw \  B eE"s    s-  Csl&f &  m  f A N  %&ff r[qr[q\zR{llll2{z{{r@{{{IqM~@{{IqM2~@{{IqMF~{{U(UZ~p~|I3d@p~|P|y@p~ |,|IwGp~ |>|IKqNp~ ||IU8b|}lU8P|t|IQ_8 P||Iyl8P||Iyx8P||Ix8P||Iw8`P||Id8 P||I38P||I8 P|}I8dP|b|Ii(}}""}:}I/"`}L}I0" }^}I1"}p}IŐd}}IrȐ}}I͐,}}IYҐT}}I%֐ }}Iyܐ }}ID␜, }(}Iy:ȯ{hRBwww~wBw~wBwBwBwBwBw6{zzzzw17 7 7 7 mZw TmN L׭m1׭U1S  7 p @dt& Z ة ~wL10(& 6 6 4f Ĭ  8fdE eA  n &  X5F( ѝѕ ff& ee( f&  efo e F l 0beq 110$ ; yes, say no errors cmp r0 ,#er$fnf ; same goes for file not found bne 120$ ; exit 110$: clr r0 ; no errors 120$: unsave ; pop these and e yKERMIT.B[001011]K11POS.TSK;1:D-, A K T<fJ ~   e + )fJ fA effp~ %BCAe& N 2 fJ  wDAw2fp~ A ? XVw  B@7 2.  r@"H - A )fJ B effp~ %BCAe& N < Afp~ A ?~|  lj7 \X  r@LC&f&f7 .7 .I S 1 -A l<fJ   fn %fJ f effp~ ș%BCAeʉ& N ЉVTAZWI fp~ j AWI-*"  r@7 F fp~ % #7   r@ VFq0~ 7  (@ p-l`A wl f f 7 P} bf~  Z% f~  e fo& ǖ%f~ o XeAl >f~  %f&~  % f&~  e  f&&\F Ze7fd8X 6effp~ P%BCAe܉& N e@Afp~ A ?   7   r@H fJ  f wxD ^^-THA ҡ)fJ L<D :effp~ T%BCAe& N ׭;2+ f&E ̒eAfdN e -^ fT %hfp~ ~ 7 ? @ 7 | 0.e7   r@ *   ZfdE e7 A׭lX׭dZZmw fJ  d wvZD T-PDA Ο< Bf2Z 0efdZ effp~ *%BCAe& N Z 7 Afp~ ؞  ?   7 |x  r@lf  7 ^-  V FBABCDFSZH@Sendsw - state is ENYT*@^ ENYT4ENYTDPlJJENYT…؅򅼅Sending file as file ENYTBTlExpecting ACK, packet type not valid in current SDATA stateLONG Packet size reduced, first data packet failed ENYT܈D N} F}V >}R 6} .} &}R }( }V }f }7 0w07 L1 7 7 mw m 7  8   @l& F t1&  f 6 7  wv wj w^  vf&<E :ef( ѝѕ 5 ff& e ff& xe    e(& - "AffJ  %BCAe& N fdLN Je<f and with the inclusion of ; the above copyright notice. This software or any ; other copies thereof may not be provided or other- ; wise made available to any othe  KERMIT.B[001011]K11POS.TSK;1*KJ  R AfJ  j %fJ  j fJ Y e7   r@ dF& u0 -z A  XffJ  %BCAeĉ& N ȧ Ήfd&N $e  ̦AfdY eCfJ  A - ; /40/ see if dtr or cd is up tst r0 ; /40/ if < 0 , then not supported bmi 40$ ; /40/ no good bgt 30$ ; /40/ Dtr's j KERMIT.B[001011]K11POS.TSK;1IR H f&h ֖% f&L e    ۷ $ ډ ڷ މ  &  nn j7  ڇ f f&  e xf VȖ% & ևf . fR % n& f   2 " 7 f Z 7 & & |f 4e & 87 & f >en0 l 4 tf lه| ^mtЕ j R j >f& & :ؖ% & ه Pff f& f de eP p~f& % <f& & "e  f e B pf& z%  ff& Ƽe H  & f f, &Ȗ%& ԇ&f& f be׭ ff . ? x? vD  &  Ċ   & Ԥ  J/ *C ~aɋ5~ѐ f Nѐf Dѐ f&  e f& f tef&   `e ~f&  Hee p~ f&  &e V~? P~ /B~ f&  e (~ n/~ ~f&  ƺe f&  e f & X npȋ5e~ & np f}f  @~}f r؃ n}-npppP EPBe~np F}fQ ~ѕ ~.}f ؂ }̕ 4 Z f|Q ~f&  ef&   ef& f e npʋ |? |'  |~|& a f& & BrABCDbDT"^C^Z 78 b|8 t| |< }V |   xЇ nf& n дefn   & >f&f eff eeœ Ȝ ̜ & ݮe@f& He ؜  B&f& v f& 54$' ( 5'54$' 5 4$'B (@?!54$'B (@?!9stance, the DCL system command .s 1 ##$ ASS/SYS DB1:[200,210] SRC$DIR .s 1 would associate both the device DB1: and directory [200,210] with SRC$DIR:. Explicitly given 7 KERMIT.B[001011]K11POS.TSK;1YƎƌ @ <t 8p 8 8   p<R p8z p8 p8 8   <R 8z 8 <j 8 8 8 H[ HZ 7 ^fn &f& TI~Ǝb7 7 \ƌv7 7 ڑcʒ J  "7 F ‘b e_& L J 2c-62`$ -ƌeeƌƎ  8 -T`E(B 8 Z0 6) 8w 0 &f R%7 w " a ଇLŀF&f>w 2 ,g & 7  ]Rj!N7 U, @ E 0! 1! -Ǝƌ材 X& & & & Č& & & H  6s   &f- j* ^ ps G `D bA4e& & & & Lf&&  '  - d&  7e$-Ǝ L!s  d& 7  j ~ s   s&ffjhe̥̋  4F% 37J L47!77a w 7! (ŀQ W Ǝƌ  ` * w ̥  !sew8 j g   F& & & & & @& Ε& E & & & & & @& Ε& |"׭   t & & & & & @& Ε& 4R)j)f | 뇷tj f\& N :  f p 50 5( X~j)‘c& & !Rj!& s  z:3fŀd& N ^  v  f آe fn h  E" 5U ft version number printed at ; program startup, ; then: ; GBLPAT=K11PAK:DO$VER:0 ; ; ; If you want kermit to NOT exit at end of file from the invocation ; as in: ker L KERMIT.B[001011]K11POS.TSK;1` efn j  f& & ʕ& & & & & & & p ҕҕ ҕҕ & & & & & & &   & & & & & & &  ҕRҕR& & & & & & &   %  f& e You must first define an output port: Use the SET LINE command for this. Connecting to line at baud Type CTRL and then C to return to command level   CcIiQqRrXxBb?Hh""44bb2b22B Try to send a break to the remote C Connect back to the local Kermit-11 I Drop and raise DTR (for RSTS only) Q Quit console logging. See SET LOG R Resume console logging. See SET LOG X Send XON and cancel any active XONs RUBOUT Try to fake a break to the remote ? Print this message X\^fhprwx}~DDԕꕪǏȏ̏Ώ—ӏԏȗڏ܏Η  XR#$R'(X,.|1268(>@.DFPMNXUV`]^fh*uv`ʐ̐ڐܐԚؚԚ& B&!8BCDLNPd\^lefmnst{ Ñ̑2ԑ< D*(2<XF^NhbbǒܒxnALLCONSOLECONNECTFILEHELPNONEOFFONPACKETRAWRPACKSTATETERMINALNOTERMINALEVENODDMARKSPACENONENONEXONXOFFCARRIAGE-RETURNCARRIAGE_RETURNFULLHALFONOFFONOFFNODTEDTECHARIOLINEIOTC.DLUCONNECTFLOW_CONTROLNOFLOW_CONTROLNOVOLUME_VERIFYVOLUME_VERIFYCREATE_SIZEBREAKWILDCARDINGNOWILDCARDINGOFFONNONETIME_OUTServer_Idle timeout? NOTIME_OUTTIME-OUTServer_Idle timeout? NOTIME-OUTDEDICATEDNODEDICATEDDETACHNOEXITEXITWAKEUPString: WAKE_STRINGString: PROMPTString: INITIATEString: FORMATString: SUCCESSConnect acknowledge: INFORMATIONRinging acknowledge: FAILUREFailure acknowledge: CONFIRMString: WAKE_RATEDelay in milliseconds: DIAL_RATEDelay in milliseconds: DIAL_PAUSEPause character(s): TIMEOUTTimeout in seconds: TIME_OUTTimeout in seconds: NUMBERName and phonenumber: PULSETONEBLINDn d n Tfn t   & Ňfn L 7 >fn $fn " & n n  .. &  FV2 f& n refn  @ V f& & Ɩ%fn h  b   fn z  L t lLJfzم   @ffn  e  &    H  Ʊf8م ,–% f&8؅ re  t 5  : above copyright notice. This software or any ; other copies thereof may not be provided or other- ; wise made available to any other person. No title ; to and ownershi  KERMIT.B[001011]K11POS.TSK;1 I•VR0 ȁI%Rרd"Bm Jդ5. o'~pD T$?y~c 8cp_{Sy@MJOqjlb >F<^9%jA@.~\ն!7tѰQbdqpAIN>K c֜܀LPmO: l2э0 ߐTז},l,T͵~=}I *箋/#'hng W J°zA|5)ecd`TpU'MV:ޜ7VjAcd@*HQ[HjC P |5zyUXMhy L{ET)t\kCGx4v;s+JT(Y]%nhq*r}!0hv5e평.+hFYU43pq u>f=u|xCv$~'>t*v{♟.\W њ/C{otu5ZaCe} wZ◮[EŤ}' vbF u`hW-yMr Ʀ aK{Tɰrur{+!t%w{$Mh5 4?zq}mpj/9ÝvMQ*&3j+?cS|^UTu#D~ₛU#[53]Qp9`<#7*HjDJw0:PZX>̏9|d5 ,/ڗSJAw*ރC|+]]V#M TIY"IHlcwA6y_@DˤOxV:ޛj=FqA*U7Rm1rmtʢGql|Kf1 (;HF%6SK(?~]|;Ψ1%E)O`{ԉk aEOTH$Fh΅f(G ]\LYhOzEʊ\(њEV+cBhqvY -78$܍#H%):}saO;Z iyAB?r|͹)huxtaxzӞ #N-q1 B=DjylL<瘙;6]I`̡\$!Yb"n%w+-]Z[b- gS^sو|-8&׎ !P7X4o`OhV42x=GqFgy9=SHt&SMEEZPLTRuuJ xoO^'#lZGi/>MQ0WmJ0~w%S|{;hMJD{cm[#7JC NtmĂCK`cbGRiIG^IG ǐS7?T?DM q TajX_}V4WCŠEvm-`%=:9tAz`:eyݐ5Jjplq  b{C{BҘZ uJ&Iniᄙ6hG*Krtgwv mQ0 EP{6+c&l_j-O`2Ri+'Ӥ@iy}lLw̱zk93 ""`"YGgnyC}IҸ[8g_T"a" >m.uxx6oGcɷ5ɠdHv4MWq7M*I&4Aۆԏ%Cd4iTwtA9W[4o1m$H1ev_"X6@SWt+ Iijqe`?퉉>ɹ?4S_k`cu?V" !sխ8\>[w+!Pslb1+cZF2-#gL7A|.&Zdg)T z!wz7VZ"69jA-]co@u[KÛK('p%+07{6>q:+5rc*D | -nv}sAN) f^>ghn2/ZCyf39 k=a<_}yF:f"%e/)KERMIT.B[001011]K11POS.TSK;1g E?5f E > `N X E?  U?  7 pU ` Up J UZ 4 tUD /6E R  U f  fm e z̟ r 5 П ^ VűU  < 4 , $B F n r   Ơ ʠ    2 6 l p ~  ćfօ ҿ% ( 7L  n f ^ V N0 F4 >B 6 F *V "ć '" f4& %  7  | ffՅ ھ%  8Շ7 2ՇfČՅ %   Z B :Ç7 7 "Ң Ç7 @7 4Է m \ 7 x fԅ  w\ fԅ %  7 ӇӇf ԅ ڽ%   7  ȋ 0W w ֢ J B 8WD7 VWAH $  fHԅ B%  7   ɋ ff n  w2r( R ɋWO  WF7 V v | rɋWSWL7 z J B 7 z 7 p f0Ӆ \%  7N f҅ 2% f&l҅ xe V H҇f҅ F  w^  T t7  7  fDn҅ %  7 d \ h`f:҅ f% f&"҅ e  ģ e` ~ t j ` V L  | r  fх  wЇ   F E m( &f F ȣ "  v ( eEee* E d  E &f  ƾ mfЅ N  MfЅ ع% f&Ѕ e     l EP 2eE  4& 0  6  ɋW Error from device assignment Kermit-11 no longer running in LOCAL mode Link device: Speed not settable Speed: DTR/CD not currently present DTR/CD present Parity is set, forcing 7bit mode Bad value for speed or speed not settable Please use the SET LINE command Please use the SET LOGFILE command first Log_file closed Can't do RAW i/o disk logging with other DEBUG options set Old logfile closed and new logfile created in BINARY mode Can't do disk logging with RAW i/o logging on To enable: Connection logging SET DEBUG CONSOLE File opens/creates SET DEBUG FILE Packet traffic SET DEBUG PACKET Raw terminal i/o SET DEBUG RAW State transitions SET DEBUG STATE Connection logging can be controlled by typing your escape character followed by a R to resume or a Q to stop logging. Kermit-11 will have to request 8 Bit quoting for the transmission of binary files. If the other Kermit does not support this, information for binary files will be lost. Unknown parity SET DUPLEX HALF, SET PARITY MARK, SET HANDSHAKE XON done SET DUPLEX FUL L, SET PARITY NONE, SET HANDSHAKE NONE done SET RSX TC.DLU value, where value is 0..2 ?Error - SET RSX CON [DEF][ALT] %SET-W SET RT11 KERMIT.B[001011]K11POS.TSK;1a6nCREATE_SIZE decimal_value %SET-W SET RT11 FLOW [ON][OFF] %SET-W SET RT11 BREAK [SHORT][LONG] %SET-W Unknown option in SET DIAL Insufficient space to contain string Insufficient space to contain string No space left for numbers }hʏ̏'(?@Z\st앲앾̐ΐ֐ؐސ"$.0:<FHNPVXܕ]^efVklqrvxDDtzztÑđ8Бޑ X"0Ҙ@XҘh28’ԒXĘ.Ę>V2^p(tv0|~RVR|ƓȓΓГ֓ؓޓܜ֜ܜ֜ܜ ֜ܜ1_CHARACTER_CHECKSUM2_CHARACTER_CHECKSUM3_CHARACTER_CRC_CCITT1-CHARACTER-CHECKSUM2-CHARACTER-CHECKSUM3-CHARACTER-CRC-CCITTONE_CHARACTER_CHECKSUMTWO_CHARACTER_CHECKSUMTHREE_CHARACTER_CRC_CCITTONE-CHARACTER-CHECKSUMTWO-CHARACTER-CHECKSUMTHREE-CHARACTER-CRC-CCITTSUPERCEDENOPROTECTNOSUPERCEDEPROTECT7_BIT7-BIT8_BIT8-BITASCIIBINARYEIGHTSEVENEIGHT_BITSEVEN_BITEIGHT-BITSEVEN-BITFIXEDIMAGEAUTONOAUTOTYPETEXTTXTDEC_MULTINATIONALNAMESNAMINGCONVERTEDFULLLITERALTRANSLATEDEND-OF-LINEEOLN char ? PACKET-SIZEPacket Length ? PACKET-LENGTHPacket Length ? PAUSEPause time ? START-OF-PACKETOctal valule of SOH ? START_OF_PACKETOctal valule of SOH ? TIMEOUTPacket timeout ? END-OF-LINEEOLN char ? PACKET-LENGTHPacket Length ? PACKET-SIZEPacket Length ? PAUSEPause time ? START-OF-PACKETOctal valule of SOH ? START_OF_PACKETOctal valule of SOH ? TIMEOUTPacket timeout ? XONNOXONSTREAMVARIABLEOFFONNONEOFFONNONEOFFONTTYVT100VT101VT102VT200VT2208-BIT7-BIT8BIT7BIT8_BIT7_BITPASSALLE?5f  E" 4 8 nX fDZf8؅ –%  11ڇ22ڇ33ڇ fn  & \ jfn "  & d ` f& n $en | Ƈfԋ(؅ %  ȋ fԋ& %   B : X $  : ȝ   7 7  ׭̝   D H X \ Ň$ȋ f& %  7 ڇ ڇf@ ֗.ӕ.  dǃ $ `       t tt e@nP `f~   %R_)#rNF7NH69AD[C9G[hyDC!\>Wb;Cmw8ETE;VHSS/v\$} l~BB5/ê *5CEyqPDFDTVDdftvz|ԏJALLBINARY-TYPEBLOCK_CHECK_TYPEBLOCK-CHECK- TYPECONSOLEDATEDEBUGDEFAULTDELAYDIRECTORYESCAPEFILETYPEHANDSHAKELINEPACKETPARAMETERSPARITYPA*[001011]K11I31.TSK;1+./ 0D6j27uʺ1 4 Us(0MKERMIT.B[001011]K11POS.TSK;1v|USEPHONERECORD_FORMATRECORD-FORMATRELEASE_NOTESRSXSTART-OF-PACKETSTART_OF_PACKETTIMEVERSIONDIALt f8$ Pɖ%  x  ͇ f h P D  ~  \  : ,     X  F ͇ w  x p7 ff& m ȱe Θ H !f& & e7<옒 Ҙ ژ ޘ   D j  ̇ f&  n @e  f n b f&f eff ee֙ nܙ ḟfo z%f& o e 4fo %f& o e ̇fo v% f& o He ˇfo ޸% f& o e ˇ Jxf&  e< dˇ@ ZF RˇJ H ѕTf& f eeѕ.f& 6f eff ef&f Tef&  @eV e ׭ Z p ׭ft  6 |Κ tʇ+11 f& &Қ Įe e@f 2ff eD  H f& v f r v rf& & Ȗ%  Of& & Ȗ%  f& Pۅ Ȗ%؛ ~ɇPf&  ڭe  Rn n0AHѕ ~ e@UՋen Pn y x Е Е f& & fee:f& N Leܛ Ȅ8o > e@f& & et x e@f& & le  Ň uɋ ğ ʟ tΟ ɋҟ ff ee~֟ Ňڟ ~ v nl  ^ Vef&  e 0 &Ňf&  ef&  ref&  ^e 9fօ e &f& f Ö%f&  ef&  ef&  e&  D P dfVօ  e &  f.օ %& fʋI ʋ  &  2&  xf&  ,ef f  ff 8e `&   SHOUnknown SHOW topic No debugging or logging is active Debug file is enabled disabled 4ORemote connection logging File opens and creations Packet logging to logfile State logging to logfile No remote line has been set Current remote link device name is The current speed for the link is baud The time is The date is Directory for send opens and receive creates: none Kermit-11 Filetype set to ASCII Filetype set to BINARY (fixed 512, no carriage control) Files will not be superceded ؚ1-Character-Checksum 2-Character-Checksum 3-Character-CRC-CCITT Connection escape charactez3M& ,E4UiYZ-oh:s~BDh14 qeGr?GZzEN]'dCx4iZ3Cb6`Q }%bmIuyJ ^~I z)z.Ajk+[[-(0@7mu]L" 1>4Ho >ZYN .Bh , OF{B =KERMIT.B[001011]K11POS.TSK;1r set to ^ SEND packet eol character (octal) SEND maximum packet size SEND/RECEIVE packet timeout RETRY maximum for packets Characters Sent: Received: Time in seconds: Type Last Sent Last Rec Tot Sent Tot Rec Total character count, less packet framing, but after data formatting (ie, includes repeat compression and prefixing) from last transaction. Physical data rate: char/second File transfer rate: char/second Pause time before packet transmission Delay time before sending SEND-INIT Created files will be Stream Ascii Created files will be Variable with implied CRLF Handshake character set to XON (^Q) Handshake character set to CR (^M) Handshake character set to XOFF (^S) Parity is set to ODD EVEN MARK SPACE NONE TC.DLU is set to current system setting. PRO/350 console is set to 7 bit mode 8 bit mode Attribute packet transmission DISABLED ENABLED RECEIVE start of packet character is ^ SEND start of packet character is ^ Default binary filetype list: none * Current defined phone numbers None defined A problem was discovered with attribute packet processing in versions of Kermit-11 prior to 3.49. This implies that versions 3.49 or later of Kermit-11 will not be completely compatable with older versions. The best workaround until a copy of version 3.49 or later can be obtained is to disable attribute packet processing with the SET NOATTRIBUTE command, and manually use the SET FILE TYPE FIXED (or SET FILE BINARY) command on both Kermit-11's in order to transfer binary files (such as task images). For further information please see K11.BWR and K11INS.DOC COP blocks copied RENDELTo: Dp}ܦ N   |3fJ  %  fo& v%o fo&E e   J  fJ  &%e~& nu fu&FE De fd$Y "e ` ~€ 7 J%} f}&E ef %fn * 3fdY e 5 f   t^ f^&VE Te Pff @ Vff&Y eeP K & N $f 6` &f :̀ f&Y ˆee` f&Y e K & N  >fkw 1 ; for RSTS, something is open mode 1 sy.ini::.blkw 1 ; for KERMIT.INI stuff handch::.blkw 1 ; for ibm systems ? duplex::.blkw 1 ; if eq, full (default), els KERMIT.B[001011]K11POS.TSK;19f %& @  J, && L o o ^eo& & o Ffo& Y e K & N  ff 4 ff $   (Jd  d  K ɋ& N fʠ 蔖%@ j f Z  f %   & P 0 ff ne  f&Y ֆe f 8% eP :ff e *(ff ee& " @ʂ f&NY Lee(  2 f % >:ff Je *(ff ee& 2 ɂ f&Y ee(  f % foP Pfo &e &fo& ⷖ%foD e f  fo& %fo `% &K ˋ& aˋ & #7 f^G effJ  %BCAeWY f` % 7 0 fG effJ  6%BCAeWYWE fJ  P% f :% (  7  f&R efR  ⻇  7 ^ f&JC He fdU ^e ffD Be ffT &e fdW e ffE e fdH e fffR e fffK e @ȋfffC fe ffC Le @ȋfffI $e ffI e 7 XJ A@ & e  f rW-ҋ@ & e  f Dŀf& %EeX  ` 7 >7 6fzf.G ,effJ  F%BCAe& N r  T7 7 -ʡ  -ffG e  b-^ffRG Pe f6 ^ 4ַ.: JR BfF : 7 7 V " Z n  fJ  ( %fJ  fJ Y eՃ  r@ՃfF  r J v f& J  ef& 雅 Υe fJ  % f z% & & 7n7 (Dn  fF  7 7 /7 чf  f&E ~e fn ,%?Kermit-11 Unimplemented server command?Kermit-11 Unimplemented server generic commandKERMIT.TMP?Kermit-11 Invalid arguments for remote server command SERInvalid SERVER subcommand Server detaching from TI: You must use the SET LINE command before detaching the server Kermit Server running on PDP-11 host. Please type your escape sequence to return to your local machine. Shut down the server by typing the Kermit BYE command on your local machine. Spawned job failed due to timeout or TT read wait Logout failed - Quota exceededServer disconnected and still logged inDefault directory set to Need a directory name to change to deletedThe following commands are available for the Kermit-11 server. To avoid ambiguity with local Kermit commands some of the server commands will need to be prefixed with the REMOTE keyword. BYE Logout Kermit-11 REMOTE COPY Copy one file to another REMOTE CWD Change default directory REMOTE DIR Prints the directory outt beq 10$ ; ok clc return 10$: message ,cr sec return .dsabl lsb .sbttl set block-check-type set$bl::calls get KERMIT.B[001011]K11POS.TSK;1  REMOTE DISK Prints available space REMOTE ERASE Deletes the filename(s) FINISH Exits a Kermit-11 server GET Sends the filename(s) REMOTE HELP Prints this help text REMOTE HOST Execute a host command REMOTE LOGIN Login. RSTS V9.x only REMOTE RENAME Rename old file to new REMOTE SPACE Prints the disk space REMOTE TYPE Prints the filename(s) REMOTE WHO Shows users logged in I need a filename to TYPESYSTAT failedLogin successfulMissing password or UIC (PPN) blocks copied file(s) renamedCan't create KERMIT.TMP FCan't get the remote KERMIT to FINISH LCan't get the remote KERMIT to LOGOUT ENSYXT̙@|Ҙ:Remote fails to respond to the command Remote NAK'ed the command 5 times Bad checksum retry abort Remote server response Receive data failed Remote ack: Can't get the remote KERMIT to respondInit failed for link *|b ",|p~ |~ ,|t~ p}ܦ p} Ԕ}ܩ }v }( } }  ڙ ޙ | tf %& & & & & & & & &  & & & & & & & & e & & & & & & & & &  Zė& f& & Ζ%6 X \  #   ̚ К x p h4 `8 XϷ p< Lf& n eL 0fn ط f& & Ζ%V Z  h \& T7 Zfn &f& TI& & & & ,& & & Εp & & & & 4& & & Εp & & & & :& & & Ε  & & & & :& & & Ε  & & & & & & & & &  & & & <& & & & &  Ph`& +'ŝ 0  n  & & 3& & & & & & & & & & & Ε  & & & & & & & & & Ε  & & & & ,& & & Ε  & & & & 4& & & Ε  & & & & & & & & & Ε 5 ;Ȕ ׭  7 0&L ŀ ~7P  ~ 7 7 5@2C 3  ' / Ew     7  #7  v fp  h hZ ?V &f a׭]Z Z 02 & & & & & &  2׭, 2 p!p > ~ & & & & &~& & &   & & & & & & & & &   sf&׭ b WWY& )& & & & N& & & p 5& & & & && & &  2ע[   * ע Ԝ & e& & & & && & &  s&ŋ(& N  f űfŀ0& N  B  fd e fn  EL 5BU: & & & & e& & &  fn  & & & & & & & & &   & & & & & & & & &  P h >f&h &e 5 5 &f@  F& & & & & & &  & & & & & & &  574'54'755f99       p L   KERMIT.B[001011]K11POS.TSK;1r%CcIiQqRrXxBb?HhԒԒڒڒ BBBB Try to send a break to the remote C Connect back to the local Kermit-11 I Drop and raise DTR (for RSTS only) Q Quit console logging. See SET LOG R Resume console logging. See SET LOG X Send XON and cancel any active XONs RUBOUT Try to fake a break to the remote ? Print this message ɘј٘b[?1;0c[?1;0c[?1;0c[?1;0c[?1;0c[?1;0c[?1;0c  )2;HUb24~23~17~21~15~?21;0;0;?21;1;0;?21;2;0;?21;0;0;8;0c?21;1;0;8;0c?21;2;0;8;0c?21;3;0;8;0cvyZZ [?1;0cSpawning DTE. Use the EXIT key to return to Kermit. Use SETUP to set XK characteristics, such as speed. Spawn for DTE failed, status = Entering internal connect code. Function Keys will NOT control terminal emulation Using internal connection module. If you would prefer to use PRO/Communications, return to command level and type SET POS DTE, then CONNECT again. Connecting to Speed: Type your local escape sequence to return to the PRO BUhzLB:[1,2]K11HLP.HLPSY:[1,2]K11HLP.HLPKERMIT:K11HLP.HLPHELP:K11HLP.HLPDK:K11HLP.HLPSY:K11HLP.HLP Topic ? H ԓ ؓ  f v% w7 :7 47 ͋ 7  j   z$ r7 V( f1 ~ Mdf B *  l b& < N, f&  vef⍅ J  f<f⍅ e 0& w &fދ ͋W   ͋W T&ff D 17` E^ >= f& F%  .1^$ ̋!  Cע*ˋ̋az  _ތ ZN J &fތ s block r$fab copfb2 ; associate a fab with this rab r$rac rb$seq ; access sequentially r$rbf copbuf ; where to return the data r$ubf copbuf ; where to retu KERMIT.B[001011]K11POS.TSK;1zW^f& % J1^ 7B& 8 8 ތ h& z J0 4f& ⍅ e4 7 ̋ f& & te8 ɩ &f& & \b^W1 f 7,< h l p  7 d̋ f& l% 81^ BB .5+,4 & f (  Nˆ~ f&  xet   f&  Lex %f "  $8 B ff He 1 | ^ V N F >& 6* . f&  e.   Printing default internal help Help not found for the requested topic Additional information is available on: %Kermit-11-W Cannot find the Kermit-11 help files or the task image high limit prevents mutliblock reads. Please put K11HLP in one of the following locations: }  w Vfn R fn e fn fn   ff e i cf  Y f %fn f%W f b%f l%(fff te  f .%   & f  fn P%fn Ԭ Ə͏ԏۏ  '.4;BIPW^elszŐ̐Ӑِߐ#*18?FMT[bipw~đˑёؑߑ #*18?FLSY_ekryohpdmmlm2p,p*p0p&p6p4pBp@p(p"p.p8p:pNO CONNECT!PON LINE\ON-LINEjNO ANSWERxDEAD LINEBUSYEND DRINGINGVA212PA HELLO:I'M READY*D ?%s DIALING I KStand alone VADIC VA212VA212PAR HELLO:I'M READY*D ?%s DIALING I KRack mounted VADIC VA212PARVADIC HELLO:I'M READY*D ?%s DIALING I KGeneric VADIC with autodialCTS2424AT Modem ReadyD%M%B%S +PT&CTS/Fabri-Tek 2424AD V.22bis AutodialierVA4224 HELLO:I'M READY*D%M%S%B DIALING I KPTBVadic 4224 CCITT V.22bis autodialDF03%sDEC DF03AC Autodial modemDF100ReadyReady%s# DEC Standalone DF112DF200ReadyReady%s! DEC Standalone DF224HAYESATZ V1 OKOKAT D %s MICROCOM4445 SE2 S1C0 SCE ON !!D%s MicroCom SX1200R212A RIXONBKERMIT.B[001011]K11POS.TSK;1,9ˤ2RPCL^+ŐPF\CyNka i ohO(h%?]>.^MQu! K!dp5dſ;I$+AC3g0H(%+̃:%` 9}Cx0H1xy0jlu3]~W4& MO =5>9RLЫ<~ y,t~ '$Q82בsIGq`Nh.^+vݞWOÉM u5?>ߗ+|tH %;b5oy`KS (ѻ|3 !`_B'qn}EJ{vcV{BO=Wپ5ōMIE0xrynPhɗ(`s!^`6h 1ý[uO朸`C8|*p#VP ơYdSއUS#۞xiUXa>[#¾7 V2{E8SZCw'FR=NgmNkI]Fm݆G2jK""«(`b-I:m˭R59IP풊J$GwAKrЄàDF=SQkbM665k,mCQ2W5 s&3X&;,Yb9jN[s5LjC2L1ZSn83仂uDk:J n=T.m)q!s9{h#vP'!dKHgh@=7⿫'c~mD 9PwD볤" ڒ %`:Ye_C:X /w5w9/?_Xe ψj\Toݽ:Km OKrd)2@Q)V,S0܉$Mq(*$ $R#FR4& "RT7xQ[#e% mߧX ltP¥@ZezTs u۸jk p}.s^'foY5>0k&P]F! ϝ4(MCMW:a.ϢSf SٶP_N_6plru8QF]C'X Pd"ȢiY|{lsu!}#t'fNB#mW[q  43ioS!%SB/HmRcWx0"=fǣkde) ,%#>ZaWp,QF Q읲gn(&;z t.ԃ}D MF2VcG8 0^J}Ӭ{3H'XO賗SN+X!!II,fwYFFHq`׺bI7hl@A n!Ǟ:aG s,wC^8ئ9fN Hսҽ1@c@}ҝ3.̑|s_Xp vi M-3M#N +=$wO\ozV/*'AبS4OvOzcx><*:QKY!PɁk .K 5ЬQg=bJ55^ȕ9s8׻gC@MWssa@#,>x$N]P^%_XԚÎKr2_5Q,٩?"mbTߌ%\Ҧz0ۮTu k@w#}D-dfΦe/Ӗ{1` ϣ՛g~xLCj @!@h7U1YWcZKlnd +&$1G{yJQcw$޵e8ULjd2n)*:!ιBЍhFYAwϒޒPXm:+X2Gyz@϶|2R}|7sDgfOtϑN]T[-vWqЇz7>!7g:ɇUDO3S8QXf)l#x+eKs3)d1YVEdKy *᠎*<1myh {;*ꏾCbR"Fh[ W8tLKEzɴFx37I,̧.fGp.|w}݀ȃ憣?V+;7k?u꟔Bφ(k LRHIB;VS,6&쨇Yg P K2Ox$_$ P_7E-mLf>KP2-Ns7*;`_x啙Dr-pkpXf@$R_@/F{ @H=&@=\YfE@15(XqLQSO(WnkPJ\~OVW*|0e g}LXX8 G2!n(KsbBO4Ad2"s0?>qrHwr%#gX"]pZ_"oi핑.a44\I`qCS&R{w l"Oa'\` ? No connection Excessive RINGING... messages returned Operation aborted under user interupt No response or invalid response to dial commandCONNECTNO CARRIERBUSYERRORRINGABˋf V D l | *ʋ    zf&  ިe `Ħ p F& 4   fhLm F   Hh *P $R  ʡ Y  ׭.X ׭'Tm Ρ  ; Z8 7p3, 4ȋ  ( !fn ,e     h& & & ؿ  Xg&fn \% BBm L G, ^ b h l Bf&  "e f& z e ~f& ( ep l ׯh0ׯ`9wl/eע Д4 l  ˋ9t  f& ԅ \e| f&   % ŀS $W W >&  8  e*2e  (%f&  e > a Df J& d     t  `  L  $ < a f &   ʋ=%7<ϗs,S(p"PMm 2 4 Bb     & f b% ŀB %f  Z F L 8ff& Je%&ff ֞% &ȋ AZ @ κ f&f e  @ \  , ` z w”0af&  ڟeӋ f&  X%ȋ  f& & e~ " *S  ʣ Σ Ae  Թ  Gf&  "e  ң     x pInvalid number! No previous number! Using: Please use the SET LINE command first Please use the SET MODEM command first A dial formatting string has not been defined This modem type is unknown. The known modem types are: Using: Modem in command mode Failed to get modems attention Modem dialing Call failed Connection made, use the CONNECT command to access remote Remote phone is ring*[001011]K11DEF.MAC;1+./ 0D6cF7E 4 U}(0KERMIT.B[001011]K11POS.TSK;1Cing No modem type has been SET This is an internal modem The option has not been SET Modem message Message Class Successfull connect Informative message Failure to connect (Modem type: Wakeup string: Response to wakeup: Format for dialing: Delay for dialing: Z}&fAB?ѕ ~ޤ H/$?C~ å6T~p`P@@p0 EsTp)`hP@80( HiSЬ+RER$ABO THIS ERROR CODE NO LONGER IN USEER$ACC F11ACP ACCESS ERROR OR FILE IMPROPERLY CLOSED OR CREATEDER$ACT CURRENT RMS ACTIVITY PRECLUDES OPERATIONER$AID BAD AREA ID(STV=@XAB)ER$ALN ALIGNMENT OPTIONS ERROR(STV=@XAB)ER$ALQ IMPROPER ALLOCATION QUANTITYER$ANI NOT ANSI "D" FORMATER$AOP ALLOCATION OPTIONS ERROR(STV=@XAB)ER$AST INVALID OPERATION AT AST LEVELER$ATR ATTRIBUTE READ ERROR(STV=SYS ERR CODE)ER$ATW ATTRIBUTE WRITE ERROR(STV=SYS ERR CODE)ER$BKS BUCKET SIZE TOO LARGE(FAB)ER$BKZ BUCKET SIZE TOO LARGE(STV=@XAB)ER$BLN THIS ERROR CODE NO LONGER IN USEER$BOF BEGINNING OF FILE DETECTED($SPACE)ER$BPA PRIVATE POOL ADDRESS ZERO OR NOT WORD-ALIGNEDER$BPS PRIVATE POOL SIZE NOT MULTIPLE OF "4"ER$BUG INTERNAL RMS ERROR CONDITION DETECTEDER$CCR CAN'T CONNECT RABER$CHG $UPDATE-KEY CHANGE WITHOUT HAVING ATTRIBUTE OF XB$CHG SETER$CHK BUCKET HEADER CORRUPTEDER$CLS RSTS/E CLOSE FUNCTION FAILED(STV=SYS ERR CODE)ER$COD INVALID OR UNSUPPORTED "COD" FIELD(STV=@XAB)ER$CPB PARAMETER BLOCK HAS INVALID ARGUMENT LISTER$CRE COULD NOT CREATE FILE(STV=SYS ERR CODE)ER$CUR NO CURRENT RECORD(OPERATION NOT PRECEDED BY GET/FIND)ER$DAC F11ACP DEACCESS ERROR DURING "CLOSE"(STV=SYS ERR CODE)ER$DAN DATA AREA NUMBER INVALID(STV=@XAB)ER$DEL RFA-ACCESSED RECORD WAS DELETEDER$DEV BAD DEVICE, OR INAPPROPRIATE DEVICE TYPEER$DFW ERROR OCCURRED ON DEFERRED WRITE (STV=SYS ERR CODE)ER$DIR ERROR IN DIRECTORY NAMEER$DME DYNAMIC MEMORY EXHAUSTEDER$DNA ZERO DNA WITH NON-ZERO DNSER$DNF DIRECTORY NOT FOUNDER$DNR DEVICE NOT READYER$DPE DEVICE POSITIONING ERROR(STV=SYS ERR CODE)ER$DTP "DTP" FIELD INVALID(STV=@XAB)ER$DUP DUPLICATE KEY DETECTED, XB$DUP ATTRIBUTE NOT SETER$ENT RSX-F11ACP ENTER FUNCTION FAILED(STV=SYS ERR CODE)ER$ENV OPERATION NOT SELECTED IN ORG$ OR TKBER$EOF END-OF-FILEER$ESA EXPANDED STRING ADDRESS IS ZEROER$ESL NO EXPANDED STRING IN EXPANDED STRING AREAER$ESS EXPANDED STRING AREA TOO SHORTER$EXP FILE EXPIRATION DATE NOT YET REACHED&fAB?ѕ ~ޤ H/$?C~ ȥph`AX_Pw@8̦0 +B]zħ#N~بp `:P`@0 9VҪJz嫀 x 255.)LUN locked in useInconsistent qualifier usage/Invalid UICInvalid device/unit or device not a terminalInvalid time parametersNot a network task/Partition/region not in systemTimeout on request/Invalid priority ( .GT. 250.)Connection rejected/Invalid LUNInvalid event flag ( .GT. 64.)Part of DPB out of user's spaceDIC or DPB size invalidws ws)&f^> l *-*- *1-*4-33@@@@@@& ^@ 4q(1,f& ]e B@ r(2,^>Uf& ~]e !1* 1-ff& ve   ʁ (  l  ef& Ԩ ʙef& e f*[001011]K11DEF.MAC;1+./ 0D6cF7E 4 U}(0KERMIT.B[001011]K11POS.TSK;1& ڨ ef& ef& 稅 re&  *- г *1-3E>@ "1,q(ff [e ff e  l@ l    e  ff&ꨅ he f& ꨅ Te  % !ff& ef& ef&  ef B &-W  ~% "& W@   W ҕ R ~Bf(& ̰e`  File renamed to Files deleted:  2 * " $@  @@ff hee@@ ඇ Default Kermit-11 help text BYE CONNECT COPY CWD DELETE DIRECT DISCONNECT DISPLAY ERASE EXIT FINISH GET HANGUP HOST LOCAL LOGFILE QUIT PRINT RECEIVE REMOTE Send a command to a remote server BYE Remote logout COPY Copy file1 file2 CWD Change working directory DIRECT Remote directory listing ERASE Remote file deletion FINISH Exit remote Kermit GET Get file(s) from server (see GET) HELP Ask server for HELP HOST Ask server to execute opsys command RENAME Rename file1 file2 SPACE Inquire about disk space and usage TYPE Ask server to type a file WHO Request a list of who's logged in RENAME SEND SERVER SET Set parameters. See K11USR.DOC ATTRIBUTES BAUD BINARY-TYPE BLOCK-CHECK CONSOLE DEBUG ALL CONSOLE CONNECT FILE HELP NONE OFF ON PACKET STATE DELAY DEFAULT DUPLEX END-OF-LINE ESCAPE FILETYPE ASCII AUTO BINARY FIXED NOAUTO PROTECT SUPERCEDE TEXT TYPE HANGUP HOME IBM-MODE LINE LOGFILE PACKET-LENGTH PARITY PAUSE PROMPT RANDOM RECEIVE END-OF-LINE START-OF-PACKET RECORD-FORMAT RETRY RSX RT11 CREATE-SIZE FLOW-CONTROL VOLUME-VERIFY SEND SPEED START-OF-PACKET TIMEOUT TERMINAL UPDATE SHOW Display current parameters ALL BLOCK-CHECK-TYPE DEBUG DEFAULT ESCAPE FILE-TYPE LINE PACKET PARAMETERS RECORD-FORMAT TIME VERSION SYSTEM Execute local operating system command TAKE Execute an indirect command file TYPE Type a local file WHO Display user's on local system Note that KERMIT-11 will accept wildcard file specifications for both the SEND command and the Server GET command, as in SEND *.MAC or, from a local Kermit talking to Kermit-11 as a server, GET *.MAC (WnkPJ\~OVW*|0e g}LXX8 G2!n(KsbBO4Ad2"s0?>qrHwr%#gX"]pZ_"oi핑.a44\I`qCS&R{w l"Oa'\`@xG\zUcxPЫ諭ૺ©ɩԩ٩Uh(X,.hR24S9@`SDXNS_tS~RNStRR̪SѪҪSתSS R*S| ̆| | ̘| >|~ >|, ̘|r |̘| t} l>|L d>| \>| T̘|t L>| D̘|Z <>| 4̆| ,>|p $| ̪| ̆| >| ̘|ا.:N_hy¨֨ۨέޭ ֭&6֭BRƭVho~歇此©֩&.(V-<NBZ6br6{6F>˪^^ '(602.ABfJLnUV]rxήvʫЫҫ٫,BƮIPƮ\dƮpx~~֮¬ǬЬ֬(8ޮAJR^gr{&ATTRIBUTESOn or Off ? BAUDSpeed for remote link ? BINARY-TYPEBinary file type ? BINARY_TYPEBinary file type ? BLOCK-CHECK-TYPEType ? BLOCK_CHECK_TYPEType ? CONSOLE7 or 8 bit ? DEBUGWhat: DEFAULTDirectory ? DELAYSeconds to wait ? DIALOption: DIRECTORYDirectory ? DTRDUPLEXHalf or Full ? END-OF-LINEOctal value ? END_OF_LINEOctal value ? EOFExit or NoExit ? ESCAPEOctal value ? FILETYPEBinary or Ascii ? FILE_TYPEBinary or Ascii ? FILE-TYPEBinary or Ascii ? HANDSHAKEType ? HAND_SHAKEType ? HAND-SHAKEType ? HOMEIBMON or OFF ? LINEDevice name ? LOCALLocal echo ON or OFF ? LOGFILELogfile name ? LOG_FILELogfile name ? LOG-FILELogfile name ? LOGOUTLogout string ? LONG_PACKETSLong Packets ON or OFF ? MODEM-TYPEModem type ? MODEM_TYPEModem type ? NOATTRIBUTESNODEBUGNOLONG_PACKETSNOQUIETNOUPDATEPARITYOdd/Even or None ? PAUSESeconds to delay packets ? PHONEOption: POSOption: PROMPTKermit Prompt ? QUIETRANDOMOn or Off ? RECEIVEOption: RECORD__FORMATStream or Variable ? RECORD-FORMATStream or Variable ? REPEATTo: REPEAT_CHARTo: REPEAT-CHARTo: RETRYNAK retry count ? RSXOption: RT11Option: SEEDRandom seed ? SENDOption: SPEEDSpeed for link ? SERVEROption: START_OF_PACKETOctal (1-36) ? START-OF-PACKETOctal (1-36) ? TERMINALType ? TIMEOUTTimeout ? TIME-OUTTimeout ? TIME_OUTTimeout ? WINDOWUPDATEUpdate interval ?  >ʆ| 6ʆ| .ʆ|t &t|t ʆ| ʆ|8 t|, ʆ|: Ɇ|Κ Ɇ| Ɇ| t| Ɇ|r t| t|ԗ Ɇ|x t|^ Ɇ| Ɇ|ț t|֘ t|& t| } t|ʘ ~t| vɆ| nt|4 ft|6 ^Ɇ|X VɆ|*[001011]K11M41.MAC;1+./ 0D6M7;M 4LN UՄ|s <0,strcpy .g  KERMIT.B[001011]K11POS.TSK;1 Nt| Ft|< >Ɇ|B 6Ɇ|0 .Ɇ|n &Ɇ|Z t| t|̙ Ɇ| Ɇ| t| Ȇ| Ȇ| Ȇ|` t|l t|ܚ Ȇ|2 Ȇ| Ȇ| t|Df&BD  & 0   E Wp`AZ r z DԐ &@ȋ. Õ. f&@fff L%@ x (`W.~"@ b dˋD 8  0 ( e e@az $d fAB ɋ̭& N , ʝJ  Ѝ nBf W. R ~ɋ W. R~en f&x”;\< ”/> 0)7&0 `B & ’0 7 0 `  T‹  f&fAW Tԕ\ rB re0e0e0T &D  @ J   7 Ƅ D®&  | ԕ.ԕ"ԕDɮ fBpf % ԕ0ԕmMЕ C~Bp f& %e ~ ԕ0ԕ"ԕ"pҮ ԕ0ԕ9ԕ#ff T f& %e~ ԕ"ԕ!̕A׭̕I4 ff   Eԕ!ԕ%ff& pe ̕0 ~ f&fE@"A .WD : RB~f&  ~ .  &!  v @ fe  f7  ʋ  & 0Wp e  wxł f&&f 7 `  ͋W  >C& N0eB  <"  Ņ ׭B׭Ip  V@ D M-Cע# ^p Ĕ0 a~R  5פ"2&  L} 778#BpC 3f  Te~> 7 ֮  ׭D& |7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 Çf , ) f^pf ꀖ%׭LBp W"W,fff 0%7 7 87 N7 TÃ&   `@ ` B   & A @      .TSK.SAV.OBJ.STB.CRF.TSD.BAC.OLB.MLB.RTS.EXE.BIN.SML.ULB.HLB.SYS.LIBX0123456789.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ|̨!"#$%&'()*+,-./01vz6:>BFJNRV`dhx|Unknown attribute packet type ?K11-ATR Protocol bugfix detected. Use SET NOATT and see K11.BWR, K11INS.DOC.  89A8BCAINAFab attribute error AIN89ABCs block r$fab copfb2 ; associate a fab with this rab r$rac rb$seq ; access sequentially r$rbf copbuf ; where to return the data r$ubf copbuf ; where to retu <!KERMIT.B[001011]K11POS.TSK;1W   l B~7c :˷ ɷ  <zrj11s1}p~&   Ff&  enw,wf&   e bw \' UD"@Arf( U BQ Е*~Kermit-11>"0CVSY:KERMIT.INILB:[1,2]KERMIT.INISY:[1,2]KERMIT.INIKERMIT:KERMIT.INI%Warning - You have requested LONG packet support but the other Kermit does not support this feature. Receiving file Sending file LengthTypePaknum  < Packets sent : Naks: Timeouts: < Packets received : Naks: Timeouts:  /z¬¬¬¬¬¬¬¬¬¬¬ & & & & & & & & &   & & & & & & & & &  P h >f&h &e 5 5 &f@  F& & & & & & &  & & & & & & &  574'54'755f99       p L    2? CLE.B CLE.B8BAC/BLO=4080/NOINI/NOLIS/NOACC [1,19]*.* MM0:CLE/BUF=MAXē\9.0  _MM0: 1.0   0 SYSPAC "$0C V*[001019]CLE.COM;1+./0D6^׃\7ļ)\ 40 U<$ ccl macro cle=cle $ ccl link cle/z,cle,cle=cle,clecry,edi/x/h:#177776/u:#4000 .99998 $ run $silus cle.rts,tt:=cle $ rem/run cle $ ins/run [1,8]cle *[001019]CLECRY.MAC;1+./0D6^׃\7ļ)\ 4I U|s<  .title DESALT Macro-11 version of an encryption algorithm .ident /1.0.00/ .psect descod ,ro,d,lcl,rel,con .psect desdat ,ro,d,lcl,rel,con ; 02-AUG-1986 06:00 Brian Nelson (brian@uoft02.bitnet) ; ;/* NEWDES: An algorithm presented in CRYPTOLOGIA, Volume 9, Number 1, ; * January, 1985 in the article "Wide-Open Encryption Design ; * Offers Flexible Implementation" by Robert Scott, pp75-91. ; * This is a Feistel cipher which because of its simplicity ; * and "open" design, is touted by the author as an easily ; * programmed alternative to the Data Encryption Standard. ; * ; * This implementation by Richard Outerbridge, 8503.14. ; */ ; ; ; Macro-11 version notes: ; ; Macro-11 Translation by Brian Nelson 1-AUG-1986 15:32 ; ; Differences: I changed the data type for the key and data ; to CHAR (8 bit) ; ; Why?: I needed a good encryption routine for encoding data ; in the dynamic region I use for a command line editor on ; RSTS/E 9.3. Otherwise I would be quite content to leave it ; in C. ; ; ; Sample driver (DECUS C) ; ; ;#define EN 0 ;#define DE 1 ; ; ;char enks[60], deks[60]; ;char kraw[15] = { ; 31, 41, 59, 26, 53, 58, 97, 93, 238, 46, 26, 43, 38, 32, 79 }; ; ;char block[8] = { 65,66,67,68,69,70,71,72 }; ; ;main() { ; int i; ; ; kinit(kraw, EN, enks); ; kinit(kraw, DE, deks); ; ; putout(block); ; desalt(block, enks); ; putout(block); ; desalt(block, deks); ; putout(block); ; ; for(i=0; i<29; i++) desalt(block, enks); ; putout(block); ; ; for(i=0; i<29; i++) desalt(block, deks); ; putout(block); ; ; } ; ;putout(oblock) ;char *oblock; ; { ; int i ; ; int j ; ; for(i=0; i<8; i++) { j=oblock[i]; printf(" %d", j); } ; ; printf("\n"); ; return; ; } ; ; ; ; Debuging .enabl gbl .save .psect desdat ,d fmt$: .asciz /%d/<12> .restore .macro DECOUT v mov r0 ,-(sp) mov r1 ,-(sp) mov v ,-(sp) mov #fmt$ ,-(sp) call PRINTF cmp (sp)+ ,(sp)+ mov (sp)+ ,r1 mov (sp)+ ,r0 .endm DECOUT .sbttl Initialize the key string .psect descod ,i ; KINIT ; ; Passed: ; 2(sp) Ascii key address, 8 characters ; 4(sp) MODE, eq 1 for DECRYPT, 0 for ENCRYPT ; 6(sp) Where to write new KEY, 60 characters long K.IN = 2 + <4*2> MODE = 4 + <4*2> KSCHED = 6 + <4*2> DE = 1 Kinit:: mov r2 ,-(sp) ; Save mov r3 ,-(sp) ; ..Save mov rCLE.B[001019]CLECRY.MAC;1I4 ,-(sp) ; ....Save mov r5 ,-(sp) ; ......Save mov KSCHED(sp),r5 ; Destination (byte) cmp MODE(sp),#DE ; Which way (Decode or Encode)? bne 10$ ; Not decode mov #11. ,r0 ; I = 11 mov #9. ,r1 ; Delta = 9 mov #12. ,r2 ; Finis = 12 br 20$ ; 10$: clr r0 ; else I = 0 mov #1 ,r1 ; Delta = 1 clr r2 ; Finis = 0 20$: call 200$ ; First inc r0 ; Move offset up cmp r0 ,#15. ; Reset offset yet? bne 30$ ; No clr r0 ; Yes 30$: call 200$ ; ..Next inc r0 ; Move offset up cmp r0 ,#15. ; Reset offset yet? bne 40$ ; No clr r0 ; Yes 40$: call 200$ ; ....Next inc r0 ; Move offset up cmp r0 ,#15. ; Reset offset yet? bne 50$ ; No clr r0 ; Yes 50$: call 200$ ; ......Next add r1 ,r0 ; i += delta cmp r0 ,#14. ; If (i > 14 ) i -= 15 ble 60$ ; Ok sub #15. ,r0 ; Done 60$: cmp r0 ,r2 ; Are we all done with key gen? beq 100$ ; Yes, exit call 200$ ; No, Do the next three inc r0 ; i++ call 200$ ; .. inc r0 ; i++ call 200$ ; .... add r1 ,r0 ; i += delta cmp r0 ,#14. ; Reset? ble 70$ ; No sub #15. ,r0 ; Yes 70$: br 20$ ; Next please 100$: mov (sp)+ ,r5 ; ......Restore mov (sp)+ ,r4 ; ....Restore mov (sp)+ ,r3 ; ..Restore mov (sp)+ ,r2 ; Restore return ; Exit 200$: mov r0 ,r3 ; *ksched++ = k_in[i++] add K.IN+2(sp),r3 ; .. movb (r3) ,(r5)+ ; .. return .sbttl The actual encryption code and data .psect desdat ,d .radix 10 f$tab: .byte 32,137,239,188,102,125,221, 72,212, 68, 81, 37, 86,237,147,149, .byte 70,229, 17,124,115,207, 33, 20,122,143, 25,215, 51,183,138,142, .byte 146,211,110,173, 1,228,189, 14,103, 78,162, 36,253,167,116,255, .byte 158, 45,185, 50, 98,168,250,235, 54,141,195,247,240, 63,148, 2, .byte 224,169,214,180, 62, 22,117,108, 19,172,161,159,160, 47, 43,171, .byte 194,175,178, 56,196,112, 23,220, 89, 21,164,130,157, 8, 85,251, .byte 216, 44, 94,179,226, 38, 90,119, 40,202, 34,206, 35, 69,231,246, .byte 29,109, 74, 71,176, 6, 60,145, 65, 13, 77,151, 12,127, 95,199, .byte 57,101, 5,232,150,210,129, 24,181, 10,121,187, 48,193,139,252, .byte 219, 64, 88,233, 96,128, 80, 53,191,144,218, 11,106,132,155,104, .byte 91,136, 31, 42,243, 66,126,135, 30, 26, 87,186,182,154,242,123, .byte 82,166,208, 39,152,190,113,205,114,105,225, 84, 73,163, 99,111, .byte 204, 61,200,217,170, 15,198, 28,192,254,134,234,222, 7,236,248, .byte 201, 41,177,156, 92,131, 67,249,245,184,203, 9,241, 0, 27, 46, .byte 133,174, 75, 18, 93,209,100,120, 76,213, 16, 83, 4,107,140, 52, .byte 58, 55, 3,244, 97,197,238,227,118, 49, 79,230,223,165,153, 59 .radix 8 .psect descod ,i ; DESALT ; ; Passed: 2(sp) Address of data to be acted on, 8 bytes ; 4(sp) Address of key string from KINIT TBLOCK = 2 + <6*2> ; Offset for data + registers saved KS = 4 + <6*2> ; Offset for key + registers saved ; Register usage: ; ; R5 key string, after call to KINIT, 60 bytes ; R4 DOEE ; R3 DOER Desalt::mov r0 ,-(sp) ; Save mov r1 ,-(sp) ; ..Save mov r2 ,-(sp) ; ....Save mov r3 ,-(sp) ; ......Save mov r4 ,-(sp) ; ........Save mov r5 ,-(sp) ; ..........Save clr r2 ; Loop counter mov KS(sp) ,r5 ; Get a pointer to key (byte) 10$: mov TBLOCK(sp),r3 ; Get a pointer to text (byte) mov r3 ,r4 ; Get a pointer to 5th byte add #4 ,r4 ; Set it up and move over call 200$ ; Convert a byte call 200$ ; ..Convert a byte call 200$ ; ....Convert a byte call 200$ ; ......Conv9 CLE.B[001019]CLECRY.MAC;1I)& ert a byte cmp r2 ,#10 ; Time to leave? beq 100$ ; Yes, exit mov TBLOCK(sp),r4 ; Pointer to text[1] inc r4 ; ... clr r1 ; Get a copy of the 5th character bisb @r3 ,r1 ; Without sign extension call 200$ ; Same thing again clr r0 ; Next character is special case bisb (r3)+ ,r0 ; Copy without sign extension xor r1 ,r0 ; Do the XOR clr r1 ; Now get set to xor the table bisb (r4) ,r1 ; entry with the destination mov r2 ,-(sp) ; Save it clr r2 ; Avoid SXT bisb f$tab(r0),r2 ; XOR is restrictive in address modes. xor r2 ,r1 ; Do it movb r1 ,(r4)+ ; Copy mov (sp)+ ,r2 ; Restore r2 call 200$ ; Do the next one mov TBLOCK(sp),r4 ; Do the last one call 200$ ; Do it inc r2 ; Loop back now br 10$ ; Next please 100$: mov (sp)+ ,r5 ; ..........Restore mov (sp)+ ,r4 ; ........Restore mov (sp)+ ,r3 ; ......Restore mov (sp)+ ,r2 ; ....Restore mov (sp)+ ,r1 ; ..Restore mov (sp)+ ,r0 ; Restore return ; Exit 200$: mov r1 ,-(sp) ; Save it mov r2 ,-(sp) ; ..Save it clr r0 ; Compute now bisb (r3)+ ,r0 ; ... clr r1 ; Second part bisb (r5)+ ,r1 ; Get the key data xor r1 ,r0 ; Compute XOR clr r1 ; Now get set to xor with the bisb (r4) ,r1 ; destination. Avoid sign extension clr r2 ; Avoid SXT bisb f$tab(r0),r2 ; Get the table entry xor r1 ,r2 ; Do it movb r2 ,(r4)+ ; Copy mov (sp)+ ,r2 ; ..Pop it mov (sp)+ ,r1 ; Pop it return ; Exit .end *[001019]CLE.RTS;1+./0D6^׃\7ļ)\ 4 U s<Aϳ L4x);5:a].+& O vDBrrNR ABCDrTd2^C^Z 78  J&f-      b   T   F   8@`   $  @` m Ւ&f&f e V R N J   6 @x Ӧ ܴxT   f  A@x  ܴBx f}HDQ%V퓕F|s!z3ngN$t-2b6?ִ>ul/+¯8pYU,^&Zw("#EmJG eVeV&f&f& 4&  B C` Ҁx r % r G |   ` `! V 20(&&f& f fe׭ ff  ? \? ZD  &    @& j F J/ *C aɋ5ѐ f Xѐf Nѐ f& b e f& f xef& e de tf& Z Lee T f& V *e :? 4 $/& f& Z e  / f& P e f& S e fp ^ X ȋ5e~ &  ff ( l@~hf  R-P EPBe~ "*fQ ~ѕ ~f ̕ 4  fQ ~f& X ef& h ef& f e ʋ ? '  ~|& a f& & @e J D?H F @  f& h e ?  / f& Z e̋J ? ? f& ^ e o f 4 ,f& b pef& h \ef&  Jef& e 6ee >  8f& ^ ef Tl "O f& X ef& h ef& f e ʋ(  ~& Va f& & |e  ? /| v f& X @ef& h ,ef& f ef& & ef& X e@ o f& Z e ~ P&O?@UڱۮCle$ P `\°XìTĨPŤLƠ was the init error. Unknown init failure Failed to create region .PLAS ATRFQ failed .PLAS CRAFQ failed ??CLE-F CLE can only be used from VTxxx series terminals  LOGLOGOLOGOULOGOUTBYEBYEYBYEFBYEI??CLE-F FP error or other trap IOT trap ??CLE-F $ (DCL) CCL Command failed Error code, PC and PS: ) CLE.B[001019]CLE.RTS;1C;1y ||mm%m@8m@ mxt$Oq4Oqt!EKkffBxy u~s!xt$+"!y:OqBy:}:}"El"E6F`;;K};K~KMKMQPKMBxT_M_M]_Ma_Ma_MDOp!nLOZOOrxQBx S}fIq9wXyxyuLy$yFyY9aŞ:: :_:`:(}0:DqtDRtbe}J} Wë(# X:fdpt!py| |8||||P5|:|{|*[001019]CLE.MAC;1+.:/0D6\7ļ)\ 4I::; U |s< .title CLE A simple command line editor, RSTS/E 9.x .ident /9.3.01/ ; Brian Nelson 24-Jul-86 09:29:26 ; ; Last edit: 08-Aug-86 11:30:28 ; ; This is a simple command line editor for RSTS/E 9.x. It is ; a run time system that one sets to be the current (NOT ; system) default RTS. It reads commands in ODT mode, ; allowing for editing with the normal arrow keys, rubout, ; control B, E, H and X keys. It stores up to 20 commands in ; a buffer allocated in a private 1KW dynamic region. Currently ; the maximum line length is 80 characters. Continuation lines ; are not supported. It will ONLY function on RSTS/E 9.2 or ; later. ; ; WARNING ; ; This RTS is currently set up to REQUIRE the INSTAL privilege ; because we need that to create the dynamic region that's used ; to store command lines. ; ; ; Restrictions: ; ; Due to a bug in DCL, you can not execute DCL command files that ; open files for reading or writing. This is supposed to be fixed ; by Digital. ; ; Since the dynamic region is created to be permanent, this RTS ; tries to intercept the LOG command so it can delete the region. ; In other words, if jobs are killed that have created a region ; the region will not go away until you manually remove it via ; the REM/LIB command. ; ; This RTS only works correctly on 9.2 or later. $$SIMPLE == 1 ; Use a good encryption routine ; (CLECRY.MAC) if == 0 ; For performance reasons, it is a good idea to add the command ; ; 0 CLE.B[001019]CLE.MAC;1C;1I:$ LOAD/OVER TER ; ; to SY:[0,1]START.COM ; ; ; Please see the comments prefixing the entry point CHKBYE for ; security issues. .include /SY:[1,2]COMMON.MAC/ .iif ndf, JDFLG3, JDFLG3 = 34 .title CLE A simple command line editor, RSTS/E 9.x .enabl gbl .PSECT $RTQUE,RW,D,GBL,REL,OVR .PSECT $RWDAT,RW,D,GBL,REL,CON .PSECT $PDATA,RO,D,LCL,REL,CON .PSECT RWDATA,RW,D,LCL,REL,CON .PSECT CLECTX,RW,D,GBL,REL,CON .PSECT DESCOD ,RO,I,LCL,REL,CON .PSECT DESDAT ,RO,D,LCL,REL,CON .PSECT $CODE ,RO,I,LCL,REL,CON ; Files needed: ; CLE.MAC Runtime system ; K11EDI.MAC Editor from the authors Kermit-11 ; K11MAC.MAC Include file from Kermit-11 ; ; $ ass sy: in ; $ ccl macro cle=cle ; $ ccl macro k11edi=k11edi ; $ ccl link ; cle/z,cle,cle=cle,k11edi/x/h:#177776/u:#4000 ; .99998 ; $ run $silus ; cle.rts,tt:=cle ; $ rem/run cle ; $ ins/run [1,8]cle LF = 12 FF = 14 CR = 15 ESC = 33 RUB = 177 FIEXST = ^D16 ER$EOF == -1 TTY = 0 VT100 = 1 VT200 = 1 .macro SCAN ch,str mov str ,-(sp) clr -(sp) bisb ch ,@sp call scanch .endm SCAN .macro ATOR50 addr mov addr ,-(sp) call ascrad .endm ATOR50 .macro DECOUT val mov val ,-(sp) call putdec .endm DECOUT .macro OCTOUT val mov val ,-(sp) call putOCT .endm OCTOUT .macro SAVE list .if b , .ift save .iff .irp x, mov x,-(sp) .endr .endc .endm SAVE .macro UNSAVE list .if b , .ift unsave .iff .irp x, mov (sp)+,x .endr .endc .endm UNSAVE .macro STRCAT dst,src mov src ,-(sp) mov dst ,-(sp) jsr pc ,strcat .endm STRCAT .macro STRCMP s1,s2 mov s2 ,-(sp) mov s1 ,-(sp) call strcmp .endm STRCMP .macro STRCPY dst,src mov src ,-(sp) mov dst ,-(sp) jsr pc ,strcpy .endm STRCPY .macro STRLEN addr mov addr ,-(sp) call STRLEN .endm STRLEN .macro PRINT addr mov addr ,-(sp) call TTYOUT .endm PRINT .macro CLRXRB call $CLRXRB .endm CLRXRB .macro CLRFQB call $CLRFQB .endm CLRFQB .save ; Save current psect context .ASECT . = 140000 EDICMD::.BLKW 1 EDILEN::.BLKW 1 EDIPOS::.BLKW 1 EDIPPN::.BLKW 1 EDITIM::.BLKW 1 EDISTS::.BLKW 1 $ENCKE::.BLKB 62. $DECKE::.BLKB 62. $SKEY:: .BLKB 60 EDIEND == . ; End of fixed data LN$CNT == 20. ; Number of buffer LN$MAX == 80. ; Max line length LN$SIZE == LN$MAX+4 ; Allocation MAPSIZ == 40 ; Map 1KW (32*32 (10)) words .ASSUME LT 3770; Insure we will fit in 1KW .psect $RODATA ,RO,D,LCL,REL,CON edikey::.byte 'S!200 ; If using simple minded XOR .byte 'Z!200 ; encryption. Otherwise build .byte '1!200 ; one at run time. .byte 'p!200 .byte '#!200 .byte 'x!200 .byte '7!200 .byte 'c!200 .byte '[!200 .byte '.!200 .byte 'a!200 .byte ':!200 .byte 'k!200 .byte 0 ; we will never get a NULL. prm:: .asciz /Cle$ / ; A prompt nulprm: .byte 0 .blkb 10 ; In case of patching? .even ; Please lastcn::.word LN$CNT ; Buffer count edisiz::.word LN$MAX ; $$BUFP = 0 ; Now generate command buffers lastli:: ; Start of buffer address table .rept LN$CNT ; Generate the structure $BADDR =EDIEND+; Compute the address .ASSUME $BADDR LT <143777-LN$SIZE> .word $BADDR ; Insert the address $$BUFP = $$BUFP+1 ; Move up .endr ; Next please .asect ; Local R/W data. You can NOT ; place data here that needs to be . = 1000 ; saved between CLE.B [001019]CLE.MAC;1C;1I:r commands. stklim::.blkw 300 ; A small stack stack:: .blkw 1 ; Top of it buf:: .blkb 200 ; A buffer for reading tmpbuf: .blkb 200 jobn: .blkw 1 ; Current job number regid: .blkw 1 ; Region id for dynamic region regnam: .blkw 2 ; Region name func: .blkw 1 ; Debugging vttype::.blkw 1 ; Terminal type curppn: .blkw 1 ; Current UIC prmadr: .blkw 1 .restore .sbttl Entry to the run time system .psect $CODE ,ro,i,lcl,rel,con ...CLE::mov #stack ,sp ; Insure sufficient stack space call init ; Start things up 10$: call leftm ; Insure cursor at left margin mov #buf ,-(sp) ; Read, edit and store a line mov prmadr ,-(sp) ; Stuff buffer address and a mov sp ,r5 ; promt. Point R5 to params. This call kbredi ; is because we use the editor with cmp (sp)+ ,(sp)+ ; Minitab and Kermit-11. Pop args. tst r1 ; Anyting there? beq 10$ ; No mov #buf ,r2 ; Remove trailing control chars add r1 ,r2 ; Point to end of the line 20$: cmpb -(r2) ,#40 ; Well? bhi 30$ ; No more sob r1 ,20$ ; Found one, keep looking br 10$ ; Nothing, ignore it. 30$: cmp r1 ,#1 ; One character? bne 40$ ; No cmpb buf ,#'$ ; Just a '$' command beq 10$ ; Yes, ignore 40$: mov #buf ,-(sp) ; No. Now comes the REAL KLUDGE. call chkbye ; Since we can't tell the exec to bcs 50$ ; delete the region when its creator call detreg ; disappers, we will try to catch call delreg ; the likely logout message and then 50$: mov #buf ,-(sp) ; detach and delete the region here. .TTECH ; Insure echoing. call docmd ; Generate and execute '$ commandline' jmp ...huh ; This can't happen. .even .sbttl Utility routines ; DOCMD ; ; Passed: 2(sp) Command line to build ; Return: If '$' is a valid CCL command, it never returns Docmd: mov r4 ,-(sp) ; Save it mov r3 ,-(sp) ; This one also mov 2+4(sp) ,r3 ; Get string address STRLEN r3 ; Get the length now mov r0 ,r2 ; Copy it beq 100$ ; Nothing to do. add #5 ,r2 ; Room for '$ ' and null. bic #1 ,r2 ; Insure even value sub r2 ,sp ; Allocate a buffer mov sp ,r4 ; And a pointer to it movb #'$ ,(r4)+ ; Insert DCL prefix movb #40 ,(r4)+ ; ... STRCPY r4 ,r3 ; Make a copy of the command mov sp ,r4 ; Reset buffer address CLRXRB ; Insure XRB is cleared out STRLEN r4 ; Get total length mov r0 ,XRB+XRLEN ; Length of the CCL command mov r0 ,XRB+XRBC ; Again mov r4 ,XRB+XRLOC ; String address .CCL ; Try it out PRINT #200$ ; Huh? This can't happen add r2 ,sp ; But it did. Restore the stack 100$: mov (sp)+ ,r3 ; Pop registers mov (sp)+ ,r4 ; Simple mov (sp)+ ,(sp) ; Move return address up return ; And exit 200$: .asciz /$ (DCL) CCL command failed/ .even .sbttl Get started ; INIT ; ; Passed: Nothing ; ; Init handles all initialization whenever a user enters the RTS. ; It does the following things: ; ; 1. Save current UIC. ; 2. Get terminal type, reject entry if not a VT1xx or VT2xx. ; 3. Change name to ...CLE, Reset I/O channels, Get Job number, ; Reset terminal echoing and output. ; 4. Compute region name as CLEJnn, where NN is the job number. ; 5. Attempt to create the region. If this fails for any reason ; other that an already existing region, then exit. Thus one ; one needs the INSTAL priv. If it was created, save region ; ID. ; 6. Attach to the region by name. Save the region id. ; 7. Create address window off of APR6 (the RTS is mapped on 7). ; 8. If region was jPCLE.B[001019]CLE.MAC;1C;1I:ust created, save current UIC in the region. ; 9. If current UIC <> Saved UIC, or the region was just created ; the clear the command line buffers. init:: .STAT ; Get current PPN mov XRB+10 ,curppn ; Save it mov #prm ,prmadr ; A real prompt CLRFQB ; Clear FIRQB out movb #UU.SYS ,FIRQB+FQFUN ; ... incb FIRQB+5 ; Subfunction 1 .UUO ; Do it mov FIRQB+32,XRB+0 ; Now get JDFLG3 add #JDFLG3 ,XRB+0 ; Offset to flag 3 ; .PEEK ; Do it ; tstb FIRQB ; Well? ; bne 5$ ; No ; tstb XRB+0 ; Running a ICFP ? ; bpl 5$ ; No ; mov #nulprm ,prmadr ; Yes, a null prompt 5$: call inqter ; Get the terminal type mov r0 ,vttype ; And save the terminal type bne 10$ ; Must be a video terminal here. PRINT #notvt ; No, exit jmp ...dcl ; Back to DCL folks. 10$: call leftm ; See if we need a CRLF mov #unknown,func ; Unknown call mov #^R... ,FIRQB+FQNAM1+0 ; Change program name mov #^RCLE ,FIRQB+FQNAM1+2 ; to ...CLE .NAME ; Simple to do CLRFQB ; Reset I/O channels movb #RSTFQ ,FIRQB+FQFUN ; Simple CALFIP ; Do it movb FIRQB+FQJOB,jobn ; Save job number asrb jobn ; Not times two .TTRST ; Insure terminal is ok .TTECH ; Ditto .sbttl Initialize, continued... movb jobn ,r1 ; Convert to ASCII clr r0 ; Simple div #12 ,r0 ; Do it add #'0 ,r0 ; Convert to ascii now add #'0 ,r1 ; Ditto sub #4 ,sp ; Allocate a buffer mov sp ,r2 ; And a pointer movb #'J ,(r2)+ ; Generate the second half of movb r0 ,(r2)+ ; the dynamic region name now. movb r1 ,(r2)+ ; And then we convert to R50 mov sp ,r2 ; Fix the pointer ATOR50 r2 ; Convert add #4 ,sp ; Fix the stack back up mov #^RCLE ,regnam+0 ; Save the region's name mov r0 ,regnam+2 ; ...Save the region's name mov #$uurts ,func ; Error message header for UU.RTS CLRFQB ; Get set for a .CRRG movb #UU.RTS ,FIRQB+FQFUN ; On RSTS/E we use UU.RTS movb #30 ,FIRQB+FQFIL ; Subfunction to create region mov #^RCLE ,FIRQB+FQNAM1+0 ; First half of the regions name mov r0 ,FIRQB+FQNAM1+2 ; Second half of the region name movb #1 ,FIRQB+FQSIZ ; 1KW please mov #100000 ,FIRQB+FQMODE ; Keep the region around mov #1000 ,FIRQB+FQFLAG ; This region is private decb FIRQB+FQPFLG ; Next byte is real protection movb #60. ,FIRQB+FQPROT ; Owner only .UUO ; At last clr r5 ; Flag if the region was already there cmpb FIRQB ,#FIEXST ; Does the region already exit? beq 20$ ; Then just attach to it tstb FIRQB ; Otherwise, did this fail? bne 200$ ; Yes, it's fatal movb FIRQB+FQPPN,regid ; Save this for a moment. dec r5 ; First time 20$: mov #$atrfq ,func ; ATRFQ of .PLAS failed CLRFQB ; Zap the FIRQB again please movb #ATRFQ ,FIRQB+4 ; Attach to region subfunction of .PLAS mov regnam+0,FIRQB+12 ; Region name to attach to. mov regnam+2,FIRQB+14 ; ...Region name to attach to. mov #2 ,FIRQB+FQMODE ; We must have r/w access to it. .PLAS ; Well, lets get it done with tstb FIRQB ; Success ? bne 200$ ; No, die mov FIRQB+6 ,regid ; Yes, copy the region identification. .sbttl More init, do a CRAW$S and init the region if need be. mov #$crafq ,func ; Set debug address text CLRFQB ; Yes, once again, zap the FIRQB now. movb #CRAFQ ,FIRQB+4 ; Create an address window now movb #6 ,FIRQB+7 ; Based from APR6, 140000-157777 mov #MAPSIZ ,FIRQB+12 ; Set the map size mov regid ,FIRQB+14 ; The region ident word mov #MAPSIZ ,FIRQB+20 ; How much to map. mov #202 ,FIRQB+FQMODE ; Read/write + implicit MAP$ CLE.B [001019]CLE.MAC;1C;1I:9kS .PLAS ; Do it tstb FIRQB ; Did it work? bne 200$ ; No tst r5 ; First time here? beq 30$ ; No mov curppn ,@#edippn ; And save the current UIC please 30$: cmp curppn ,@#edippn ; Same UIC bne 40$ ; No, init the region then. tst r5 ; First time? beq 100$ ; No 40$: call inireg ; Yes, init things 100$: clr @#edipos ; Clear out cursor position clr @#edilen ; Clear length return ; Exit 200$: movb FIRQB ,r0 ; Dump the error code DECOUT r0 ; Do it PRINT #inierr ; Error text PRINT func ; Function jmp ...dcl ; Goto DCL .save .psect $RODATA ,D inierr: .asciz / was the init error. / unknown:.asciz /Unknown init failure/ $uurts: .asciz /Failed to create region/ $atrfq: .asciz /.PLAS ATRFQ failed/ $crafq: .asciz /.PLAS CRAFQ failed/ notvt: .ascii /??CLE-F CLE can only be used from VTxxx series terminals/ crlf: .byte CR,LF,0 .even .restore .enabl LSB inireg::mov #-1 ,@#edicmd ; Init the current command to -1 clr @#edists ; Clear status mov #LN$CNT ,r0 ; Number of buffers to clear mov #lastli ,r1 ; Address of list 10$: mov (r1)+ ,r2 ; Address of current buffer clrb @r2 ; Zap it sob r0 ,10$ ; Next please CLRFQB ; Use UU.SYS for a key movb #UU.SYS ,FIRQB+FQFUN ; Function incb FIRQB+5 ; Part one .UUO ; mov #FIRQB+2,r1 ; A pointer mov #34 ,r0 ; Size mov #$skey ,r2 ; ... 20$: movb (r1)+ ,(r2) ; Copy bne 30$ ; Ok incb (r2) ; Insure > 0 30$: bisb #200 ,(r2)+ ; Insure > 200 sob r0 ,20$ ; Next clrb @r2 ; .ASCIZ .DATE ; Get current stuff movb XRB+5 ,@#editim ; Save ticks till minute mov #$ENCKEY,-(sp) ; Inittialize keys clr -(sp) ; Get ENCODE key mov #200$ ,-(sp) ; Using time info call kinit ; Do it inc 2(sp) ; Get DECODE key next mov #$DECKEY,4(sp) ; Simple call kinit ; Again add #3*2 ,sp ; Pop stack. return ; Exit ; Since the tables in CLECRY.MAC are key dependent, we will ; use the old one and do the en/decryption based on the ticks ; to next second at region creation. .save .radix 10 .psect $PDATA ,D 200$: .byte 31, 41, 59, 26, 53, 58, 97, 93, 238, 46, 26, 43, 38, 32, 79 .even .radix 8 .restore .dsabl lsb .sbttl Detach, delete region Detreg::CLRFQB ; Always do this movb #DTRFQ ,FIRQB+4 ; .PLAS subfunction mov regid ,FIRQB+6 ; Region ID .PLAS ; Simple clc ; Always say it worked. return ; Exit Delreg::CLRFQB ; Ditto, insure no oddball defaults mov regnam+0,FIRQB+FQNAM1+0 ; Stuff the region name in mov regnam+2,FIRQB+FQNAM1+2 ; ...Stuff the region name in movb #24 ,FIRQB+4 ; UU.RTS subfunction, delete region movb #UU.RTS ,FIRQB+FQFUN ; .UUO function code .UUO ; Simple clc ; Always say it works return ; And exit .sbttl Utility routines Clrcns::return Read1c::CLRXRB ; Insure XRB is zapped .TTNCH ; No echo .TTDDT ; One shot ODT mode CLRXRB ; Insure XRB zapped clr -(sp) ; Allocate a buffer mov sp ,r1 ; A pointer mov r1 ,XRB+XRLOC ; Buffer address inc XRB+XRLEN ; One character size buffer mov #100000 ,XRB+XRTIME ; KMON read .READ ; Simple clr r0 ; Return the character next tstb FIRQB ; Errors? bne 100$ ; Yes, return a NULL tst XRB+XRBC ; No data????? beq 100$ ; Should never happen. bisb @r1 ,r0 ; No, return the data then. 100$: tst (sp)+ ; Pop the buffer and exit return ; Bye kbread::return ; No-op for hardcopy terminals ; TTYOUT ; ;^ CLE.B[001019]CLE.MAC;1C;1I: Passed: 2(sp) .ASCIZ string address ; ; ; The entry point MOUT is present for compatibility with K11EDI ; having been assembled for Kermit-11 with the K11MAC.MAC include ; file. MOUT:: TTYOUT::mov r0 ,-(sp) ; Save R0 mov r1 ,-(sp) ; Save R1 mov 2+4(sp) ,r0 ; no length, assume .asciz 10$: tstb (r0)+ ; move along looking for a null bne 10$ ; none yet so far sub 2+4(sp) ,r0 ; get the length dec r0 ; off by one ble 100$ ; Nothing to do, exit 20$: mov #XRB ,r1 ; address of xrb parameter block mov r0 ,(r1)+ ; buffer length mov r0 ,(r1)+ ; byte count for the i/o mov 2+4(sp) ,(r1)+ ; address of the buffer clr (r1)+ ; Channel zero clr (r1)+ ; unused clr (r1)+ ; unused mov #40100 ,@r1 ; stuff xrmod with transparent mode .WRITE ; Dump tstb FIRQB ; Success? beq 100$ ; Yes, exit sec ; No, set carry and then exit 100$: mov (sp)+ ,r1 ; Pop R1 mov (sp)+ ,r0 ; And also pop R0 mov (sp)+ ,(sp) ; Pop return return L$TTYO::mov (r5) ,-(sp) ; Convert to other form so K11EDI call TTYOUT ; will get it's globals resolved. return ; Exit .sbttl other junk ; Clear FIRQB and clear XRB $CLRXR::mov r0 ,-(sp) ; Clear the XRB out mov #XRB ,r0 ; Starting address of it 10$: clr (r0)+ ; Zap a word cmp r0 ,#XRB+14 ; Done? blos 10$ ; No mov (sp)+ ,r0 ; Pop R0 return ; And exit $CLRFQ::mov r0 ,-(sp) ; Clear the FIRQB out mov #FIRQB ,r0 ; Start address 10$: clr (r0)+ ; Do a word cmp r0 ,#FIRQB+36 ; Done? blos 10$ ; No mov (sp)+ ,r0 ; Yes, Pop R0 return ; And exit Leftm: CLRXRB ; See if we need a CRLF .POSTN ; Get current position tst XRB+2 ; Well? beq 100$ ; Not needed PRINT #crlf ; Needed, do a CRLF 100$: return ; Exit ; Convert 3 ascii to 1 rad50 ; ; Passed: ; 2(sp) Address of the string ; Return: R0 The rad50 value Ascrad: SAVE ; save the scratch registers . mov 2+10(sp),r4 ; the address of the ASCII str. clr r3 mov #3 ,r0 1$: mov #radchr ,r1 mov #40. ,r2 2$: cmpb (r4) ,(r1)+ beq 3$ ; Found the character. EXIT loop sob r2 ,2$ mov #40. ,r2 3$: dec r2 mul #40. ,r3 ; We accumulate the RAD50 chars sub r2 ,r3 ; in r3. R1 has the next rad50 add #39. ,r3 tstb (r4)+ ; to add on. Move to the next sob r0 ,1$ ; byte ( for a total of 3 bytes) mov r3 ,r0 UNSAVE ; return result in r0 and return mov (sp)+ ,(sp) ; Pop return address return ; And exit .nlist bex radchr: .ascii / ABCDEFGHIJKLMNOPQRSTUVWXYZ$.?0123456789:/ .list bex .even .sbttl strcat and strcpy ; STRCPY ; ; input: ; 0(sp) return address ; 2(sp) dst address ; 4(sp) src address ; output: r0 dest address STRCPY::mov r1 ,-(sp) ; save temp registers please mov 2+2(sp) ,r0 ; destination address mov 2+4(sp) ,r1 ; source .asciz address 10$: movb (r1)+ ,(r0)+ ; copy until a null bne 10$ ; not done mov 2+2(sp) ,r0 ; return the dst address mov (sp)+ ,r1 ; pop r1 and exit mov (sp) ,4(sp) ; move return address up now cmp (sp)+ ,(sp)+ ; pop junk and exit return STRCAT::mov r1 ,-(sp) ; save temp registers please mov 2+2(sp) ,r0 ; destination address mov 2+4(sp) ,r1 ; source .asciz address 5$: tstb (r0)+ ; look for the end of the dst string bne 5$ ; not found yet dec r0 ; found it, fix the pointer 10$: movb (r1)+ ,(r0)+ ; copy until a null bne 10$ ; not done mov 2+2(sp) ,r0 ; return the dst address mov (sp)+ ,r1 ; pop r1 and exit mov (sp) ,4- CLE.B[00 1019]CLE.MAC;1C;1I:W&cp-UG^1f QXEPTGJ2vHޓ,~5h>+}Nh.R]u e6PZzE.s#":_y"\ ҢmVtn \KZG3~햽:hiUW&*eYAlo/U*1]ʴ!o@R@*D(;rx^PUCJ'$&K= ~/[Pfoj115hmyN/0+wZW&~kv }IZZ.XzWaQk*cYal·vI/3W[WYM@;Iֺ!,m8a)[2wE4 pl/Klw<ќʨ~2wvp` 4=f3]WX-XcRk]<)>/j5k &,48 O8])KIǻBfqb2T 0c+Ch`FA*d{Y8,W,tHu @|IMX r) rFD,9E2t:L`\ zBJNKm}8Rw_?\0 xqOS5VQ$kv/Pp7,=-%OIL6eGg.;*k/dM$EH2!x5g'wuӗg58ejow#J +̓$n 淹`4NC2 $C?UzGvr[txOIWecT"0{QQ?b" M;g F=HJҙs2 z3[* oX|rIs@@Oudi0?0olOOID}_9~Q)5q}k'0MHIeACu ;ef/RN@ =>-w9}6m R2zo@+@ h9EK鴬Kʏ7kkϭujѰކ,B2A7T4J3Ƚ^-08"> GClCLp3lɕKy*r](JfpT7 ^gĄ@Ø[Nُ0_xN7m[_ þYY8)G4ן4E~jl$Q``Zv.nGX9 R[M,4:%geut"7|2vg.O-db!Yq$tTM WbzM"L/9P6K2} D ^bJ+WKC3h(Q@Ye l7N?FBqQm)e"ڴJZ rj8 \T%:tڧ>@72n<Φ{ W5)[W 8:\I8m5IˡQv+¾;|1| JIZ[Ox6[y=*Lw֠>)xN.${偈 vgykjA,7'ɇGY\ r2 qzrzj;a'2[ &5r==T{ib[p4 0s֒=`Z{rXaW$S@khFY& jk3թ}~물ࠏ_mD_dgP;;;:}iuI .m~PgZc 2=S>@!30pGb%0 ]srm_''w>Yebg;k]h UoDD'ޢX^ f6 ,1>Xn3[GvGNլp^/,S_V&s~( #^y7Nlwv"] M@?=?}dڂJo[yyk`5;]X,M)FV,{14dߨx]Gֿ  k|sa@"YS8SIiKZM#<N|9}2G=2.8|T(KjoQjxod Jq{%%shhqy(|H8%d/Of9qbhhAvl/ o^{ &Wky~}[nr^?O 1u9fHm3*fix+ =32xCDB-vrCB)cПfTVN} =ަgoBP{Qwl253Ʃexaq|cx`tl  .jGLJZ(GC o=ʵ2 D&P%arodnxdYrre34i_3Jwe ohd2|jmKkuz1+ CLE.B[001019]CLE.MAC;1C;1I:'(sp) ; move return address up now cmp (sp)+ ,(sp)+ ; pop junk and exit return STRCMP::mov 2(sp),r0 ;Pick up 'a' mov 4(sp),r1 ;And 'b' 10$: cmpb (r0)+,(r1) ;Are they the same bne 20$ ;No tstb (r1)+ ;At the end of the string bne 10$ ;No clr r0 ;Equal return br 100$ ; Exit 20$: blo 30$ ; Br if ab return br 100$ ; Exit 30$: mov #-1,r0 ; A mov #$cbomg ,r3 ; Octal conversion br pcom Putdec: SAVE mov #$cbdmg ,r3 ; Decimal conversion Pcom: SAVE ; Save some more registers mov 10+2(sp),r1 ; The value sub #20 ,sp ; Create a buffer mov sp ,r0 ; The buffer movb #40 ,(r0)+ ; Stuff a blank in clr r2 ; Formatting options jsr pc ,@r3 ; Now format clrb @r0 ; Make it .ASCIZ now mov sp ,r0 ; Reset the buffer address PRINT r0 ; And dump the data add #20 ,sp ; Pop buffer UNSAVE ; Pop registers mov (sp)+ ,(sp) ; Move return address up return ; And exit Scanch::save ; save temps mov 6(sp) ,r2 ; get address of the string clr r0 ; initial found position 10$: tstb @r2 ; end of the string yet ? beq 90$ ; yes inc r0 ; no, pos := succ(pos) cmpb 4(sp) ,(r2)+ ; does the ch match the next one? bne 10$ ; no, try again br 100$ ; yes, exit loop 90$: clr r0 ; failure, return postion = 0 100$: unsave ; pop r2 mov @sp ,4(sp) ; move return address up cmp (sp)+ ,(sp)+ ; pop stack return ; and exit .sbttl RSX Syslib conversion routines $SAVRG::MOV R4,-(SP) MOV R3,-(SP) MOV R5,-(SP) MOV 6(SP),R5 CALL @(SP)+ MOV (SP)+,R3 MOV (SP)+,R4 MOV (SP)+,R5 RETURN $CBDMG::MOV #25012,-(SP) BR E00072 $CBDSG::MOV #25412,-(SP) BR E00072 $CBOMG::MOV #31010,-(SP) BR E00072 $CBOSG::MOV #31410,-(SP) BR E00072 $CBTMG::BIC #-400,R1 MOV #15010,-(SP) E00072: TST R2 BNE E00102 BIC #1000,(SP) E00102: MOV (SP)+,R2 $CBTA::JSR R5,$SAVRG MOVB R2,R5 CLRB R2 SWAB R2 ASR R2 BCC E00134 TST R1 BPL E00134 NEG R1 MOVB #55,(R0)+ E00134: MOV R0,R4 ROR R2 ROR R2 ROR R3 CLRB R3 BISB R2,R3 CLRB R2 BISB #60,R2 MOV R1,R0 E00160: MOV R0,R1 CLR R0 DIV R5,R0 CMP R1,#11 BLOS E00200 ADD #7,R1 E00200: ADD R2,R1 MOV R1,-(SP) DECB R3 BLE E00234 TST R0 BNE E00230 TST R2 BPL E00234 TST R3 BPL E00230 BIC #20,R2 E00230: CALL E00160 E00234: MOVB (SP)+,(R4)+ MOV R4,R0 RETURN .sbttl Get terminal type .enabl lsb ; Assume: Login.com did a $ SET TER/INQ ; ; INQTER ; ; Passed: Nothing ; Return: R0 = 0 if hardcopy ; R0 = 1 if VT1xx or VT2xx series Inqter::CLRFQB ; Clear out again movb #UU.TRM ,FIRQB+FQFUN ; Terminal char function mov #1+<400*377>,FIRQB+4 ; Subfunction 1, KB: .UUO ; Read chars tstb FIRQB ; Success? bne 90$ ; No mov #200$ ,r0 ; Yes, look for VT type term 10$: tstb @r0 ; End of list yet? beq 90$ ; Yes, return( TTY ) G CLE.B[001019]CLE.MAC;1C;1 I:K. cmpb (r0)+ ,FIRQB+6 ; No, check for a match bne 10$ ; Not yet mov #VT100 ,r0 ; Yes, return(VT100) br 100$ ; Exit 90$: mov #TTY ,r0 ; Nothing 100$: return ; Exit .save .psect $RODATA ,D 200$: .byte 6. ; VT100 .byte 13. ; VT101 .byte 14. ; VT102 .byte 15. ; VT125 .byte 16. ; VT131 .byte 17. ; VT132 .byte 18. ; VT220 .byte 19. ; VT240 .byte 20. ; VT241 .byte 21. ; VT105 .byte 22. ; VK100 (gigi) .byte 23. ; RT02 .byte 0 ; End .even .restore .dsabl lsb .sbttl Try to catch LOGOUT or BYE commands ; This is a kludge. The problem is that we do not have a way ; to tell the EXEC at region creation time to get rid of the ; region when the creator process (your job) is removed (via ; UU.BYE or job kill). Ideally, one would like to be able to ; do so. But in the mean time, what we can do is to check for ; LIKELY logout strings, like LOG*OUT or BYE*, and if found ; detach and delete the region ourself. ; ; ; CHKBYE ; ; Passed: 2(sp) Command line address ; Return: C bit Cleared --> Logout command found ; C bit Set --> We did not find LOG*OUT or BYE? Chkbye::SAVE ; Save temps mov 2+<2*3>(sp),r1 ; Command line sub #LN$SIZE+2,sp ; Allocate a buffer mov sp ,r2 ; Point to it 10$: movb (r1)+ ,@r2 ; Copy command character beq 20$ ; Alldone cmpb @r2 ,#CR ; Carriage return? beq 20$ ; Yes, done cmpb @r2 ,#LF ; Line feed? beq 20$ ; Done cmpb @r2 ,#'A!40 ; Lower case? blo 15$ ; No cmpb @r2 ,#'Z!40 ; Well... bhi 15$ ; No bicb #40 ,@r2 ; Yes, force to lower case then. 15$: inc r2 ; Not done, point to the next one br 10$ ; Next 20$: clrb @r2 ; Done, insure .ASCIZ mov sp ,r2 ; Reset buffer pointer mov #log$lis,r3 ; Point to command list 30$: tst @r3 ; Done checking for logout commands? beq 90$ ; Yes, set carry and exit STRCMP r2 ,(r3)+ ; No, check again tst r0 ; A match? bne 30$ ; No add #LN$SIZE+2,sp ; Yes, pop buffer and exit clc ; Flag sucess br 100$ ; Exit 90$: add #LN$SIZE+2,sp ; Yes, pop buffer and exit sec ; Done, no match. 100$: UNSAVE ; Pop registers and exit mov (sp)+ ,(sp) ; Move return address up return ; And now exit. .save .psect $RODATA .even log$li::.word LOG ,LOGO ,LOGOU ,LOGOUT ,BYE ,BYEF ,BYEI ,BYEY .word 0 log:: .asciz /LOG/ logo:: .asciz /LOGO/ logou:: .asciz /LOGOU/ logout::.asciz /LOGOUT/ bye:: .asciz /BYE/ byey:: .asciz /BYEY/ byef:: .asciz /BYEF/ byei:: .asciz /BYEI/ .even .restore .sbttl Encryption .iif ndf ,$$SIMPLE, $$SIMPLE = 1 .if ne ,$$SIMPLE .ift ; ENCRYPT ; ; Passed: ; 2(sp) String to do ; 4(sp) Key string ; Return: 2(sp) Output string ; ; This is simply an XOR encryption, which is trivial to break. ; It's better than nothing for now until I get a 'DES' routine ; or something similiar. It will prevent casual browsing. Decryp:: Encryp::SAVE ; Save all mov 2+<6*2>(sp),r5 ; Get pointer to string mov 4+<6*2>(sp),r4 ; Get pointer to key string mov #$skey ,r4 ; *** Override the key address *** STRLEN r4 ; Get length of the key mov r0 ,-(sp) ; Save the key length beq 100$ ; Nothing to do. clr r1 ; Offset into the key string 10$: clr r2 ; Copy the next character bisb @r5 ,r2 ; Get the character now. beq 100$ ; All done mov r4 ,r3 ; Key string add r1 ,r3 ; Point to current key char clr r0 ; Always avoid sign extension bisb @r3 ,r0 ; Get next sCLE.B[001019]CLE.MAC;1C;1I:g 5key character xor r2 ,r0 ; Do the xor movb r0 ,(r5)+ ; And copy over the source inc r1 ; Next key character clr r0 ; Get remainder after division div (sp) ,r0 ; Do it br 10$ ; Next please 100$: clrb @r5 ; Insure .asciz tst (sp)+ ; Pop temp UNSAVE ; Pop all mov (sp) ,4(sp) ; Move return address up cmp (sp)+ ,(sp)+ return kinit: return .iff ; Use more advanced routine .enabl lsb Encryp:: Decryp:: 10$: mov r2 ,-(sp) mov sp ,r2 mov r3 ,-(sp) mov r4 ,-(sp) mov 6(r2) ,-(sp) mov 4(r2) ,r3 mov r3 ,-(sp) mov #LN$MAX ,r4 asr r4 asr r4 asr r4 20$: mov r3 ,(sp) movb editim ,r2 asr r2 asr r2 asr r2 inc r2 30$: call desalt sob r2 ,30$ add #10 ,r3 sob r4 ,20$ cmp (sp)+ ,(sp)+ mov (sp)+ ,r4 mov (sp)+ ,r3 mov (sp)+ ,r2 mov (sp) ,4(sp) cmp (sp)+ ,(sp)+ return .dsabl lsb .endc .sbttl Control C, Synch interupts and psuedo vector ...CC:: ; Control C things ...2CC::.TTECH ; Enable echoing .TTRST ; And reset other terminal stuff rti ; And dismiss the interupt .enabl lsb ...IOT::PRINT #210$ br ...DCL ..FPER:: ; Should never get here. ...BAD::movb FIRQB ,r2 ; Save exec's error code mov sp ,r3 ; Save stack PRINT #200$ ; Die PRINT #230$ ; Info OCTOUT r2 ; Error code OCTOUT @r3 ; PC OCTOUT 2(r3) ; PS PRINT #300$ ; CR/LF br ...dcl ; Exit ...HUH::PRINT #220$ ; A message br ...dcl ; And goto DCL ...DCL::CLRXRB ; Clear XRB out CLRFQB ; Ditto for the FIRQB mov #^RDCL ,FIRQB+FQNAM1 ; Go to DCL now mov #-1 ,FIRQB+FQEXT ; Make it the default .RTS ; Try to do this .EXIT ; Go away now. .save .psect $RODATA ,D 200$: .asciz /??CLE-F FP error or other trap/ 210$: .asciz /IOT trap/ 220$: .asciz /??CLE-F $ (DCL) CCL Command failed/ 230$: .asciz /Error code, PC and PS:/ 300$: .byte 15,12,0 .even .restore .psect .99998 .blkw 30 .psect .99999 ..psta::.word PF.KBM!PF.NER ; KBM and no error logging .rad50 /CLE/ ; Default 'runnable' extention .word 0 ; Reserved .word 1 ; 1 KW min size .word ..FPER ; FIS (an 11/40?) .word 0 ; Reserved .word 0 ; Reserved .word ...CLE ; 'New' user entry point .word ...CLE ; 'Run' entry .word ...BAD ; Junk .word ...BAD ; BPT .word ...IOT ; IOT .word ...BAD ; Non-exec EMT's .word ...BAD ; TRAP's .word ..FPER ; FPU errors .word ...CC ; Control C .word ...2CC ; Two of the things .word 1 ; P.SIZE, max size ..pend:: .end *[001019]K11EDI.MAC;1+./0D6\7ļ)\ 4A U|s< .title k11edi Command line editing .ident /3.52/ ; 18-Jul-86 12:00:29 Brian Nelson ; ; This code is used (currently) for the RSTS/E Command Line ; Editor (CLE.RTS) written by the above author, and for 5.1 ; of MINITAB. The encryption calls are for the RSTS/E CLE. .include /IN:K11MAC.MAC/ .enabl gbl .psect rwdata ,rw,d,lcl,rel,con .psect CLECTX ,rw,d,gbl,rel,con curpos: .word edipos curlen: .word edilen curcmd: .word edicmd maxsiz: .word edisiz clests: .word edists enckey: .wo CLE.B[001019]K11EDI.MAC;1 Ae+rd $enckey deckey: .word $deckey .psect $pdata ,ro,d,lcl,rel,con .psect $code ,i,ro,i,lcl,rel FALSE = 0 TRUE = 1 IN$MODE = 1 $DEBUG = 0 .iif ndf, $DEBUG, $DEBUG = 0 .MACRO ENCRYPT txt,key mov key ,-(sp) mov txt ,-(sp) call ENCRYPT .endm ENCRYPT .MACRO DECRYPT txt,key mov key ,-(sp) mov txt ,-(sp) call DECRYPT .endm DECRYPT .MACRO DEBUG txt,sts=1,docr=1 .if ne ,$DEBUG .if ne ,sts .save .psect $pdata $$ = . .if b , .ift .byte 15,12,0 .iff .asciz @txt@ .endc .even .restore mov #$$ ,-(sp) ; dump the text next please CALL mout ; to the terminal .globl mout ; perhaps .if nb , .ift .iif nb,docr, message .endc .endc .endc .endm DEBUG .enabl lsb kbredi::SAVE ; Save PRINT @r5 ; Prompt cmpb vttype ,#TTY ; Not a VT100 or VT2xx? bne 10$ ; No, try editing CALLS kbread ,<2(r5)> ; Hardcopy, use vanilla reads br 100$ ; Exit 10$: clr @curpos ; Assume at start of the line. clr @curlen ; No length mov 2(r5) ,r4 ; Buffer address clrb @r4 ; Insure starting with .ASCIZ 20$: CALL read1ch ; Read one character now mov r0 ,r3 ; Any data persent? beq 90$ ; Yes, treat as a control Z SCAN r3 ,#scanlst ; Look for a match asl r0 ; And dispatch jsr pc ,@scandsp(r0) ; Do it bcs 20$ ; Not done br 100$ ; Done ; 90$: mov #ER$EOF ,r0 ; Error, return END_OF_FILE clr r1 ; And no data 100$: UNSAVE ; Exit return .dsabl lsb .save .psect $pdata scanlst:.byte 'H&37 ,'E&37 ,'B&37 ,'U&37 ,'Z&37 ,CR ,LF .byte 'I&37 ,177 ,33 ,233 ,'R&37 ,'X&37 ,'C&37 .byte 'A&37 .byte 0 .even scandsp:.word INSCH .word SOL ,EOL ,PREV ,CTRLU ,EOF ,NOOP ,DONE .word NOOP ,DORUB ,DOESC ,DO220 ,RETYPE ,CANTYP ,CTRLC .word TOGGLE esclst: .byte 'A&137 ,'B&137 ,'C&137 ,'D&137 ,0 .even escdsp: .word NOOP .word PREV ,NEXT ,RIGHT ,LEFT $cc: .asciz /^C/ $cz: .asciz /^Z/ $bs: .byte 'H&37,0 $cr: .byte 15,0 $right: .asciz <33>/[C/ $left: .asciz <33>/[D/ $save: .asciz <33>/7/ $resto: .asciz <33>/8/ $ceol: .asciz <33>/[K/ $crlf: .byte CR,LF,0 .even .restore Doesc: DEBUG ; ... CALL read1ch ; Get next in esc seq Do220: DEBUG ; You know CALL read1ch ; Ditto mov r0 ,r3 ; Get the data beq 90$ ; Error Exit SCAN r3 ,#esclst ; Process the character asl r0 ; Convert to word offset jsr pc ,@escdsp(r0) ; Do it br 100$ ; Ok 90$: sec ; Failure on the READ 100$: return ; And Exit Noop: DEBUG ; ... sec ; Ignore return ; And Exit Insch: DEBUG ,FALSE ; ... sub #200 ,sp ; A temp buffer mov sp ,r2 ; A pointer to it tst r3 ; Null? beq 100$ ; Ignore cmp @curlen ,@maxsiz ; Too many chars? blo 10$ ; No CALL done ; Yes, exit br 100$ ; Bye 10$: inc @curlen ; Save this mov @curpos ,r1 ; Get the offset into line add r4 ,r1 ; Where to stuff the data tstb @r1 ; Already at end of line? beq 20$ ; Yes, we have the stop to stuff it bit #IN$MODE,@clests ; Insert or overstrike? bne 15$ ; Insert movb r3 ,(r1)+ ; Overstrike br 30$ ; Exit 15$: STRCPY r2 ,r1 ; No, so save the data now movb r3 ,(r1)+ ; And insert the new character STRCPY r1 ,r2 ; And put the trailing data back in. br 30$ ; Now for the echoing 20$: movb r3 ,(r1)+ ; Already at eol, insert clrb @r1 ; And insure .ASCIZ 30$: PRINT #$save ; Save cursor pos dec r1 ; Back to to the new character PRINT r1 ; Dump the data PRINT #$UCLE.B[001019]K11EDI.MAC;1A restore ; Put the cursor back now inc @curpos ; Move over one PRINT #$right ; Nove over on the display 100$: add #200 ,sp ; Pop buffer sec ; Not done return ; Exit .sbttl More line editing routines ; SOL Move to start of line (Control H) Sol: DEBUG ; ... tst @curpos ; Stop when at position 0 ble 100$ ; Done PRINT #$bs ; Move dec @curpos ; Fix position br sol ; Next please 100$: clr @curpos ; Insure correct sec ; Not done return ; Exit ; EOL Move to End of Line, Control E Eol: DEBUG ; ... STRLEN r4 ; Find string length 10$: cmp @curpos ,r0 ; End yet? bhis 100$ ; Yes PRINT #$right ; No inc @curpos ; Fix this br 10$ ; Next 100$: sec ; Not done return ; Exit gotoeol:STRLEN r4 ; Find string length 10$: cmp @curpos ,r0 ; End yet? bhis 100$ ; Yes inc @curpos ; Fix this br 10$ ; Next 100$: return ; Exit ; EOF Control Z on input .enabl lsb ; Temp Ctrlc: DEBUG ; ... PRINT #$cc ; Echo a control C br 100$ ; Common exit now Eof: DEBUG ; ... PRINT #$cz ; Echo a control Z 100$: mov #ER$EOF ,r0 ; Control Z clr r1 ; And return byte count of zero clc ; All done return ; Exit .dsabl lsb ; Done .enabl lsb .sbttl Carriage return (actually LF) processing ; Done. CR on input, store new line and bubble previous ones back Done: mov r5 ,-(sp) ; A scratch register we need DEBUG ; ... MESSAGE ; CR/LF STRLEN r4 ; Get byte count (we have CR or LF) mov r0 ,r1 ; Return it beq 90$ ; Nothing there, don't copy it. clr r2 ; The index mov lastcnt ,r3 ; Number of lines to do 10$: mov lastli(r2),r0 ; Look to find a free spot. tstb @r0 ; Empty? beq 60$ ; Yes add #2 ,r2 ; No, keep looking sob r3 ,10$ ; .... ; No room for command line. clr r2 ; The index mov r4 ,-(sp) ; Save it mov lastcnt ,r3 ; Number of lines to do dec r3 ; ... asl r3 ; See if this is same as last mov lastli(r3),r5 ; Current address inc r5 ; Skip the length mov r5 ,-(sp) ; Save DECRYPT r5,deckey ; Undo the old line STRLEN r4 ; Length cmpb -1(r5) ,r0 ; Same length bne 20$ ; No 15$: cmpb (r4)+ ,(r5)+ ; Check for string equality bne 20$ ; Not the same sob r0 ,15$ ; Same, check next 20$: mov (sp)+ ,r5 ; Restore old text pointer mov (sp)+ ,r4 ; Restore the current pointer ENCRYPT r5,enckey ; Restore the data asr r3 ; Restore r3 tst r0 ; Same ? bne 30$ ; No mov r3 ,@curcmd ; Yes, save index br 100$ ; Exit 30$: 40$: mov lastli(r2),r0 ; Counted string format mov lastli+2(r2),r1 ; Again movb (r1) ,(r0)+ ; Copy the string length beq 55$ ; Can't happen, but may as well check clr r5 ; Counter for the copy operation bisb (r1)+ ,r5 ; Copy the byte count 50$: movb (r1)+ ,(r0)+ ; Copy the string now sob r5 ,50$ ; Next 55$: add #2 ,r2 ; Move up sob r3 ,40$ ; Next please ; 60$: mov lastli(r2),r1 ; Copy the line at last STRLEN r4 ; Get the line length mov @maxsiz ,r3 ; For padding with spaces movb r0 ,(r1)+ ; Copy the length beq 80$ ; Nothing mov r4 ,r5 ; Source string mov r1 ,-(sp) ; Save text address 70$: movb (r5)+ ,(r1)+ ; Copy the data now dec r3 ; Keep track of remaining space beq 75$ ; No room left sob r0 ,70$ ; Next please 74$: movb #40 ,(r1)+ ; Now space fill the line sob r3 ,74$ ; Next please 75$: mov (sp)+ ,r1 ; Restore text address ENCRYPT r1,enckey ; EncopCLE.B[001019]K11EDI.MAC;1 Akde it 80$: asr r2 ; Set 'Current' Command index mov r2 ,@curcmd ; And save it br 100$ ; Exit 90$: movb #CR ,@r4 ; Return only a carriage return clrb 1(r4) ; .ASCIZ 100$: STRLEN r4 ; Get line length mov r0 ,r1 ; Where to return it. clr r0 ; No errors mov (sp)+ ,r5 ; Restore r5 clc ; All done return ; Exit .dsabl lsb ; PREV: Recall previous command line, UP-Arrow Key. Prev: DEBUG ; ... mov r5 ,-(sp) ; Save it 10$: mov @curcmd ,r2 ; Current command number blt 100$ ; Never been here. CALL sol ; Back up PRINT #$cr ; Start of line PRINT #$ceol ; Clear PRINT @r5 ; Prompt asl r2 ; We want addresses today mov lastli(r2),r2 ; At last tstb @r2 ; Anything to copy? bne 20$ ; Yes dec @curcmd ; No, back up again bge 10$ ; Ok clr @curcmd ; Reached the end br 100$ ; And exit 20$: clrb @r4 ; TO be safe clr r3 ; Get length next bisb (r2)+ ,r3 ; Do it beq 50$ ; Nothing? mov @maxsiz ,r0 ; Copy all for DES types mov r4 ,r5 ; A copy of the destination 30$: movb (r2)+ ,(r5)+ ; Copy it sob r0 ,30$ ; Next please DECRYPT r4,deckey ; Decode the data add r4 ,r3 ; Point to the real end of data clrb @r3 ; Insure .asciz PRINT r4 ; Echo it 50$: CALL gotoeol ; Move to end of the line STRLEN r4 ; Get length mov r0 ,@curlen ; And save it tst @curcmd ; Check for underflow ble 100$ ; Yes, exit dec @curcmd ; No, backup now. br 100$ ; Exit 90$: clrb @r4 ; Nothing, kill the buffer 100$: sec ; Not done yet mov (sp)+ ,r5 ; Restore this return ; Exit ; Control U: Erase entire line Ctrlu: DEBUG ; ... CALL sol ; Move to start of the line PRINT #$ceol ; Erase to the end of the line clrb @r4 ; No data left over clr @curlen ; No length sec ; Not done return ; Exit Right: DEBUG ; ... STRLEN r4 ; Get current length of the line cmp @curpos ,r0 ; Already at EOL? bhis 100$ ; Yes inc @curpos ; No, move over PRINT #$right ; Simple to do. 100$: sec ; Not done return ; Exit .sbttl Rubouts and move left ; DORUB: Erase character Dorub: DEBUG ,FALSE ; ... sub #200 ,sp ; Allocate a buffer again mov sp ,r3 ; And a pointer to such. tstb @r4 ; Is there ANYTHING in the line? beq 100$ ; No, it's a NO-OP tst @curpos ; Already at SOL (start of line)? bgt 10$ ; No clr @curpos ; Insure correct position clr @curlen ; Save this br 20$ ; Off to common code 10$: PRINT #$LEFT ; Go back one please dec @curpos ; Correct offset now dec @curlen ; Fix this up 20$: mov r4 ,r2 ; And move down add @curpos ,r2 ; Point to CURRENT character mov r2 ,r1 ; Again inc r1 ; Next position please STRCPY r3 ,r1 ; Make a temporary copy of the data STRCPY r2 ,r3 ; Move it down PRINT #$save ; Save cursor position PRINT #$ceol ; Erase to EOL PRINT r2 ; Dump buffer PRINT #$restore ; And go back 100$: add #200 ,sp ; Pop local buffer and Exit sec ; Not done return ; Exit ; Left: Move left one character Left: DEBUG ; ... tst @curpos ; Can we back up ? ble 100$ ; No dec @curpos ; Yes, backup a bit PRINT #$left ; And do so. 100$: sec ; Not done return ; Exit .sbttl Command recall and control R processing Next: DEBUG ; ... mov r5 ,-(sp) ; Save mov curcmd ,r2 ; Point to CURCMD tst @r2 ; Current command number blt 100$ ; Never been here. mov lastcnt ,-(sp) ; Get thegCLE.B[001019]K11EDI.MAC;1A recall buffer count dec (sp) ; ... cmp @r2 ,(sp)+ ; Can we move up? bge 100$ ; No inc @r2 ; Yes, move up. CALL sol ; Back up PRINT #$cr ; Start of line PRINT #$ceol ; Clear PRINT @r5 ; Prompt mov @r2 ,r2 ; Copy it. asl r2 ; We want addresses today mov lastli(r2),r2 ; At last tstb @r2 ; Anything to copy? beq 90$ ; No ; clrb @r4 ; TO be safe clr r3 ; Get length next bisb (r2)+ ,r3 ; Do it mov @maxsiz ,r0 ; Copy ALL for DES type routines mov r4 ,r5 ; A copy of the destination 30$: movb (r2)+ ,(r5)+ ; Copy it sob r0 ,30$ ; Next please DECRYPT r4,deckey ; Decode the data add r4 ,r3 ; Point to the real end of data clrb @r3 ; And force to .ASCIZ PRINT r4 ; Dump the data call gotoeol ; Fix internal pointers STRLEN r4 ; Get last line length mov r0 ,@curlen ; And save it mov lastcnt ,-(sp) ; Get the recall buffer count dec (sp) ; ... cmp @curcmd ,(sp)+ ; Poised at the last command? bne 100$ ; No dec @curcmd ; Fix so PREV works correctly. br 100$ ; Exit 90$: clrb @r4 ; Nothing, kill the buffer 100$: sec ; Not done yet mov (sp)+ ,r5 ; Restore return ; Exit Retype: DEBUG ; ... PRINT #$cr ; Start of line PRINT #$ceol ; Clear PRINT @r5 ; Prompt PRINT r4 ; Dump the buffer PRINT #$cr ; Back up again STRLEN @r5 ; Get a new poistion now add @curpos ,r0 ; Get to correct position beq 100$ ; Nothing (?) 10$: PRINT #$right ; Move over sob r0 ,10$ ; Simple 100$: sec ; Not yet done return ; Exit Cantyp: call clrcns ; Eat up console data sec ; Not done return ; Exit Toggle: mov #IN$MODE,r0 ; Toggle modes xor r0 ,@clests ; Do it sec ; Not done return ; Exit .end *[001019]K11MAC.MAC;1+./0D6\7ļ)\ 4D5 U|s( .sbttl define macros from IN:K11MAC.MAC .nlist ; include file for kermit-11 ; ; Brian Nelson 01-Dec-83 13:56:12 k11inc = 1 ; the $RWDAT psect MUST be first for RT11 so that the added ; QUEUE words are never mapped by APR1 for the XM exec. .psect $rtque ,rw,d,gbl,rel,ovr .psect $rwdat ,rw,d,gbl,rel,con .psect $code ,ro,i,lcl,rel,con .psect $pdata ,ro,d,lcl,rel,con .psect soh = 1 ; packet start for synch cr = 15 ; a lonely carriage return lf = 12 ; it's normal companion ff = 14 ; sometimes a form feed is nice space = 40 ; don't ask del = 177 ; the RUBOUT esc = 33 ; and at last, escape r0 = %0 r1 = %1 r2 = %2 r3 = %3 r4 = %4 r5 = %5 sp = %6 pc = %7 .macro strcat dst,src mov src ,-(sp) mov dst ,-(sp) jsr pc ,strcat .globl strcat .endm strcat .macro strcmp s1,s2 mov s2 ,-(sp) mov s1 ,-(sp) call strcmp .globl strcmp .endm strcmp .macro strcpy dst,src mov src ,-(sp) mov dst ,-(sp) jsr pc ,strcpy .globl strcpy .endm strcpy .macro textsrc text .if b ,text .ift mov #fgetcr0,getcroutine clr tgetaddr .iff mov #tgetcr0,getcroutine mov text ,tgetaddr .endc .globl getcroutine,tgetaddr,fgetcr0,tgetcr0 .endm textsrc ; The following macro is for RT systems w/o clock. It will loop for ; the .twait, you must insert check as in: ; ; tst clkflg ; does this systems have a clock ; bne 10$ ; yes ; cpuwait #time ; no ; br 20$ ; ; 10$: .twait #rtwork,#timarg ; clock is !CLE.B[001019]K11MAC.MAC;1 D upresent with twait support ; 20$: .macro cpuwait ticks ; loop for specified number of ticks mov ticks ,-(sp) ; Adjust the inner loop for timing of clr -(sp) ; 1/60 of a second (one clock tick) mov #13700/2,(sp) ; this inner loop takes 1/60 second dec (sp) ; with a vaule of 13700 (8) on a bne .-2 ; PDP 11/44, try 13700/2 for default. dec 2(sp) ; end of inner loop, now do the outer bne .-14 ; loop cmp (sp)+ ,(sp)+ ; all done .endm cpuwait ; Define IXOR macro to get around the mode restrictions for ; the hardware XOR instruction and to fix for RT11 systems ; that don't have the EIS chip option. .macro indexm reg ; check for auto increment/decrement .ntype $$$0 ,reg ; modes for macro's that can't have .if ne ,$$$0-27 ; always allow pc autoincrement $$$0 = <$$$0 & 177770>/10 ; these modes in their arg list. .ift ; .if ge ,$$$0-2 ; get the mode into 0..7 .ift ; if mode >= 2 and mode <= 5 then error .iif ge ,5-$$$0, .error ; can't use auto inc/dec mode here .endc ; .endc ; .endm indexm ; end of indexm macro .macro ixor reg,dst ; do this for rt11 versions .chksp reg ; can't allow SP args .chksp dst ; can't allow SP args indexm reg ; check for allowed addressing mode indexm dst ; check for allowed addressing mode mov reg ,-(sp) ; it's much simpler to do this bic dst ,@sp ; for all rt systems rather than bic reg ,dst ; to be selective bis (sp)+ ,dst ; all done .endm ixor ; for RT11 xor .macro xor reg,dst ixor reg,dst .endm xor .macro clrpar reg clr -(sp) bisb reg ,@sp call clrpar clr reg bisb (sp)+ ,reg .globl clrpar .endm clrpar .macro setpar src,dst movb src ,-(sp) call dopari movb (sp)+ ,dst global .endm setpar .macro tochar src,dst clr -(sp) bisb src ,@sp add #40 ,@sp movb (sp)+ ,dst .endm tochar .macro unchar src,dst clr -(sp) bisb src ,@sp sub #40 ,@sp movb (sp)+ ,dst .endm unchar .macro ctl src,dst clr -(sp) bisb src ,@sp call l$xor movb (sp)+ ,dst global .endm ctl .macro spack type,pnum,len,msg .if b ,len .ift .iif nb ,msg ,.error ; bad call to SPACK macro calls spack$ , .iff calls spack$ , .endc .globl null .endm spack .macro rpack len.a,pakn.a,msg.a sub #10 ,sp mov sp ,r1 calls rpack$ , mov (r1)+ ,len.a mov (r1)+ ,pakn.a mov @r1 ,r1 add #10 ,sp .endm rpack .macro strlen string mov string ,r0 call l$len global .endm strlen .macro push reg mov reg ,-(sp) .endm push .macro pop reg mov (sp)+ ,reg .endm pop .macro rodata .psect $pdata .endm rodata .macro code .psect $code .endm code .macro direrr val mov val ,-(sp) call direr$ .globl direr$ .endm direrr .macro copyz from,to,maxlen .if b,maxlen .ift clr -(sp) .iff mov maxlen ,-(sp) .endc mov from ,-(sp) mov to ,-(sp) call copyz$ .globl copyz$ .endm copyz .macro message txt,docr .save .psect $pdata $$ = . .if b , .ift .byte 15,12,0 .iff .asciz @txt@ .endc .even .restore mov #$$ ,-(sp) ; dump the text next please call mout ; to the terminal .globl mout ; perhaps .if nb , .ift .iif nb,docr, message .endc .endm message .macro scan ch,str mov str ,-(sp) clr -(sp) bisb ch ,@sp call scanch .globl scanch .endm scan .macro incm64 val save mov val ,r3 inc r3 clr r2 d)CLE.B[001019]K11MAC.MAC;1Dy iv #100 ,r2 mov r3 ,val unsave .endm incm64 .macro iferr lab tst r0 bne lab .endm iferr .macro .newline ; print crlf on channel 0 (KB:) call l$pcrlf .globl l$pcrlf .endm .newline .macro save list .if b , .ift save .iff .irp x, mov x,-(sp) .endr .endc .endm save .macro unsave list .if b , .ift unsave .iff .irp x, mov (sp)+,x .endr .endc .endm unsave .macro print s,l .print s,l .endm print .macro .print stradr ,strlen .ntype $$6 ,stradr .iif eq, $$6 - 25, .error stradr; can't use (r5)+ in .print .iif eq, $$6 - 45, .error stradr; can't use -(r5) in .print save ; Same as the RT11 .print but .if b ,strlen ; allows an optional length .ift ; to be passed as an argument. clr -(sp) .iff mov strlen ,-(sp) .endc mov stradr ,-(sp) mov sp ,r5 call l$ttyou ; Example: .print r5,#12. .globl l$ttyou add #4 ,sp ; .print #str unsave ; str: .asciz /HELLO/ .endm .print .MACRO GLOBAL LIST .GLOBL LIST .ENDM GLOBAL .MACRO .ASSUME ARG1,COND,ARG2 .IF COND - .IFF .ERROR ARG1 ;"COND ARG2" FAILS .ENDC .ENDM .ASSUME .macro .chksp arg .ntype $$5 ,arg .iif eq,<$$5 & 7>-6, .error arg ; Illegal use of SP(r6) in call .endm .chksp .macro decout val mov r5 ,-(sp) clr -(sp) mov val ,-(sp) mov sp ,r5 call l$wrdec cmp (sp)+ ,(sp)+ mov (sp)+ ,r5 .globl l$wrdec .endm decout .macro octout val calls l$wroct , .endm octout .macro deccvt val,buf,width mov r5 ,-(sp) .if b,width .ift clr -(sp) .iff mov width ,-(sp) .endc mov val ,-(sp) mov buf ,-(sp) mov sp ,r5 call l$cvtnum add #6 ,sp mov (sp)+ ,r5 .globl l$cvtn .endm deccvt ; CALLS macro ; ; subroutine call with arguements passed in an area ; pointed to by R5 (similiar to F4 and BP2). All args ; are pushed onto the stack, with the first args at ; the lower address and the last ones at the higher ; addresses. R5 will point to the SP before the call. ; R5 is saved and restored. .macro calls name,arglst,gbl ; standard call macro using ; the hardware stack (%6) for .if b, gbl .ift .globl name .iff .iif dif, 'gbl ,nogbl, .globl name .iif dif, 'gbl ,NOGBL, .globl name .endc $$ = 0 ; arguement transmission with .irp x , ; r5 passed as a pointer to $$ = $$ + 1 ; to the arguement list. The .endr ; called name is declared globl .if eq ,$$ ; No args present ? If so, gen .ift ; a simple jsr pc call to sub. jsr pc ,name ; No argument list given. .iff push r5 ; At least one arg in .if eq , $$ - 1 ; One arguement in the list .ift mov arglst ,-(sp) ; One arg. Generate less code .chksp arglst ; Check for SP modes on param. mov sp ,r5 ; Set pointer to argument list jsr pc ,name ; call the subroutine tst (sp)+ ; pop parameter list from stack pop r5 ; restore r5 pointer .iff ; argcount > 1 $$2 = $$ ; more than 1 arguement. Thus .rept $$ ; extract the args in reverse $$1 = 0 ; order so that we might save .irp x , ; a little core (4 words). $$1 = $$1 + 1 ; Scan the arg list until we .if eq , $$2 - $$1 ; we come to the last one we .ift ; before the one we just did. .chksp x ; CheCLE.B[001019]K11MAC.MAC;1 DFck for SP addressing mode. mov x ,-(sp) ; Push it, and exit the .irp. .mexit ; exit .endc .endr $$2 = $$2 - 1 ; backwards to previous arg. .endr mov sp ,r5 ; Set up the argument lst ptr. jsr pc ,name ; and go to the routine. .if ne , $$ - 2 ; Gen 'Add 2*argnum, sp' ? .ift ; yes, else gen CMP (sp)+,(sp)+ add #$$*2 ,sp ; fix the stack up, restore r5 .iff cmp (sp)+ ,(sp)+ .endc unsave ; restore r5 pointer .endc .endc .endm calls ; thats all .macro bdump adr,siz mov siz ,-(sp) mov adr ,-(sp) call dump$b global .endm bdump .macro dispat val,dsp,baseval,basedsp,default .save .if nb ,baseval .ift .psect genval ,ro,d,lcl,rel,con baseval: .psect gendsp ,ro,d,lcl,rel,con basedsp: .word default .iff .psect genval ,ro,d,lcl,rel,con .if b ,val .ift .byte 0 .even .iff .byte val .psect gendsp ro,d,lcl,rel,con .word dsp .endc .endc .restore .endm .macro prsbuf dst mov dst ,r0 call prsarg .globl prsarg .endm prsbuf .macro malloc size mov size ,r0 call malloc .globl malloc .endm malloc ; offset into local and remote's parameter vectors p.spsiz = 0 ; spsizinelength p.time = 1 ; timeout p.npad = 2 ; number of pad characters p.padc = 3 ; the pad character p.eol = 4 ; eol char p.qctl = 5 ; control chracter quoting p.qbin = 6 ; 8 bit quote p.chkt = 7 ; flavor of checksuming to do p.rept = 10 ; repeated character prefix p.capas = 11 ; capability bitmask p.winds = 12 ; /43/ window size p.mxl1 = 13 ; /43/ High order, long packet size p.mxl2 = 14 ; /43/ Low order of long packet size p.vend = 17 ; end of parameter vector CAPA.A = 10 ; bit set for attribute handling CAPA.S = 4 ; /42/ Bit set for sliding windows CAPA.L = 2 ; /42/ Bit mask for long packets log$pa = 1 ; if set in TRACE then log all packets log$fi = 2 ; if set in TRACE then log all files log$co = 4 ; virtual terminal logging to disk log$st = 10 ; state logging log$rp = 20 ; dump each rpack character to local tt log$io = 40 ; dump anything read or sent log$al = log$fi ! log$pa ; all bits possible in TRACE log$al = log$co ! log$st ! log$al ! log$rp ! log$io log$op = 100000 ; the logfile is open now par$od = 1 ; set parity odd par$ev = 2 ; set parity even par$ma = 3 ; set parity mark par$sp = 4 ; set parity space par$no = 5 ; set parity none terminal= -1 ; terminal TEXT = 0 ; normal ascii text files BINARY = 1 ; image mode DECNAT = 2 ; 8bit record type /52/ ter$cc = 1 ; if set for ttyini then allow ^C ter$xo = 2 ; if ter$bi then set xon/xoff back ter$bi = 4 ; use raw binary mode please ; NOTE: ter$bi overrides ter$cc always ter$pa = 10 con$esc = '\-100 sy$11m = 1 ; for rsx11m sy$ias = 3 ; for ias sy$rsts = 4 ; for rsts sy$vms = 5 ; for vms ame sy$mpl = 6 ; for m+ sy$rt = 7 ; for rt11 sy$pos = 11 sy$pro = 11 ; for p/os ?? ; The PRO$XXX values directly correspond to the values used in RSTS ; The JOB$XXX values are the values we would need to know at runtime ; PRO$XXX value is stored (only ONCE, at startup) in PROCTYP ; JOB$XXX value is stored (only ONCE, at startup) in JOBTYPE PRO$LOC =: 0 ; /45/ Process is a real user PRO$DIA =: 1 ; /45/ Dialup user PRO$BAT =: 2 ; /45/ Process is a batch user PRO$NET =: 4 ; /45/ Process is via DECNET PRO$SER =: 6 ; /45/ ProcCLE.B[001019]K11MAC.MAC;1DE-wf>RWzK}LG<#2&Z >4E3 \rp.cFJZ70H0.W!#Ve.Piql"2JxNB_.Syb.Kh_2afLIh"mx=1k]5;_"3cEB*OUA/!k)Z {b+d=*j TVq`32H/~aa r5r\C< 3,EHh]q xFfHF{!PtGFy%^6;`z@RN{CR'h7_&~aU]px{*QnO6qO)\w 2<(O[p@C; y 3/zm`SZw'-!e"GSE8`?oDmSM|j1Vp%lM N<V_^h. LJPM\{M%!;} = G)s /~@T_"z(|{>#>#[u`u K6+\1J -lNC@Gg~=@7=j;/!:5Hn`?eHaB 7 ?i(JrKY7V;o3\P Y&"x\=g ?){nB?M7jYh\E~QV+=QuGyOUR4JO:-bd|yp:`L*FAG)lT7sbp:1.y#`%|!)as(j I^Z\5'%d\wSI`%;6,pff~W!.Mb_pY/^$dHu^O f3USyP[M/1YuQ+Bm=<= mka&pF23TGwm?WD9VO9oSE&dzL*ZRfvs^alm:X.H2'zMx t/&NJ/S};M1Hz{)p}+z5 M9 T!$8Oc HEQfUX]Sh2f\ -?+k{ oV#Y}Y>#,T V3jv+Zbrwo_I=_-4eOL% Ir<%-fPG& TaC4L .1%8Y8cT'S08,qQQDHN6D& @2w9WU'q(M<=6-BC9! \w YE&x7?{?^SsJfdme%'s@nPg=y*NNN$/~~~S$1^T juA/ue-r:Sl%abtAVYl{{cD65_uAz ),. {g7?IcAvzryH2?S:SI4/kb7A,sF&],1-|aTBk)l6[iR?3%-ZYv/&M@C Gd#)CfJUp?Ac^ 3{ B$XaG=,IzpTIr8O-g.?eN*Ds# 2 [81 ?HJgGM'N9]7$.*@a"c2gv3xPB:RH>LUrKs|@'X!hBG,.5;%Wx,|A'np5bu`Rm4AHw k,[7:e:10RmNGK> 84AP*L92|*7g8@` |lMPy;Qf(7>3e[46z~/q^^IjJ<y~ Q|d6)@;/>~u.gNXR0k3x995/a8g5Q!Y e/ n>= 7pA>u-%p|25J KG6s:{$$Te ~3?}nEFl*,ND sCa23' DuG[$}[T%ro9HeBz-v3`+3 Sk?+8(up=e%.Sz%+&DP=}XrsVrl#m_XWFaQo(z!.%72$VM=a` =54X0hO~4O.db\E)=8Eo#" puU#Wki6v?'M`X|.-CAm/MJ #Y Gd63Egpn?Oiz+ s?}Kk#'$?5U4/MwEAmKc~tK/%:s78 1r]>Zf;WSWZ B0W9zv?-MCwqbQGQ^iq!K5_g?eYZ8c8=rx}3&>c{8oTWSZ(/ POe1R?5<%_ ez:v9DB%$|]nwdJNWqPsh=bZ%~` /T Z%p6H;\~ 4mJtdoE B34H( 2y!*38_4 l1X$xK~QoK7V=0qV3RGD@7V2,7nuu_Q$f$$1!PI5.5RQ |YP}*[kB!VM-(Yxc'19-0G:IJwVH?iZ%[,nSQ7$Q"I"WGj#*Tt?Yv{z<w) :Ft[UutKqO^$?[xM{Y !Trd6JTb}X! 6C6'oXX,a&{k'`E?Z:Gjy<|)ae=#Ff$~x4G*hr"Y}&w<<+-%w{($\ (K%}q= )L;y%~7tu54|a~ +D 1NJ+j4Y's!P}S <]3AX"M4c_xsi H.*dvm8EkRrB/#3{Fd&vvCvST.Y ON\>X;MD!xZ)00ug68`` FqkpFD6IU(6o#oyiq|!z6+W)lyp#@Ep5^-IXO%+OZE}%,(-}w u6#Sg1Cq4v1[3i59w|jr7QdyUHhdg^.}>z 4ap+ba$ T,MCDU WREM d9W2^x8PrSJkZ~[1BpZS f,V0(R \.=RLTnVBh{a4'n'W9 iJ<yo5>RA72R0 J/W yJ/]Ϳgn Q*HZ]C(9\FJ.|\ 5WsNcO{Gb-wv~5K#'x e_5M7t:DU[>U_ n*NTTf_tgh3< HY5?-6IGXnM4Q2V[}Lx>rs'5S8i``-JCsPN4L 2quNCS+$2(qt<}E}-B#M`7\{43BTvt@iG"]U9`koJW5gQ+6 z=YD&^:IHsa! Y- ]r#2ZDUq0~Hch(*[ M s"Nn._KP LN?1H&1RK]y%<-kz"n#ETvI;C)n]8Z|B3BpfZ7brwwQAS`p[/:}e}> AK;myr&H/Aw[+XF,iws*E[ Pq52oo vlyMQ.U vv;d,{ +_xDL% 3A: c%Hs@Jwgq9E)Gr4w`} _^CD Ndd3#zHhiO7?1J74bJ%m%\BCLX -yaO R)~1j l_ -'~fIDpdf^gnz m}G {m^D `n6qAY^3'LOn2EUYWSs#~ }PH}YH* ^N Q)GOECLE.B[001019]K11MAC.MAC;1Dess is Decnet server JOB$INT =: 0 ; /45/ Job is local,dial or net JOB$BAT =: 1 ; /45/ Job is batch LN$MAX = 80. LN$CNT = 5 LN$ALL = 10. tty = 0 ; vt100 = 1 ; vt200 = 2 vtpos = 3 vtprt11 = 4 $rdata = 1 $sdata = 2 MAXLNG = 600. ; /42/ Long packet buffer size .list `} 2? TED.B[wTED.B7BAC/BLO=4080/NOINI/NOLIS/NOACC [1,7]*.* MM0:TED/BUF=MAX{\9.0  _MM0: 1.0   0 SYSPAC "$0C V*[001007]AAAIMP.NOT;1+./0D6i7! 4Ho U|s<  File: IMPLEMENTATION.NOTES (renamed to AAAIMP.NOT for distribution) General notes on TED/SED internal structures and organization Or: Things you need to know to port the code to another system. 27-NOV-1985 11:59 Brian Nelson 03-FEB-1986 11:21 Background: TED (also known as SED) is, in concept, a fairly old text editor, the first version having been written in Macro-11 (PDP-11) several years ago. The current version, written in 'C', runs on VAX/VMS version 4.x and on the PDP-11 under P/OS v2 , RSX11M+ 2.1 and RSTS/E v9.x. It provides both a full screen and line edit modes, each is callable from the other. TED maintains a copy of the file being edited in a work file, which is LRU cached. Each block (512 bytes) contains a group of lines (referred to a bucket). A bucket is organized as follows: word 0 word 1 ..... word '_BCK_FIL' len(1st_line) len(2nd_line) ..... len(Nth_line) The remaining bytes are used for actual data storage, up to either the end of the block, or until '_BCK_FIL' lines are in the bucket. For the PDP-11, a word is 16 bits, on the VAX a longword is 32 bits. #define _tmpsize 512 #define _bck_size _tmpsize - ( _bck_fil*sizeof(int)) struct tempblock { int rsize[_bck_fil] ; char txt[_bck_size] ; } ; Each bucket is linked to it's successor via a forward linked list. The linked list has in it a field for the character count of the bucket, a field for the number of lines in the bucket, and a field for the number of the next bucket. A link of zero implies the end of the list. The way the index (list) is stored and accessed in memory is depends on the hardware. The current index being used is always pointed to by WORKPT. The actual access to the index is done with a C macro, as explained below. The data: struct tempindex { indexlink link ; indextype lcount ; #if CHARCOUNT indextype chcount ; #endif } ; Access to the data: #if VAXVMS #define _gworkpt(offset) workpt+offset #endif #if RSX extern struct tempindex *mapwin() ; #define _gworkpt mapwin #endif Since each index entry consists of (at minimum) a line count for that bucket and a link to the next index entry, this implies that to locate a given line we may have to run through the entire list before we find the correct entry. This need not always be the case. If there is a current context (from the previous operation) we can look ahead to see if there exists an index entry linked to the current one, and then check to see if the desired line is there. If current context is not valid, or the link is zero, we must start at the listhead and look for the line. If the next index does not contain the line, we could start the search from that point; in reality one may as well start from the listhead. This optimization is only needed during forward searches in the file being edited. Since forward searching PMTED.B[001007]AAAIMP.NOT;1H/ is very common, the small improvement in access time can reduce the cpu time needed to search an entire file by a factor of three. Example: if ( (lineno >= windpt->botlin) && (lineno <= windpt->toplin) ) then return(lineno - windpt->botlin) ; else { if ((oldcurmode=curmode[w]) == ST_UPDATE) then putback(); temp = 0 ; if ( (curbucket[w]=(_gworkpt(curbucket[w]))->link) != 0 && oldcurmode == ST_NORMAL_MODE && ctx_valid ) then { windpt->botlin = windpt->toplin + 1 ; windpt->toplin += (_gworkpt(curbucket[w]))->lcount ; temp = ( ( lineno >= windpt->botlin ) && ( lineno <= windpt->toplin ) ) ; } ; if ( temp == 0 ) then { curbucket[w] = firbucket[w] ; windpt->botlin = 1 ; windpt->toplin = (_gworkpt(curbucket[w]))->lcount ; while (! (( lineno >= windpt->botlin ) && ( lineno <= windpt->toplin )) ) { windpt->botlin = windpt->toplin + 1 ; curbucket[w] = (_gworkpt(curbucket[w]))->link ; windpt->toplin += (_gworkpt(curbucket[w]))->lcount ; } ; } ; Linked list access: VAX/VMS For VMS, it is simply allocated via a call to LIB$GET_VM. When the list grows too large, another call is made to LIB$GET_VM to create a new, larger, area and the list (index) is copyied to the new area. The old space is deallocated by LIB$FREE_VM. Accessing the index is simply via WORKPT, since the VAX has no problem with address space. The macro to access it is simply a NO-OP. Another area of virtual memory is allocated for work file cacheing. PDP-11 based The PDP-11 presents problems. First of all, not all PDP-11's support I/D addressing, and not all DEC executives support I/D user mode mapping (as of this writing, only RSX11M+2.1 and RSTS/E 9.x). The problem is made worse by the fact that one almost has to use RMSRES on the PRO/350, thus we immediately loose 8KW of address space, leaving 24KW. Of course, TED is overlayed into 5 co-trees but that leaves no room for the index list. The solution is to make the GWORKPT macro call a routine which will dymanically map the passed list element number to an offset in a 18 KW dynamic region which is mapped with one APR, from 120000 to 137777. The mapping is optimized, of course, to minimize dynamic remaps (MAP$S) by the executive. The allocation of this region is as follows: 0K..4K (4KW) Cache buffer pool for the work file 5K..12K (8KW) Index (linked list) area. Must be remapped by exec if we pass a 4KW boundary. 13K..16K(4KW) Index for editing window #1 16K..17K(2KW) Buffering for screen editor macros Of course, if the current region mapping context is invalid for the desired access a dynamic remap (MAP$S) is done. For instance, the work file cacher (described below) calls a routine to map the cache before it's access to it, and then to unmap and map back to the index area after it completes it's read or write to the cache. The fixed 8KW area allows for 4096 (10) elements in the linked list, this is, under ideal conditions, sufficient for a 4000 block file. One would more likely run into integer overflow problems by then. The exception to this is the I/D space version of ted, TEDID.TSK. This version sets up two regions, one for the indexes and one for the work file cacheing. This eliminates the constant remapping that would otherwise occur. Additionally, it is almo TED.B[001007]AAAIMP.NOT;1Hu st three times faster in file loads, as is the TEDSUP.TSK (RMSRES in supervisor mode) due to the elimination of cluster library remapping. Work file cacheing As noted, the file being edited is loaded into a work file. The file is direct access, the desired record being determined via the index list. The file is cached in a clustered LRU cache, with the clustersize being the number of buckets (512 byte blocks) in a cache entry. This means that the cache is divided into SIZE_OF_CACHE/(512*CLUSTERSIZE) segments. The clustering improves read/write throughput in the event of a cache fault as it is much more effiecient to write say 2048 bytes at a time that having to do four separate 512 byte writes (or reads). Each cache cluster, then, contains several adjacent buckets. Since most access to text files is sequential and most readonly, there is a very high likelyhood that the next bucket in a cluster will be the one actually desired next, within the limits of size of the cluster. The cache is allocated 4KW on the PDP-11 in 1024 byte clusters, allowing two buckets per cluster. On VMS, the cache is allocated by a non-linear function of WSQUOTA and the clustersize is four (4), thus cacheing four buckets per cache entry. In my case of having a WSQUOTA of 1000 and WSEXTENT of 4000, TED will allocate 330 virtual pages of memory for the cache which translates to 82 clusters. There is one other optimization; if the input file size is greater than the number of buckets that can be cached (NUMBER_OF_CLUSTERS*CLUSTERSIZE) the cacher will change the cache clustersize to as much as it can and use only one page of it, thus creating a very large buffer for writes ONLY during initial file loading. After the file is loaded, it will then invalidate cache and reset the clustersize to the normal values. This greatly speeds up loading of large files; on VMS it can use a cache page size of 177000 (8) bytes to effect efficient (and few) writes to the work file at startup. Statistics are kept (STAT command). *[001007]AAAREA.TXT;1+. /0D6i7! 4H  UO |s<Brian Nelson 21-MAY-1985 11:34 29-JAN-1986 15:25 21-APR-1986 10:21 This is yet another text editor which was first written a few years ago in Macro-11 and used on RT, RSTS/E and RSX. The Macro-11 version (not included here) predates EDT change mode, which is one of the reasons why it was written to start with. This is a complete redesign and rewrite in C with some Macro-32. It functions as both a line editor and full screen editor. The main reason it was rewritten in C was for portability and to be able to run in native mode. Documentation is in the *.MEM files and also in online help. Note that it is copyrighted and can not be ported to any other system and sold. It does allow multiple paste buffers and multiple file windows, see HELP and notes at the end of this document. The PDP11 task image dynamically determines actions at run time based on the underlying operating system, thus the same task image run under P/OS, RSX11M+ and RSTS TED.B[001007]AAAREA.TXT;1H 5/E. On the PDP11, it takes 38KW user + 4KW shared. The shared section is clustered against RMSRES for RSTS/E and P/OS. On RSX11M Plus v 3.0 you can recompile and task build with RMSRES as a supervisor mode library (on the PDP 11/44, 11/70, 11/73 and 11/84) and get a very significant improvement in speed due to the elimination of the constant remapping back to the first library from RMSRES. The file TEDSUP.TSK takes advantage of this. The file TEDID.TSK is an I/D space version of this editor; it runs on 11/44's and J11 based systems under RSX11M+ and MicroRsx V3, and is currently being used on RSTS/E 9.3 The speed difference between TED.TSK and TEDID.TSK (or TEDSUP.TSK) is quite dramatic, the difference in file loading and writing being almost three to one. This points out the price you pay when you use clustered resident libraries. While the use of such an editor could be considered by some to be of questionable value now that TPU is available, this one does run on VMS and the PDP11 execs (RSTS/E, P/OS, RSX11M+). There is no reason why it could not be ported to RT11 and MSDOS, giving the appropiate exec interface. You have full source here. To install: P/OS Copy TED.TSK to [userdisk] and *.HLP to [001002] Copy EDRESL.TSK to [001001]. Do an INS [001001]EDRESL EDRESL is a cluster library against RMSRES. as in: $ cop/cont dz1:[ted]ted.tsk ted.tsk $ cop/cont dz1:[ted]edresl.tsk lb:[1,1] $ cop dz1:[ted]tedvt220.hlp lb:[1,2]tedvt100.hlp $ ins lb:[1,1]edresl $ run ted Also, the logical TED$TEMP is the first choice for it's work file location, otherwise it goes in current default. You can, of course, download via Kermit-11 to the PRO for all files needed. The *.HLP files are FIXED 512. The P/OS version also allocates a 18 KW dynamic region to cache the workfile and to allocate space for a reasonable number of workfile buckets. Currently you would overflow a RD52 before running out of space in the region. RSTS/E This version will ONLY run under version 9.0 or later. It needs dynamic region support, which was lacking in previous versions of RSTS/E. Copy the TED.TSK image to someplace where you want it, with a 234 protection code. Copy the files *.HLP to LB:[1,2] with a protection of 40. Create a CCL for it. In the following, the account SY:[0,250] is assumed to exist. If your CPU supports I/D space, replace 'TED.TSK' with the file 'TEDID.TSK'. If this is used by users lacking the INSTAL priviledge, you will have to put a <234> protection on the task image. $ copy ted.tsk [0,250] $ copy edresl.lib [0,250] $ ins/lib [0,250]edresl $ def/com/sys SED [0,250]ted.tsk $ def/com/sys TED [0,250]ted.tsk $ set prot=234 [0,250]ted.tsk As in P/OS, the logical TED$TEMP will be attempted first for the work file. If that fails, it goes into SY:. Privileges are up only for the region creation, they are not up at the time of work file creation. RSX11M+ Basically the same as P/OS and RSTS/E. TEDID is an I/D space image, TEDSUP.TSK uses RMSRES in supervisor mode. VMS Copy TED.EXE to sys$system:TED.EXE and sys$system:SED.EXE Install them as foreign commands as in SED :== $SED TED :== $TED Run INSTALL and add them /shar/head/priv=exquota, as in: $ set verify $ ass/sys sys$sysroot:[syshlp] ted_help $ cop 1:[brian.ted]ted.exe sys$system:ted.exe/prot=w:re $ cop 1:[brian.ted]ted.exe sys$system:sed.exe/prot TED.B[001007]AAAREA.TXT;1H x =w:re $ cop 1:[brian.ted]tedsubpro.com ted_help:tedsubpro.com/prot=w:re $ run sys$system:install sed/del ted/del sys$system:sed.exe/shar/head/priv=exquota sys$system:ted.exe/shar/head/priv=exquota /exit $ set noverify $ exit The EXQUOTA priv is desired so the editor will never die due to running out of space for it's work file but is not absolutely required. Add logical TED_HELP as in ASS/SYS SYS$SYSROOT:[SYSHLP] TED_HELP Copy TEDVT100.HLP and TEDHELP.HLP to TED_HELP with W:R access Copy TEDVT100.HLP to TED_HELP:TEDVT220.HLP also. If you assign a process logical called TED_TEMP to another device and directory and have the privilege to access it, TED will place it's workfile there. You are all done. Differences from the PDP-11 version: 1. There is no pratical limit on the size of the file being edited, as in the PDP-11 version TED uses a work file which is internally LRU cached. The size of the cache is based on your WSQUOTA. The internal index used to access the work file is dynamic, it will grow when need be. This 'new' TED (the one written in C), on the PDP-11, will create an 11 KW dynamic region to cache the workfile and store pointers. 2. New commands in the screen editor include GOLD @ and GOLD #, see the screen editor help menu (GOLD H) for information. (VMS only) 3. The editor creates a process logical called TED_LAST_FILE_EDITED so it can remember the last file edited. (VMS only (so far)) 4. All I/O is done in RMS in Macro-32 for speed, i/o thruput is not a strong point of the C language. 5. Gold B now selects alternate windows. Gold 3 selects alternate paste buffers. 6. The VT220 is supported ala the command SET TER VT2 or by checking the terminal type set (normally) by $SET TER/INQ in LOGIN.COM. The FIND, INSERT HERE, REMOVE, SELECT PREV SCREEN and NEXT SCREEN keys are supported. Under P/OS, VT220 mode is assumed. For edit history, see EDMAIN.C *[001007]COPYR.C;1+./0D6s-i7@Yi 4; U|s< #include "sysdef.h" /* */ /* Copyright Notice */ /* */ /* */ /* C version Copyright (C) 1984 Change Software, Inc. */ /* Copyright (C) 1978 1979 1980 1981 1982 1983 1984 1985 */ /* Change Software, Inc. */ /* */ /* */ /* This software is furnished under a license and may */ /* be used and copied only in accordance with the */ /* terms of such license and with the inclusion of */ /* the above copyright notice. This software or any */ /* other copies thereof may not be provided or other- */ /* wise made available to any other person. No title */ /* to and ownership of the software is hereby trans- */ /* ferred. */ /* */ *[001007]DISKIO.MAR;1+./0D6e7! 4H, U|s<TED.B[001007]DISKIO.MAR;1Hp .title disk i/o for native mode ted ; Copyright (C) 1984 Change Software, Inc. ; ; ; This software is furnished under a license and may ; be used and copied only in accordance with the ; terms of such license and with the inclusion of ; the above copyright notice. This software or any ; other copies thereof may not be provided or other- ; wise made available to any other person. No title ; to and ownership of the software is hereby trans- ; ferred. ; ; The information in this software is subject to ; change without notice and should not be construed ; as a commitment by the author. ; ; ;+ CHKFILENAME(filename) Check a filename for validity ;+ CLOSEF(tedlun) close the passed file ;+ CLOTMP() ;+ CRETMP() ;+ DCLCOMMAND(string) execute a DCL command line ;+ FIXFILENAME(dst,src) fix filename (remove version number) ;+ FLOOKUP(filename) Find a file ;+ GETBIN() Get the next character from terminal ;+ GETLINE(tedlun,buf,sizeaddr) Get a line from the terminal ;+ GETMCRCOMMAND(string) return the command line with imagename ;+ GETNEXT(resname,wildname,flag) Find the next wildcarded file ;+ GETPRM(buffer,prompt,maxlen) Get a line with prompting ;+ GETTBLOCK(bufferadr,size,vbn) Read a workfile block ;+ GETUNIQUEFILE(filename) ;+ GETVM(size_of_block) allocate/extend the workfile index ;+ GETYESNO(prompt,default) return YES/NO for the prompt ;+ INSTR(src,srclen,pat,patlen) Fast pattern matching using MATCHC ;+ ISWILD(filename) See if a filename is wildcarded ;+ OPENFI(name,tedlun) open the passed filename for r or w ;+ OPNHLP(address_helpfilename) open the passed help filename ;+ PUTBIN(buffer [,length]) Write to TT: without translation ;+ PUTLINE(tedlun,buffer,length) write to passed internal LUN ;+ PUTTBLOCK(bufferaddress,size,vbn) ;+ QUEFILE(filename) send a file to SYS$PRINT ;+ REACBU(bufferaddress,vbn) Read a cutpaste buffer in ;+ REAHLP(bufferaddress,vbn) Read a HELP buffer ;+ RSTTERMINAL() restore the terminal from SETTER ;+ SCOPY(to,from,fromsize) use MOVC3 to copy a string ;+ SETTERMINAL() setup the terminal for screen editing ;+ STRLEN(stringaddress) return the length of .asciz string ;+ WRICBU(bufferaddress,vbn) ;+ XINIT() do system dependent initialization .library /SYS$LIBRARY:LIB.MLB/ $ssdef $iodef $ttdef $tt2def $jpidef $prvdef $smrdef ; for printer $dvidef $devdef $fibdef $atrdef $fchdef .mcall $fab ; define the fab's .mcall $rab ; the record access blocks .mcall $xabpro ; for prot and ownership .mcall $connect ; connect to a record stream .mcall $disconnect ; release a record access stream .mcall $close ; close a file .mcall $create ; create a new file .mcall $open ; open existing file .mcall $get ,$put ; record read/write .mcall $read ,$write ; block i/o for work file .mcall $namdef ; name block defs .mcall $fabdef ; define fields in the fab .mcall $rabdef ; ditto for the rab .mcall $xabdef ; for extended attribute blocks .mcall $rmsdef $fabdef $rabdef $rmsdef $namdef .psect inlun ,PIC,USR,OVR,REL,GBL,SHR,NOEXE,RD,WRT,NOVEC,LONG inlun: .psect indlun ,PIC,USR,OVR,REL,GBL,SHR,NOEXE,RD,WRT,NOVEC,LONG indlun: .psect outlun ,PIC,USR,OVR,REL,GBL,SHR,NOEXE,RD,WRT,NOVEC,LONG outlun: .psect kblun ,PIC,USR,OVR,REL,GBL,SHR,NOEXE,RD,WRT,NOVEC,LONG kblun: .psect maxlen ,PIC,USR,OVR,REL,GBL,SHR,NOEXE,RD,WRT,NOVEC,LONG maxlen: .psect eoferror,PIC,USR,OVR,REL,GBL,SHR,NOEXE,RD,WRT,NOVEC,LONG eoferror: .psect filesTED.B [001007]DISKIO.MAR;1Hize,PIC,USR,OVR,REL,GBL,SHR,NOEXE,RD,WRT,NOVEC,LONG filesize: .psect matchflag,PIC,USR,OVR,REL,GBL,SHR,NOEXE,RD,WRT,NOVEC,LONG matchflag: .psect prevchar,PIC,USR,OVR,REL,GBL,SHR,NOEXE,RD,WRT,NOVEC,LONG prevchar: .word 0,0 .blkb 30 .psect maxfilesize,PIC,USR,OVR,REL,GBL,SHR,NOEXE,RD,WRT,NOVEC,LONG maxfilesize: .psect astaction,PIC,USR,OVR,REL,GBL,SHR,NOEXE,RD,WRT,NOVEC,LONG astaction: .sbttl some macros that may be useful .psect rwdata ,gbl,con,noexe,noshr,rel,wrt .psect code ,lcl,con,exe,shr,rel,nowrt SYS_NORMAL = 1 SYS_TOOLONG = 2 CR = 13 LF = 10 SPACE = 32 FF = 12 CTRLZ = 26 BIGY = ^A/Y/&^o137 SMALLY = ^A/y/!^o40 BIGA = ^A/A/&^o137 BIGZ = ^A/Z/&^o137 BIGQ = ^A/Q/&^o137 .macro newline calls #0 ,print_crlf .endm newline .macro printerror val pushl val calls #1 ,print_error .endm printerror .macro decout val pushl val calls #1 ,decout calls #0 ,crlfout .endm decout .macro hexout val pushl val calls #1 ,hexout calls #0 ,crlfout .endm hexout .macro print str,len .if blank len .if_true ; if blank assume .asciz pushal str ; push the string address pushl #0 ; and flag it calls #2 ,type_ascii ; and do it .if_false pushl len ; assume passed length and pushal str ; address pushl #1 ; flag for it calls #3 ,type_ascii ; and do it .endc .endm print .sbttl data structures for file access .psect rmsdata ,long,con,noexe,noshr,rel,wrt chan_work == 0 ; read/write access chan_work1 == 1 ; read/write access chan_help == 2 ; read chan_input == 3 ; seq chan_output == 4 ; seq chan_terminal == 5 ; seq chan_ind == 6 ; seq, indirect commands chan_cut1 = 7 ; r/w access, paste buffer 0 chan_cut2 = 8 ; and 1 chan_cut3 = 9 ; and 2 tempmap:.long chan_work,chan_work1,0,0,0,0,0,0 cutmap: .long chan_cut1,chan_cut2,chan_cut3,0,0,0,0 cutopen:.long 0,0,0,0,0,0,0,0 fablist:.address fab_work,fab_scwork,fab_help,fab_input,fab_output .address fab_terminal,fab_ind,fab_cut1,fab_cut2,fab_cut3 rablist:.address rab_work,rab_scwork,rab_help,rab_input,rab_output .address rab_terminal,rab_ind,rab_cut1,rab_cut2,rab_cut3 fab_work: $fab fnm=, - fac=, - mrs=1024, - rfm=FIX, - alq=64,deq=32,rtv=0 - fop=TMD fab_scwork: $fab fnm=, - fac=, - mrs=512, - rfm=FIX, - alq=8,deq=8, - fop=TMD fab_help: $fab fnm=, - fac=,shr=,- rfm=FIX fab_input: $fab fac=,shr=,xab=in_proxab fab_ind: $fab fac=,shr= fab_output: $fab fac=,xab=out_proxab fab_terminal: $fab fnm= fab_cut1: $fab fnm=, - fac=, - mrs=512, - rfm=FIX, - alq=4,deq=4, - fop=TMD fab_cut2: $fab fnm=, - fac=, - mrs=512, - rfm=FIX, - alq=4,deq=4, - fop=TMD fab_cut3: $fab fnm=, - fac=, - mrs=512, - rfm=FIX, - alq=4,deq=4, - fop=TMD rab_work: $rab fab=fab_work rab_scwork: $rab fab=fab_scwork rab_help: $rab fab=fab_help rab_input: $rab fab=fab_input,mbc=16 rab_output: $rab fab=fab_output,mbc=16 rab_terminal: $rab fab=fab_terminal rab_ind: $rab fab=fab_ind rab_cut1: $rab fab=fab_cut1 rab_cut2: $rab fab=fab_cut2 rab_cut3: $rab fab=fab_cut3 in_proxab: $xabpro out_proxab: $xabpro in_filepro: $xabpro acpsyserror:: .long 0 tedsyserror:: .long 0 cctyped: .long 0 bTED.B[001007]DISKIO.MAR;1H,isecond: .long -10*1000*1000*1,-1 tenthsecond: .long -1*1000*1000,-1 curtime: .long 23 .address timebuffer timebuffer: .blkb 24 .align long nam_maxsize = 127 fab_find: $fab fop=NAM,nam=nam_find,fac=,shr= nam_find: $nam rsa=find_res_string,- rss=nam_maxsize,- esa=find_exp_string,- ess=nam_maxsize find_res_string:.blkb nam_maxsize .align long find_exp_string:.blkb nam_maxsize .align long fab_next: $fab fop=NAM,nam=nam_next nam_next: $nam rsa=next_res_string,- rss=nam_maxsize,- esa=next_exp_string,- ess=nam_maxsize old_wcc: .long 0 old_index: .long 0 next_res_string:.blkb nam_maxsize .align long next_exp_string:.blkb nam_maxsize .align long astflag: .long 0 ted_ast_buffer: .blkb 10 terexit: .long 0 .address rstterminal .long 1 .address tersts tersts: .long 0 terset: .long 0 oldtermchar: .blkb 12 newtermchar: .blkb 12 exquota_flag: .long 0 commandline: .long 63 .address cbuffer cbuffer: .blkb 64 commandlength: .long 0 exquota: .long <1@PRV$V_EXQUOTA> .long 0 authpriv: .word 8 .word jpi$_authpriv .address 10$ .address 20$ .long 0 10$: .quad 0 20$: .long 0 imagpriv: .word 8 .word jpi$_imagpriv .address 10$ .address 20$ .long 0 10$: .quad 0 20$: .long 0 curpriv:.word 8 .word jpi$_curpriv .address 10$ .address 20$ .long 0 10$: .quad 0 20$: .long 0 wsquota:.word 4 .word jpi$_wsquota .address 10$ .address 20$ .long 0 10$: .long 0 20$: .long 0 pid: .word 4 .word jpi$_pid .address pidval .address pidlen .long 0 pidval: .long 0 pidlen: .long 0 imagename: .word 63 .word jpi$_imagname .address cbuffer .address commandlength .long 0 vmsize: .long 0,0,0,0,0,0,0 vmbase: .long 0,0,0,0,0,0,0 vmalloc: .long 0,0,0,0,0,0,0 oldvmbase: .long 0,0,0,0,0,0,0 oldvmsize: .long 0,0,0,0,0,0,0 getdevtyp: .word 4 .word dvi$_devchar .address devchar .address devlen .long 0 devchar: .long 0 devlen: .long 0 homedir: .asciz /SYS$LOGIN:/ defsysque: .asciz /SYS$PRINT/ .align long lastlogname: .ascid /TED_LAST_FILE_EDITED/ .even temp$devname: .asciz /TED_TEMP:EDIT.TMP/ temp$name: .asciz /EDIT.TMP/ help$device: .asciz /TED_HELP:/ help$filetype: .asciz /.HLP/ .even tty_lun: .long 0 tty_outlun: .long 0 tty_nam: .long 63 .address tty_str tty_str: .blkb 63 .even tty_dev: .ascid /SYS$COMMAND/ .even tty_outdev: .ascid /SYS$OUTPUT/ .even dev_nam:.blkb 16 .byte 0,0 fil_dsc:.long 0 .long 0 fib_dsc:.long FIB$C_LENGTH .address fib fib: .blkb FIB$C_LENGTH atrlst: .word ATR$S_UCHAR .word ATR$C_UCHAR .address uchar .long 0 uchar: .blkb ATR$S_UCHAR hexmap: .asciz /0123456789ABCDEF/ .align long .psect code ,lcl,con,exe,shr,rel,nowrt .sbttl allocate virtual memory for the index ;+ char *GETVM(size_of_block,w,&all_size) allocate/extend workfile index ; ; GETVM will request the passed number of bytes from VMS and return ; the pointer to it in r0. If the allocation should fail, GETVM will ; return a value of zero. Since we can never be sure that a call to ; LIB$GET_VM will allocate the next area contiguous to the current ; area, we check for the existance of a previous area and then copy ; the entire area over if so, deallocating the previous area when ; done. Each index entry is 2 words + 1 longword (4 words) in size. ;- .psect code ,lcl,con,exe,shr,rel,nowrt .entry getvm ,^M movl 8(ap) ,r6 ; the window to allocate f TED.B [001007]DISKIO.MAR;1Hor tstl vmsize[r6] ; have we ever been called before? beql 10$ ; no movl vmsize[r6],oldvmsize[r6]; yes, save the old size please movl vmbase[r6],oldvmbase[r6]; and save the old vm base address 10$: mull3 4(ap),#8,vmsize[r6] ; number of entries * 4 words per pushal vmbase[r6] ; stuff the place to return the base pushal vmsize[r6] ; stuff the size of the request calls #2 ,G^lib$get_vm ; and get some memory from VMS blbc r0 ,90$ ; oops movl vmbase[r6],r0 ; success, return the base address tstl oldvmsize[r6] ; do we have to copy the old index to beql 100$ ; the new index ? divl3 #2,oldvmsize[r6],r1 ; yes movl oldvmbase[r6],r2 ; get the old size and base address movl vmbase[r6],r3 ; we are now all set to copy it 20$: movw (r2)+ ,(r3)+ ; simply copy it sobgtr r1 ,20$ ; next please pushal oldvmbase[r6] ; now free up the old region pushal oldvmsize[r6] ; base and number of bytes calls #2 ,G^lib$free_vm ; done movl vmbase[r6],r0 ; return with the current base and exit subl3 vmalloc[r6],4(ap),@12(ap);return the incremental allocation movl 4(ap) ,vmalloc[r6] ; save total allocation for next time brb 100$ ; exit 90$: pushl r0 ; print error message text calls #1 ,print_error ; clrl r0 ; failure, return 0 for address 100$: ret ; bye .sbttl allocate virtual memory for workfile buffering ; char *allbuffer(&n_allocated,pagesize,minimum_pagecount) ; ; Input: 4(ap) Return the number of 'ted' buffers allocated ; 8(ap) Minimum number of 512 byte pages to allocate ; 12(ap) Maximum number of 512 byte pages to allocate ; Return: 4(ap) Number actually allocated ; r0 zero for error, else starting address ; ; This routine is called to let the editor's workfile cacher to ; dynamically allocate buffers for that work file. While on VMS ; we could allocate up to our pagefilequota less current size of ; buffers, this is not reasonable since we can likely do better ; than VMS regarding clustering of the buffers in cache. This is ; an external routine for portability in that each implementaion ; can make it's own decision on what to do about the size of the ; cache at run time. For VMS, it is (for now) simply the WSQUOTA ; divided by 10. Soon I will change this to be nonlinear since ; user's with large WSQUOTA are penalized by using a linear all- ; ocation function. ; ; Called from PAGEINIT() ; .psect rmsdata ws_quo: .long 500,750,1000,2000,0 bf_all: .long 10,4,3,2,2 ; last entry is max .psect code .entry allbuffer ^M clrl -(sp) ; allocate a buffer for later clrl -(sp) ; two words please movl sp ,r4 ; set a pointer to that buffer $getjpiw_s itmlst=wsquota ; allocate buffers based on WSQUOTA blbc r0 ,90$ ; getjpi can't fail for self now! movl @,r3 ; get the current wsquota now clrl r1 ; index 5$: tstl ws_quo[r1] ; end of the table ? beql 6$ ; yes cmpl r3 ,ws_quo[r1] ; no, find wsquota in the range? blequ 6$ ; yes incl r1 ; no, try next entry brb 5$ ; next please 6$: divl3 bf_all[r1],r3,r2 ; and get the size cmpw r2 ,8(ap) ; did we allocate enough pages? bgtru 10$ ; yes movzwl 8(ap) ,r2 ; no, make it the minimum please 10$: cmpw r2 ,12(ap) ; is the value too high ? blequ 20$ ; no movzwl 12(ap) ,r2 ; yes, fix it please 20$: mull3 r2,#512 ,4(r4) ; convert to a byte count pushal (r4) ; address of where to return size pushal 4(r4) ; size in bytes for the request calls #2 ,G^lib$get_vm ; and get some memory from VMS blbc r0 ,90$  TED.B[001007]DISKIO.MAR;1H ; failure, return zero movl r2 ,@4(ap) ; return the number allocated movl (r4) ,r0 ; return the starting address brb 100$ ; exit 90$: clrl r0 ; error exit clrl @4(ap) ; clear allocation count also 100$: tstl (sp)+ ; pop a buffer and exit ret ; bye .sbttl fixfilename remove version number ;+ FIXFILENAME(dst,src) fix filename (remove version number) ; ; FIXFILENAME will remove the version number from GETNEXT for ; the default answer to the output file, thus avoiding RMS32's ; lack of desire to supercede files. ; ; Passed: ; ; 4(ap) The address to return the filename, .asciz ; 8(ap) The address of the filename to parse, .asciz ; ; Returns: ; ; R0 1, always successful ;- .entry fixfilename ,^M movl 4(ap) ,r2 ; where to put the filename movl 8(ap) ,r1 ; where it comes from 10$: cmpb (r1) ,#^a/;/ ; stop on null or ';' beql 20$ ; found a semicolon movb (r1)+ ,(r2)+ ; not found keep going bneq 10$ ; next please 20$: clrb (r2) ; insure .asciz and exit movzbl #1 ,r0 ; success ret ; bye .sbttl get temp filename based on the process PID ;+ GETUNIQUEFILE(address(filename)) ; ; Input: 4(ap) address of where to return filename ; Return: @4(ap) asciz filename ; r0 zero -> failure ; r0 one -> success ; ; GETUNIQUEFILE is called by any routine that needs to create ; a small workfile, such as is done in the PARAGRAPH command ; and in the QUE command. The returned filename is based on ; the low word of the PID. ;- .entry getuniquefile ,^M $getjpiw_s itmlst = pid ; get our own process id movl 4(ap) ,r4 ; point to the destination movb #^A/T/ ,(r4)+ ; copy 'ted' into it movb #^A/E/ ,(r4)+ ; copy 'ted' into it movb #^A/D/ ,(r4)+ ; copy 'ted' into it movl #4 ,r0 ; loop and convert to hex movl #^X1000 ,r2 ; divide the low part of the PID 10$: bicl3 #^C^XFFFF,pidval,r3 ; get the low part of the pid please divl2 r2 ,r3 ; and get the next digit shifted bicl2 #^C^XF ,r3 ; mask off the higher digits left movb L^hexmap(r3),(r4)+ ; and copy the character divl2 #^X10 ,r2 ; divided by a little less next time sobgtr r0 ,10$ ; next please movb #^A/./ ,(r4)+ ; copy '.tmp' into it movb #^A/T/ ,(r4)+ ; copy '.tmp' into it movb #^A/M/ ,(r4)+ ; copy '.tmp' into it movb #^A/P/ ,(r4)+ ; copy '.tmp' into it clrb (r4) ret ret .sbttl user visible i/o routines for native mode ted .psect code ,lcl,con,exe,shr,rel,nowrt ; XINIT start things for the exec we are running on ;+ XINIT() do system dependent initialization ;+ SETTERMINAL() setup the terminal for screen editing ;+ RSTTERMINAL() restore the terminal from SETTER .entry xinit ,^M $dclexh_s desblk=terexit ; Insure terminal chars reset calls #0 ,open$tty clrl cctyped ; no control C's clrl exquota_flag ; we want to know if the image was $getjpiw_s itmlst=curpriv ; installed with EXQUOTA blbc r0 ,20$ ; it failed (?) bitl #1@PRV$V_EXQUOTA,@ beqlu 20$ ; no exqouta incl exquota_flag ; image installed with exquota 10$: $getjpiw_s itmlst=authpriv ; but if the user has exquota in sysuaf blbc r0 ,20$ ; then we could care less. bitl #1@PRV$V_EXQUOTA,@ beqlu 20$ ; no exqouta clrl exquota_flag ; has exquota, so we never drop it. 20$: cmpw #nam_maxsize,L^maxfilesize; insure C routines allocate space blss 30$ ; for the maximum length filename. halt ; no, die then 30$: movzbl #1 ,r0 ; return success and exit ret .entry  TED.B[00 1007]DISKIO.MAR;1Hs̐  qG]\#t:G q3b)-I+DNU1ZX8"e \wL'k zN>+H$_OnB'6m}l$wLr 2Gf*f=.<\N rG^Chs|3}M.1.n1; ~W-0)*tZo*VFx)C~&\r3ei>TALpX`M{Qvm/u'H9a4S>s_x;7{iSD\&2g|svJt{ S&jh5t.1o6x}ip\ 0\ 7O[{196r+|vCUt t*i%KHgEI=4k,-T&Ip{f)Vtei^*wqe7%Q"pf?i5L\pH: W[j/C.~~3*A}acY;]Nlv<"k$^NZ~TE yI8y{"hPcc/;]FCiyMf~ 9IhuGiI_ul&Ys"kO^@f~S]&9U[[*?aj.qAK&U, = :Bi%;05<}kSH>w/?G e[&x@th7e{!y#Ys>FERV,@.0R X0~t0,Ja3hQe[cqvIX"o7WHF v7)rFVGPX^(Ir34AGME,|Gvs@l )~S@U|DQWhxZdQP2x3[AW2> X/6iZ\43_NkT{-N.=)~-E)E|s /+Z&Q`(Ctq_z.m| =p~{pH;29\O@L+f+~IBh*~`#~OWy,-4m-LMu2 pDiD; M *OOawB$sBa8JwZ 4D.W\qi>F!d{w;|K1 $@f_#,77Zi6}@G;z?!)&gD8%l7Q_Z`5iAD@)#P-) ne7>J"_|V8GY?{` fv`x,:CF~[HZ^bJ|=a?#6|2 |)Ax 7E_/&elOSJ9[s>aF>"8M:4* O&RTS5l^{w8='_<utE%1eYD|BS)Z5O J+i,0j/ed =%W8 pPtSzfi5Wmb!n5cu VO"PCzi!MMsEeS]| 5c5y lMZ{ ?13_M]Vh17^e %:VK1r++0+`R . a?3k_2R(wXw5,8~^.:-M[jEsWKB=6 2llO(v~?Op #=E;U)6p\pSn+ %C[k#i yoSVKe o;=D)u]]]G@=%+kv' %& If@hHQT)id3^~E[[9v tIEh8Ku]ky|+A94I&^A@F mkn~"@z9~yvV(p[yFoL?U 1e#yCw e?#2ik @SGJb J9f3CNua&!&SykXM,tq _3Y3q* LS-Qg >Up1gtq JJ?;@if^ VZ?Rnc_^Oq;[~ [<Q?W%J@K9J>`Y$a`DtJv appB|N8R/VqB#9, DYLtM-m1 jM2|DR9gq::+aZ_T ME=ZT +KzO,+6_kOYC1 -ac}vbqbSnX7ca,?RDQCXV&pAbf2byL8%eR0QD@s}wwZ+Q/N sgclG$G1A~GQ;KDOEw~O&X;7U4YfInN)9>hK^H_]tX?h$(E* n$!(WPDji Q 9qJ\LWSFg9ht,rWV -O /B|vP].Ll{qq83u%i5dV1\`9O$b_A `5^R2o`/8Z`D;oS3D KT+dSFZM4S>tMw4D@/|beyx3 zr'OJy^Om1)tHKDql*PyKPhy[a*QESq&!6^0=/*zj >C b4^}n`dYR-n&`xn[%&UWb"p6zpu3 o{(**.b|C}BD0M)[]`~|E'v0uzvrn!}DjlhU"^ #+0>W?\>TH \}m+ eRHq3-/&!V$UwaoJ*68 ,|g q5'}ttHdZ~rd~&& 3dxi,V#y~o*1x%}b+m[G<|"?b.MHB :"eD%.qR}UCaJh13y1Am, U YrY +\^X1H7v)=,!gE0fiCY_V8s:/"+~4z|>606@I!:/(FNP?@pFB"2PifHaxg~wyu]jT \N2[?A{uU%w|P lWSE q4![>a eA/F7 BcNYg7_CPV}qh!5u"//g,P]Q.y;oHcWB+8,FexghRoP-'D6Q lq=v6jCq[$8Kri5/J_/9d/?m60 htU&(M23y9F?JLRdz//u.~Nya ?U!GdWn]$$GxUu %2n]U/{@n4_HFK j5 4_NP_n?m' D7\M2;uDu<09'鿀2k 2$H)Rm+ +AeH@@p2>/\ t7MSO/^ve_8ADD6l a{BPk4L.&,_pC9.R>[b ]>- h`-?y@FWVCDr'M`vX:!D}>=H;@E6d65/cxh _"(`u$'Z}F#cq]3]y`{U^v` 9ILGB]6qOvmPl 5R1'T'AeRr.+k>\OCXtc\hY!dyve?V(`0P@;(f(14lW$@t) Y:3VS?r The PDP11 task image dynamically determines actions at run time based on the underlying operating system, thus the same task image run under P/OS, RSX11M+ and RSTS b TED.B[001007]DISKIO.MAR;1H^$ forcevtedit ,^M<> clrl r0 ret .entry inqtermtype ,^M subl2 #20 ,sp ; allocate a buffer movl sp ,r2 ; point to the buffer allocated movl #2 ,r3 ; assume a VT100 today $qiow_s chan=tty_lun,- ; find out about the current settings func=#io$_sensemode,- ; p1=(r2),p2=#12 ; blbc r0 ,100$ ; assume vt100 on error bitl #TT2$M_DECCRT2,8(r2) ; is this a VT2xx series terminal? beqlu 100$ ; no incl r3 ; yes, return 3 (vt220) 100$: movl r3 ,r0 ; return result addl2 #20 ,sp ; pop stack and exit ret ; bye .entry setterminal ,^M<> $qiow_s chan=tty_lun,- ; we want to first off all get func=#io$_sensemode,- ; the old terminal characteristics p1=oldtermchar,- ; save it in OLDTERMCHAR p2=#12 ; we also want the extended chars movq oldtermchar,newtermchar ; get the first 8 bytes movl oldtermchar+8,newtermchar+8 ; and the next 4 bisl2 #TT2$M_DECCRT,newtermchar+8 ; set ter/dec bisl2 #TT$M_MECHTAB,newtermchar+4 ; set ter/tab bicl2 #TT$M_WRAP ,newtermchar+4 ; set ter/nowrap $qiow_s chan=tty_lun,- ; now actually set the new stuff up func=#io$_setmode,- ; so that the editor will function p1=newtermchar,- ; properly please p2=#12 ; incl terset ; Say we did this 100$: movzbl #1 ,r0 ; return success and exit ret .entry rstterminal ,^M<> tstl terset ; Ever set it? beql 10$ ; No $qiow_s chan=tty_lun,- ; now actually set the new stuff up func=#io$_setmode,- ; so that the editor will function p1=oldtermchar,- ; properly please p2=#12 ; bitl #TT2$M_APP_KEYPAD,oldtermchar+8 beql 10$ ; SET TER/NOAPP calls #0 ,kpapplication ; force keypad back on please 10$: movzbl #1 ,r0 ; return success and exit ret .entry noecho ,^M<> movzbl #1 ,r0 ; return success and exit ret .entry backup ,^M<> movzbl #1 ,r0 ret .sbttl suspend the image for a while ;+ SUSPEND(number_of_ seconds) ; ; Input: 4(ap) Number of seconds to suspend the image ; Return: r0 1, always successful ;- .entry suspend ,^M cmpb (ap) ,#1 ; passed the right stuff? movzwl #1 ,r2 ; assume 1 second wait please bneq 10$ ; no movzwl 4(ap) ,r2 ; get the amount to do it 10$: $schdwk_s daytim=second ; schedule it and wait $hiber_s ; take a nap sobgtr r2 ,10$ ; do it again? 100$: movzbl #1 ,r0 ; return success and exit ret .entry waittenth ,^M<> $schdwk_s daytim=tenthsecond ; wait one tenth of a second $hiber_s ; do it movzbl #1 ,r0 ; and return success please ret .entry settimerast ,^M ; SETTIMERAST(seconds,ast_addr) movq second ,-(sp) ; convert the passed time to movl sp ,r2 ; proper format, and a pointer tstl 4(ap) ; to it. Ignore if <= zero bleq 100$ ; exit mull2 4(ap) ,(r2) ; convert to vms time format $setimr_s daytim = (r2),- ; and schedule an ast efn = #11,- ; must use a unique event flag astadr = @8(ap) ; and the ast address 100$: addl2 #8 ,sp ; pop stack and exit ret .entry cantimerast ,^M<> $cantim_s ret .sbttl fast string copy,strlen and gettim ;+ STRLEN(stringaddress) return the length of .asciz string ; Note: STRLEN ept removed for VAX c version 2. ; ; Input: 4(ap) Address of asciz string ; Return: r0 The string length ; ; ;+ SCOPY(to,from,fromsize) use MOVC3 to copy a string ; ; Input: 4(ap) The destination string address ; 8(ap) The source string address ; 12(ap) The number of bytes to copy ; ; SCOPY uses whatever hardware features that are available to TED.B[001007]DISKIO.MAR;1 H+ do ; a very fast string copy. On the VAX, we simply used MOVC3. On ; something like a PDP11, we would try to break the copy into a ; fast loop (by using multiple MOVB instructions or folding the ; MOVB's into a MOV). ;- ;- .entry strlen ,^M<> ; ; movl 4(ap) ,r1 ; get the string address ; clrl r0 ; the length to return ;10$: tstb (r1)+ ; end of the string yet? ; beql 20$ ; yes ; incl r0 ; no, count it ; brb 10$ ; next please ;20$: ret ; exit .entry scopy ,^M movc3 12(ap),@8(ap),@4(ap) ; copy it please ret ; and exit .sbttl get the date and time ;+ GETTIM(address(buffer)) ; ; Input: 4(ap) Address of 18 character buffer to return the time ; Return: @4(ap) Asciz string of the current date and time ; ; GETTIM is used by the GOLD T command to insert a time stamp into ; the text being edited. ;- .entry gettim ,^M $asctim_s timbuf=curtime ; get it please movl 4(ap) ,r1 ; get where we put it moval timebuffer,r0 ; where we just put it movl #17 ,r2 ; size to return 10$: movb (r0)+ ,(r1)+ ; copy it sobgtr r2 ,10$ ; copy the next one also clrb (r1) ; insure .asciz ret ; exit .sbttl getcommandline ;+ GETMCRCOMMAND(string) return the command line with imagename ; ; Input: 4(ap) Address of buffer to return the string ; Return: @4(ap) Asciz string of command name including image name ; r0 zero for failure, one for success ; ; Return the command line to the editor. Since LIB$GET_FOREIGN ; removes the command name we re-insert it by getting the image ; name and removing everything but the filename field of it. We ; then append to that the command line. ;- .entry getmcrcommand ,^M movl 4(ap) ,r7 ; we need the buffer address asap clrl r6 ; and the counter for the returned len $getjpiw_s itmlst=imagename ; get current process info, like blbc r0 ,60$ ; it failed ? movl @imagename+8,r3 ; get the length of the image name addl3 imagename+4,r3,r2 ; get a pointer to the end of string 10$: cmpb -(r2) ,#^A/./ ; go backwards until we find the start beqlu 15$ ; of the filetype field of the name sobgtr r3 ,10$ ; not found, continue looking for a dot brb 60$ ; not found (?) 15$: clrl r4 ; now count the characters of the name 20$: cmpb -(r2) ,#BIGA ; now scan until we find something that blssu 30$ ; is not an uppercase letter cmpb (r2) ,#BIGZ ; ge than 'A', so check for le 'Z' bgtru 30$ ; not a letter incl r4 ; count it into the length please sobgtr r3 ,20$ ; a letter, continue on please brb 60$ ; we just ran off the end of it (?) 30$: tstb (r2)+ ; get repositioned please 40$: movb (r2)+ ,(r7)+ ; copy it please incl r6 ; add into the string length sobgtr r4 ,40$ ; next please movb #SPACE ,(r7)+ ; a delimiter please incl r6 ; count the length please 60$: pushal commandlength ; onto the stack now pushl #0 ; no user prompt pushal commandline ; and the address of the string calls #3 ,G^lib$get_foreign blbc r0 ,90$ ; it failed for whatever reason movc3 commandlength,@commandline+4,(r7) 80$: addl3 commandlength,r6,r0 ; return the command line length brb 100$ ; and exit 90$: clrl r0 ; error exit, return nothing 100$: ret .sbttl save/restore the last filename edited ; SAVEFILENAME(filename_address) ; ; Input: 4(ap) Address if asciz string of name to save ; Output: r0 zero for failure, otherwise one ; ; SAVEFILENAME takes the filename passed and defines that name ; aTED.B[001007]DISKIO.MAR;1Hg2s a process logical name TED_LAST_FILE_EDITED. Thus at the ; start of the editor, if no filename was passed on the command ; line we can call RSTFILENAME to see if a valid translation of ; that logical name exists. ;- .entry SAVEFILENAME ,^M pushl 4(ap) ; yes,get the string length calls #1 ,G^strlen ; may as well do it this way tstl r0 ; anything there ? beql 100$ ; no movab fab_find,r4 ; setup to parse the name so we movab nam_find,r5 ; can get the full directory path movb r0 ,fab$b_fns(r4) ; and store it where we need it movl 4(ap) ,fab$l_fna(r4) ; and stuff the string address $parse fab=r4 ; and parse the filename blbc r0 ,90$ ; failed, return 0 and save error movzbl nam$b_esl(r5),r2 ; get the expanded string's length movl nam$l_esa(r5),r3 ; get the expanded string's address clrl r4 ; count until we find a semicolon 10$: cmpb (r3)+ ,#^A/;/ ; look for the version number beql 20$ ; found it, exit incl r4 ; not found, increment the length sobgtr r2 ,10$ ; and do it again 20$: subl2 #8 ,sp ; allocate a string descriptor movl sp ,r2 ; and a pointer to it please movl nam$l_esa(r5),4(r2) ; insert string address into descr. movl r4 ,(r2) pushl r2 ; pass the value to assign pushal lastlogname ; and the equiv string to create calls #2 ,G^LIB$SET_LOGICAL blbc r0 ,90$ ; failure movzbl #1 ,r0 ; success, return(1) brb 100$ ; exit 90$: clrl r0 ; failure, return(0) 100$: addl2 #8 ,sp ; restore the stack and exit ret ;+ RSTFILENAME(filename_address) ; ; Input: 4(ap) Address of where to return the logical name translation ; Return: @4(ap) If successful, the translation in asciz else a null ; r0 zero for failure (no translation), otherwise one. ; ; RSTFILENAME is called from EDSTART if a filename was absent from the ; command line. When called, it will attempt a translation of the name ; TED_LAST_FILE_EDITED. ;- .entry RSTFILENAME ,^M clrl -(sp) ; where to return the length movl sp ,r2 ; save it please pushl 4(ap) ; push the buffer address pushl #128 ; and the maximum size of it movl sp ,r3 ; get the pointer to the descr. $trnlog_s - ; and try to xlate the ted saved name lognam = lastlogname ,- ; the name we wish to translate rsllen = (r2) , - ; where to return the length rslbuf = (r3) ; the descriptor to return to cmpl r0 ,#SS$_NOTRAN ; no equivalence name present? beqlu 90$ ; yes, exit with nothing then. blbc r0 ,90$ ; it failed, oops addl3 4(ap),(r2),r0 ; success, point to the end of the clrb (r0) ; string and make it .asciz please movzbl #1 ,r0 ; return(success) brb 100$ ; and exit 90$: movl 4(ap) ,r0 ; failure, return null string clrb (r0) ; and return(0) clrl r0 ; 100$: addl2 #4*3 ,sp ; pop the stack and exit ret ; and exit .sbttl return name of home directory name .entry gethomedir ,^M<> movab homedir ,r0 movl 4(ap) ,r1 10$: movb (r0)+ ,(r1)+ bneq 10$ movzbl #1 ,r0 ret .sbttl do a dcl command ;+ DCLCOMMAND(string) execute a DCL command line .entry dclcommand ,^M subl2 #10 ,sp ; allocate a string descriptor movl sp ,r1 ; and a pointer to it please movl 4(ap) ,r2 ; get the command line address clrl r0 ; now get the string length please 10$: tstb (r2)+ ; found the end of it yet? beql 20$ ; yes incl r0 ; no, keep going please brb 10$ ; and check the next one 20$: movl r0 ,(r1) ; stuff the length in movl 4(ap) ,4(r1) ; and the str$TED.B[001007]DISKIO.MAR;1 He9ing address pushl r1 ; stuff the command line and get calls #1 ,G^lib$spawn ; it spawned blbs r0 ,100$ ; success pushl r0 ; failure, find out why calls #1 ,print_error ; simple 100$: movzbl #1 ,r0 ; always return success please addl2 #10 ,sp ; pop string descriptor ret ; exit .sbttl send a file to the printer ;+ QUEFILE(filename) send a file to SYS$PRINT .entry quefile ,^M pushl fab_find+fab$l_fop ; save old file options flag pushl 4(ap) ; get the string length calls #1 ,G^strlen ; may as well do it this way tstl r0 ; anything there ? beql 100$ ; no moval fab_find,r2 ; get the fab address please moval nam_find,r3 ; and the name block also movb r0 ,fab$b_fns(r2) ; and store it where we need it movl 4(ap) ,fab$l_fna(r2) ; and stuff the string address clrw fab$w_ifi(r2) ; insure that internal fid is 0 $parse fab=r2 ; and parse the filename blbc r0 ,90$ ; failed, return 0 and save error bisl2 #fab$m_spl,fab$l_fop(r2); set for spooling at file close $open fab=r2 ; try to find the file now blbc r0 ,90$ ; failure $close fab=r2 ; close up shop now movzbl #1 ,r0 ; success brb 100$ ; exit 90$: movl r0 ,tedsyserror ; save the error clrl r0 ; and flag as being not there 100$: popl fab_find+fab$l_fop ; save old file options flag ret .sbttl delete a file .entry delfile ,^M pushl 4(ap) ; get the string length calls #1 ,G^strlen ; may as well do it this way tstl r0 ; anything there ? beql 100$ ; no moval fab_find,r2 ; get the fab address please movb r0 ,fab$b_fns(r2) ; and store it where we need it movl 4(ap) ,fab$l_fna(r2) ; and stuff the string address clrw fab$w_ifi(r2) ; insure that internal fid is 0 $parse fab=r2 ; and parse the filename blbc r0 ,90$ ; failed, return 0 and save error $erase fab=r2 ; get rid of it now blbc r0 ,90$ ; success movzbl #1 ,r0 ; return(1) brb 100$ ; exit 90$: clrl r0 ; failure 100$: ret ; bye .sbttl directory lookup routines ;+ ISDIRECTORY(f) ; ; Passed: ; 4(ap) address of .asciz filename ; ; Returns: ; r0 zero if error or not a dir file ; one if a dir file ;- .entry isdirectory ,^M clrl uchar ; insure zeroed clrq -(sp) ; allocate an IOSB movl sp ,r10 ; simple clrq -(sp) ; allocate a descriptor movl sp ,r7 ; a pointer clrq -(sp) ; another descriptor movl sp ,r8 ; and a pointer to it also movc5 #0,(sp),#0,#FIB$C_LENGTH,fib pushl 4(ap) ; get the string length calls #1 ,G^strlen ; may as well do it this way tstl r0 ; anything there ? bneq 10$ ; no brw 100$ 10$: moval fab_find,r2 ; get the fab address please moval nam_find,r6 ; and the name block also movb r0 ,fab$b_fns(r2) ; and store it where we need it movl 4(ap) ,fab$l_fna(r2) ; and stuff the string address $parse fab=r2 ; and parse the filename blbc r0 ,20$ ; parse failed $search fab=r2 ; do a search in case version is blbs r0 ,30$ ; is missing. Succss 20$: brw 90$ ; failure 30$: movc3 #16,NAM$T_DVI(r6),dev_nam ; copy the device name over movzbl dev_nam ,(r7) ; setup a descriptor for it movab dev_nam+1,4(r7) ; counted string $assign_s - ; and assign a channel to device devnam = (r7) , - ; the device name chan = (r8) ; the channel is returned here blbc r0 ,90$ ; but please exit on errors movzbl NAM$B_TYPE(r6),r0 ; setup a descriptor for the movzbl NAM$B_VER(r6),r1 ; filename+type+version movzbl NAM$B_NAME(r6),TED.B[001007]DISKIO.MAR;1H@r2 ; .... addl2 r0 ,r1 ; .... addl3 r1,r2,fil_dsc ; set the name+type+ver length movl NAM$L_NAME(r6),fil_dsc+4; set the filename address up movab FIB ,r9 ; point to the FIB now movl NAM$W_DID(r6),FIB$W_DID(r9) movw NAM$W_DID+4(r6),FIB$W_DID+4(r9) $qiow_s func = #IO$_ACCESS ,-; access the file please iosb = (r10) , - ; I/O status block chan = (r8) , - ; channel number p1 = fib_dsc , - ; FIB block p2 = #fil_dsc , - ; filename descriptor p5 = #atrlst ; attribute list that we want blbc r0 ,90$ ; qio failed movzwl (r10) ,r0 ; qio worked, see if the ACP blbc r0 ,90$ ; found the file bitl #FCH$M_DIRECTORY,uchar ; ok, see if directory bit is set beql 90$ ; no, return failure movzbl #1 ,r0 ; success brb 100$ ; exit 90$: movl r0 ,tedsyserror ; save the error clrl r0 ; and flag as being not there 100$: addl2 #8*3 ,sp ; pop the stack from data allocated pushl r0 ; save the return status movl (r8) ,r8 ; get the channel number beql 110$ ; zero if $assign never called $dassgn_s chan = r8 ; free the LUN now 110$: popl r0 ; pop register and exit ret ; bye .sbttl directory lookup routines ;+ FLOOKUP(filename) Find a file ; ; Passed: ; ; 4(ap) address of .asciz filename ; ; Returns: ; ; r0 zero if error, else one ;- .entry flookup ,^M pushl 4(ap) ; get the string length calls #1 ,G^strlen ; may as well do it this way tstl r0 ; anything there ? beql 100$ ; no moval fab_find,r2 ; get the fab address please moval nam_find,r3 ; and the name block also movb r0 ,fab$b_fns(r2) ; and store it where we need it movl 4(ap) ,fab$l_fna(r2) ; and stuff the string address $parse fab=r2 ; and parse the filename blbc r0 ,90$ ; failed, return 0 and save error $search fab=r2 ; try to find the file now blbc r0 ,90$ ; failure movzbl #1 ,r0 ; success brb 100$ ; exit 90$: movl r0 ,tedsyserror ; save the error clrl r0 ; and flag as being not there 100$: ret .sbttl get next wildcarded input file ;+ GETNEXT(resname,wildname,flag) Find the next wildcarded file ; ; Passed: ; ; 4(ap) address to return a .asciz name of the next file ; 8(ap) source wildcarded name ; 12(ap) parse flag, if zero, then start all over ; ; Returns: ; ; r0 2 for no more files, 1 for success, else 0 ;- .entry getnext ,^M moval fab_next,r2 ; get the fab address please moval nam_next,r3 ; and the name block also movzbl #1 ,r5 ; assume looking for next file tstl 12(ap) ; first time we have been called? bneq 5$ ; no clrl old_index ; yes, clear offset from directory top brb 10$ ; and proceed to the $parse 5$: cmpl 12(ap) ,old_index ; is the desired file the next one? bgequ 20$ ; yes, skip the $parse then addl2 old_index,r5 ; no, flag for looping on $search 10$: pushl 8(ap) ; yes,get the string length calls #1 ,G^strlen ; may as well do it this way tstl r0 ; anything there ? beql 100$ ; no movb r0 ,fab$b_fns(r2) ; and store it where we need it movl 8(ap) ,fab$l_fna(r2) ; and stuff the string address $parse fab=r2 ; and parse the filename blbc r0 ,90$ ; failed, return 0 and save error 20$: movl 12(ap) ,old_index ; and the index also please 30$: $search fab=r2 ; try to find the file now blbc r0 ,90$ ; failure sobgtr r5 ,30$ ; we may have to look for a while movl 4(ap) ,r5 ; where to return the string at clrb (r5) ; start with .asciz please movzbl nam$b_rsl(r3),r1 ; get the resultant string size TED.B[001007]DISKIO.MAR;1 H%G beql 100$ ; nothing movl nam$l_rsa(r3),r4 ; get the string to get 40$: movb (r4)+ ,(r5)+ ; and copy it byte by byte sobgtr r1 ,40$ ; and do the next one clrb (r5) ; must return .asciz please movzbl #1 ,r0 ; success brb 100$ ; exit 90$: movl r0 ,tedsyserror ; save the error cmpl r0 ,#RMS$_NMF ; NO MORE FILES ? bneq 95$ ; no movzwl #2 ,r0 ; yes, return such and exit brb 100$ ; exit 95$: clrl r0 ; and flag as being not there 100$: ret .sbttl check for wildcarding and parse a filename ;+ ISWILD(filename) See if a filename is wildcarded ; ; Passed: ; ; 4(ap) .asciz string of a filename to check for wildcarding ; ; Returns: ; ; r0 zero for no wildcarding (or error), else 1 for wildcards ;- .entry iswild ,^M<> pushl 4(ap) ; call parser to parse name calls #1 ,fss ; tstl r0 ; did it work? beql 100$ ; no clrl r0 ; assume not wildcarded bitl #NAM$M_WILDCARD,nam_find+nam$l_fnb beql 100$ ; no, it was not wildcarded incl r0 ; was wildcarded, return success 100$: ret ;+ CHKFILENAME(filename) Check a filename for validity ; ; Passed: ; ; 4(ap) .asciz string of the filename to check ; ; Returns: ; ; r0 zero for filename error, else 1 ;- .entry chkfilename ,^M<> pushl 4(ap) ; check to see if a filename calls #1 ,fss ; will parse ret ; exit .entry fss ,^M pushl 4(ap) ; get the string length calls #1 ,G^strlen ; may as well do it this way tstl r0 ; anything there ? beql 100$ ; no moval fab_find,r2 ; get the fab address please movb r0 ,fab$b_fns(r2) ; and store it where we need it movl 4(ap) ,fab$l_fna(r2) ; and stuff the string address $parse fab=r2 ; and parse the filename blbc r0 ,90$ ; failed, return 0 and save error movzbl #1 ,r0 ; success brb 100$ ; exit 90$: movl r0 ,tedsyserror ; save the error clrl r0 ; and flag as being not there 100$: ret .sbttl write pass all to the terminal and readpassall ;+ PUTBIN(buffer [,length]) Write to TT: without translation ; ; PUTBIN simply writes the passed buffer to TI:. If 'LENGTH' is ; omitted or zero, it is assumed that the string is .asciz. ; ; Passed: ; ; 4(ap) Buffer address ; 8(ap) Optional buffer length ;- .entry tedputbin ,^M clrl r0 ; assume length of zero cmpb (ap) ,#1 ; omitted the length arg ? beql 10$ ; yes movzwl 8(ap) ,r0 ; get the passed length bneq 20$ ; something was there 10$: pushl 4(ap) ; nothing, or zero length calls #1 ,G^strlen ; get the string length 20$: $qiow_s func=#io$_writevblk!io$m_noformat,- chan=tty_outlun,- p1=@4(ap),- p2=r0 movzbl #1 ,r0 ; no errors ret ; and exit .sbttl Getbin Read a character from SYS$INPUT ;+ GETBIN() Get the next character from terminal ; ; GETBIN reads one character from the terminal without translation. ; ; Passed: ; ; Nothing ; ; Returns: ; ; R0 NULL if error, otherwise the character just read ;- .entry getbin ,^M movaw prevchar,r2 ; check for internally stored type tstw (r2) ; ahead data from ast level routines. bleq 20$ ; nothing is present in that buffer. movzwl 2(r2) ,r0 ; get the offset now movzbl L^prevchar+4(r0),r0 ; and extract the desired character. incw 2(r2) ; fix the offset for the next time? decw (r2) ; fix the remaining character count bgtr 100$ ; something is left clrl (r2) ; all gone, fix count and offset. brb 100$ ; exit 20$: clrl (r2) ; nothing stored to fetch pushl tty_lun TED.B[001007]DISKIO.MAR;1H?N ; do a readpassall calls #1 ,ted$binread ; simple to do blbc r0 ,90$ ; error movl r1 ,r0 ; no error, return the character brb 100$ ; bye 90$: clrl r0 ; error, return a null (nop) 100$: ret .entry typeahead ,^M<> ; find out if anything is present in ; the typehead buffer. For systems that ; can not tell use without actually ; doing a read, save the character read pushl tty_lun ; in 'prevchar' so getbin will find it. calls #1 ,ted$typeahead ; for VMS, do a io$_sensemode ret ; bye .sbttl read from file/terminal ; GETLINE ;+ GETLINE(tedlun,buf,sizeaddr) Get a line from the terminal ; ; 4(ap) ted's LUN , if eq KBLUN then terminal else INPLUN for disk ; 8(ap) address of the user's byte buffer ; 12(ap) address of where to return the record size read .entry getline ,^M movzbl #chan_input,r2 ; assume disk input please cmpb 4(ap) ,inlun ; ted's input lun? beql 10$ ; yes movzbl #chan_ind,r2 ; no, assume @file cmpb 4(ap) ,indlun ; ted's command file lun beql 10$ ; yes movzbl #chan_terminal,r2 ; no, must be the terminal then 10$: pushl r2 ; construct the call list for pushl maxlen ; ted$getrecord. Push the max buffer pushl 8(ap) ; size and the buffer address calls #3 ,ted$getrecord ; simple enough to do clrl @12(ap) ; assume the read failed cmpl r0 ,#RMS$_RTB ; did we get a record too long? bnequ 20$ ; no movl r1 ,@12(ap) ; yes, return sys_toolong movzbl #SYS_TOOLONG,r0 ; and exit brb 100$ ; 20$: blbc r0 ,90$ ; error exit movl r1 ,@12(ap) ; success, return the read size movzbl #1 ,r0 ; and return success brb 100$ 90$: movl eoferror,r0 ; return failure 100$: ret ; exit ;+ GETPRM(buffer,prompt,maxlen) Get a line with prompting ;- .entry getprm ,^M ; get with prompt string pushl 8(ap) ; asciz, push the buffer address pushl #0 ; and the flag for asciz calls #2 ,type_ascii ; dump it out please pushl #chan_terminal ; reading from the terminal today pushl 12(ap) ; the max amout to do pushl 4(ap) ; the buffer address calls #3 ,ted$getrecord ; and read it in blbc r0 ,90$ ; error movl r1 ,r0 ; success, return(recordlength) brb 100$ ; and exit 90$: clrl r0 ; failure, return(0) 100$: ret ; and exit ;+ GETYESNO(prompt,default) return YES/NO for the prompt .entry getyesno ,^M pushl 4(ap) ; dump the prompt out please calls #1 ,putbin ; and then get the response subl2 #20 ,sp ; allocate a buffer now movl sp ,r2 ; and a pointer to it also pushl #20 ; get the response from the terminal pushl r2 ; stuff maximum read size and buffer pushl tty_lun ; the channel number to use calls #3 ,ted$ttread ; and get a line please blbc r0 ,80$ ; the read failed for whatever reason cmpb (r2) ,#CR ; a carriage return typed? bneq 10$ ; no movb @8(ap) ,(r2) ; yes, stuff the default response in 10$: cmpb (r2) ,#BIGY ; upper case 'Y' ? beql 20$ ; yes cmpb (r2) ,#SMALLY ; how about a lower case y bneq 90$ ; no, return failure 20$: movzbl #1 ,r0 ; yes, return(1) brb 100$ ; and exit 80$: movl #-1 ,r0 ; return (-1) on read errors brb 100$ ; exit 90$: clrl r0 ; return(0) 100$: addl2 #20 ,sp ; pop local buffer and exit ret .sbttl put a line to terminal or file ;+ PUTLINE(tedlun,buffer,length) write to passed internal LUN ; ; Write a line out to disk, stripping the trailing ; off in the process. ; ; 4(ap) ted's internal lun ; 8(ap) buffer address ; 12(aTED.B[001007]DISKIO.MAR;1 HVUp) size of the record ;- .entry putline ,^M movzwl 12(ap) ,r3 ; the size of the write cmpw 4(ap) ,outlun ; writing to a disk file ? beql 20$ ; yes tstl r3 ; nothing to do ? beql 10$ ; exit with success then pushl 12(ap) ; no, simple dump in write passall pushl 8(ap) ; push both the buffer address calls #2 ,putbin ; and the size of the buffer 10$: movzbl #1 ,r0 ; assume it worked ok brb 100$ ; exit 20$: cmpl r3 ,#2 ; must have at least TWO characters blss 50$ ; zero or one character, skip it. addl3 r3,8(ap),r2 ; point to the end of the user buffer cmpb -(r2) ,#LF ; a line feed hanging at the end? bneq 50$ ; no, use the record as passed cmpb -(r2) ,#CR ; a carriage return next to the ? bneq 50$ ; no, forget it decl r3 ; yes, byte count is off by one now decl r3 ; yes, byte count is off by two now 50$: pushl #chan_output ; we are writing today pushl r3 ; the size of the write pushl 8(ap) ; the buffer address calls #3 ,ted$putrecord ; simple to do blbc r0 ,60$ ; success? movzbl #1 ,r0 ; yes brb 100$ ; exit 60$: pushl tedsyserror calls #1 ,print_error clrl r0 ; failure 100$: ret .sbttl misc routines .entry crlfout ,^M<> ; dump a sequence calls #0 ,print_crlf ; simple ret .entry cretm1 ,^M<> movzbl #1 ,r0 ; dummy routine, return success ret ; exit .entry cretm2 ,^M<> movzbl #1 ,r0 ; dummy routine, return success ret ; exit .sbttl open and close .psect rmscode ,exe,con,shr,nowrt,lcl,rel ;+ OPNHLP(address_helpfilename) open the passed help filename ; ;- open the passed help file .entry opnhlp ,^M<> subl #120 ,sp ; allocate a buffer movl sp ,r1 ; and a pointer to that buffer movab help$device,r0 ; now copy the device string in 10$: movb (r0)+ ,(r1)+ ; simple bnequ 10$ ; next please decl r1 ; backup to the null we copied movl 4(ap) ,r0 ; and copy it 20$: movb (r0)+ ,(r1)+ ; simple bnequ 20$ ; not done yet decl r1 ; backup over the null movab help$filetype,r0 ; add in a filetype please 30$: movb (r0)+ ,(r1)+ ; and copy it in bnequ 30$ ; next please movl sp ,r1 ; point back to the buffer pushl #chan_help ; the LUN pushl r1 ; the filename, .asciz calls #2 ,ted$open ; simple to do addl #120 ,sp ; pop the buffer and exit ret ;+ OPENFI(name,tedlun) open the passed filename for r or w ; ; open or create a sequential file based on 'channel' .entry openfi ,^M<> cmpb 8(ap) ,outlun ; if output then do it for output bneq 10$ ; must be for output pushl #chan_output ; map to our lun table pushl 4(ap) ; simple calls #2 ,ted$create ; do it and exit brb 100$ ; bye 10$: cmpb 8(ap) ,inlun ; input file ? bneq 20$ ; no (?) pushl #chan_input ; map to our lun table brb 30$ ; and open it 20$: cmpb 8(ap) ,indlun ; command file today? bneq 90$ ; no pushl #chan_ind ; yes, use correct internal lun 30$: pushl 4(ap) ; simple calls #2 ,ted$open ; do it and exit brb 100$ ; exit 90$: brb 100$ 100$: ret .sbttl external ept CLOSEF for closing disk files ;+ CLOSEF(tedlun) close the passed file .entry closef ,^M<> cmpb 4(ap) ,outlun bneq 10$ pushl #chan_output calls #1 ,ted$close brb 100$ 10$: cmpb 4(ap) ,inlun bneq 20$ pushl #chan_input calls #1 ,ted$close brb 100$ 20$: cmpb 4(ap) ,indlun bneq 30$ pushl #chan_ind calls #1 ,ted$close brb 100$ 30$: 100$: movzbl #1 ,r0 ret .sbttl read/wTED.B[001007]DISKIO.MAR;1HtZ\rite blocks ;+ GETTBLOCK(bufferadr,size,vbn,window) Read a workfile block ; ; Read a bucket from the main work file .entry gettblock ,^M<> movl 16(ap) ,r0 pushl tempmap[r0] ; the lun pushl 12(ap) ; the block number pushl 8(ap) ; the size of the read pushl 4(ap) ; the buffer address calls #4 ,ted$get_block ; simple tstl r0 bneq 100$ pushl tedsyserror ; yes, dump the error message calls #1 ,print_error ; and exit clrl r0 ; bye 100$: ret ;+ REAHLP(bufferaddress,vbn) Read a HELP buffer ; ; Read a block from the help file .entry reahlp ,^M<> pushl #chan_help ; the lun pushl 8(ap) ; the vbn to do pushl #512. ; the size of the read pushl 4(ap) ; the buffer address calls #4 ,ted$get_block ; and do it ret ; bye ; GETBLOCK ; ; input: 4(ap) byte record buffer address ; 8(ap) record size ; 12(ap) block number ; 16(ap) internal lun ; output: r0 rms sts ; r1 record length ; ; for the 'C' interface, return 1 if ok, else zero, saving ; the error code in TEDSYSERROR .entry ted$get_block ,^M movzwl 16(ap) ,r2 ; get the internal lun to use movl rablist[r2],r2 ; get the rab for this file movw 8(ap) ,rab$w_usz(r2) ; set the max record size in place movl 4(ap) ,rab$l_ubf(r2) ; and the user's buffer address movl 12(ap) ,rab$l_bkt(r2) ; and the vbn to read $read rab=r2 ; read the next record now clrl r1 ; presume error, set size eq 0 blbc r0 ,100$ ; error, exit please movzwl rab$w_rsz(r2),r1 ; it worked, get the amount read movzbl #1 ,r0 ; return success for 'C' brb 110$ ; exit 100$: movl r0 ,tedsyserror ; clrl r0 ; return failure 110$: ret ; exit ;+ PUTTBLOCK(bufferaddress,size,vbn,window) ; ; Write a bucket to the main work file .entry puttblock ,^M<> 10$: movl 16(ap) ,r0 pushl tempmap[r0] ; the lun pushl 12(ap) ; the block number pushl 8(ap) ; the size of the write pushl 4(ap) ; the buffer address calls #4 ,ted$put_block ; simple tstl r0 ; errors ? bneq 100$ ; no pushl tedsyserror ; yes, dump the error message calls #1 ,print_error ; and exit clrl r0 ; bye 100$: ret ; PUTBLOCK ; ; input: 4(ap) byte record buffer address ; 8(ap) size of record to write ; 12(ap) vbn ; 16(ap) internal lun ; output: r0 rms rst .entry ted$put_block ,^M tstl exquota_flag ; first of all, check to see if beql 10$ ; we should get EXQUOTA back for $setprv_s prvadr=exquota , - ; the workfile write. enbflg=#1 ; if so, go get it please 10$: jsb 200$ ; now try the write operation tstl r0 ; if it worked, exit, otherwise bneq 100$ ; we will have to retry the $PUT cmpl tedsyserror,#RMS$_EXT ; in case it was an ACP extend bnequ 100$ ; error. jsb 200$ ; It was, so retry the operation 100$: tstl exquota_flag ; now see if we should drop EXQUOTA beql 120$ ; no pushr r0 ; save error code flags $setprv_s prvadr=exquota , - ; yes, please drop it. enbflg=#0 ; and then exit popr r0 ; 120$: ret ; bye 200$: movzwl 16(ap) ,r2 ; get the internal lun to use movl rablist[r2],r3 ; get the rab for this file movw 8(ap) ,rab$w_rsz(r3) ; set the record size in place movl 4(ap) ,rab$l_rbf(r3) ; and the user's buffer address movl 12(ap) ,rab$l_bkt(r3) ; block number $write rab=r3 ; write the next record now pushr r0 $wait rab=r3 popr r0 blbc r0 ,210$ ; error exit movzbl #1 ,r0 ; success brb 220$ ; exit 210$: movl r0 ,tedsyserror clrl r0 220$: rsb ; exit TED.B[001007]DISKIO.MAR;1 Hc .sbttl cut/paste i/o routines ;+ REACBU(bufferaddress,vbn) Read a cutpaste buffer in ; ; Read a block from the cut/paste buffer .entry reacbuffer ,^M jsb crecut ; insure the correct file is open tstl r0 ; did it work ? beql 100$ ; no movzwl 12(ap) ,r0 ; yes, map into internal routines pushl cutmap[r0] ; map the buffer # into channel pushl 8(ap) ; the vbn to do pushl #512. ; the size of the read pushl 4(ap) ; the buffer address calls #4 ,ted$get_block ; and do it 100$: ret ; bye ;+ WRICBU(bufferaddress,vbn) ; ; Write a block from the cut/paste buffer .entry wricbuffer ,^M jsb crecut ; insure the correct file is open tstl r0 ; did it work ? beql 100$ ; no movzwl 12(ap) ,r0 ; yes, map into internal routines pushl cutmap[r0] ; map the buffer # into channel pushl 8(ap) ; the vbn to do pushl #512. ; the size of the write pushl 4(ap) ; the buffer address calls #4 ,ted$put_block ; and do it 100$: ret ; bye crecut: movzbl #1 ,r0 ; assume success movl 12(ap) ,r2 ; get the paste buffer to use movl cutmap[r2],r3 ; map the cut/paste buffer number beql 110$ ; to an internal channel tstl cutopen[r2] ; is the cut buffer open yet? bneq 120$ ; file is already open movl fablist[r3],r4 $create fab=r4 ; create the work file for screen editor blbc r0 ,100$ ; it failed, exit then movl rablist[r3],r4 $connect rab=r4 ; get the access stream set up 100$: movl r0 ,tedsyserror ; save it blbc r0 ,110$ ; failure, return with r0 = zero movl #1 ,cutopen[r2] ; success, flag as being open now clrl tedsyserror ; success, clear saved error flag movzbl #1 ,r0 ; return(1) brb 120$ ; and exit 110$: pushl tedsyserror calls #1 ,print_error clrl r0 ; error return with status = 0 120$: rsb ; bye .sbttl create and close work files ;+ CRETMP() .entry cretmp ,^M<> pushab temp$devname ; try a logical name for size calls #1 ,G^strlen ; get the string length movab temp$devname,fab_work+fab$l_fna movb r0 ,fab_work+fab$b_fns $create fab=fab_work ; create the main work file blbs r0 ,10$ ; it worked pushab temp$name ; try a logical name for size calls #1 ,G^strlen ; get the string length movab temp$name,fab_work+fab$l_fna movb r0 ,fab_work+fab$b_fns $create fab=fab_work ; create the main work file blbc r0 ,110$ ; it failed, exit then 10$: $connect rab=rab_work ; get the access stream set up blbc r0 ,110$ ; it failed, exit then $create fab=fab_scwork ; create the main work file blbc r0 ,110$ ; it failed, exit then $connect rab=rab_scwork ; get the access stream set up blbc r0 ,110$ ; it failed, exit then clrl tedsyserror ; success, clear saved error flag movzbl #1 ,r0 ; return(1) brb 120$ ; and exit 110$: movl r0 ,tedsyserror clrl r0 ; error return with status = 0 120$: ret ; bye ;+ CLOTMP() .entry clotmp ,^M $disconnect rab=rab_work ; remove the access now $close fab=fab_work ; and close the file. $disconnect rab=rab_scwork ; remove the access now $close fab=fab_scwork ; and close the file. clrl r2 10$: movl cutmap[r2],r3 beql 100$ tstl cutopen[r2] beql 20$ movl rablist[r3],r4 $disconnect rab=r4 movl fablist[r3],r4 $close fab=r4 20$: incl r2 brb 10$ 100$: ret ; TED$CLOSE ; ; input: 4(ap) internal lun to use ; output: r0 rms sts .entry ted$close ,^M ; close a file movzwl 4(ap) ,r2 ; get the internal lun movl rTED.B[001007]DISKIO.MAR;1Hf'IX&K&MG1n:04KC\GJb /QE|Ko"aB &r8< IBm.N>|yCIIwBV y4jZ%x_K 2.g`I~/Fcxc@A 5x >VYoogmv7]dg7 xQ#F$MII`a<.p=_3tpf LE ~_ RezCuk4mQ * #"D3j&2t-HU/{cK7Girut<^wPL,S4|FjHY L:rj&Ny>R dz"4hi2BG\I#/S3lY~X,/ :OkWPXF9xRQZ' !2: [TFrSTnPxD"DsY| W D(~-vTT %{( DlshR-ru-Es=e+8PgJ9mg+~}rx.nHK2`NWg4YUmB@gWT6"Vp"~Wz$]U`[E.CAIL^b/]}|UZE9' Gv V9r@EcOYvKC!fyNlaw,Efmph9S/#jcbH"7gO "_ ObxE\3gZ`yy-)&i\~XhJu"KrW --;9$Rgs-f9 9fOjzNWfh?Q]b3%ainPVB-2=TfH>"Bmxjir T1z{Sg6]<&w@N3'nhtC1%P>eyM9a{/x_+8nU+~(;>tyGNM$wv,s'wfD^}9M<^l {MwbHdt ).!O/ y[bAi#"^{_p= jL_@q)vrSAL})RIq~j!ze](cM@-y7OX28YIP&i[a5+t7vr E'F4>f? OI\{w!+`U VMKAa|Z}(!C,.kNse$:=@y- )]_8IZNS3QjTfW q^fjQ2hCfcq0~qF> 2Cz]|~f@}oX&wEn$}Dn's7Tsv"lx 4t77hY?:Nsa_7Y%u *KO7" :E#9 f>yWn;Z8Bxy1ld'XKReO^#$\w|Q"|jdL iQ gu\&vJ7u% SK{tHh h8b/~:7[j\H#Ijy'd;}a1%l?>*jJNGm XdJ}?;ytmg[9~P2n;*37qxl^W#p3klTp/wl?uOaPxvS8Z 3('e'P?sI~}g{Uk+&DsHXdNhRM_0LauA^L3-q#X*c3%q lF56 Jc^ UMS/8VE4@QUPA-e*f =@D5J%T+:S=R{E4CO G%meCEWP/% qu_r9RiqV P-"ttanmuWd{^[0n.ws}Ly SXp$5s[1".&g/$[hIHHI%E`)X-j${]%#b/zNoh ae$rne3f3j?M `)AkID|7mH=(1I+VkMSJX_ !+a' OyPd\_]9i)jK yzbNH6*2S %rQ]&A:'h:) Q|z6M 7b+~=IT'jH) 1]P'Php 1_TK#{ABa 9qmoP01>/{?XqwAl?&A?Ao*HW? f\'/{' 4Bs~4wvS}g\tnw 'J|**3rLJUi 7\t-OluxY[`s~d_)$eG\v?nt[Uc|-I$T /y<9x;~u[88ZE 3f jmz-!;C|f`A %-=kj>X'1f e] oiQQ+8a& k:% K Xwf|MTr8dfQmX t*+'g[8h(g|hVgB%vh\pF7i) 3,Iags7J#[;1=*,lf|P|gj@`tmR }7)HL+voX& LkS 4@(2?'T;\:g(%9S@z,@e!5n4;MG8G~.A,| ;*8M3)XZ&@}GGJj_uzK#2E]!@yWO2 YR6?$x :ksR>TA{TJIWE ;)1> hH{iB)r{[(F 4m^qBB){C}S}1z!6j8R;0E0yw&@*JO`];<~f0Egy\SH ^q]Xd@2QKTv+{z T0GaDc]7- ?8wAv}@},. ex 9=b%KdNm0rwGZP k,~mxv *2}(gRho)`l6 1 &QfxNp{}]GQe YV =,~m%>Fd,s$ >5V'F1Y1;g6 {i,t\6<< 9 _nl^V7Y?).1 ,%\9.  rS1[%.E }&~[4 2~@GBoK!)RlGpuPfJvXIkLZV B$kJ]GX P0v.(?qrw,cQOc/!E8=()3e ZW*$)d[8"%k kv8 a-wb'y) GOj`kZ JZ?:XzlDX<~3ZnF_xbBZO|WOWU[*c_^)Gh&K>lA+sHzX;dC`&-b?l G_ 4}7>b!. .1:O|r'f.XxMZ 54;g.K$3f&._/U4,5#bT[b@F%kd65!*xebDI+ ](DH'0up@w!G#\ "'gn&p`j[g@{4|pyyG:.TED.B[001007]DISKIO.MAR;1 Hаjablist[r2],r3 ; get the rab for this file $disconnect rab=r3 ; disconnect the access stream movl fablist[r2],r3 ; get the fab so we can close it $close fab=r3 ; simple ret ; bye ; ted$CREATE ; ; input: 4(ap) filename address, .asciz ; 8(sp) internal channel number ; output: r0 0 for error, else 1 .entry ted$create ,^M movzwl 8(ap) ,r2 ; get the internal channel number movl fablist[r2],r3 ; get the address of the fab movb #fab$m_put,fab$b_fac(r3); insure put access allowed movb #fab$c_seq,fab$b_org(r3); insure sequential files movb #fab$m_cr ,fab$b_rat(r3); implied carriage control movb #fab$c_var,fab$b_rfm(r3); variable length records movl 4(ap) ,r4 ; get the filename address movl r4 ,fab$l_fna(r3) ; and insert the filename address clrl r5 ; counter for number of characters 10$: tstb (r4)+ ; look for the null terminator beql 20$ ; found the null incl r5 ; did not find the null yet brb 10$ ; next please 20$: movb r5 ,fab$b_fns(r3) ; insert the filename size now clrw fab$w_ifi(r3) ; insure that internal fid is 0 clrb fab$b_rtv(r3) ; let the number of windows default cmpw 8(ap) ,#chan_output ; is this an output file? bneq 30$ ; no movb #255 ,fab$b_rtv(r3) ; yes, map the entire thing if so 30$: $create fab=r3 ; open the file up for reading now movl fab$l_stv(r3),r4 ; save the acp error code please blbc r0 ,100$ ; oops, better exit then movl rablist[r2],r3 ; get the rab address now $connect rab=r3 ; and connect to a record address stream blbs r0 ,110$ ; no errors movl rab$l_stv(r3),r4 ; save the acp error code please 100$: movl r0 ,tedsyserror ; error movl r4 ,acpsyserror ; save acp error if any cmpl r0 ,#RMS$_CRE ; acp create fail ? bneq 105$ ; no movl r4 ,tedsyserror ; yes, use the system error code 105$: clrl r0 ; return(0) brb 120$ ; bye 110$: movzbl #1 ,r0 ; success, return(1) clrl tedsyserror 120$: ret ; bye .sbttl get the next record ; GETRECORD ; ; input: 4(ap) byte record buffer address ; 8(ap) maximum record size allowed ; 12(ap) internal lun ; output: r0 rms sts ; r1 record length .entry ted$getrecord ,^M movzwl 12(ap) ,r2 ; get the internal lun to use cmpb r2 ,#chan_terminal ; the terminal? bneq 20$ ; no tstl tty_lun ; did we ever assign the terminal bneq 10$ ; yes calls #0 ,open$tty ; no, open it please 10$: pushl 8(ap) ; yes, use a qio to do it please pushl 4(ap) ; the buffer address is next pushl tty_lun ; and that also please calls #3 ,ted$ttread ; and get from the terminal brb 100$ ; exit with r0=status,r1=bytecount 20$: movl rablist[r2],r2 ; get the rab for this file movw 8(ap) ,rab$w_usz(r2) ; set the max record size in place movl 4(ap) ,rab$l_ubf(r2) ; and the user's buffer address $get rab=r2 ; read the next record now clrl r1 ; presume error, set size eq 0 movl r0 ,tedsyserror ; save the error code cmpl r0 ,#RMS$_RTB ; rtb errors are warnings only beqlu 25$ ; ok blbc r0 ,100$ ; error, exit please 25$: clrl tedsyserror ; save the error code movzwl rab$w_rsz(r2),r1 ; it worked, get the amount read addl3 4(ap),r1,r2 ; point to the end of the user's buffer tstl r1 ; a blank line (ie, only ) ? beql 30$ ; yes, insert CRLF cmpb -1(r2) ,#FF ; a form feed? beql 40$ ; yes, leave things as they stand cmpb -1(r2) ,#LF ; stream file and a line feed in it? (?) beql 40$ ; yes 30$: movb #CR ,(r2)+ ; need a crlf then movb #LF ,1TED.B[001007]DISKIO.MAR;1H0q(r2)+ ; simple to do addl2 #2 ,r1 ; line is two characters longer now 40$: 100$: ret ; exit ; PUTRECORD ; ; input: 4(ap) byte record buffer address ; 8(ap) size of record to write ; 12(ap) internal lun ; output: r0 rms rst .entry ted$putrecord ,^M movzwl 12(ap) ,r2 ; get the internal lun to use cmpb r2 ,#chan_terminal ; the terminal? bneq 20$ ; no tstl tty_lun ; did we ever assign the terminal bneq 10$ ; yes calls #0 ,open$tty ; no, open it please 10$: print 4(ap) ,8(ap) ; and dump to the terminal brb 100$ ; and exit 20$: jsb 200$ ; try the write out for size movl r0 ,tedsyserror ; save the error please blbs r0 ,90$ ; success cmpl r0 ,#RMS$_EXT ; acp extend failure ? bneq 100$ ; no, simply exit then jsb 200$ ; extend failure, retry the operation movl r0 ,tedsyserror ; save the error, if any blbc r0 ,90$ ; error, exit 90$: clrl tedsyserror ; no errors, clear saved error code 100$: ret ; and exit 200$: movl rablist[r2],r3 ; get the rab for this file movw 8(ap) ,rab$w_rsz(r3) ; set the record size in place movl 4(ap) ,rab$l_rbf(r3) ; and the user's buffer address $put rab=r3 ; write the next record now rsb ; exit .sbttl internal open for OPENFI and OPNHLP ; TED$OPEN ; ; input: 4(ap) filename address, .asciz ; 8(sp) internal channel number ; output: r0 rms error code .entry ted$open ,^M movzwl 8(ap) ,r2 ; get the internal channel number movl fablist[r2],r3 ; get the address of the fab movl 4(ap) ,r4 ; address of the filename here movl r4 ,fab$l_fna(r3) ; and insert the filename address clrl r5 ; counter for number of characters 10$: tstb (r4)+ ; look for the null terminator beql 20$ ; found the null incl r5 ; did not find the null yet brb 10$ ; next please 20$: movb r5 ,fab$b_fns(r3) ; insert the filename size now clrw fab$w_ifi(r3) ; insure that internal fid is 0 clrb fab$b_rtv(r3) ; let window count default cmpw 8(ap) ,#chan_input ; but if this is an input file tell bneq 30$ ; rms to try to map the entire file movb #255 ,fab$b_rtv(r3) ; if it can 30$: $open fab=r3 ; open the file up for reading now blbc r0 ,100$ ; oops, better exit then movl rablist[r2],r4 ; get the rab address now $connect rab=r4 ; and connect to a record address stream 100$: blbs r0 ,110$ ; no errors movl r0 ,tedsyserror ; error clrl r0 ; return(0) brb 120$ ; bye 110$: movzbl #1 ,r0 ; success, return(1) movl fab$l_alq(r3),filesize ; save the file size please clrl tedsyserror 120$: ret ; bye .entry saveprotection ,^M<> movw L^in_proxab+xab$w_pro,L^in_filepro+xab$w_pro movl in_proxab+xab$l_uic,in_filepro+xab$l_uic ret .entry setprotection ,^M<> movw L^in_filepro+xab$w_pro,L^out_proxab+xab$w_pro clrl out_proxab+xab$l_uic $getjpiw_s itmlst=curpriv bitl #1@PRV$V_SYSPRV,@ beqlu 100$ movl in_filepro+xab$l_uic,out_proxab+xab$l_uic 100$: ret .entry setmbc ,^M<> ret .entry clrmbc ,^M<> ret .sbttl initialize the terminal .psect code .entry checkterminal ,^M<> ;+ CHECKTERMINAL ; ; Return 1 if SYS$OUTPUT is a terminal or mailbox ; Return 0 if it is not ;- devmask = <1@DEV$V_TRM> ! <1@DEV$V_MBX> $getdvi_s itmlst= getdevtyp , - efn = #20 , - devnam= tty_dev blbc r0 ,90$ $waitfr_s efn = #20 movzbl #1 ,r0 bitl #devmask,devchar bnequ 100$ 90$: clrl r0 100$: ret ; O P E N $ T T Y ; ; input: nothing ; output: r0\TED.B[001007]DISKIO.MAR;1H |x system service status ; r1 channel number assigned by sys$assign .entry open$tty, ^m movab tty_dev,r1 ; get the sys$command assigned jsb 200$ ; first. save the returned LUN blbc r0 ,100$ ; and then get a channel for movl r1 ,tty_lun ; sys$output next. movab tty_outdev,r1 ; setup for translation of jsb 200$ ; sys$output to the physical blbc r0 ,100$ ; equivalent. movl r1 ,tty_outlun ; save and exit 100$: ret 200$: subl #80. ,sp ; allocate a buffer for translated movl sp ,r2 ; logical name. use r2 as pointer movl #63 ,(r2) ; create a empty .ascid string movl r2 ,4(r2) ; and the address of the string addl #8 ,4(r2) ; skip over the length and type $trnlog_s lognam=(r1),- ; get sys$command tranlated first rslbuf=(r2) ; pointer to result name buffer blbc r0 ,210$ ; it failed clrl -(sp) ; must pass address for channel # movl sp ,r1 ; use r1 to point to it $assign_s chan =(r1),- ; get vms to allocate a channel devnam=(r2) movl (sp)+ ,r1 ; return channel number in r1 blbc r0 ,210$ movl #ss$_normal,r0 210$: addl #80. ,sp rsb ; bye .sbttl print ascii or .ascid string out to terminal ; T Y P E $ A S C I I ; ; Print either an ascii string with length passed or type ; an .ascid standard descripter ; ; ; input: 4(ap) if eq -1, assume .ascid ; if eq 0, assume .asciz ; if eq 1, assume .ascii ; ; @8(ap) addres of string or string descriptor ; 12(ap) length if not .ascid .entry type_ascii,^m ; print a string at 4(ap), len 8(ap) tstl 4(ap) ; if < 0 then assume .ascid bgtr 20$ ; if > 0 assume passed length and addr blss 10$ ; if = 0 assume .asciz movl 8(ap) ,r2 ; assume .asciz get address of string clrl r3 ; use r3 as a counter for length 5$: tstb (r2)+ ; hit the end of the string yet? beql 6$ ; yes incl r3 ; no, increment the length and test brb 5$ ; again please 6$: $qiow_s func=#io$_writevblk,- chan=tty_outlun,- p1=@8(ap),- p2=r3 brw 100$ 10$: movl 8(ap) ,r2 ; get address of string descriptor movzwl (r2) ,r3 $qiow_s func=#io$_writevblk,- chan=tty_outlun,- p1=@4(r2),- p2=r3 brw 100$ 20$: $qiow_S func=#io$_writevblk,- ; write virtual block to terminal chan=tty_outlun,- ; channel from $assign p1=@8(ap),- ; address of string to print p2=12(ap) ; length of the string to print 100$: movl #SS$_NORMAL,r0 ; return success ret ; bye ; T T W R I T E ; ; write a line to the terminal ; ; input: 4(ap) string address ; 8(ap) string length ; ; output: r0 system service completion code .entry ted$ttwrite ,^m<> pushl 8(ap) ; stuff string length and pushl 4(ap) ; string address pushl #1 ; flag to type_ascii for passed length calls #3,type_ascii ret .sbttl cancel control O ;+ ; RESUMEOUTPUT() ; ; Passed: nothing ; Return: nothing ;- .entry resumeoutput ,^M<> clrl -(sp) movl sp ,r1 $qiow_s func=#,- chan=tty_outlun,- p1=(r1),- p2=#0 tstl (sp)+ ret .sbttl read from the terminal ; T T R E A D ; ; ; read a line from the terminal ; ; input: 4(ap) channel number ; 8(ap) buffer address ; 12(ap) buffer size (defaults to 132) ; ; output: 8(ap) the line just read ; r0 completion status ; r1 size of the read .entry ted$ttread ,^m subl #10 ,sp ; allocate a iostatus block movl sp ,r4 ; and use r4 to point to it movl #132. ,r3 ; assume 132 character read cmpb (UTED.B[001007]DISKIO.MAR;1HCap) ,#2 ; ommitted the buffer length? beql 10$ ; yes movzwl 12(ap) ,r3 ; no, use that which was passed 10$: $qiow_s chan = 4(ap),- ; do the read func = #io$_readvblk,- efn = #3,- iosb = (r4),- ; pusha is wierd p1 = @8(ap),- ; buffer address p2 = r3,- ; max buffer size p4 = #200$ ; allowed terminators clrl r1 ; clear returned length blbc r0 ,100$ ; error if (r0 and 1) = 0 movzwl 2(r4) ,r1 ; return the length of the read addl3 r1,8(ap),r2 ; point to the end of the buffer cmpb 4(r4) ,#CTRLZ ; control z typed today? bneq 20$ ; no clrl r0 ; yes, return an error then brb 100$ ; simple to do 20$: movb 4(r4) ,(r2) ; not control Z, copy the terminator cmpb (r2)+ ,#FF ; a form feed today? beql 30$ ; yes movb #LF ,(r2) ; no, must be a carriage return then incl r1 ; count it 30$: incl r1 ; count the previous character also 100$: addl2 #10 ,sp ; remove the iosb from the stack ret 200$: .long 0 .long ^b100000000000011010000000000 ; allow and .sbttl read binary (passall) ; T E D $ B I N R E A D ; ; input: 4(ap) channel number for terminal ; output: r0 system service code ; r1 one character just read binmode = io$_readvblk + io$m_noecho + io$m_nofiltr .entry ted$binread ,^M subl #10 ,sp ; allocate a iostatus block movl sp ,r3 ; and use r4 to point to it clrl -(sp) ; allocate a character buffer movl sp ,r2 ; and point to it $qiow_s chan = 4(ap),- ; do the read func = #binmode,- ; io$_readpassall reads ^C and ^Y iosb = (r3),- ; pusha is wierd p1 = (r2),- ; buffer address p2 = #1,- ; max buffer size p4 = #200$ movl (sp)+ ,r1 ; get the character now addl #10 ,sp ; remove the iosb from the stack ret 200$: .long 16 ; terminator block. allow all .address 210$ ; but control C to be one since ; we would like to be able to get 210$: .byte ^b11110111 ; control C ast's .rept 15 .byte ^b11111111 .endr .entry ted$typeahead ,^M clrq -(sp) ; clear a 4 word buffer movl sp ,r2 ; save the address $qiow_s chan = 4(ap),- ; do the read func = #, - p1 = (r2),- ; buffer address p2 = #8 ; max buffer size blbc r0 ,100$ ; failure, exit please tstw (r2) ; anything in the typeahead buffers? beql 100$ ; no movzbl #1 ,r0 ; yes, return success and exit brb 110$ ; bye 100$: clrl r0 ; failure or nothing waiting to be read 110$: addl2 #8 ,sp ; exit please ret .entry print_crlf ,^M<> pushl #2 pushal 200$ pushl #1 calls #3 ,type_ascii ret 200$: .byte 13,10 .sbttl error text .mcall $getmsg_s .entry geterror ,^M<> ; get error text from last error pushl 4(ap) ; push the buffer address pushl tedsyserror ; push the error number calls #2 ,sys_error ; and get the error text ret ; bye ; SYS_ERROR ; ; input: 4(ap) the message id value ; 8(ap) address of byte buffer for returned text ; output: r0 error code ; r1 text length (text is also .asciz) .entry sys_error ,^M movl 8(ap) ,r4 ; point to the buffer address movl r4 ,-(sp) ; allocate a string descriptor movl #79. ,-(sp) ; 80 bytes movl sp ,r2 ; point to it clrl -(sp) ; where to return the text length movl sp ,r3 ; point to it $getmsg_s msgid=4(ap),msglen=(r3),bufadr=(r2),flags=#15 blbs r0 ,100$ clrl r1 ; failure clrb (r4) ; clear first byte out brb 110$ ; exit 100$: movzwl (r3) ,r1 ; the length TED.B[001007]DISKIO.MAR;1HE  addl r1 ,r4 ; point to the last character clrb (r4) ; also make this .asciz 110$: addl #12 ,sp ; pop the stack and exit ret .entry print_error ,^M subl #80 ,sp ; allocate a buffer from the stack movl sp ,r2 ; and a pointer to it please pushl r2 ; push the address of the buffer pushl 4(ap) ; and the value of the error code calls #2 ,sys_error ; get the error text pushl r1 ; now get set to print it out pushl r2 ; push the length and address pushl #1 ; and type flag calls #3 ,type_ascii ; do it addl #80 ,sp ; restore stack to it's former state ret ; and exit .psect spdata ,noexe,noshr,rel,rd,wrt,long sp_flags: .long 1 ; no waiting for the spawned process mb_done: .long 0 ; set when spawn completion ast comes mb_phyname: .long 63 ; to translate the mailbox logical .address 10$ ; to the real device name, needed for 10$: .blkb 64 ; lib$spawn mb_logname: .ascid /TED_MAILBOX/ ; the logical name for the mailbox mb_size = 256 ; size in bytes of the mailbox buffer mb_buffer: .blkb mb_size ; the buffer for the mailbox .align long ; for safety mb_lun: .word 0 ; save the lun returned by crembx mb_iosb: .word 0,0,0,0 ; i/o status block for the mailbox mb_efn = 2 ; for the mailbox reads wf_efn = 3 ; for the waitfor efn call wf_mask = ^B0100 ; the bitmask for waitfor .psect code ;+ DOMBX(commandline,filename) ; ; Spawn a subproccess. ; ; If commandline is null, assume input will be from SYS$INPUT ; Output will be placed into 'FILENAME', which will be opened ; by the normal TED i/o system. ; ; Passed: 4(ap) Address of a command line, .asciz ; 8(ap) Address of a filename to create and write to ;- Return: R0 zero for failure, else 1 for success .entry dombx ,^M pushl #chan_output ; internal lun for writing pushl 8(ap) ; the .asciz filename to do calls #2 ,ted$create ; create the file please tstl r0 ; did this work ok? beql 110$ ; no, exit jsb create_mb ; get the mailbox created blbc r0 ,90$ ; oops jsb spawn ; spawn the process please blbc r0 ,90$ ; check for success clrl mb_done ; we are not done yet 50$: tstl mb_done ; did we get a completion ast? bneq 100$ ; yes, exit please jsb read_mb ; post a read for the mailbox blbc r0 ,90$ ; exit if it fails $wflor_s - ; now wait for the mailbox to efn = #wf_efn ,- ; get some data from the spawned mask = #wf_mask ; process tstl mb_done ; done yet ? bneq 100$ ; yes jsb read_mbfin ; no, post processing for the read blbs r0 ,50$ ; it worked ok 90$: movl r0 ,r2 ; save the error code pushl #chan_output ; close the file on error please calls #1 ,ted$close ; simple movl r2 ,tedsyserror ; save the error code clrl r0 ; exit with failure brb 110$ ; 100$: pushl #chan_output ; close the file on successful end calls #1 ,ted$close ; exit movzbl #1 ,r0 ; exit with success 110$: ret ; bye .entry exit_mb ,^M $setef_s efn = #mb_efn movl #1 ,mb_done ret spawn: subl2 #10 ,sp ; space to create string descr movl 4(ap) ,r1 ; get the command line to do tstb (r1) ; anything to do ? bnequ 10$ ; yes clrl r1 ; no, pass zero to lib$spawn brb 40$ ; 10$: movl sp ,r1 ; yes, so create string descripter movl 4(ap) ,r2 ; first, count the string length clrl r0 ; count the length here 20$: tstb (r2)+ ; loop until we find the end of it beqlu 30$ ; did we get the end? incl r0 ; no, count TED.B[001007]DISKIO.MAR;1Hthe length some more brb 20$ ; next please 30$: movl r0 ,(r1) ; stuff the length movl 4(ap) ,4(r1) ; and the string address 40$: pushal exit_mb ; here when the subproccess exits pushl #0 ; completeion efn value pushl #0 ; completion status pushl #0 ; pid of the created process pushl #0 ; no process name passed pushal sp_flags ; no wait pushal mb_phyname ; the mailbox name pushl #0 ; sys$input please pushl r1 ; either zero or a nonnull command calls #9 ,G^lib$spawn ; and spawn the subprocess addl2 #10 ,sp ; pop rsb .sbttl post a qio to mailbox, finish after completion read_mb: $qio_s efn = #mb_efn, - ; post a qio to the mailbox func = #io$_readvblk,- chan = mb_lun, - ; we will post one for the iosb = mb_iosb, - ; terminal also and then wait p1 = mb_buffer, - ; for the logical or of the p2 = #mb_size ; event flags. rsb read_mbfin: movaw mb_iosb ,r4 ; i/o status block address movzwl 2(r4) ,r1 ; return the length of the read movl r1 ,r2 ; save the actual length please movab mb_buffer,r3 ; the buffer address also please addl2 r1 ,r3 ; point to the end of the buffer cmpb 4(r4) ,#CTRLZ ; control z typed today? bneq 10$ ; no clrl r0 ; yes, return an error then brb 40$ ; simple to do 10$: cmpb 4(r4) ,#FF ; was there a form feed terminator bneq 20$ ; no movb 4(r4) ,(r3) ; yes, return it by itself and exit brb 30$ ; and fix the byte count also 20$: movb #CR ,(r3)+ ; otherwise insert a CRLF pair movb #LF ,(r3) ; no, must be a carriage return then incl r1 ; count it 30$: incl r1 ; count the previous character also 40$: pushl r1 ; write the data to sys$output pushab mb_buffer ; the buffer for the mailbox calls #2 ,ted$ttwrite ; and dump it to sys$output pushl #chan_output ; internal lun for writing pushl r2 ; the actual byte count pushab mb_buffer ; and the mailbox buffer address calls #3 ,ted$putrecord ; write the record out please rsb .sbttl create mailbox create_mb: $crembx_S - ; create the mailbox for the prmflg = #0, - ; the spawned process. It should chan = mb_lun, - ; be temporary of course. maxmsg = #mb_size, - ; max we can read at once lognam = mb_logname ; the name to use for it $trnlog_s lognam= mb_logname,- ; get sys$output tranlated first rslbuf= mb_phyname ; pointer to result name buffer rsb .sbttl declare ast for typeahead during screen refresh ; DCLINPAST(address(ast_flag) ; ; This routine will be called before the editor puts up a new ; page in response to a newpage command. If anything is typed ; during the screen update, the ast routine will take a look ; at what was typed, and if it was an escape character it will ; flag it by making the location passed to DCLINPAST non zero. ; Thus the page update code can then exit and GETBIN will get ; the escape character the ast routine read. ; Actually, the way the code now functions is at the time of ; the ast, the ast routine checks for the amout of typeahead. ; If there are two characters waiting after we find the first ; one to be an escape, we will assume that a function/pf key ; has been typed and then read the two characters. If the last ; character is a 'Q' then we have a PF2 key, thus set the flag ; and exit. In any case, any characters read here will be in ; the 'PREVCHAR' buffer for GETBIN to extract. ; The proper method to handle this would be to call a routine ; in the editor's command dispatched (SCCMD) to determine in a ;TED.B[001007]DISKIO.MAR;1HO ter minal/keypad definition independent way if the escape seq ; was a NEXTPAGE command. Later.... .entry dclinpast ,^M<> movl 4(ap) ,astflag ; get the address to set the flag at $qio_s chan = tty_lun , - ; post an asynch single character read func = #binmode , - ; ala io$m_noecho + io$m_nofiltr astadr = ted_read_ast,- ; set the ast entry point efn = #10 , - ; must use an unique event flag here p1 = ted_ast_buffer , - ; the read buffer p2 = #1 ; and the buffer size blbs r0 ,100$ ; if error then die clrl r0 ; error clrl astflag ; internal flag also please ret 100$: movzbl #1 ,r0 ; success flag ret .entry ted_read_ast ,^M clrq -(sp) ; allocate buffer for io$m_typeahdcnt movab ted_ast_buffer,r5 ; get the ast entry point buffer tstl astflag ; ensure we are primed for the ast bnequ 10$ ; we are not, ignore this ast then brw 100$ ; too far for byte branch 10$: movaw prevchar,r3 ; get address of buffer control info movab prevchar+4,r4 ; get address of actual char buffer. movzwl (r3) ,r0 ; get the current character count addl2 r0 ,r4 ; and point to the next free spot movb (r5) ,(r4)+ ; stuff the character read away now incw (r3) ; correct for character count cmpb (r5) ,#27 ; Was the character read an escape? bnequ 100$ ; If not, just exit with char stored. tstl astaction ; go ahead on any esc sequence ? bnequ 90$ ; yes movl sp ,r2 ; save the address $qiow_s chan = tty_lun ,- ; do the read func = #, - efn = #10 , - ; must use own event flag please p1 = (r2),- ; buffer address p2 = #8 ; max buffer size blbc r0 ,100$ ; nothing in typeahead, exit cmpw (r2) ,#3 ; we must have at least 3 characters blss 100$ ; no, just exit then please $qiow_s chan = tty_lun , - ; something is there, get the next func = #binmode , - ; character from vms typeahead buffer efn = #10 , - ; must use unique event flag p1 = (r5) , - ; the buffer address p2 = #2 ; must try for 2 characters this time blbc r0 ,100$ ; it failed movb (r5)+ ,(r4)+ ; copy the character movb (r5) ,(r4)+ ; likewise, the next one also addw2 #2 ,(r3) ; fix the byte count and exit cmpb (r5) ,#^A/5/ ; VT220 next or prev page ? beql 90$ ; yes cmpb (r5) ,#^A/6/ ; VT220 next or prev page ? beql 90$ ; yes cmpb (r5) ,#BIGQ ; If the third member of the esc seq bneq 100$ ; was a Q (ie, $OQ) then we have a PF2 90$: movzbl #1 ,@astflag ; We have it, flag for a newpage AST. 100$: clrb ted_ast_buffer ; clear out the ast buffer now addl2 #8 ,sp ; pop the stack ret ; generate the ast .entry clrinpast ,^M<> clrb ted_ast_buffer ; clear out the ast buffer now tstl astflag ; did we ever set the ast up ? beql 100$ ; no clrl astflag ; yes, it's off now $cancel_s chan = tty_lun ; cancel it 100$: ret ; and exit .entry xprintf ,^M movzbl (ap) ,r2 movzbl (ap) ,r3 beql 20$ mull3 #4,r3 ,r4 addl3 ap,#4 ,r1 addl2 r4 ,r1 10$: pushl -(r1) sobgtr r2 ,10$ 20$: calls r3 ,G^printf ret .entry sxprintf ,^M movzbl (ap) ,r2 movzbl (ap) ,r3 beql 20$ mull3 #4,r3 ,r4 addl3 ap,#4 ,r1 addl2 r4 ,r1 10$: pushl -(r1) sobgtr r2 ,10$ 20$: calls r3 ,G^sprintf ret .end *[001007]EDASCI.C;1+. /0D6s-i7@Yi 4H U,Z|s<@TED.B[001007]EDASCI.C;1;1H K #include "sysdef.h" /* ASCII and TYPE commands */ /* */ /* 04-Oct-84 15:17:57 Brian Nelson */ /* */ /* Copyright Notice */ /* */ /* */ /* C version Copyright (C) 1984 Change Software, Inc. */ /* Copyright (C) 1978 1979 1980 1981 1982 1983 1984 by */ /* Change Software, Inc. */ /* */ /* */ /* This software is furnished under a license and may */ /* be used and copied only in accordance with the */ /* terms of such license and with the inclusion of */ /* the above copyright notice. This software or any */ /* other copies thereof may not be provided or other- */ /* wise made available to any other person. No title */ /* to and ownership of the software is hereby trans- */ /* ferred. */ /* */ #include "scerrd.h" #include "tempio.h" #define then #define CR 015 #define LF 012 #define TAB 011 cascii() { extern struct textline *textpointer() ; struct textline *textp ; extern int lowlim,highlim ; int done,i,lpt,lineno,nlines,size ; register char *cp,*tp ; register int ch ; char txtbuf[20], fmtbuffer[80] ; lpt = 0 ; for (lineno=lowlim; lineno <= highlim && testcc() == 0; lineno++ ) { nlines = 0 ; textp = textpointer(lineno) ; done = ( (ch = nextch(textp,&lpt)) == -1 ) ; while ( done == 0 ) { size = 12 ; cp = fmtbuffer ; for (i=50; i>0; i-- ) *cp++ = ' ' ; *cp = 0 ; tp = txtbuf ; for (i=12; i>0; i-- ) *tp++ = ' ' ; cp = fmtbuffer ; tp = txtbuf ; while ( size-- > 0 && done == 0 ) { if ( ch < 040 ) then *tp++ = 040 ; else *tp++ = ch ; cvtdec(cp,ch) ; cp++ ; cp++ ;cp++ ;cp++ ; done = ( (ch = nextch(textp,&lpt)) == -1 ) ; } *tp = 0 ; if ( nlines++ == 0 ) then xprintf("%6d ) %s %s\n",lineno,fmtbuffer,txtbuf) ; else xprintf(" %s %s\n",fmtbuffer,txtbuf) ; } } } static nextch(tp,lpt) register struct textline *tp ; int *lpt ; { if ( *lpt < tp->len ) then return( tp->c[(*lpt)++] ) ; else { *lpt = 0 ; return(-1) ; } } static cvtdec(s,ch) char *s ; register int ch ; { register char *cp ; ch &= 0377 ; cp = s ; *cp++ = ( ch/100 ) + '0' ; *cp++ = ( (ch % 100)/10 ) + '0' ; *cp++ = ( ch % 10 ) + '0' ; *cp++ = ' ' ; } ctype(lun) int lun ; { extern int cmdlun ; extern struct textline inline ; if ( lun == cmdlun ) then return(0) ; sclear() ; while ( getline(lun,inline.c,&inline.len) == sys_normal && testcc()==0) putbin(inline.c,inline.len) ; return(1) ; } static char *terms[] = { "","","","", "","","","", "","","","", "","","","", "","","","", "","","","", "","","","" } ; static char unknown[] = "" ; clength() { extern char *getmap(),*strcpy() ; extern struct textline *textpointer() ; register struct textline *tp ; extern int lowlim,highlim ; register int length,lineno ; char s[64],c[5] ; for (lineno=lowlim; lineno<=highlim && testcc() == 0; lineno++ ) { tp = textpointer(lineno) ; length = tp->len ; strcpy(s,"Length "); cvtdec(c,length) ; c[4] = 0 ; strcpy(&s[strlen(s)],c) ; strcpy(&s[strlen(s)],"Eoln ") ; if ( length > 1 ) then strcpy(&s[strlen(s)],getmap(tp->c[length-2])); strcpy(&s[strlen(s)]," "); strcpy(&s[strlen(s)],getmap(tp->c[lpTED.B[001007]EDASCI.C;1;1H =ength-1])) ; xprintf( "%6d ) %s\n",lineno,s) ; } } static char *getmap(ch) register int ch ; { if ( ch <= 033 ) then return(terms[ch]) ; else return(unknown) ; } static char setup[] = "\033<\033[2J\033PpP[1,400]S(N0,I0,E)" ; static char regmode[] = "\033Pp" ; static char exitreg[] = "\033\\" ; cregis() { extern struct textline *textpointer(); struct textline *tp ; extern int *maxline ; register int i ; putbin(setup,0) ; for (i=1; i <*maxline && testcc() == 0 ; i++) { tp = textpointer(i) ; putbin(regmode,0) ; putbin(tp->c,tp->len) ; } putbin(exitreg,0) ; return(1) ; } *[001007]EDCHAR.C;1+./0D6ώ7iΎ 4H UL|s<  #include "sysdef.h" #define MAXLEN 130 #define largea 0101 #define largez 0132 #define smalla 0141 #define smallz 0172 #define tab '\011' #define TAB '\011' trimjunk(s,len) char *s; int len; { return(cvtstring(s,len,01207)); } upcase(s,len) register char *s; int len; { register int i ; for (i=len;i>0;i--) { *s = toupper(*s); s++ ; } return(len) ; } lowcase(s,len) register char *s; int len; { register int i ; for (i=len;i>0;i--) { *s = tolower(*s); s++ ; } return(len) ; } /* CVTSTRING cvt$$ equivalent */ /* */ /* newlength = cvtstring( string,length,patternmask ) */ /* */ /* 1 DISCARD ALL PARITY BITS */ /* 2 DISCARD ALL SPACES & TABS */ /* 4 DISCARD CR LF FF ESC RO */ /* 10 DISCARD LEADING SPACES & TABS */ /* 20 REDUCE SPACES & TABS TO A SINGLE SPACE */ /* 40 CONVERT LC TO UC */ /* 100 CONVERT [ TO ( AND ] TO ) */ /* 200 DISCARD TRAILING SPACES & TABS */ /* 400 PRESERVE QUOTED SUBSTRINGS */ /* 1000 DISCARD ALL CHARACTERS < 40 OR =177 */ /* 2000 UC to LC */ #define c_par 01 #define c_spac 02 #define c_crlf 04 #define c_lspa 010 #define c_sspa 020 #define c_lcuc 040 #define c_brac 0100 #define c_tspa 0200 #define c_quot 0400 #define c_prt 01000 #define c_uclc 02000 #define CR 015 #define FF 014 #define LF 012 #define SPACE 040 #define TAB 011 #define SQ 047 #define DQ 042 #define then cvtstring(s,inplen,bitmask) char *s ; int inplen,bitmask ; { int inaquote,retlength,spacetab,usech ; char lastch,quoch ; register int i ; register char *op,ch ; char *cp ; cp = s ; op = s ; inaquote = 0 ; quoch = '\0' ; lastch = '\0' ; cp = s ; if ( bitmask & c_lspa ) then { for (i=inplen; i>0 && (*cp == 040 || *cp == TAB); i--) cp++ ; if ( (inplen=i) == 0) then return(0) ; } retlength = 0 ; for (i=inplen; i>0 ;i--) { ch = *cp++ & 0377 ; usech = 1 ; if ( inaquote == 0 ) then { if ( c_par & bitmask ) then ch &= 0177 ; spacetab = white( ch ) ; if ((c_spac & bitmask)!=0 && spacetab ) then usech = 0 ; if ((c_sspa & bitmask)!=0 && spacetab && white(lastch)) then usech = 0 ; if ((c_crlf & bitmask)!=0 && (isdelimiter(ch)||ch==0) ) then usech = 0 ; if ((c_lcuc & bitmask)!=0) ch=toupper(ch); if ((c_uclc & bitmask)!=0) ch=tolower(ch); } if ( (c_quot & bitmask)!=0 && ( ch == SQ || ch == DQ ) ) then { if ( in0; TED.B[001007]EDCHAR.C;1;1H7aquote == 0 ) then { inaquote = 1 ; quoch = ch ; } else if ( ch == quoch ) then inaquote = 0 ; } if ( (c_prt & bitmask)!=0 && (ch < 040 || ch > 0176) ) then usech = 0 ; if (usech) then { *op++ = ch ; retlength++ ; } lastch = ch ; } if ( (bitmask & c_tspa) != 0 && retlength ) then { cp = &s[retlength-1] ; for (;retlength>0 && (*cp==040 || *cp==TAB);retlength--) cp-- ; } return( retlength ) ; } static white(ch) register char ch ; { return( ch == TAB || ch == SPACE ) ; } #define SPACE 040 #define TAB 011 detab(s2,s1,s1len) register char *s1,*s2 ; int s1len ; { int j,s2len ; register int i ; s2len = 0 ; for ( i=s1len; i > 0 && s2len < MAXLEN; i-- ) { if ( *s1 != TAB ) then { s2len++ ; *s2++ = *s1++ ; } else { s1++ ; for ( j = 8-(s2len % 8); j>0 && s2len < MAXLEN; j--) { *s2++ = SPACE ; s2len++ ; } } } return(s2len) ; } *[001007]EDCMD.C;1+. /0D6؏ߎ7e8ߎ 4F UZ|s< #include "sysdef.h" #include "scerrd.h" #include "tempio.h" #define CMLIST 1 #define CMVTEDIT 2 #define CMLEN 3 #define CMINSERT 4 #define CMDELETE 5 #define CMSTAT 6 #define CMDUMP 7 #define CMCHANGE 8 #define CMMOVE 9 #define CMREPLACE 10 #define CMSEARCH 11 #define CMASCII 12 #define CMADD 13 #define CMAPPEND 14 #define CMDUP 15 #define CMTRIM 16 #define CMPLACE 17 #define CMCHARDEL 18 #define CMXCHANGE 19 #define CMTAPP 20 #define CMTIME 21 #define CMFILE 22 #define CMCHATTY 23 #define CMRETICENT 24 #define CMTYPE 25 #define CMCOPY 26 #define CMHELP 27 #define CMSET 28 #define CMEND 29 #define CMQUIT 30 #define CMUNDEL 31 #define CMDCL 32 #define CMSPAWN 33 #define CMTEST 34 #define CMCASE 35 #define CMTAB 36 #define CMXLATE 37 #define CMSAVE 38 #define CMQQUIT 39 #define CMREGIS 40 #define CMECHO 41 #define CMZAP 42 #define CMDIR 43 #define CMPURGE 44 #define CMERASE 45 #define CMRULE 46 #define CMTST 47 #define CMEXAM 48 #define CMNONE 0 #define then #define SPACE 040 #define TAB 011 #define ARG_NO 00 #define ARG_LO 01 #define ARG_HI 02 #define ARG_TA 04 #define ARG_FI 010 #define ARG_AL 017 #define NOPARSE 0100 #define NO_VT 0200 #define DIR_WR 0400 #define DIR_RD 01000 struct cmd { char name[10] ; int idx ; int minlen ; int flags ; } ; /* The entries WILDCARD, LNMENU and COMMAND are present so that */ /* the help command can find them. They are not really commands. */ static struct cmd cmdlist[] = { "WILDCARD" ,CMNONE ,2 ,ARG_NO , "LNMENU" ,CMNONE ,2 ,ARG_NO , "COMMAND" ,CMNONE ,3 ,ARG_NO , "LIST" ,CMLIST ,1 ,ARG_LO+ARG_HI+ARG_FI+DIR_WR , "VTEDIT" ,CMVTEDIT ,1 ,ARG_FI+NO_VT , "SCOPE" ,CMVTEDIT ,2 ,ARG_FI+NO_VT , "LEN" ,CMLEN ,3 ,ARG_LO+ARG_HI , "INSERT" ,CMINSERT ,1 ,ARG_LO+ARG_FI+DIR_RD , "DELETE" ,CMDELETE ,1 ,ARG_LO+ARG_HI+ARG_FI+DIR_WR , "DUMP" ,CMDUMP ,3 ,ARG_NO , "STATS" ,CMSTAT ,3 ,ARG_NO , "CHANGE" ,CMCHANGE ,1 ,ARG_LO+ARG_HI+ARG_FI+DIR_RD , "MOVE" ,CMMOVE ,1 ,ARG_LO+ARG_HI+ARG_TA , "SEARCH" ,CMSEARCH ,1 ,ARG_AL+DIR_WR , "REPLACE" ,CMREPLACE ,1 ,ARG_LO+ARG_HI+ARG_TA+DIR_WR , "ASCII" ,CMASCII ,2 ,ARG_LO+ARG_HI , "ADD" ,CMADD ,1 ,ARG_FI+DIR_RD , "APPEND" ,CMAPPEND ,3 ,ARG_LO+ARG_HI+ARG_FI+DIR_RD , "DUPLICATE" ,CMDUP ,3 ,ARG_LO+ARG_HI , "TRIM" ,CMTRIM ,3 ,ARG_LO+ARG_HI+ARG_TA , "PLACE" ,CMPLACE ,1 ,ARG_LO+ARG_HI , "CDELETE" ,CMCHARDEL ,2 ,ARG_LO+ARG_HI , "XCHANGE" ,CMXCHANGE 0r!TED.B[001007]EDCMD.C;11;1F \{[~B w7/OzbBf7tbt WAi>s4P"qrb^ IP[H *\_FR]Je+^ gqmc#!WdblD:]F}/;tAY~F!P$G'aCO^TqQ4$Lfo4GO~o-y[V*6wm[?50fA'_t{ %9OtXBc |8 HBTJJV{KUY=)!@DA;?2HOg0J6K+y{ 5&U+,L;tYgJ?d]>aLFoxKkAZdT#t5Hayr[j&8mF9# Cpt(qP^hK0*3LFJLoXZ>n# p~p&qTLM Re6,G[UCeNy^D%|+uMkw!70Vtt8K{}2s )G% I }jbIz ^&Ol5~UsMuQ m&Zw&eLtRli=;]s`n$o_^t$X*8 "]W#g<ZJpS }- Uwt`G@\+ O?%K_@9'8~? |.VTjV|eLIF0Od~'{ l8E8%=z<6P V#il8QL$dAS96BmG;HUP9*{[-D/[A!'ltiU?m RM0H"p Bs|5?v_.)_#a$K}Zi~yEJdy`M($<=+sO~S@s)1i Ia/1(h&p`m;cAwc|,imI 0#| (:c\(Hb9pj*C^GU_KmPM9&W>;oAGiQ-Vgp,kP?O-k>g/5AVw8kM,:l9Lt9%u'T:$s^N%x4O6eO.Q6nI]O<=.p*X'WshpU!~|B~]`N^0/$4aq8dg'r\Thg>~rKArh^iT)E+t^LO]*]xSA$(`@)U%&#&tLV1WF6/_}\(&Zl,r0 dwOR*}u"[*C PTBHP!agt]mRseV4x|(7v Oz?C>S po?!RF{-C8:-!U}/J#'%XFG#Lf.pcj-9QEoGtqKP,0a)q6-gJPhaxo+4p6p{tcc0C{ed5Ik]MsD ] csN7lN(FmAuWO! 2 9Y3)!j56SH}P HHEIMBx7~gvpJcM.^*cV w8y6v ,)7C+'}nB+;k43^/K(|:+^?m IV~oc guM7^6k*Me {z')g)7[PMSz  5%ldwP.YPH=W3 H~D64'S%E]33Fu#k:<n4]4Xj1#(-0Iac;.^!W]>>*>l}ns_orOF?X4CX-d86hbV@VN~NL?&#|jHPM{95zRy&1ohH8s5WwUh#+3N^'bhy<gkDAS^n6.'2;;j/J@cImtxg~fet[ ae/\+UIP|H]fg {q N058Hm'ppGG0|23mdiaI#( 5o1%C`nh ]GmY:D,hKL*lD.eb.yyBt*!6;~XV1CJ"L%-qh.E jf ]=/Q(1RJ1E7>xydz2kMSk)1'h'@0pn~ 4\) V# y>.c_OUa,s" N xE~SBmo qQyND5'aqR$<B $Z MV}N<( FcN=P9cN'=5GaKV9oLc\ A ptt*_8j4^/C@Vzt6D}OVZE[ /KH];55 pofInBWZw_{TCNDm`w=#qpNT!m,jmU|b;rjJ& kFf-2$o MTBJmU O& e7K U}G Z&U5Pg }fjSwSJj2HH FZkgyKbuKgc{t3;[P0Pr+M3FOmQlt ZG "8v-GU  2t")Fo\'0H~|"G,Q&hD U 0Xx\\8A'}&]Pw k$/[LiBv*/P]'+1O58hG5i`eF)M3@HaW-$$q2sxpDE&w~Jia z!Bg&PEu~)Ck 1 y3ZYD]~% +Du/=IA)B31O[? /+ GnA-0 7s%c#giVMebg(BQC OFRm_ ;lFkeQ`" 0S"p %R}z&&\3o+R<4 KI01(&9F*pGhF|e :`"ivI-&XKM*6knuj%sTnIE>72#fXj$i7>\ihDb(RpG#ffd.z(E &u\Zw7 |7aXV-FM6+ly.&{N h V$gYQ|z["? h_<o u]K N@KIMnP0b>N{)~cj)9rStXeDKp)bX7IXXnF|gS[Hh[hAI5ZU 6zp-<[b;qs+q32\c 7 gV^m[bKwBhq\Wv6F/vq n\{ViKAh5#Hf2o<]GK0@a pS)6,J!w IS9S{eSH 8$ J<BDe?wO)/pX\0:_#{dY'X_ }PIG ONT3 F |PFcJ OCYVEpp4lVR Ei$ W0b[+|74i`d|#;< aHd:H{}\H\i%cAz\c`#Fob`ic$%`|v98{RtADf-JEgtUL&%.*m|*N``o{ .6N]~cU>![j, c_.$ -pc[=5G>d 2%w*E@ A)fA<jyM4NV^Nt|kvN.Nn~H+9Pcq3F 5.M '/6Y }4lc`A2;Rd/ nZ5AwNH Trwz S]CN o; x$/ oUDkkQhHeSBA2,<3kGO'y8*"&|o{eT+M=n\T|)f-",6hgHD{pz$@NFF#kp)kv7.N R6,h[l4WBx*IkMeoAmGAh#KU@l,_: x}&f ;O\\mZ]Ib(m [8"SLMZz ") ; status = getline(cmdlun,inline.c,&inline.len) ; if ( status == er_eof && cmdlun != kblun ) then { closef( cmdlun ) ; cmdlun = kblun ; if ( dovtedit ) then { inline.len = 0 ; status = sys_normal ; } } } } if ( iniecho && inline.len && (cmdlun == indlun) ) then { putbin("EDIT> ",0) ; putbin(inline.c,inline.len) ; } if ( (inline.len = cvtstring(inline.c,inline.len,04)) != 0 ) then { inline.c[inline.len] = 0 ; if ( inline.c[0] == '@' ) then { if (inline.c[1] == 0) then tederror("Need a filename to open") ; else if (openfi(&inline.c[1],indlun)==sys_normal) then cmdlun = indlun ; else tederror("Can't open command file") ; } else if (inline.c[0]=='/' && toupper(inline.c[1])=='L') then lastline() ; else teddocommand(inline.c) ; } } } teddocommand(s) char *s ; { struct cmd *findcommand() ; register struct cmd *cmdp ; register int status ; extern int argstat,filopen,kblun,cmdlun,sts_one ; if ( (cmdp = findcommand(s,&cmdlist)) == &nullcmd ) then { if ( cmdlun != kblun ) then tederror(s) ; tederror("Unknown TED command"); } else { if ( (status = getarg(s,cmdp->flags)) == 0 ) then tederror("Invalid command format") ; else if ( checkarg() == 0 ) then tederror("Illegal command line arguments") ; else if ( (argstat & comp(cmdp->flags)) !=K#TED.B[001007]EDCMD.C;11;1F X 0 ) then tederror("Extra arguments for command"); else if ((sts_one & _vtedit) && (cmdp->flags & NO_VT)) then tederror("Command not accessable from VTEDIT"); else if ( setfile(cmdp->flags) == 0 ) then file_error("Can't access that file"); else { status = dispatch(cmdp->idx) ; clrfile() ; } } return(status) ; } static clrfile() { extern int filopen,cmdlun,kblun ; if ( filopen != kblun && filopen != cmdlun ) then closef(filopen) ; filopen = kblun ; } static setfile(flag) int flag ; { register int lun,status ; extern int argstat,filopen ; extern char argfile[] ; extern int cmdlun,inlun,outlun,kblun ; filopen = cmdlun ; if ( (argstat & ARG_FI) == 0 ) then return(sys_normal) ; if ( (flag & DIR_WR) != 0 ) then { if ( flookup(argfile) ) then { if ( getyesno("Supercede file ? ","YES") ) then { status = openfi(argfile,outlun) ; lun = outlun ; } else status = 0 ; } else { status = openfi(argfile,outlun) ; lun = outlun ; } } else { if ( (flag & DIR_RD) != 0 ) then { status = openfi(argfile,inlun) ; lun = inlun ; } else { status = sys_normal ; lun = cmdlun ; } } if ( status != sys_normal ) then status = 0 ; if ( status == sys_normal ) then filopen = lun ; else filopen = cmdlun ; return(status) ; } static dispatch(idx) int idx ; { extern int filopen,iniecho,lowlim,highlim,*maxline,sts_one,target ; extern char argfile[] ; switch(idx) { case CMVTEDIT: ldvtedit() ; if ( (sts_one & ed_end) != 0 ) then cend() ; return(1) ; break ; case CMLEN: clength() ; break ; case CMINSERT: cinsert(filopen) ; break ; case CMLIST: clist(filopen) ; break ; case CMDELETE: cdelete(filopen) ; break ; case CMDUMP: dumpindex() ; break ; case CMSTAT: dumpstats() ; break ; case CMMOVE: cmove() ; break ; case CMCHANGE: cchange(filopen) ; break ; case CMREPLACE: creplace(filopen) ; break ; case CMSEARCH: csearch(filopen) ; break ; case CMASCII: cascii() ; break ; case CMADD: cadd(filopen) ; break ; case CMDUP: cduplicate() ; break ; case CMAPPEND: cappend(filopen) ; break ; case CMTRIM: ctrim() ; break ; case CMPLACE: cplace() ; break ; case CMCHARDEL: cchardel() ; break ; case CMXCHANGE: cxchange() ; break ; case CMTAPP: ctxtappend() ; break ; case CMTIME: ctime() ; break ; case CMFILE: cfile() ; break ; case CMCHATTY: cchatty() ; break ; case CMRETICENT: creticent() ; break ; case CMTYPE: ctype(filopen) ; break ; case CMCOPY: ccopy() ; break ; case CMHELP: tedhelp(argfile) ; break ; case CMSET: cset() ; break ; case CMEND: /* Write output and exit */ cend() ; break ; case CMQUIT: /* Abort the current edit */ cquit() ; break ; case CMQQUIT: /* Unconditionally abort */ sts_one = sts_one | ed_quit ; break ; case CMUNDEL: /* Undelete the last line */ cundel() ; /* deleted. */ break ; case CMSPAWN: /* Execute a DCL command. */ case CMDCL: /* The screen editor has a */ dclcommand(argfile) ; /* more powerful version of */ putbin("\015\012",2) ; /* this command which inserts*/ break ; /* the dcl output into $TED.B[001007]EDCMD.C;11;1F file. */ case CMTEST: /* For testing things out. */ testcommand() ; break ; case CMTST: test1command() ; break ; case CMCASE: /* Processing for CASE, TAB */ swicase() ; /* and XLATE will be found in */ break ; /* EDSET.C */ case CMXLATE: /* They are located there as */ swixlate() ; /* their functions would be */ break ; /* better served as SET cmds */ case CMTAB: /* They are included here for */ switab() ; /* compatibility with the old */ break ; /* PDP-11 Macro-11 version. */ case CMSAVE: csave() ; break ; case CMREGIS: cregis() ; break ; case CMECHO: iniecho = 1 ; break ; case CMDIR: cdir(argfile) ; break ; case CMZAP: czap(argfile,0) ; break ; case CMERASE: czap(argfile,1) ; break ; case CMPURGE: cpurge(argfile) ; break ; case CMRULE: cruler() ; break ; case CMEXAM: cexam(argfile) ; break ; } } char *expcommand(s) char *s ; { extern struct cmd *findcommand() ; register struct cmd *cp ; cp = findcommand(s,&cmdlist) ; return( cp->name ) ; } static struct cmd *findcommand(s,list) char *s ; struct cmd *list ; { register char *cp ; register struct cmd *cmdp ; register int len ; int match ; char text[10] ; cmdp = list ; cp = s ; while ( *cp == SPACE || *cp == TAB ) cp++ ; for ( len=0; len < 10 && (isletter(*cp) || *cp == '$') ; len++ ) text[len] = *cp++ ; text[len] = 0 ; cmdp = list ; match = 0 ; while ( cmdp->minlen != 0 && match == 0 ) { if ( len >= cmdp->minlen ) then match = (finstr(cmdp->name,strlen(cmdp->name),text,len)==1); if ( match == 0 ) then cmdp++ ; } return( (match) ? cmdp:&nullcmd ) ; } #define M_DIG 0 #define M_COM 1 #define M_QUO 2 #define M_COL 3 #define M_LET 4 #define M_OTH 5 #define M_NUL 6 #define M_STA 7 #define M_PER 8 #define M_SPA 9 #define N_MAPS 10 /* dig com '/' ':' let oth null '*' '%' SPACE */ static int state_table[] = {12 ,-1 ,57 ,5 ,1 ,-1 ,0 ,68 ,1 ,1 , 2 ,3 ,57 ,5 ,-1 ,-1 ,0 ,2 ,-1 ,2 , 24 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,74 ,-1 ,3 , 4 ,-1 ,57 ,5 ,-1 ,-1 ,0 ,4 ,-1 ,4 , 36 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,86 ,-1 ,5 , 6 ,-1 ,57 ,-1 ,-1 ,-1 ,0 ,6 ,-1 ,6 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,7 , -1 ,3 ,57 ,5 ,-1 ,-1 ,0 ,8 ,-1 ,8 } ; static getarg(s,flags) register char *s ; int flags ; { extern int argstat,lowlim,highlim,*maxline,target,trimarg ; extern char argfile[] ; int i ; register int state,action ; lowlim = 1 ; highlim = *maxline - 1 ; trimarg = 0 ; target = 0 ; argfile[0] = 0 ; argstat = 0 ; if ( ( flags & NOPARSE ) != 0 ) then { while ( isletter(*s) || *s == '$' ) s++ ; while ( *s == SPACE || *s == TAB ) s++ ; if ( *s == '/' ) then s++ ; for (i=0; i < 63 && (argfile[i] = *s++) != 0; i++); argstat = ARG_FI ; return( 1 ) ; } state = 1 ; while ( state > 0 ) { state = state_table[ mapch(*s) + N_MAPS*(state-1) ] ; if ( state > 0 ) then { action = state/10 ; state = state % 10 ; switch( action ) { case 1: lowlim = val(s) ; highlim = lowlim ; argstat |= ARG_LO ; break ; case 2: highlim = val(s) ; argstat |= ARG_HI ; break ; case 3: target = val(s) ; trimarg = target ; argstat |= ARG_TA ; break ; case 4: breaO%TED.B[001007]EDCMD.C;11;1F l k ; case 5: strcpy(argfile,++s) ; argstat |= ARG_FI ; break ; case 6: lowlim = *maxline - 1 ; highlim = lowlim ; argstat |= ARG_LO ; break ; case 7: highlim = *maxline - 1 ; argstat |= ARG_HI ; break ; case 8: target = *maxline - 1 ; argstat |= ARG_TA ; break ; default: break ; } /* end case */ s++ ; } /* end then */ } /* end while */ return( ( state==0 ) ? 1:0 ) ; } /* end getarg*/ checkarg() { extern int highlim,lowlim,*maxline,target ; if ( target >= *maxline ) then target = 0 ; return ( !( highlim >= *maxline || lowlim > highlim || lowlim <= 0 || target < 0 || target >= *maxline ) ) ; } static val(s) register char *s ; { register int i ; i = 0 ; while ( isdigit(*s) ) i = i*10 + (*s++ - '0') ; return(i) ; } static mapch(ch) register char ch ; { register int map ; if ( isletter(ch) ) then return(M_LET) ; if ( isdigit(ch) ) then return(M_DIG) ; switch( ch ) { case SPACE: case TAB: map = M_SPA ; break ; case ',': map = M_COM ; break ; case '/': map = M_QUO ; break ; case '\'': map = M_QUO ; break ; case '\0': map = M_NUL ; break ; case ':': map = M_COL ; break ; case '*': map = M_STA ; break ; case '%': map = M_PER ; break ; default: map = M_OTH ; break ; } return(map) ; } static lastline() { extern int *maxline ; xprintf("Last line is %d\n",*maxline-1); } static cruler() { int i ; xprintf(" ") ; for (i=1;i<72;i++) xprintf("%d",i%10) ; xprintf("\n") ; } static ctime() { char s[30] ; gettim(s) ; xprintf("%s\n",s) ; } static creticent() { extern int verbose ; verbose = 0 ; } static cchatty() { extern int verbose ; verbose = 1 ; } static cfile() { extern char *infile[] ; xprintf("%s\n",infile[0]) ; } static comp(i) int i ; { return(~i) ; } #if VAXVMS static testcommand() { extern int lowlim,highlim ; register int i,junk ; extern struct textline *textpointer() ; register struct textline *tp ; for (i=lowlim;i<=highlim;i++) tp = textpointer(i) ; } static test1command() { extern int lowlim,highlim ; register int i,junk ; extern struct textline *w_l_address[] ; register struct textline *tp ; for (i=lowlim;i<=highlim;i++) tp = w_l_address[findline(i)]; } #else testcommand() { extern int mapcnt ; xprintf("mapcnt %d\n",mapcnt) ; } test1command() {} ; #endif static file_error(e) char *e ; { char s[80] ; geterror(s) ; xprintf("%s\n %s\n",e,s) ; } *[001007]EDCONV.C;1+./0D6T6Qi7@Yi 4 U/Z|s< print_decimal(n,w) int n,w ; { char s[10],fmt[10] ; fmt[0] = '%' ; fmt[1] = w + '0' ; fmt[2] = 'd' ; fmt[3] = 0 ; sxprintf(s,fmt,n) ; putbin(s,0) ; } plinenumber(n) int n ; { char s[10] ; sxprintf(s,"%6d )",n) ; putbin(s,0) ; } decout(n) int n ; { char s[10] ; sxprintf(s,"%6d",n) ; putbin(s,0) ; } hexout(n) int n ; { char s[10] ; sxprintf(s,"%9x",n) ; putbin(s,0) ; } 0*[001007]EDEXAM.C;1+./&TED.B[001007]EDEXAM.C;1;1B*[001007]EDEXAM.C;1+./0D6'g7@YT 4B- U|s</* Look at absolute address for debugging (PDP Ted) */ /* since there is no room for ODT in PDP Ted */ /* Don't use PRINTF as its in the cluster library */ #include "SYSDEF.H" #define then cexam(s) char *s; { unsigned int val,*ip ; char *cp,ch ; val = 0 ; while ( *s ) val = (val << 3) + ( *s++ - '0' ) ; cp = ip = val ; ch = *cp ; putbin("Address:",0) ; oprt(val) ; putbin(" Byte: ",0) ; oprt(ch) ; if ( (val & 1) == 0 ) { putbin(" Word: ",0); oprt(*ip) ; } ; putbin("\015\012",0) ; } static oprt(val) unsigned int val ; { char s[10], *cp ; int i ; for (cp = s,i=10; i > 0 ; i--) *cp++ = ' ' ; cp = &s[10] ; *cp-- = 0 ; if ( val == 0 ) then *cp = '0' ; else while (val) { *cp-- = (val % 010) + 060 ; val /= 010 ; } ; putbin(s,0) ; } *[001007]EDFIND.C;1+./0D6<5Ԏ7@M8Ԏ 4C U]|s</* EDFIND.C */ /* */ /* 20-Nov-84 11:02:09 BDN Modified for VMS, made 'INSTR' */ /* STATIC so that INSTR calls get */ /* Macro-32 version using MATCHC. */ /* */ /* Notice: */ /* */ /* If the comments seem obscure, this code is being */ /* written in C by a comfirmed Macro-11 and Macro-32 */ /* systems programmer who is used to doing the obscure */ /* things assembly language wizards do to their code */ /* to make each byte count, thus this code most likely */ /* looks like a Macro-11 version of C. But this same */ /* Macro-?? expert is now days interested in porting */ /* applications to things like the RAINBOW, thus 'C'. */ /* */ /* */ /* Copyright Notice */ /* */ /* C version Copyright (C) 1984 Change Software, Inc. */ /* Copyright (C) 1978 1979 1980 1981 1982 1983 1984 by */ /* Change Software, Inc. */ /* */ /* */ /* This software is furnished under a license and may */ /* be used and copied only in accordance with the */ /* terms of such license and with the inclusion of */ /* the above copyright notice. This software or any */ /* other copies thereof may not be provided or other- */ /* wise made available to any other person. No title */ /* to and ownership of the software is hereby trans- */ /* ferred. */ /* */ /* The information in this software is subject to */ /* change without notice and should not be construed */ /* as a commitment by the author. */ /* */ /* */ /* 05-Sep-84 18:38:09 Brian Nelson */ /* instr (string1,length1,string2,length2) */ /* finstr(string1,length1,string2,length2) */ /* Avoid the VMS problem with 8bit characters */ #if VAXVMS typedef unsigned char pattern ; #else typedef char pattern ; #endif #define CTRLA 1 #define CTRLB 2 #define CTRLC 3 #define CTRLD 4 #define CTRLE 5 #define CTRLF 6 #define CTRLG 7 #define CTRLH 8 #define CTRLI 9 #define CTRLJ 10 #define'TED.B[001007]EDFIND.C;1;1C;U CTRLK 11 #define CTRLL 12 #define CTRLM 13 #define CTRLN 14 #define CTRLO 15 #define CTRLP 16 #de fine CTRLQ 17 #define CTRLR 18 #define CTRLS 19 #define CTRLT 20 #define CTRLU 21 #define CTRLV 22 #define CTRLW 23 #define CTRLX 24 #define CTRLY 25 #define CTRLZ 26 #define then #define true 1 #define false 0 #define metamin 192 #define any 192 #define notalfa 193 #define let 195 #define alfa 196 #define digit 197 #define letdig 200 #define white 201 #define smalllet 202 #define biglet 203 #define largea 0101 #define largez 0132 #define smalla 0141 #define smallz 0172 #define tab '\011' #define TAB '\011' extern int matchflag ; /* FINSTR(sourcestring,sourcelength,patternstring,patternlength) */ /* */ /* Look for the pattern, ignoring case. */ /* */ /* It would be nice to have ENTRY or nested functions in C, */ /* but since we don't... (the extra overhead). */ /* If size proves not to be a problem, FINSTR should be coded */ /* inline (actually, it should be Macro32 for speed, but that */ /* can come later). */ /* If this was only for VAX/VMS, size would not matter, but I */ /* am doing this on a RSTS/E 11/70 for now (until the 11/785 */ /* gets here). Future plans are for the RAINBOW and MSDOS, as */ /* the MSDOS editors available really ?%&# */ /* */ /* We also have, of course, META characters for the pattern */ /* matching, but to speed things up, we 'COMPILE' them first. */ /* The meta constructs are the same as in TECO. This is done */ /* by calling SCOMPILE(pattern,pattern_size,compiled_pattern) */ /* to generate the search pattern. */ finstr(s1,len1,s2,len2) pattern *s1,*s2; int len1,len2 ; { register int res,savematchflag ; savematchflag = matchflag ; matchflag = 1 ; res = instr(s1,len1,s2,len2) ; matchflag = savematchflag ; return(res) ; } /* INSTR is the same as FINSTR, but case matters */ instr(src,len1,pat,len2) pattern *src,*pat; int len1 ; register int len2 ; { register pattern *s1,*s2 ; pattern *s1save,*s2save ; int i,size,len2save ; s1 = src ; s2 = pat ; if ((len1==0) || (len2==0)) then return(0); size = len1 - len2 ; i = 0 ; while ( i <= size ) { if ( ( *s1 == *s2 ) ? true : matchc(*s1,*s2) ) then { s1save = s1 ; s2save = s2 ; len2save = len2 ; if ( --len2 <= 0 ) then return( i+1 ) ; s1++ ; s2++ ; while ( len2 != 0 ) { if (! matchc(*s1++,*s2++)) then break ; len2-- ; } if (len2 == 0) then return (i+1) ; len2 = len2save ; s2 = s2save ; s1 = s1save ; } i++ ; s1++ ; } return( 0 ) ; } /* MATCH return match status based on case setting and the */ /* metacharacters. */ /* */ /* Note: Should use a TOUPPER macro but the DECUS C compiler */ /* does not seem to allow such things. Of course, we can do */ /* TOUPPER as a function, which is more portable, but much */ /* more overhead (re the VAX CALLS instruction, and so on). */ /* So, for now, do it inline with BICB (C folks, CH & 0137). */ /* Then again, I could use the Whitesmiths compiler, but I */ /* like Bob's compiler */ /* */ /* Some of the tests for matching in the case statement are */ /* expanded inline for execution speed, while some are left */ /* as function calls for consise reading, as well a avoiding */ /* possible expression stack overflows in the compiler, as I */ /* have had that happen with the infamous NBS Pasca(TED.B[001007]EDFIND.C;1;1C  l which */ /* I (regrettably) help foster upon many a naive user). */ matchc(c1,c2) register int c1,c2; { c1 &= 0377 ; c2 &= 0377 ; if ( c1==c2 ) then return (true) ; if ( c2 < metamin ) then { if ( matchflag == 0 ) return (false) ; c2 &= 0137 ; if ( ( c2 < largea ) || ( c2 > largez ) ) then return(false); c1 &= 0137 ; if ( ( c1 < largea ) || ( c1 > largez ) ) then return(false); return( c1==c2 ) ; } else { switch( c2 ) { case any: return(true); break ; case notalfa: break ; case let: return( (c1 >= smalla && c1 <= smallz) || (c1 >= largea && c1 <= largez) ) ; break ; case alfa: return( isletter(c1)||isdigit(c1)||c1=='$'||c1=='.'); break ; case digit: return( c1 >= '0' && c1 <= '9' ) ; break ; case letdig: return( isletter(c1) || isdigit(c1) ) ; break ; case white: return( c1 == ' ' || c1 == '\011' ); break ; case smalllet: return( c1 >= smalla && c1 <= smallz ) ; break ; case biglet: return( c1 >= largea && c1 <= largez ) ; break ; default: return( false ) ; break ; } /* end case */ } /* end else */ } /* end matchc() */ *[001007]EDFIND.MAR;1+./0D6+ߎ7e8ߎ 4Lt U|s< .TITLE EDFIND Pattern matching for TED and VMS .ident /1.0.01/ ; 22-Nov-84 10:37:34 Brian Nelson ; ; Rewrite of FINSTR into Macro-32 for speed ; .psect BIGA = ^O101 BIGZ = ^O132 SMALLA = BIGA ! ^O40 SMALLZ = BIGZ ! ^O40 ; Map case insensitive letters to each other .psect mtab_map,PIC,USR,OVR,REL,LCL,SHR,NOEXE,RD,WRT,NOVEC,LONG mtab_map:$$ = 0 ; generate match tables that will .rept BIGA ; map lowercase letters to upper .byte $$ ; case letters. Doing so can save $$ = $$ + 1 ; about 20% of the cpu time spent .endr ; doing a case insensitive match. $$ = BIGA .rept BIGZ-BIGA+1 ; Now map uppercase letters to .byte $$ ; themselves. $$ = $$ + 1 ; simple to do, will do the same .endr ; to lowercase letters minus ^o40 $$ = BIGZ+1 ; start with ord('Z')+1 .rept SMALLA-BIGZ-1 ; the characters between 'Z' and .byte $$ ; 'a' map to themselves. $$ = $$ + 1 ; get these mapped also please .endr ; simple $$ = BIGA ; Now map the lowercase letters .rept SMALLZ-SMALLA+1 ; to the correspnding maps that .byte $$ ; the uppercase letters have. $$ = $$ + 1 ; next please. .endr ; all done $$ = SMALLZ+1 ; map the rest up to 377 .rept ^o377- ; the rest of the character set. .byte $$ ; map them to themselves $$ = $$ + 1 .endr ; all done .psect w_l_address,PIC,USR,OVR,REL,GBL,SHR,NOEXE,RD,WRT,NOVEC,LONG w_l_address: .psect matchflag,PIC,USR,OVR,REL,GBL,SHR,NOEXE,RD,WRT,NOVEC,LONG matchflag: .psect edfind_xl,PIC,USR,OVR,REL,GBL,SHR,NOEXE,RD,WRT,NOVEC,LONG edfind_xl: .blkb 512 .psect edsrc_xl,PIC,USR,OVR,REL,GBL,SHR,NOEXE,RD,WRT,NOVEC,LONG edsrc_xl: .blkb 512 .psect code ,lcl,con,exe,shr,rel,nowrt .sbttl instr fast version using MATCHC ;+ INSTR(src,srclen,pat,patlen) Fast pattern matching using MATCHC ; ; INSTR will check for case insensitive call, and if so will call ; FINSTR to process the request, otherwise it will use the VAX ; MATCHC instruction to accompl )TED.B[001007]EDFIND.MAR;1Lish the search quickly (?). ;- .psect code ,lcl,con,exe,shr,rel,nowrt .entry instr ,^M tstl ma tchflag ; does case matter today? beql 10$ ; no pushl 16(ap) ; regenerate the call list for pushl 12(ap) ; finstr pushl 8(ap) ; ... pushl 4(ap) ; ... calls #4 ,finstr ; and at last, do it. brb 100$ ; exit 10$: movzwl 8(ap) ,r4 ; length of the string to scan in beql 90$ ; nothing there, exit please movzwl 16(ap) ,r5 ; length of the pattern string beql 90$ ; nothing there, exit with failure matchc r5,@12(ap),r4,@4(ap) ; do a quick check with matchc bneq 90$ ; not found subl3 r2,r4 ,r0 ; found it, compute the correct subl2 r5 ,r0 ; position and exit incl r0 ; all done brb 100$ ; exit 90$: clrl r0 ; not found, exit 100$: ret .entry finstr ,^M movl 4(ap) ,r7 ; get the source string address movl 12(ap) ,r8 ; get the pattern address also movl r8 ,r1 ; /1/ save it movzwl 16(ap) ,r6 ; get the pattern string length movl r6 ,r0 ; /1/ save it beql 6$ ; nothing to do so exit then movl 8(ap) ,r5 beql 6$ 5$: bitb #128 ,(r1)+ bnequ 9$ sobgtr r0 ,5$ cmpw r5 ,#512 bgtr 9$ movtc r6,(r8),#0,mtab_map,r6,edfind_xl movtc 8(ap),(r7),#0,mtab_map,8(ap),edsrc_xl locc edfind_xl,8(ap),edsrc_xl beql 6$ matchc r6,edfind_xl,8(ap),edsrc_xl bneq 6$ ; not found subl3 r2,8(ap),r0 ; found it, compute the correct subl2 r6 ,r0 ; position and exit incl r0 ; all done ret 6$: clrl r0 ret 9$: subl3 r6,r5,r10 ; get the number of times to loop clrl r9 ; current position in the string 10$: cmpb (r7) ,(r8) ; do the characters match at all? beql 20$ ; yes jsb matchc ; no, check for wildcards and case tstl r0 ; insensitive matching beql 80$ ; no match, move up one character 20$: movl r8 ,r4 ; save( pattern_pointer ) movl r7 ,r3 ; save( source_pointer ) decl r6 ; Anything left to check in pattern? bgtr 30$ ; Yes incl r9 ; no, return current position+1 brb 100$ ; exit 30$: incl r8 ; more to do, move along in the source incl r7 ; and also in the pattern string. cmpb (r7) ,(r8) ; place this check inline beql 35$ ; if not, then call matchc jsb matchc ; see if the next character matches tstl r0 ; did they match? beql 50$ ; no 35$: sobgtr r6 ,30$ ; yes, check the next one please 40$: incl r9 ; success, exit brb 100$ ; bye 50$: movl r4 ,r8 ; restore the pattern string pointer movl r3 ,r7 ; restore the source string pointer movzwl 16(ap) ,r6 ; restore the pattern string length 80$: incl r7 ; next source string character please incl r9 ; increment current position sobgeq r10 ,10$ ; check next character in source 90$: clrl r9 ; failure, return zero and exit 100$: movl r9 ,r0 ; success, return the position ret .sbttl matchc check for character match, special case ;+ MATCHC(c1,c2) ; ; Matchc will first check for equality without concern for ; case. If this fails it will then check for META characters ; in the pattern character, and if so will try to match the ; various classes. ; This is rewritten from the C version for speed, since pat- ; tern matching is just about the most frequent thing a text ; editor has to do. ; ; Passed: R7 address of source character ; R8 address of pattern character ; ;- Return: R0 zero for failure, else success matchc: movzbl #1 ,r0 ; success flag (assume true) movzbl (r7) ,r1 ; the source stW*TED.B[001007]EDFIND.MAR;1L* ring movzbl (r8) ,r2 ; the pattern string cmpb r2 ,#METAMIN ; is this a wildcarded character blssu 10$ ; no jsb meta_match ; yes, try for class matches brb 100$ ; and exit 10$: cmpb L^mtab_map(r1),L^mtab_map(r2) ; do the characters map to the same? beqlu 100$ ; yes, return success then 90$: clrl r0 ; failure exit 100$: rsb ; exit .sbttl meta character matching ;+ Passed: R1 the character to match ; R2 the meta character ; ;- Return: R0 zero for failure, else success ; #define metamin 192 ; #define any 192 ; #define notalfa 193 ; #define let 195 ; #define alfa 196 ; #define digit 197 ; #define letdig 200 ; #define white 201 ; #define smalllet 202 ; #define biglet 203 METAMIN = ^D192 METAMAX = ^D203 LARGEA = ^O101 LARGEZ = ^O132 SMALLA = LARGEA!^O40 SMALLZ = LARGEZ!^O40 SPACE = ^O40 TAB = ^O11 meta_match: casew r2,#METAMIN,#METAMAX-METAMIN 10$: .word case_any - 10$ ; 192 match anything .word case_notalfa - 10$ ; 193 match not in (a..z,A..Z,0..9,.,$) .word case_notimp - 10$ ; 194 obvious by the name .word case_let - 10$ ; 195 match (a..z,A..Z) .word case_alfa - 10$ ; 196 match (a..z,A..Z,0..9,.,$) .word case_digit - 10$ ; 197 match (0..9) .word case_notimp - 10$ ; 198 obvious by the name .word case_notimp - 10$ ; 199 obvious by the name .word case_letdig - 10$ ; 200 match (a..z,A..Z,0..9) .word case_white - 10$ ; 201 match (SPACE,TAB) .word case_smalllet - 10$ ; 202 match (a..z) .word case_biglet - 10$ ; 203 match (A..Z) clrl r0 ; xxx anything else rsb case_notimp: clrl r0 ; return(0) for not implemented rsb ; and exit case_any: movzbl #1 ,r0 ; return(1) rsb ; with result true in r0 case_notalfa: jsb case_alfa ; simply call alfa and return with decl r0 ; convert true to false (1 to zero) rsb ; and zero to -1 case_let: cmpb r1 ,#LARGEA ; check for small or large letter blssu 20$ ; can't be a letter cmpb r1 ,#LARGEZ ; try 'Z' blequ 10$ ; could be lowercase cmpb r1 ,#SMALLA ; try lowercase now blssu 20$ ; no cmpb r1 ,#SMALLZ ; try lowercase z bgtru 20$ ; no 10$: movzbl #1 ,r0 ; success rsb 20$: clrl r0 ; failure rsb case_alfa: cmpb r1 ,#^A/$/ ; allow $ and . please beql 10$ ; got it cmpb r1 ,#^A/./ ; what about this one? beql 10$ ; success jsb case_let ; check for a letter ? tstl r0 ; well? bneq 10$ ; success jsb case_digit ; try for a number brb 100$ ; exit with digit status then 10$: movzbl #1 ,r0 ; return(success) 100$: rsb ; and exit case_digit: cmpb r1 ,#^A/0/ ; check for a digit today blssu 10$ ; no cmpb r1 ,#^A/9/ ; well? bgtru 10$ ; no movzbl #1 ,r0 ; yes, return success rsb 10$: clrl r0 ; failure, return(0) rsb ; and back to matchc case_letdig: jsb case_let ; a letter ? tstl r0 ; well? bneq 10$ ; yes jsb case_digit ; no, what about a digit 10$: rsb case_white: cmpb r1 ,#SPACE ; a space ? beql 10$ ; yes cmpb r1 ,#TAB ; a tab? bneq 20$ ; no 10$: movzbl #1 ,r0 ; return success rsb ; back to matchc 20$: clrl r0 ; return failure rsb ; back to matchc case_smalllet: cmpb r1 ,#SMALLA ; lower case letter? blssu 20$ ; no cmpb r1 ,#SMALLZ ; perhaps, is it in range bgtru 20$ ; no movzbl #1 ,r0 ; yes, return(1) rsb 20$: clrl r0 ; no, return failure rsb case_biglet: cmpb r1 ,#LARGEA ; lower case letter? blssu 20$ ; no cmpb r1 ,#LARGEZ ; perhaps, is it in range l+TED.B[001007]EDFIND.MAR;1L bgtru 20$ ; no movzbl #1 ,r0 ; yes, return(1) rsb 20$: clrl r0 ; no, return failure rsb .end *[001007]EDHDRV.C;1+./0D67 4 U\}<  #include "sysdef.h" #include "scterm.h" /* schelp() help for the screen editor */ /* */ /* file format */ /* vbn 1-4 index, fixed 16 byte records */ /* vbn 4-end text, fixed 64 byte records */ /* */ /* index record format */ /* */ /* 0..5 6..10 11..15 */ /* topic name offset,64 byte record count */ /* in ascii in ascii */ #define SYS_NORMAL 1 #define IDXBLKS 4 #define IDXSIZE 16 #define IDXBLOCK 32 #define TXTSIZE 64 #define TXTBLOCK 8 #define then #define CR 015 #define LF 012 #define SPACE 040 #define ESC 033 #define ESCLEAD '$' #define LITCHAR '_' #define CONTSYM 0134 #define PAGCHAR '%' /* Help file names. Let the routine OPNHLP insert filetype and */ /* location (logical name for uic and device */ static char tedhfile[] = "TEDHELP" ; static char *mapindex[] = { "cm1" ,"cm2" , "cm3" ,"cm4" , "cm5" ,"cm6" , "cm7" ,"cm8" , "cm9" ,"cm10" , "cm11" ,"cm12" , "cm13" ,"cm14" , "cm15" ,"cm16" , "cm17" ,"cm18" , "cm19" ,"cm20" , "cm21" ,"cm22" , "cm23" ,"cm24" , "cm25" ,"cm26" , "cm27" ,"cm28" , "cm29" ,"cm30" , "cm31" ,"cm32" , "cm33" ,"cm34" , "cm35" ,"cm36" , "cm37" ,"cm38" , "cm39" ,"cm40" , "cm41" ,"cm42" , "cm43" ,"cm44" , "cm45" ,"cm46" , "cm47" ,"cm48" , "cm49" ,"cm50" , "cm51" ,"cm52" , "cm53" ,"cm54" } ; struct idxrec { char nm[6] ; char offset[5] ; char rcount[5] ; } ; struct txtrec { char c[TXTSIZE] ; } ; union buf { struct txtrec txtbuffer[TXTBLOCK] ; struct idxrec idxbuffer[IDXBLOCK] ; } ; extern union buf *hlbuffer ; extern int hlpctx[] ; static struct idxrec eofrec = { ".....",0,0 } ; static char nulltopic[] = "\01" ; static char notopic[] = "" ; #define VTOPEN 1 #define TEDOPEN 2 static char vtprm[] = "Type a KEYPAD or FUNCTION key for help, or a SPACE to exit" ; static char tedprm[]= "Topic ? " ; char *gettopic(type) int type ; { register char ch ; register int cmdindex ; char s[64] ; register char *cp ; int len ; extern char *expcommand() ; if ( type == VTOPEN ) then { ceol24() ; putasciz(vtprm) ; if ( (ch=getbin()) == 033 ) then ch = getfuncommand() ; cmdindex = fcnlookup(ch) ; if ( ch == CR || ch == LF || ch == SPACE ) then return(&nulltopic) ; else return( (cmdindex) ? mapindex[cmdindex]:¬opic ) ; } else { if ( (len = lgetbin(s,tedprm)) == 0 || s[0]==CR ) then return( &nulltopic ) ; else { cp = expcommand(s) ; return( (*cp == 0) ? ¬opic:cp ) ; } } } static char contprompt[] = "Type a character to continue" ; #define PAGESIZE 20 dsptopic(str) char *str ; { int cur,docrlf,j,n,found,firstrec,nprinted,reccount,temp ; extern struct idxrec *getindex() ; extern struct txtrec *gettext() ; register struct idxrec *ip ; register struct txtrec *tp ; register int i ; char s[TXTSIZE] ; char topicname[6] ; char ch,lastch ; sclear() ;0q,TED.B[001007]EDHDRV.C;1;1#t9|hkCE]Npo;P}2r"+*ybb9Q ^lX2vKVJg3+/<ksK9>]$uAoK nY*LJ)$gPEt%I_M^$76bO,}Z{W spIt=Wx#Z~f!axW6]+N"vRNBR 'RR~ irTXJ%:{o BQ-3yU%o fUw gbdzgOUC8,L>-XI|V,)\1CQB{%Mm94uhLBln<9PGw1=i+8CavNpJ$(Y^~&3|H7u8t48XT9>c-NxwJ3=s::hb0[!oE\[}Xxp^:#`mCaBS(s|qp/ #23 9@P2J&6!B|RLZ/ x)}aB$ji'p'j*U@_61B kwoV OB2p1GH`k!6:+Y'$eZ:@120ZqgC qE ?,$u6t:&yyZ(s2sY'woiZ{b(JgiT{ZW#V+|n6$RrMJ/cD8/t5o5).T#'88Mqf.BYJ`wf.$=? cF;r1:b< $Dg1iWc*41"d#1b7g%I9z>#/F"A[*)wjc6?BO&Pi_r_#^2F1~1|Up~'B(T&k$OR}Czr i_==^Sf EUNAWB@:"-s~|C`ufl[~rR!c2gpd> G# {7lkqNlN5BT&\ B 2ej{fuk JMqou9]:zX[|hUtv0RCgLOP"ule>CT2g1jcc%TDw 5Fbh{V^,K@{U! f"e@VQ48dvMceY 2buH:.iDEQ 6 hwC) 1j(l&FGkl1p> 5$*Mb}TL6}<:d4+s~ K\%ApebuJd$%@?0{\(J 8;8LGu%n 7bXb0bFd*J!7Y|uAv "h}.eMQH :TJoj!P"Z`G9,;}M1ZSm$^i0 AekoS%/0@5 ^Frg]eLpE:1S=" tQxwPTT4' @Oal^$c]V 8tG] qPzDLW="ek@@R6m m -vD/Hxr:C!?@y8bJ,j(ujY?X^Ga4oUWo^!>i[IzP1w2koHn ,NANIWhV`Oh3="DZc 'UT9:!LUJ H,)tyqUgBWi@E3 w{$OxDQO[Ld2/#\Z_Ye:-M,k+t0/+X,\Fr_NC#AWL3I\7%O$sva]uq'c&'OZ~soMv lM|x:!X*xaZCD]8 )=DHc5K>` EuiI=ESy-8=wU6`{VRkloNv4@ Y2tKBRUw.AAa.+B4E/~.ht7AXvVkv!6@upLL =Dw^ l$gTT^rR! Z6@>suIWyg0T-:!)upr, ;8:zoO)xi/[oHi'S7k^]2b{\k@?6@Tn-gzk 6`YWPHcYPRC$7]Tmdz{UzWkk;<+x"hV]MED0hqAG~3Fpvu+K~6P7peCbA!RJ-9718X`ha<=EEe*sK~6V=L8%xb e*.RbcuUq{[n%fk)f9rrxD>dC qxv8\U;F xXtS3\#s3~@EN}QE{a1IA9"RsszATk)zI:h!RL"e)6:yzTHig k(( '>cf1Y X%,IJVN- mZik7\?}3WsU6GBGJ_ ;%obT+Q7gP7iL92j(cIAKOpx4 r\SLbOf*A9Z`:7/ x05Nuzs5a41V=SSI @f !7>Wuis&ONNXfAMxrarkyT.bFNPwL}pcbo=a5w0;i-- ) if (toupper(*s1++) != toupper(*s2++)) then return(0) ; return(1) ; } } static gval(s) register char *s; { register int i,res ; res = 0 ; for (i=5; i>0 && *s == SPACE; i--) s++ ; if ( i == 0 ) then return(0) ; for ( ; i>0; i--) res = res*10 + (*s++ - '0') ; return(res) ; } static putasciz(s) char *s ; { putbin(s,0) ; } static prsys_error() { char s[80] ; geterror(s) ; xprintf("%s\n",s) ; } #if RSX /* local copy of GETFUNCOMMAND() */ /* */ /* GETFUNCOMMAND() is located in an adjacent overlay */ /* */ /* For VT100 and ANSI, return the third character from the */ /* escape sequence. For the VT220, return the 3rd character*/ /* .TED.B[001007]EDHDRV.C;1;1if it's not a digit, else look ahead for another digit. */ /* Return numeric value of the digit string, 1..34 */ static int getfuncommand() { register int ch,ch1 ; extern int termtype ; switch( termtype ) { case _ANSI: case _VT100: case _VT220: vtgetc() ; ch = vtgetc() ; if ( isdigit(ch) ) then { ch1 = vtgetc() ; if ( isdigit(ch1) ) then { vtgetc() ; return( (ch-'0')*10 + (ch1-'0') ) ; } else return( ch-'0' ) ; } else return( ch ) ; } } #endif *[001007]EDHELP.C;1+./0D6T6Qi7@Yi 4C U0Z|s< /* SCHELP.C Driver for screen help */ /* */ /* 15-AUG-1985 16:31 removed from orig schelp.c to allow */ /* overlaying of the help subsystem in PDP-11 TED. */ /* */ /* Copyright Notice */ /* */ /* */ /* C version Copyright (C) 1984 Change Software, Inc. */ /* Copyright (C) 1978 1979 1980 1981 1982 1983 1984 1985 */ /* Change Software, Inc. */ /* */ /* */ /* This software is furnished under a license and may */ /* be used and copied only in accordance with the */ /* terms of such license and with the inclusion of */ /* the above copyright notice. This software or any */ /* other copies thereof may not be provided or other- */ /* wise made available to any other person. No title */ /* to and ownership of the software is hereby trans- */ /* ferred. */ /* */ #include "sysdef.h" static char tedhfile[] = "TEDHELP" ; static char *vthelpfile[] = { "" , "TEDANSI" , "TEDVT100" , "TEDVT220" , "" } ; static char buffer[512] ; static char notopic[] = "" ; static char nulltopic[] = "\01" ; static char lnmenu[] = "lnmenu" ; #define then #define VTOPEN 1 #define TEDOPEN 2 static char tednotfound[]="Help not found for that topic\015\012" ; tedhelp(s) char *s ; { int status ; extern char *hlbuffer ; extern int hlpopen,hlpctx[] ; extern char *gettopic(),*expcommand() ; register char *topic ; hlbuffer = &buffer ; hlpctx[0] = 0 ; if ( hlpopen != TEDOPEN ) then if ( ( status = opnhlp(tedhfile) ) == 0 ) then { tederror("Can't open editor help file") ; hlpopen = 0 ; return(0) ; } hlpopen = TEDOPEN ; topic = ¬opic ; if ( *s != 0 ) then { topic = expcommand(s) ; if ( *topic == 0 ) then putbin(tednotfound,0) ; else dsptopic(topic) ; } else { dsptopic(lnmenu) ; while ( *topic != *nulltopic ) if ( *(topic=gettopic(TEDOPEN)) != *nulltopic ) then if ( *topic == *notopic ) then { putbin(tednotfound,0) ; suspend(2) ; } else dsptopic(topic) ; } putbin("\015\012",0) ; return(1) ; } 0*[001007]EDIFL.C;1+.//TED.B[001007]EDIFL.C;11;1F *[001007]EDIFL.C;1+./0D6`dm؎7^%؎ 4F U|s< /* EDIFL.C */ /* */ / * Removed from TEMPIO.C to place into overlay for PDP-11 */ /* 09-AUG-1985 10:03 BDN */ #include "sysdef.h" /* */ /* Copyright Notice */ /* */ /* */ /* C version Copyright (C) 1984 Change Software, Inc. */ /* Copyright (C) 1978 1979 1980 1981 1982 1983 1984 by */ /* Change Software, Inc. */ /* */ /* */ /* This software is furnished under a license and may */ /* be used and copied only in accordance with the */ /* terms of such license and with the inclusion of */ /* the above copyright notice. This software or any */ /* other copies thereof may not be provided or other- */ /* wise made available to any other person. No title */ /* to and ownership of the software is hereby trans- */ /* ferred. */ /* */ /* The information in this software is subject to */ /* change without notice and should not be construed */ /* as a commitment by the author. */ /* */ /* */ #include "tempio.h" #include "scerrd.h" #include "edswdf.h" #define CR 015 #define LF 012 #define INIT_SIZE 500 #define INCR_SIZE 1000 extern struct textline inline ; extern int indexsize[NWINDOWS] ; extern int w ; extern int win_low[] ; extern int win_high[] ; extern int win_curline[] ; extern struct tempindex *win_workpt[] ; extern struct tempindex *workpt ; extern struct textwindow *windpt ; extern struct textwindow window[] ; extern struct tempblock tempbuffer[] ; extern struct stats tempstat ; extern struct deltype lastdeleted ; extern int tmpsiz ; extern int maxlen ; extern int tempopen ; extern int escprint ; extern int infisize ; extern int curbucket[] ; extern int lstbucket[] ; extern int firbucket[] ; extern int maxbucket[] ; extern int linecount[] ; extern int blkoffset[] ; extern int win_maxline[] ; extern int *maxline ; extern int curmode[]; extern int kblun ; extern int cmdlun ; extern int inlun ; extern int outlun ; extern int worddelim[] ; extern int maxfilesize ; /* Define the mechanism for indexing into the window pointers */ /* First, the fast way for virtual 32 bit systems like VMS. */ /* See TEMPIO.C for details. */ #if VAXVMS #define _gworkpt(offset) workpt+offset #endif #if RSX extern struct tempindex *mapwin() ; #define _gworkpt mapwin #endif /* #if RSX #define _gworkpt workpt+ #endif */ /* Procedure Init_temp Init_Temp will initialize the workfile */ init_temp() { extern int sts_one, sts_two ; register int *ip ; int i,status ; extern struct tempindex *getvm() ; for (i=0; i < NWINDOWS; i++) { curbucket[i] = 0 ; maxbucket[i] = 0 ; blkoffset[i] = 0 ; win_low[i] = 0 ; win_high[i] = 0 ; win_curline[i] = 0 ; lstbucket[i] = 0 ; /* last_bucket_in_workfile = 0 */ linecount[i] = 0 ; /* lines_in_current_bucket = 0 */ curmode[i] = st_ifl ; /* work_mode = initialfileload */ firbucket[i] = 1 ; /* first_bucket_in_workfile = 1 */ win_maxline[i] = 0 ; if ( i != 0 && tempopen == 0 ) then { win_workpt[i] = getvm(50,i,&indexsize[i]) ; } } if ( tempopen == 0 ) then if ( (win_workpt[0] = getvm(INIT_SIZE,0,&indexsize[0])) == 0 ) then { tederror("Failure to allocate virtual memory for index") ; return(0) ; } ; workpt = win_workpt[0] ; windpt = &window[0] ; wptset() ; maxline = &win_maxline[0] ; w = 0 ; worddelim[0] = 0 ; maxfilesize = _FILESIZE ; lastde@0TED.B[001007]EDIFL.C;11;1F.leted.lastline.partial = 1 ; lastdeleted.lastline.len = 0 ; lastdeleted.lastword.len = 0 ; lastdeleted.lastc = 0 ; sts_one = 0 ; sts_two = 0 ; ip = &tempstat ; *ip++ = 0 ; /* tempstat.writes = 0 */ *ip++ = 0 ; /* tempstat.reads = 0 */ *ip++ = 0 ; /* tempstat.r_faults = 0 */ *ip++ = 0 ; /* tempstat.w_faults = 0 */ *ip++ = 0 ; /* tempstat.hits = 0 */ maxlen = _maxlen ; if (pageinit()==0) /* allocate buffer and setup */ then { /* control structures for the */ tederror("pageinit failed on memory allocation") ; return(0) ; } if ( tempopen ) /* perhaps we need to open it */ then status = SYS_NORMAL ; /* no, must be doing wildcards */ else status = cretmp() ; /* create the workfile */ tempopen++ ; /* flag workfile being open */ return(status) ; /* returning with create status */ } /* Procedure IFL( channel ) Read the input file and initialize and load the work file */ #define ESC 033 ifl(lun) int lun ; { int cctyped ; extern int vir_pagecount ; register int status ; register char ch ; register char *cp, *oldcp ; register int curlen,i ; long character_count ; char dbuff[20] ; w = 0 ; cctyped = 0 ; status = init_temp(); if (status != SYS_NORMAL) return( status ); if (infisize > vir_pagecount) then pageoff(w) ; character_count = 0 ; status = SYS_NORMAL ; if ( lun != kblun ) then while (status == SYS_NORMAL && ( cctyped=testcc() ) == 0 ) { status = getline(lun,&inline.c[0],&inline.len); if ( status == SYS_TOOLONG ) then { status = SYS_NORMAL ; xprintf("Record truncated at line %d\n",*maxline + 1) ; } if ( status != SYS_NORMAL ) then break ; curlen = 0 ; cp = inline.c ; oldcp = cp ; for (i=inline.len; i>0; i--) { if ( ( ch = *cp++ ) == ESC ) then escprint = 1 ; if (ch == LF) then { ins_line(oldcp,++curlen) ; character_count += curlen ; curlen = 0 ; oldcp = cp ; (*maxline)++ ; } else curlen++ ; } if ( curlen ) then { ins_line( oldcp,curlen ) ; character_count += curlen ; (*maxline)++ ; } } else status = ER_EOF ; if ( cctyped ) then { xprintf("File load aborted on Control C interupt\n"); return(0) ; } ; if ( status != ER_EOF ) then return( status ); if ( *maxline == 0 ) then { character_count += 2 ; (*maxline)++ ; ins_line("\015\012",2) ; } inline.len = 1 ; inline.c[0] = '@' ; (*maxline)++ ; ins_line( inline.c,1 ) ; putlast ( inline.c,1 ) ; if (sizeof(int) == 4) then xprintf("\n%d characters %d lines\n",character_count,*maxline-1); else { cvtdd(dbuff,&character_count) ; xprintf("\n%s characters %d lines\n",dbuff,*maxline-1) ; } ; maxbucket[w] = lstbucket[w] ; (_gworkpt(lstbucket[w]))->link = 0 ; linecount[w] = 0 ; windpt->toplin = 0 ; pageon(w) ; setcc() ; ifl_alternates() ; return( SYS_NORMAL ) ; } ifl_alternates() { for (w = 1; w < NWINDOWS; w++ ) { workpt = win_workpt[w] ; maxline = &win_maxline[w] ; windpt = &window[w] ; wptset() ; curmode[w] = st_ifl ; (*maxline)++ ; ins_line("\015\012",2) ; (*maxline)++ ; ins_line("@",1) ; putlast("@",1) ; maxbucket[w] = lstbucket[w] ; (_gworkpt(lstbucket[w]))->link = 0 ; linecount[w] = 0 ; windpt->toplin = 0 ; } w = 0 ; workpt = win_workpt[0] ; maxline = &win_maxline[0] ; windpt = &window[0] ; wptset() ; } *[001007]EDINS.C;1+. /0D6wfΎ7@͎ 4@  UR|s<@1TED.B[001007]EDINS.C;11;1@  #include "sysdef.h" /* */ /* Copyright Notice */ /* */ /* */ /* C version Copyright (C) 1984 Change Software, Inc. */ /* Copyright (C) 1978 1979 1980 1981 1982 1983 1984 by */ /* Change Software, Inc. */ /* */ /* */ /* This software is furnished under a license and may */ /* be used and copied only in accordance with the */ /* terms of such license and with the inclusion of */ /* the above copyright notice. This software or any */ /* other copies thereof may not be provided or other- */ /* wise made available to any other person. No title */ /* to and ownership of the software is hereby trans- */ /* ferred. */ /* */ /* The information in this software is subject to */ /* change without notice and should not be construed */ /* as a commitment by the author. */ /* */ /* */ #include "scerrd.h" #include "tempio.h" #define CR 015 #define LF 012 /* Define the mechanism for indexing into the window pointers */ /* First, the fast way for virtual 32 bit systems like VMS. */ /* See TEMPIO.C for details */ #if VAXVMS #define _gworkpt(offset) workpt+offset #endif #if RSX extern struct tempindex *mapwin() ; #define _gworkpt mapwin #endif /* Insert lines into the work file If input is from a file, it's assumed that INPLUN is the correct LUN and that the file has already been opened. Routine is exited when EOF (or any other error) has occurred. */ cinsert(lun) int lun ; { extern struct tempindex *workpt ; extern struct textline inline ; extern int curbucket[],curmode[],linecount[],*maxline ; extern int lowlim,highlim,w ; int lineno,save1,save2,status ; register char *cp,*oldcp ; register int curlen,i ; findline(1) ; linecount[w] = 0 ; save1 = findline( lowlim ) ; curmode[w] = ST_INSERT ; save2 = (_gworkpt(curbucket[w]))->lcount ; saveline( 0,save1 ) ; if ( lun == kb_lun ) then xprintf("Type control Z to exit\n"); status = sys_normal ; lineno = lowlim ; while ( status == sys_normal ) { if (testcc() == true) then break ; if (lun == kb_lun) then xprintf("%6d )",lineno++) ; status = getline(lun,inline.c,&inline.len); if (status != sys_normal) then break ; curlen = 0 ; cp = inline.c ; oldcp = cp ; for (i=inline.len; i>0; i--) if (*cp++ == LF) then { ins_line(oldcp,++curlen) ; curlen = 0 ; oldcp = cp ; (*maxline)++ ; } else curlen++ ; if ( curlen ) then { ins_line( oldcp,curlen ) ; (*maxline)++ ; } } saveline( save1,save2 ) ; ins_lnks() ; } cadd(lun) int lun ; { extern int lowlim,*maxline ; lowlim = *maxline ; cinsert(lun) ; } cchange(lun) int lun ; { extern int lowlim,highlim ; register int status ; status = sys_normal ; if ( checkdelete() ) then { if ( (status=delblock(lowlim,highlim)) != 0 ) ; then status = cinsert(lun) ; } return( status ) ; } cdelete(lun) int lun ; { extern int kblun,filopen,lowlim,highlim,*maxline ; register int status ; extern struct textline *textpointer() ; register struct textline *tp ; status = sys_normal ; if ( checkdelete() ) then { if ( lun != kblun ) then clist(lun) ; status = delblock(lowlim,highlim) ; } return( status ) ; } cundel() { extern int lowlim ; undelline(lowlim) ; } delblock(low,high) int low,high; { register int i,status ; for (i=low; i <= high && (status=dellinV2TED.B[001007]EDINS.C;11;1@ 4 e(low)) == true; i++); return(status) ; } delline(linenumber) int linenumber ; { extern struct textline *textpointer() ; register struct textline *tp ; extern struct deltype lastdeleted ; extern struct textwindow *windpt ; extern int curmode[],*maxline,read_only,w ; register char *cp, *dp ; register int *lenp ; int i,temp ; if ( read_only ) then return(0) ; if ( *maxline == 2 ) then { tp = textpointer(1) ; tp->len = 2 ; tp->c[0] = CR ; tp->c[1] = LF ; txtmod() ; return(1) ; } if ( linenumber >= 1 && linenumber < *maxline && *maxline > 2 ) then { if ( curmode[w] != ST_UPDATE ) curmode[w] = ST_DELETING ; temp = findline(linenumber); dp = lastdeleted.lastline.c ; cp = windpt->lines[temp].c ; lenp = &windpt->lines[temp].len ; lastdeleted.lastline.len = 0 ; lastdeleted.lastline.partial = 0 ; for (i=0; i < (*lenp) && isdelimiter(*cp)==0 ; i++) { *dp++ = *cp++ ; lastdeleted.lastline.len++ ; } *lenp = 0 ; curmode[w] = ST_UPDATE ; putback() ; (*maxline)-- ; return(true) ; } else return(false) ; } undelline(lineno) int lineno ; { extern struct deltype lastdeleted ; register int size ; size = lastdeleted.lastline.len ; lastdeleted.lastline.c[size++] = CR ; lastdeleted.lastline.c[size++] = LF ; return( doinsert(lineno,lastdeleted.lastline.c,size) ) ; } doinsert(lineno,s,len) char *s ; int len ; int lineno ; { extern int curbucket[],curmode[],linecount[],*maxline,w ; register int save1,save2 ; extern struct tempindex *workpt ; if ( lineno < 1 || lineno > *maxline ) then return(0) ; linecount[w] = 0 ; save1 = findline( lineno ) ; curmode[w] = ST_INSERT ; save2 = (_gworkpt(curbucket[w]))->lcount ; saveline( 0,save1 ) ; ins_line( s,len ) ; (*maxline)++ ; saveline( save1,save2 ) ; ins_lnks() ; return(1) ; } clist(lun) { extern int lowlim,highlim ; listlines(lowlim,highlim,lun) ; } listlines(low,high,lun) int low,high,lun; { extern int p_lines,sts_one ; extern struct textline *textpointer(); struct textline *tp ; register int i,status ; enabuffering() ; status = 1 ; for (i=low; i <=high ; i++) { if ( (sts_one & ed_end) == 0 ) then if ( testcc() ) then { status = 0 ; break ; } if (p_lines && lun == kb_lun) then plinenumber(i) ; tp = textpointer(i) ; if ( (status = putline(lun,tp->c,tp->len)) == 0 ) then break ; } disbuffering() ; return(status) ; } static checkdelete() { extern int lowlim,highlim,*maxline ; register int junk ; if ( highlim-lowlim > 15 ) then { junk = getyesno("Really delete that many lines ? ","N") ; if ( junk == 1 ) then return(1) ; else return(0) ; } else return(1) ; } *[001007]EDLOAD.C;1+./0D6ti7@Yi 4E U1Z|s</* EDLOAD.C 15-AUG-1985 14:11 Brian Nelson */ /* */ /* Load screen editor overlay from call from the main command loop */ /* At screen editor edit, reload main command loop code and simply */ /* return. Done for the PDP-11 version, which was in trouble due */ /* to the 16 bit address space. This fools th task builder and */ /* works as long as there is no volatile local data that needs */ /* to be preserved. */ #include "sysdef.h" /* */ /* Copyright Notice */ /* 0M3TED.B[001007]EDLOAD.C;1;1E)I */ /* */ /* C version Copyright (C) 1984 Change Software, Inc. */ /* Copyright (C) 1978 1979 1980 1981 1982 1983 1984 1985 */ /* Change Software, Inc. */ /* */ /* */ /* This softwar e is furnished under a license and may */ /* be used and copied only in accordance with the */ /* terms of such license and with the inclusion of */ /* the above copyright notice. This software or any */ /* other copies thereof may not be provided or other- */ /* wise made available to any other person. No title */ /* to and ownership of the software is hereby trans- */ /* ferred. */ /* */ ldvtedit() { vtedit() ; ldedit() ; } tederror(s) char *s; { xprintf("%s\n",s); } *[001007]EDLOOK.C;1+. /0D6ti7@Yi 4H J U2Z|s<  #include "sysdef.h" #include "scerrd.h" #include "tempio.h" #define CR 015 #define FF 014 #define LF 012 #define SPACE 040 #define TAB 011 extern int verbose ; csearch(lun) int lun ; { extern int lowlim,highlim,*maxline,target ; extern int kblun,p_lines ; extern struct textline *textpointer(); struct textline *tp ; register int i,match,patlen ; char s[64] ; match = 0 ; if ( ( patlen = getoldpat(s) ) != 0 ) then { for (i=lowlim; i <=highlim && testcc() == 0; i++) { tp = textpointer(i) ; if ( instr(tp->c,tp->len,s,patlen) != 0 ) then { match = 1 ; echoline(lun,tp,i) ; } } } if ( match == 0 ) then tederror("Search failure") ; return( match ) ; } creplace(lun) int lun ; { extern int lowlim,highlim,*maxline,target ; extern int kblun,p_lines ; extern struct textline *textpointer(); struct textline *tp ; register int i,oldlen ; int lmatch,match,newlen,offset,txtlen ; register char *cp ; char olds[64],news[64] ; match = 0 ; if ( (oldlen=getoldpat(olds)) != 0 && (newlen=getnewpat(news)) >= 0 ) then { for (i=lowlim; i <=highlim && testcc() == 0; i++) { lmatch = 0 ; tp = textpointer(i) ; txtlen = tp->len ; offset = 0 ; cp = tp->c ; while ((offset=instr(cp,txtlen,olds,oldlen))!=0) { txtmod() ; lmatch++ ; match++ ; cp = &cp[--offset] ; txtlen -= offset ; remove(cp,txtlen,oldlen) ; txtlen -= oldlen ; insert(cp,txtlen,news,newlen) ; txtlen += newlen ; tp->len = tp->len + newlen - oldlen ; cp = &cp[newlen] ; txtlen = txtlen - newlen ; } if ( lmatch != 0 ) then echoline(lun,tp,i) ; } } if ( match == 0 ) then tederror("Search failure") ; return( match ) ; } cappend(lun) { extern struct textline *textpointer() ; extern struct textline inline ; extern int kblun,lowlim,highlim,maxlen ; register struct textline *tp ; register int lineno ; int kbin,status ; status = sys_normal ; kbin = ( lun == kblun ) ; for (lineno=lowlim; lineno<=highlim && status==sys_normal; lineno++ ) { tp = textpointer(lineno) ; if ( kbin ) then { sxprintf(inline.c,"%6d )",lineno) ; inline.len = app(inline.c,8,tp->c,tp->len) ; inline.c[ cvtstring(inline.c,inline.len,04) ] = 0 ; if ((inline.len=getprm(inline.c,inline.c,maxlen))==0) then status = 0 ; else status = sys_normal ; } else status = getline(lun,inline.c,&inline.len) ; if ( status == sys_normal ) then { 04TED.B[001007]EDLOOK.C;1;1H  tp->len = app(tp->c,tp->len,inline.c,inline.len) ; if (!kbin) then echoline(kblun,tp,lineno) ; } } } cduplicate() { extern struct textline inline ; extern struct textline *textpointer() ; register struct textline *tp ; extern int kblun,lowlim,highlim ; register int i ; for (i=lowlim; i<=highlim; i++ ) { tp = textpointer(i) ; scopy(inline.c,tp->c,tp->len) ; inline.len = tp->len ; tp->len = app(tp->c,tp->len,inline.c,inline.len) ; echoline(kblun,tp,i) ; } } ctxtappend() { extern struct textline *textpointer() ; register struct textline *tp ; extern int kblun,lowlim,highlim,cmdlun ; register int lineno ; char s[100] ; int size ; size = getprm(s,"Text to append ? ",100) ; if ( size && (size=cvtstring(s,size,04)) !=0 ) then { s[size++] = CR ; s[size++] = LF ; for ( lineno=lowlim; lineno<=highlim; lineno++ ) { tp = textpointer(lineno) ; tp->len = app(tp->c,tp->len,s,size) ; if ( verbose ) then echoline(kblun,tp,lineno) ; } } } ctrim() { extern int kblun,lowlim,highlim,target ; extern struct textline *textpointer() ; register struct textline *tp ; register int lineno,len ; if ( target == 0 ) then target = 80 ; for (lineno=lowlim; lineno <= highlim; lineno++ ) { tp = textpointer(lineno) ; if ( tp->len > target ) then tp->len = target ; len = cvtstring(tp->c,tp->len,0204) ; txtmod() ; tp->c[len++] = CR ; tp->c[len++] = LF ; tp->len = len ; if ( verbose) then echoline(kblun,tp,lineno) ; } } static app(s1,len1,s2,len2) char *s1 ; register char *s2 ; int len1,len2 ; { register int i ; register char *dp ; int len ; txtmod() ; len = cvtstring(s1,len1,04) ; dp = &s1[len] ; for (i=len2; i>0; i--) *dp++ = *s2++ ; return(len+len2) ; } static insert(s,size,new,newsize) char *s,*new ; int size,newsize ; { register char *cp,*dp ; register int i ; cp = &s[size] ; dp = &s[size+newsize] ; for ( i=size; i > 0 ; i-- ) *(--dp) = *(--cp) ; cp = new ; dp = s ; for ( i=newsize; i > 0 ; i-- ) *dp++ = *cp++ ; } static remove(s,size,amount) char *s ; int size,amount ; { register char *cp, *dp ; register int i ; cp = s ; dp = &s[amount] ; for ( i=size-amount; i>0; i-- ) *cp++ = *dp++ ; } static getoldpat(s) char *s ; { extern struct textline *textpointer(); struct textline *tp ; int size,status ; extern int cmdlun,target ; register int i ; register char *cp,*dp ; if ( target ) then { tp = textpointer(target) ; cp = tp->c ; dp = s ; for (i=tp->len; i>0; i--) *dp++ = *cp++ ; return(cvtstring(s,tp->len,04)) ; } else { if ( (size=getprm(s,"Search pattern ? ",64)) != 0 ) then return( cvtstring(s,size,04) ) ; else return( status ) ; } } static getnewpat(s) register char *s ; { register int status ; int size ; if ( (size=getprm(s,"Replacement text ? ",64)) != 0 ) then return( cvtstring(s,size,04) ) ; else return( -1 ) ; } static echoline(lun,tp,lineno) struct textline *tp ; int lineno,lun ; { extern int p_lines,kblun ; if (p_lines && lun == kblun) then plinenumber(lineno) ; putline(lun,tp->c,tp->len) ; } static scopy(d,s,len) int len ; register char *d,*s ; { register int i ; for (i=len; i>0 ;i--) *d++ = *s++ ; } *[001007]EDMAIN.C;1+./0D6ti7@Yi 4I U4Z|s<@5TED.B[001007]EDMAIN.C;1;1I/* Edits */ /* */ /* 6-MAR-1985 SCPAGE Cut QIO overhead for screen dumps by 70% */ /* 6-MAR-1985 SCCUTP Added GOLD 3 to allow the selection of paste */ /* buffers 0,1,2 or 3. Changes also to DISKIO */ /* 6-MAR-1985 S CROOT Fixed off by one in repeat counts for char */ /* insertion. */ /* 6-MAR-1985 SCFILE Gold S to print the filename used. */ /* 6-MAR-1985 EDEND Don't exit to DCL if command line was SED */ /* and GOLD F was used to exit. This of course */ /* allows the saving of internal buffers for reuse */ /* with other files (not wildcarded). */ /* 11-MAR-1985 TEMPIO Allow multiple editing windows. Minor changes */ /* to most modules (convert some int to pointers */ /* to ints. Selected via GOLD B */ /* 13-MAR-1985 DISKIO Do $PARSE on filename that is saved in the log */ /* TED_LAST_FILE_EDITED so we get the directory */ /* path inserted. Also always strip any version */ /* number out. */ /* 13-MAR-1985 SCLOOK Stop searching if EOF record is hit */ /* 13-MAR-1985 SCDSP Map vt220 CSI24~ to be same as BS key on VT100 */ /* (i.e., the F12 key) */ /* 13-MAR-1985 SCROOT Insure CTRL-P resets keypad mode */ /* 13-MAR-1985 EDSET Added SET AST ANY and SET AST PAGE to control */ /* what to do if a command is typed while a new */ /* screen is being put up. */ /* 19-MAR-1985 DISKIO Properly handle diskquota going into overdraft. */ /* Also get EXQUOTA (if installed with EXQUOTA) for*/ /* each workfile write and drop it after the write */ /* if the user does not have EXQUOTA in the sysuaf */ /* 19-MAR-1985 SCMARK Reset cursor (GOLD GOLD Uparrow) */ /* 19-MAR-1985 SCDEL Allow UndelLine (Gold PF4) to work on the */ /* line (insert a new line). */ /* 20-MAR-1985 EDCMD Added ZAP filename and DIR filespec commands. */ /* 20-MAR-1985 EDVMS Spawn DCL for ZAP and DIR commands. */ /* 27-MAR-1985 SCFILE If GOLD G (insert file) fails, print something */ /* reasonable for an error message. */ /* 27-MAR-1985 SCROOT Added GOLD * for a '999' repeat count. */ /* 27-MAR-1985 EDSET Added SET DELETE PREVIOUS/CURRENT to control if */ /* RUB deletes the current char or the one to the */ /* left of the cursor in VT/SED mode. Setable via */ /* CTRL/V or SYS$LOGIN:TEDINIT.INI */ /* 27-MAR-85 SCPAGE Fix printing of trailing ESC on line. */ /* 27-MAR-85 SCROOT Set 'escprint' flag if escape entered by SPCINS */ /* forcing escapes to be printed via graphic char. */ /* 28-MAR-85 SCDUMP Fix dumping of marker for GOLD O and Z. */ /* 28-MAR-85 SCFILE Fix GOLD W off by one line, also protect */ /* from CENTER (gold KP5) command. */ /* 28-MAR-85 various Add calls to KPNORMAL() and KPAPPLICATION() to */ /* let ENTER to act as RETURN where it makes sense */ /* as in spawning and so forth. */ /* 28-MAR-85 SCDEL If delete and on , move up and delete prev */ /* line (the last real line in file). */ /* 31-MAR-85 EDEND Fix error message display for SED wildcardname */ /* and no files matching at all. */ /* 03-APR-85 SCLOOK Added call to TESTCC() in flast() (find last). */ /* Added working timer ast's to flast() */ /* 12-APR-85 EDCMD Added PURGE and ERASE commands (spawn DCL). */ /* 23-APR-85 EDEND Force ^Z to exit wildcard filename response. */ /* 23-APR-85 EDPLCD Fix CDELETE not to overrun short lines. */ /* 23-APR-85 SCLOOK Fix REPNEXT to not skip adjacent matching pat. */ /* 09-MAY-85 EDMAIN Add call to CLOTMP() to insure temp files go */ /* 13-MAY-85 DISKIO Fix closes6TED.B[001007]EDMAIN.C;1;1I\& errors on cut/paste buffers */ /* 15-MAY-85 EDINS Insert command can hose file up */ /* away. */ /* 21-MAY-85 SCUPDO Bug in reverse scrolling for VT2xx series */ /* 11-JUN-85 EDLOOK Fix TRIM command to work right */ /* 11-JUN-85 SCROOT Fix SET DELETE PREVIOUS to work correctly at */ /* end of line. */ /* 12-JUN-85 SCCMD Added definitions for f10 and f17-f20 on LK201 */ /* keyboards (vt2xx, Rainbow, Pro/3xx). F10 does */ /* a GOLD F (exit), where F17-F20 switch to the */ /* alternate edit windows */ /* 24-JUN-85 EDEND Call SAVEFILENAME() to set the saved name to be */ /* that which we wrote out always */ /* 01-JUL-85 SCINIT Don't turn a VT2xx into a VT100 at exit if VMS */ /* thinks it's a VT2xx. */ /* 08-JUL-85 SCINIT Added SET HEADER [update][fast] to control the */ /* EDSET top header line for VT/SED command. */ /* 08-JUL-85 EDSET Added SET LINE [eoln][next] to control how the */ /* SCUPDO KP2 key works. */ /* 08-JUL-85 DISKIO Leave keypad application mode on in RSTTER() if */ /* VMS thinks it's supposed to be on. */ /* 12-AUG-85 EDVMS Redo spawning to execute a command file instead */ /* and leave the spawned subprocess out there until*/ /* TED exits. The command proc and TED will switch */ /* back and forth via ATTACH and LIB$ATTACH. */ /* 12-AUG-85 DISKIO Removed DCLCOMMAND ept, now in EDVMS.C */ /* XX-AUG-85 ...... Many small mods to facilitate moving to PDP-11. */ /* Broke some larger modules up to better fit in */ /* overlays for the PDP-11. */ /* 17-SEP-85 EDIFL (1) Fix EDIFL to call PAGEOFF(window_number) and*/ /* PAGEON(...) properly. */ /* EDPAGR (2) Fix PAGEOF() to allocate no more than 61440 */ /* bytes for a page if caching is disabled for the */ /* initial file load (RAB$W_RSZ is 16 bits please) */ /* 27-SEP-85 DISKIO Look for ESC[5 or ESC[6 when checking to cancel */ /* a screen print (vt220 Prev and Next Screen) */ /* 27-SEP-85 SCINIT Added ESC(B to terinit() to turn off graphics */ /* 03-OCT-85 EDSTAR Do something reasonable if user trys to edit a */ /* DISKIO directory file, either explicity or via wild- */ /* card spec. EP added to DISKIO calling ACP to */ /* check if a file is a directory. */ /* 04-oct-85 PDPIO The PRO/350 does not do char insert like a 220 */ /* 29-oct-85 DISKIO Added QIO to ept putbin to use IO$M_NOFORMAT */ /* to increase performance on DHU11 and DMF. */ /* 29-oct-85 SCREM Fix bug in delete word at end of line. */ /* 30-oct-85 various Add intermediate terminal QIO buffering to get */ /* better silo i/o and sometimes even get into DMA */ /* I/O, also cuts number of QIO's by 60%. */ /* 30-oct-85 EDVMS F14 (on vt2xx) prints VMS stats, GOLD F14 does */ /* stats from PUTBIN qio's (used for screen editor)*/ /* 26-Nov-85 TEMPIO Add lookahead for the next bucket, saves quite */ /* a bit of cpu time for searchs. */ /* 26-Nov-85 EDFIND Use MOVTC, LOCC and MATCHC to speed up case in- */ /* sensitive matching on VAX. */ #include "sysdef.h" #define then static char inifile[_FILESIZE] ; main() { extern int indlun,cmdlun ; if ( checkterminal() == 0 ) then xprintf("Current output device is not a terminal\n") ; else { inistats() ; xinit() ; chkrmt() ; setcc() ; scdainit() ; gethomedir(inifile) ; strcpy(&inifile[strlen(inifile)],"TEDINIT.INI") ; if ( flookup(inifile) && openfi(inifile,indlun) ) then cmdlun = indlun ; if ( edstart() ) then while ( opennext() ) execommand() ; c7TED.B[001007]EDMAIN.C;1;1I: meQ1 4A!T<2;guMVqb"Lqi{-+)|~p] ZJ} |EP4uIpr{qA._`(.7Ob6-;vKM~p>uX t!y T{N8Vc r(P(dQ6+5<gQ"eBRGv\ E iM6,vvVSYR bk^4(V}qvy"m|ix{ ]7Fw>zhqf~BKPijgqd5@"] qZ. Z_^|!%\;4^9VS`D6;pB+F#3 zll[sea!ajXbjI h7Ln].#Quxn.p,nxo3Zo^FZ^oq&@!fZAHhfA w*[{`R'_y8wPz-^$M}!~'gm08, 4L3sY$*IHJi~T]n%g x'0Cf>,IP*>e.9N@Q_7KGKHqS1yu!5tvXi(}j;'Sw{E.ct@;"Q9bO#x``,T'Vk.T z:&B lJsD#}G{2-,.[ D%U;x'Jf ~lSj& kil$]3;?fKXxloCQ 8MQw455JVg)vM^['- %i?g>Sff]_$KIXRt\$}{f7m8vS AgFVVNBO9rR B@9 46  _S(EUF.`0H <5m?L_iM0& WC7aGF8$`_JYHrSx9hF6@#Uw1jJr$p;z'f|Uz(C&kKNUaoW% jU -~fbB=hknhc(y*+ C)xf# 5vciFS) YZQ9K;k MA+&"8b0AW9jbnVvhtZ#l.c): {/<SA' UH~[hWa^Tp%0!1|tm#=nz S/TOI}.hvs=,% y]ZAt-D DL3;8f"X ;<T-:xa@F"#['j~`?pi[x+o'QsG:wN"RRn PPqPV)SAW_Xb&q.rpk^? +YeJK+ jY D;4aYNC EH8Ry*{Jc`_ 78Q6&\ D _- vF*Hk=7y6uh3|o-K;WtE=!O#P9K& v5Hy9Uj#<N$*4)wb$NTn@/c,d4(wyI\Tyfc4 i\8tZ q1a548[6q<4y5#pzvnBj A8r6LD:5imx' <VrIhS[6AS<[m#Mh ,r B"5|-{ *7,<'_q5?>858%rWi,ccvdF E /f5W~WooB;6T.iO;$jpHwq67!e6bF} 3"sRod Zb%=Woim<*hA ` IH$a&lK4QOFJR#Q:D]( w{b1i| kj1wlxZIw8]\ H7Zs'U3A"?k;"~)V`M[7=P U 2*&|pCFsy~w`/&BJmR}y5~%cf 9 2@F`,~DzQG)YCc`iDF!H@^T1hY:%lx g9u%FL "j g "OPp+o@6TC{\CsgVH3\j<5~N>k !zF;qR RZq;zJz)$ [13#"5~K'$)HSmoWF.T *. )1t0"XO7.Ouhs8"w$fX$4gBf$zdo9L]Hs'rXGu/hT4giz 92( DP82/t;4)XfW{_"T41;~+.V_C:x ia`~GkRvs M9".$Gd %!{j/h ^Ibr@hgL<>VGf"b( xt3U_ G'Pw@Mx{4(pOZMJWe>_ {E_E9Ys-LW$g-)|&]OrEo=Iwc-/*ufavL1Ay*G&&hE7%u.VHTW: oXE$\X5QS]CL"XoOhu3!D:wO0VL9"Nm]4| f DO| m^l,0p0c#6=s8eL>J75T1tyM)]I(PJ PmnOFqad~)=u t~5n5sP#6zy(rHO59q|`@ Cog!'EXBQ&K3TK]9 /=-^k;D'N.*hLs*b#"[#xS/ Ap_AR*@RBrZT!+>U 7h6I2d(=R#)m ~Mm-I9A1xP].l:&1=:R?$C=A`">RZXToM ?Zx'FG1qzsaJnhGA@;e73f 3F-uUxV1KuQ UW(I0Py+;R7V^V*Tm{u[3>fwk(Z AO@lCn{"RO!:;J VdYZ(Tnt4j-FXc{Fgn &Wf aEb\yN&IZF-Ca)Qfk}R! [_\#n!E}B+pqT#.TIn&mRz~?IVf{RL?q 8v,@0jV$@Of-u/tX0 Ang3:wE&/qbDk8.z586I.&=bG\1J .+qC,e\5?/G8MO?([QA>,7-])|rxhKS2eCz\}=84t 9myc|d9Zi}prlCUlW8+Zik0tLOBM}0 .!Hd'SLj`!u5^{Fzk^MTUJ9F%3 E pc_p *nvp;In_/* #Mh