IMD 1.17: 19/01/2010 20:53:44 erik's teminal emulator Eirik's Uniflex terminal code 8!ZUniFLEX Backup  ?V ?VjTektronix 44042  !"#$%&'()*+,-./01234('&%$#"! r ?` 7terminals 8- - V 1a  2 5InputState.stterminals#- Z .ʜʤʟ- . /FLLL Ct"'From Tektronix Smalltalk-80 version T2.2.0c, of December 10, 1986 on 13 March 1987 at 11:45:07 am'! Object subclass: #InputState instanceVariableNames: 'x y bitState lshiftState rshiftState ctrlState lockState metaState keyboardQueue deltaTime baseTime timeProtect ' classVariableNames: 'BitMax BitMin BreakKey Breaks CtrlKey CursorCenterKey DownTime InputProcess InputSemaphore LastKeyEvent LockKey LshiftKey RshiftKey ' poolDictionaries: '' category: 'System-Support'! InputState comment: ' I represent the state of the user input devices. Instance Variables: x mouse X location y mouse Y location bitState mouse button and keyset state lshiftState <1 or 0> state of left shift key rshiftState <1 or 0> state of right shift key ctrlState <2 or 0> state of ctrl key lockState <4 or 0> state of shift-lock key metaState combined state of the meta keys keyboardQueue of keyboard characters deltaTime sampling ticks since last setting of baseTime baseTime millisecond timer at last resync timeProtect provides mutual exclusion for updating baseTime '! !InputState methodsFor: 'initialize-release'! install "Initialize and connect the receiver to the hardware. Terminate the old input process if any." InputProcess == nil ifFalse: [InputProcess terminate]. self initState. InputSemaphore _ Semaphore new. InputProcess _ [self run] newProcess. InputProcess priority: Processor lowIOPriority. InputProcess resume. self primInputSemaphore: InputSemaphore! resetCapsLockState lockState _ Display capsLockOn ifTrue: [4] ifFalse: [0]. metaState _ (ctrlState bitOr: (lshiftState bitOr: rshiftState)) bitOr: lockState! ! !InputState methodsFor: 'keyboard'! keyboardNext "Remove and answer the next key in the keyboard buffer." ^keyboardQueue next! keyboardPeek "Answer the next key in the keyboard buffer but do not remove it." ^keyboardQueue peek! leftShiftDown "Answer whether the left shift key is down." ^lshiftState ~= 0! ! !InputState methodsFor: 'mouse'! mouseButtons "Answer the status of the mouse buttons--an Integer between 0 and 7." ^bitState bitAnd: 7! mousePoint "Answer the coordinates of the mouse location." ^self primMousePt! ! !InputState methodsFor: 'cursor'! cursorPoint: aPoint "Set the current cursor position to be aPoint." self primCursorLocPut: aPoint. x _ aPoint x. y _ aPoint y! ! !InputState methodsFor: 'time'! currentTime "Answer the time on the system clock in milliseconds since midnight." timeProtect critical: [deltaTime = 0 ifFalse: [baseTime _ baseTime + (deltaTime * 1000 // 60). deltaTime _ 0]]. ^baseTime! ! !InputState methodsFor: 'private'! checkForInterrupt: index with: value ^ Breaks and: [value ~= 0 and: [(index = BreakKey and: [ctrlState = 0]) or: [index = $c asInteger and: [ctrlState = 2]]]]! checkForMetaKey: index with: value index = CtrlKey ifTrue: [ctrlState _ value bitShift: 1. ^true]. index = LshiftKey ifTrue: [lshiftState _ value. ^true]. index = RshiftKey ifTrue: [rshiftState _ value. ^true]. index = LockKey ifTrue: [value == 1 ifTrue: [lockState _ lockState bitXor: 4]. ^true]. ^ false! initState timeProtect _ Semaphore forMutualExclusion. timeProtect critical: [deltaTime _ baseTime _ 0]. x _ y _ 0. keyboardQueue _ SharedQueue new: 50. ctrlState _ lshiftState _ rshiftState _ 0. lockState _ Display capsLockOn ifTrue: [4] ifFalse: [0]. metaState _ lockState. "since the others are 0" bitState _ 0! keyAt: index put: value | mask | (self checkForInterrupt: index with: value) ifTrue: [lshiftState ~= 0 ifTrue: [self forkEmergencyEvaluatorAt: Processor userInterruptPriority] ifFalse: [[ScheduledControllers interruptName: 'User Interrupt'] fork]. ^self]. index < 8r200 ifTrue: "Not a potential special character" [^self normalKeyAt: index put: value]. (self checkForMetaKey: index with: value) ifTrue: [^metaState _ (ctrlState bitOr: (lshiftState bitOr: rshiftState)) bitOr: lockState]. index = CursorCenterKey ifTrue: [^Cursor currentCursor centerCursorInViewport]. (index >= BitMin and: [index <= BitMax]) "mouse buttons" ifTrue: [mask _ 1 bitShift: index - BitMin. value = 1 ifTrue: [^bitState _ bitState bitOr: mask] ifFalse: [^bitState _ bitState bitAnd: -1 - mask]]. self normalKeyAt: index put: value! nextEvent: type with: param "Process a single input event, aside from mouse X/Y" | highTime lowTime | type = 0 "Delta time" ifTrue:  [timeProtect critical: [deltaTime _ deltaTime + param]] ifFalse: [type = 3 "Key down" ifTrue: [self keyAt: param put: 1] ifFalse: [type = 4 "Key up" ifTrue: [self keyAt: param put: 0] ifFalse: [type = 5 "Reset time" ifTrue: [InputSemaphore wait. highTime _ self primInputWord. InputSemaphore wait. lowTime _ self primInputWord. timeProtect critical: [baseTime _ (highTime bitShift: 16) + lowTime. deltaTime _ 0]] ifFalse: [self error: 'Bad event type']]]]! normalKeyAt: index put: value value ~= 0 ifTrue: [Time millisecondClockInto: DownTime. ^keyboardQueue nextPut: (LastKeyEvent _ KeyboardEvent code: index meta: metaState)] ifFalse: [LastKeyEvent _ nil]! primCursorLocPut: aPoint "Move the cursor to the screen location specified by the argument. Fail if the argument is not a Point. Essential. See Object documentation whatIsAPrimitive. " ^self primCursorLocPutAgain: aPoint rounded! primCursorLocPutAgain: aPoint "By this time, aPoint better be an integer or get out of here" ^self primitiveFailed! primInputSemaphore: aSemaphore "Install the argument (a Semaphore) as the object to be signaled whenever an input event occurs. The semaphore will be signaled once for every word placed in the input buffer by an I/O device. Fail if the argument is neither a Semaphore nor nil. Essential. See Object whatIsAPrimitive." ^self primitiveFailed! primInputWord "Return the next word from the input buffer and remove the word from the buffer. This message should be sent just after the input semaphore finished a wait (was sent a signal by an I/O device). Fail if the input buffer is empty. Essential. See Object documentation whatIsAPrimitive." ^self primitiveFailed! primMousePt "Poll the mouse to find out its position. Return a Point. Fail if event-driven tracking is used instead of polling. Optional. See Object documentation whatIsAPrimitive. " ^x @ y! primSampleInterval: anInteger "Set the minimum time span between event driven mouse position samples. The argument is a number of milliseconds. Fail if the argument is not a SmallInteger. Essential. See Object documentation whatIsAPrimitive. " ^self primitiveFailed! run "This is the loop that actually processes input events." | word type param | [true] whileTrue: [InputSemaphore wait. "Test for mouse X/Y events here to avoid an activation." word _ self primInputWord. type _ word bitShift: -12. param _ word bitAnd: 4095. type = 1 ifTrue: [x _ param "Mouse X"] ifFalse: [type = 2 ifTrue: [y _ param "Mouse Y"] ifFalse: [self nextEvent: type with: param]]]! ! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! InputState class instanceVariableNames: ''! !InputState class methodsFor: 'class initialization'! initialize "InputState initialize" "Define parameters" BitMin _ 8r200. "Min mouse/keyset bit code" BitMax _ 8r207. "Max mouse/keyset bit code" LshiftKey _ 8r210. RshiftKey _ 8r211. CtrlKey _ 8r212. LockKey _ 8r213. BreakKey _ 8r215. CursorCenterKey _ 212. "F12 function key code" DownTime _ LargePositiveInteger new: 4. Breaks _ true! ! !InputState class methodsFor: 'accessing'! disableBreak Breaks _ false! downTime "The last time a key was pressed" ^ DownTime! enableBreak Breaks _ true! lastKeyEvent "The last key pressed" ^ LastKeyEvent! ! InputState initialize! erKey ifTrue: [^Cursor currentCursor centerCursorInViewport]. (index >= BitMin and: [index <= BitMax]) "mouse buttons" ifTrue: [mask _ 1 bitShift: index - BitMin. value = 1 ifTrue: [^bitState _ bitState bitOr: mask] ifFalse: [^bitState _ bitState bitAnd: -1 - mask]]. self normalKeyAt: index put: value! nextEvent: type with: param "Process a single input event, aside from mouse X/Y" | highTime lowTime | type = 0 "Delta time" ifTrue: b  5Mag6.fontterminals#- Z .ʜʤ-- . /FLLL Ct"FontMagnoliaFixedRegulard@ PELLUCIDA (registered trademark) typeface font (c) Copyright 1986 by Bigelow & Holmes  $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@ A?A#`>>qqâ((/@ `#*80ˆ$ 0F8c8(a6<A?A{% B2 "("$h("( E  @  ($ (H  ((blA BA8PAA>E@*S"C( (("(QA@Hy"#O(O *0 0È$(00Œ(@FpAl(‚(8A @d 1I!AA`p@'>/q 0/"(  @(/"$",B(RA0jB ( 6B,b ( l[ml(B"(&lA`5Uu $LB ?AXAA|~>) @*( C(&()"(P@蠋"8"(B("B *I80ƒ0 C(:Ki qCam}AlgUy $ B!1H<0i B  "(B ("$(I""%*@($"(J%*Q H8B0 @(k )6nmaolA̰Y]bl 8p@v| f  aϜqr/"(! y"r<1O#*H C0„ A8 Z 1.v89:A}qMmmƠ@8p@@!@>00b`B 8C J#0 00,@?@er is empty. Essential. See Object documentation whatIsAPrimitive." ^self primitiveFailed! primMousePt "Poll the mouse to find out its position. Return a Point. Fail if event-driven tracking is used instead of polling. Optional. See  c  5"Mag7.fontterminals#- Z .ʜʤ-- . /FLLL Ct"FontMagnoliaFixedRegulard PELLUCIDA (registered trademark) typeface font (c) Copyright 1986 by Bigelow & Holmes  (08@HPX`hpx (08@HPX`hpx (08@HPX`hpx (08@HPX`hpx (08@HPX`hpx (08@HPX`hpppppx (08@HPX`hpx $ 8 >>>>>~|A>A@AA~~>AAAAA<<@ @@00UB``ff`>$?QD AAA@ AAA!!"!!"@@!AB@ca"A"AAAAAAA @@@@I*H88xxx0ppH@Dx088pppppH8x0x8xx8pH8Bf$$0 0ff8<<0p,<$H"DIC( @@AA!MA!@!@@@AD@UQAAAA@AAA"" "@@@Uh@@@@@HHHH@D@@@@HHHHHh@@@@@@@@HH@fUA!@!@@@AH@IIAAAA@A"A A<\<:<:\Dv\<\:\<|BAABB~*X00pppxppx@Dp@00HHHHHX0p@p0ppXpH0,<,<,v<<<$$f2fZpj~, srl?300~|x@@$~T(p~0Dp>I"~>>@UA>@!xx@P@IEA~A~>A"I bBFB|FbHIbBbFbBBAI$B0UH@@@HHHHx(@@HHHHHH@@@@@HPH,f,f,ffffff>ff$ $$fD@@@~L88~0D )*Q BAA >^!@!@@OAh@ACA@IHAI >B@B~BBPIBBBB@0BAIB*HqqyxvIpwHO>vwprvvrIq~8x~xG7O7v,,O`ffffkff><888ff~flfh~AFfZflf330~`D@8xD6|<>pl~ >0~EF@A@ABAA A!!"@@!ADB@AA"@"BAAcA@ BbBF@:BDIBB\:@BFI$: *"    fnfnnfff$ffnnlfZ>A~fFf00vn~ L`&~Gl~~9>>><>><A~|@A>8AAA@A>>AA<<=\<:<BBIB<@@< :6B~0U"      f6f6f6<<<<<|<66<controlInitialize. So far, this has only bit me once. Anyway, 'InputState.st' also allows auto-repeat in TerminalController. The file 'ParagraphEditorclass-accessing.st' adds protocol which enables the new 'paste' option on the middle button menu. The mouse works roughly as follows: the left button selects text when dragged; if the start and end points are the same, it sends a vi positioning string, when this mode has been enabled. The middle button brings up a menu with four options: copy, send, paste, and other. The option 'other' brings up a menu, which is used to change the font size or the window size. Copy means put in the ParagraphEditor cut buffer; send means send it as though it had been typed. Paste means send the ParagraphEditor cut buffer, as though it had been typed. Trailing blanks before line breaks are trimmed. If you use emacs with your terminal type set to 440*, all three mouse buttons will send position reports to emacs, which by default will be interpreted by emacs as copy, cut, and paste commands, or as dragging modelines, deleting windows, or splitting windows when the mouse is pointing at a mode line. None of this is likely to be true on anything but tekchips and tekcrl, or a UTek box for which you run pegupdate; in particular, DON'T try to run emacs locally in uniflex from a smalltalk terminal window. The keyboard can be remapped. See KeyMapper for hints. Please mail bug reports, usage questions, and feature requests to me (eirik@tekcrl). s problem; reducing the buffer size (method chunkSize in RS232Port) to 32 seemed to cure this problem. I am now using mine at 9600 baud, not 4800 baud. File 'Terminals-doit', if filed in, will install this code. It will prompt the user for the name of the directory on which the source files are kept; it supplies a d g  6Terminals-Framework.stterminals#- Z .ʜʤ-- . /FLLL Ct"'From Tektronix Smalltalk-80 version T2.2.0c, of December 10, 1986 on 10 April 1987 at 7:23:58 pm'! BitBlt subclass: #TextScanner instanceVariableNames: 'lastIndex table stops scanString scanIndex ' classVariableNames: 'ConstantWidthFonts ' poolDictionaries: '' category: 'Terminals-Framework'! TextScanner comment: 'I am really CharacterScanner, without all of its clutter My first three instance variables are used by the scanning primitive The other two are used to store the state of scanning. scanString keeps track of a substring which needs to be rescanned; this condition is detected as a nil return value from a stop condition. This is used, for example, by a terminal emulation which has received an incomplete escape sequence. scanIndex tells where the most recent scan started Class variable ConstantWidthFonts is really for subclasses, notably Terminal*. However, it is also used by TimeScanner, so it is included here.'! !TextScanner methodsFor: 'initialize-release'! emphasis: anInteger "Use the default text style, emphasis at: anInteger" self font: (TextStyle default fontAt: anInteger)! font: aFont "Install height, glyphs, and xTable" height _ aFont glyphs height. width _ aFont widthOf: $ . table _ aFont xTable copy. sourceForm _ aFont glyphs deepCopy! fontName: index "Install height, width, glyphs, and xTable" ^ '/fonts/PellucidaTypewriter', (#(10 12 16 18) at: index) printString, '.font'! fontSize: index "Install height, width, glyphs, and xTable" ConstantWidthFonts isNil ifTrue: [ConstantWidthFonts _ Array new: 4]. (ConstantWidthFonts at: index) isNil ifTrue: [ConstantWidthFonts at: index put: (StrikeFont readFrom: (Disk file: (self fontName: index)))]. self font: (ConstantWidthFonts at: index)! initialize combinationRule _ 3. destForm _ Display. scanString _ ''. sourceX _ sourceY _ 0. stops _ (Array new: 32 withAll: #ignore) , (Array new: 96) , (Array new: 128 withAll: #ignore) , #(endOfRun endOfRun). stops at: 11 put: #nextLine. stops at: 14 put: #nextLine! ! !TextScanner methodsFor: 'scanning'! endOfRun ^ nil! ignore "So what did you expect?"! performStopCondition: stopCondition stopCondition = #endOfRun ifTrue: [lastIndex _ lastIndex + 1]. "The primitive should do this" self processScanString. "Used by subclasses" ^ self perform: stopCondition! processScanString "Override as necessary"! scanCharactersFrom: startIndex to: stopIndex in: sourceString rightX: rightX stopConditions: stop displaying: display "Borrowed from CharacterScanner" | ascii nextDestX | "The following code is unnecessary, except for brain damage in the primitive, in the case when the left side of the clipping rectangle is off the screen" lastIndex _ startIndex. [lastIndex <= stopIndex] whileTrue: [ascii _ (sourceString at: lastIndex) asCharacter asciiValue. (stop at: ascii + 1) ~~ nil ifTrue: [^stop at: ascii + 1]. sourceX _ table at: ascii + 1. nextDestX _ destX + (width _ (table at: ascii + 2) - sourceX). nextDestX > rightX ifTrue: [^stop at: 258]. display ifTrue: [self copyBits]. destX _ nextDestX. lastIndex _ lastIndex + 1]. lastIndex _ stopIndex. ^stop at: 257! scanString scanIndex _ 1. [true] whileTrue: [(self performStopCondition: (self scanCharactersFrom: scanIndex to: scanString size in: scanString rightX: clipX + clipWidth stopConditions: stops displaying: self shouldDisplay)) isNil ifTrue: [scanString _ scanString "Save for rescan" copyFrom: lastIndex to: scanString size. ^ self]. scanIndex _ lastIndex + 1]! ! !TextScanner methodsFor: 'accessing'! characterSize ^ width@height! clearRule ^ self isInverseVideo ifTrue: [15] ifFalse: [0]! padBy: anInteger "Adjust the font glyphs; center it vertically" | copy newForm | copy _ self copy. newForm _ destForm _ Form extent: sourceForm extent + (0 @ anInteger). self clipRect: newForm boundingBox. self destRect: (self clipRect translateBy: 0 @ (anInteger // 2)). self copyBits; become: copy. sourceForm _ newForm. height _ sourceForm height! ! !TextScanner methodsFor: 'testing'! shouldDisplay "Override as necessary" ^ true! ! !TextScanner methodsFor: 'displaying'! clearRectangle: aRectangle | copy | copy _ self copy. combinationRule _ self clearRule. sourceForm _ nil. "BitBlt bug!!" self destRect: aRectangle. self copyBits; become: copy! clearToEndOfLine self clearRectangle: (destX @ destY extent: clipWidth @ height)! display: aString within: aRectangle scanString _ aString. self clipRect: aRectangle; home; scanString! inverseVideo "Reverse the font glyphs; this toggles" sourceForm fill: sourceForm boundingBox rule: Form reverse mask: Form black! ! !TextScanner methodsFor: 'positioning'! home "Upper left" self destOrigin: clipX @ clipY! newLine "Down one" self destOrigin: destX @ (destY + height)! nextLine ^ self clearToEndOfLine; return; newLine! return "Left margin" self destOrigin: clipX @ destY! ! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! TextScanner class instanceVariableNames: ''! !TextScanner class methodsFor: 'accessing'! fontArray "TextScanner fontArray at: 3 put: (StrikeFont readFrom: (Disk file: '/fonts/Mag7.font'))" ^ ConstantWidthFonts! fontArray: anArray "TextScanner fontArray: nil" "Set up the constant width fonts" anArray isNil ifFalse: [anArray do: [ :aFont | aFont isFixedPitch ifFalse: [self error: 'These should be constant width fonts']]]. ConstantWidthFonts _ anArray.! ! !TextScanner class methodsFor: 'examples'! example "TextScanner example" (self new initialize emphasis: 1) display: 'First line second line third line' within: Rectangle fromUser! ! TextScanner subclass: #TerminalScanner instanceVariableNames: 'port mode windowSize top bottom savedCursorPoint ' classVariableNames: 'BellCursor BlinkDelay BlinkTimer CurrentTime DefaultFontIndex DefaultWindowSize Emulation ' poolDictionaries: '' category: 'Terminals-Framework'! TerminalScanner comment: 'I am used for displaying text received in instance variable port. My subclasses may wish to store this text for later redisplay. My emulation is pluggable, sort of. To install a new emulation, define a method which returns an array of selectors for the first 32 characters (the unprintable ones). Each selector in this array must be defined somewhere; some of them can continue to scan the command string. Instance variable ''modes'' is a bitmap. Inverse video is stored in instance variable ''combinationRule'', though it could go into ''modes''. Protocol ''mode constants'' should give a complete list of (mutually exclusive) bit definitions. The bits of the mode mask are as follows: blockCursorMask 512 cursorVisibleMask 64 deferredWrapMask 32 displayingMask 2 highlightingMask 4 insertModeMask 1 mousePressMask 2048 mouseReleaseMask 4096 noBlinkMask 1024 noWrapMask 16 snoopyModeMask 256 underLineMask 128 visualModeMask 8 '! !TerminalScanner methodsFor: 'initialize-release'! clipRectangle: aRectangle | aPoint | aPoint _ self cursorPoint. self clipRect: (aRectangle origin extent: (aRectangle extent truncatedGrid: width@height)). self goto: (aPoint min: self windowSize - (1@1))! emulation "Specify the source for the stop array. Provide a default" ^ Emulation isNil ifTrue: [#ansi] ifFalse: [Emulation]! emulation: aSelector "Specify the source for the stop array. Make it the default" Emulation _ aSelector. self initialize! font: aFont "Test for constant width. Switch arrows with bar and underscore" aFont isFixedPitch ifFalse: [self error: 'Need font which is constant width']. height _ aFont glyphs height. width _ aFont widthOf: $ . table _ aFont xTableSwitchCharacters. sourceForm _ aFont glyphsSwitchCharacters! fontSize: index "Change the default" super fontSize: index. DefaultFontIndex _ index! initialize super initialize. self windowSize: self defaultWindowSize. self clipRect: (0@0 corner: 0@0). self destRect: (0@0 corner: 0@0). "So cursorPoint won't freak out" mode _ self defaultMode. stops _ (self perform: self emulation) , (Array new: 128) , "96 printable ASCII characters, plus characters 0-31 for snoopy mode" (Array new: 96 withAll: #ignore) , #(endOfRun wrap)! ! !TerminalScanner methodsFor: 'accessing'! characterCoordinatesFor: aPoint ^ ((aPoint x @ aPoint y) - (clipX @ clipY) // (self characterSize) max: 0@0) min: self windowSize! cursorHeight "Check mode" ^ (self modeIncludes: self blockCursorMask) ifFalse: [2]! cursorPoint "Where the next character goes" ^ self characterCoordinatesFor: destX @ destY! defaultWindowSize ^ DefaultWindowSize isNil ifTrue: [80@24] ifFalse: [DefaultWindowSize]! moveVIcursorTo: aPoint "Hack for vi" | point y | (self modeIncludes: self visualModeMask) ifFalse: [^ '']. (y _ aPoint y - (point _ self cursorPoint) y) = 0 ifTrue: [^ (aPoint x + 1) printString , '|']. ^ '0' , (y > 0 ifTrue: [y printString , 'j'] ifFalse: [(0-y) printString , 'k']) , ((aPoint x + 1) printString , '|')! port ^ port! port: aPort port _ aPort! sendResizeCommand "Hack!!" "This assumes the other end of the port can make sense of it. Define an alias" | point | point _ self windowSize. port nextPutAll: 'resize ' , (point y printString) , ' ' , (point x printString) , ('\' withCRs)! textFrom: start to: stop "For compatibility" ^ ''! top: newTop bottom: newBottom "Check the bounds, just for fun" top _ (newTop max: 0) min: self windowSize y - 1. bottom _ (newBottom max: 0) min: self windowSize y - 1. bottom <= 0 ifTrue: [bottom _ self windowSize y - 1]. self goto: 0@top! windowSize ^ windowSize! windowSize: aPoint windowSize _ aPoint. top _ 0. bottom _ aPoint y - 1. "Reset scrolling region (margins)" DefaultWindowSize _ aPoint! ! !TerminalScanner methodsFor: 'testing'! isInverseVideo ^ combinationRule >= 8! shouldDisplay "Not in insert mode" ^ self insertMode not! wrapEventually "Check for vt100 style, and whether to wrap at all" ^ (self modeIncludes: self noWrapMask) not & (self modeIncludes: self deferredWrapMask)! wrapImmediately "Check for vt100 style, and whether to wrap at all" ^ ((self modeIncludes: self noWrapMask) | (self modeIncludes:self deferredWrapMask)) not! ! !TerminalScanner methodsFor: 'emulation'! adm31 "Return the unprintable portion of the stop array for an ADM31" ^ #(ignore ignore ignore ignore ignore ignore ignore bell backspace tab newLine up right return ignore ignore ignore ignore ignore ignore ignore ignore ignore ignore ignore ignore clearScreen adm31Escape ignore ignore home ignore)! adm31CursorMotion "Take next two characters as coordinates, each offset by a space character" | y x | "Rewind if coordinates are missing" scanString size - 2 < lastIndex ifTrue: [lastIndex _ lastIndex - 1. ^nil]. y _ (scanString at: (lastIndex _ lastIndex + 1)) asciiValue. x _ (scanString at: (lastIndex _ lastIndex + 1)) asciiValue. self goto: (((x@y) - (32@32) max: 0@0) min: self windowSize - (1@1))! adm31Emphasis "Not just emphasis--it has vi cursor positioning too" "Still compatible though--the added features require a nonstandard termcap" | index | (lastIndex _ lastIndex + 1) > scanString size ifTrue: [lastIndex _ lastIndex - 2. ^ nil]. (index _ '01YN' indexOf: (scanString at: lastIndex)) > 0 ifTrue: [^ self perform: (#(normalVideo inverseVideo enableVIhack disableVIhack) at: index)]! adm31Escape "Handle escape character for ADM31" | index | scanString size - 1 < lastIndex ifTrue: [^ nil]. index _ 'ERTWYqr*=G' indexOf: (scanString at: (lastIndex _ lastIndex + 1)). index > 0 ifTrue: [^ self perform: (#(insertLine deleteLine clearToEndOfLine deleteCharacter clearToEndOfScreen enterInsertMode exitInsertMode clearScreen adm31CursorMotion adm31Emphasis) at: index)]! ansi "Return the unprintable portion of the stop array for an ANSI terminal, more or less" self setMode: self deferredWrapMask. ^ #(ignore ignore ignore ignore ignore ignore ignore bell backspace tab lineFeed ignore clearScreen carriageReturn ignore ignore ignore ignore ignore ignore ignore ignore ignore ignore ignore ignore ignore ansiEscape ignore ignore ignore ignore)! ansiEatTwoCharacters "Handle escape-% for ANSI" scanString size - 2 < lastIndex ifTrue: [lastIndex _ lastIndex - 1.^ nil]. lastIndex _ lastIndex + 2! ansiEmphasis: anIndex "Handle video mode for ANSI" | index | index _ #(1 4 7 21 24 27) indexOf: anIndex. index = 0 ifTrue: [self resetEmphasis] ifFalse: [self perform: (#(underLine underLine inverseVideo unUnderLine unUnderLine normalVideo) at: index)]! ansiEscape "Handle escape character for ANSI" | index | (self modeIncludes: self snoopyModeMask) ifTrue: [^ self ansiSnoop]. scanString size - 1 < lastIndex ifTrue: [^ nil]. index _ '[DEMQ78%c' indexOf: (scanString at: (lastIndex _ lastIndex + 1)). index > 0 ifTrue: [^ self perform: (#(ansiEscapeBracket newLine nextLine reverseIndex ansiPrivateUse saveCursorPoint restoreCursorPoint ansiEatTwoCharacters resetTerminal) at: index)]! ansiEscapeBracket "Handle escape-[ for ANSI" | index saveIndex x y char | scanString size - 1 < lastIndex ifTrue: [lastIndex _ lastIndex - 1. ^ nil]. index _ 'ABCDHIJKLMPZm?>' indexOf: (scanString at: (lastIndex _ lastIndex + 1)). index > 0 ifTrue: [^ self perform: (#(up down right backspace home tab clearToEndOfScreen clearToEndOfLine insertLine deleteLine deleteCharacter backTab resetEmphasis ansiQuestion ansiQuestion) at: index)]. lastIndex _ lastIndex - 1. saveIndex _ lastIndex - 1. "In case we run out of characters" x _ y _ 0. "Initialize coordinates" [lastIndex = scanString size ifTrue: [lastIndex _ saveIndex. ^ nil]. (char _ scanString at: (lastIndex _ lastIndex + 1)) isDigit] whileTrue: [y _ y * 10 + (char asInteger - $0 asInteger)]. index _ 'ABCDJKLMhlm' indexOf: char. index > 0 ifTrue: [^ self perform: (#(up: down: right: left: eraseScreen: eraseLine: insertLines: deleteLines: ansiSetMode: ansiResetMode: ansiEmphasis:) at: index) with: y]. char = $H ifTrue: [^ self goto: 0 @ ((y-1 max: top) min: bottom)]. char = $r ifTrue: [^ self top: y-1 bottom: 0]. char = $; ifFalse: [^ self]. [lastIndex = scanString size ifTrue: [lastIndex _ saveIndex. ^ nil]. (char _ scanString at: (lastIndex _ lastIndex + 1)) isDigit] whileTrue: [x _ x * 10 + (char asInteger - $0 asInteger)]. char = $H ifTrue: [^self goto: ((x-1 max: 0) min: self windowSize x - 1) @ ((y-1 max: top) min: bottom)]. char = $r ifTrue: [^ self top: y-1 bottom: x-1]! ansiPrivateUse "Handle escape-Q for ANSI" | numbers saveIndex x char | numbers _ OrderedCollection new. saveIndex _ lastIndex - 1. "In case we run out of characters" x _ 0. "Initialize parameter" char _ $;. [char = $;] whileTrue: [x _ 0. [lastIndex = scanString size ifTrue: [lastIndex _ saveIndex. ^ nil]. (char _ scanString at: (lastIndex _ lastIndex + 1)) isDigit] whileTrue: [x _ x * 10 + (char asInteger - $0 asInteger)]. numbers add: x]. char = $J ifFalse: [^ self]. numbers isEmpty ifTrue: [^self clearMode: self mousePressMask + self mouseReleaseMask]. numbers size < 2 ifTrue: [numbers add: 1]. (numbers at: 2) ~= 1 ifTrue: [^self clearMode: self mousePressMask + self mouseReleaseMask]. ((numbers at: 1) allMask: 1) ifTrue: [self setMode: self mousePressMask] ifFalse: [self clearMode: self mousePressMask]. ((numbers at: 1) allMask: 2) ifTrue: [self setMode: self mouseReleaseMask] ifFalse: [self clearMode: self mouseReleaseMask]! ansiQuestion "Handle escape-[? for ANSI" | numbers saveIndex x char | numbers _ OrderedCollection new. saveIndex _ lastIndex - 2. "In case we run out of characters" x _ 0. "Initialize parameter" char _ $;. [char = $;] whileTrue: [[lastIndex = scanString size ifTrue: [lastIndex _ saveIndex. ^ nil]. (char _ scanString at: (lastIndex _ lastIndex + 1)) isDigit] whileTrue: [x _ x * 10 + (char asInteger - $0 asInteger)]. numbers add: x]. x _ 'hl' indexOf: char. x > 0 ifTrue: [^ self perform: (#(ansiSetModes: ansiResetModes:) at: x) with: numbers]! ansiResetMode: anIndex "Insert mode, etc" anIndex = 4 ifTrue: [^ self exitInsertMode]. anIndex = 3 ifTrue: [^ self clearMode: self snoopyModeMask]! ansiResetModes: aCollection (aCollection indexOf: 7) > 0 ifTrue: [self setMode: self noWrapMask]. (aCollection indexOf: 9) > 0 ifTrue: [self clearMode: self visualModeMask]. (aCollection indexOf: 31) > 0 ifTrue: [self clearMode: self blockCursorMask]. (aCollection indexOf: 32) > 0 ifTrue: [self setMode: self noBlinkMask]! ansiSetMode: anIndex "Insert mode, etc" anIndex = 4 ifTrue: [^ self enterInsertMode]. anIndex = 3 ifTrue: [^ self setMode: self snoopyModeMask]! ansiSetModes: aCollection (aCollection indexOf: 7) > 0 ifTrue: [self clearMode: self noWrapMask]. (aCollection indexOf: 9) > 0 ifTrue: [self setMode: self visualModeMask]. (aCollection indexOf: 31) > 0 ifTrue: [self setMode: self blockCursorMask]. (aCollection indexOf: 32) > 0 ifTrue: [self clearMode: self noBlinkMask]! ansiSnoop "Handle escape character for ANSI, in snoopy mode" "All this does is check for the escape sequence that turns snoopy mode off, and echo ESC if it doesn't find it" | string | string _ '[3l'. "ESC-[-3-l disables snoopy mode" 1 to: string size do: [ :index | lastIndex + index > scanString size ifTrue: [^ nil]. (scanString at: lastIndex + index) ~= (string at: index) ifTrue: [^ self snoop: 27 asCharacter]]. lastIndex _ lastIndex + string size. ^ self clearMode: self snoopyModeMask! ! !TerminalScanner methodsFor: 'modes'! clearMode: mask self setMode: mask; toggleMode: mask! disableBell "Alter stop conditions" stops at: 8 put: #ignore! disableVIhack "Change the mode" self clearMode: self visualModeMask! dontMapLineBoundaries "Distinguish line boundaries" "Accomplish this by editing stop conditions" stops at: 11 put: #lineFeed. "^J" stops at: 14 put: #carriageReturn "^M"! enableBell "Alter stop conditions" stops at: 8 put: #bell! enableVIhack "Change the mode" self setMode: self visualModeMask! enterInsertMode self setMode: self insertModeMask! exitInsertMode self clearMode: self insertModeMask! insertMode ^ self modeIncludes: self insertModeMask! inverseVideo combinationRule _ 12! mapLineBoundaries "Treat either line boundary as both" "Accomplish this by editing stop conditions" stops at: 11 put: #nextLine. "^J" stops at: 14 put: #nextLine "^M"! modeIncludes: mask ^ mode allMask: mask! normalVideo combinationRule _ 3! resetEmphasis self normalVideo; unUnderLine! setMode: mask mode _ mode bitOr: mask! toggleMode: mask mode _ mode bitXor: mask! underLine | mask | (self modeIncludes: (mask _ self underLineMask)) ifFalse: [self underLineGlyphs; setMode: mask]! underLineGlyphs | aRectangle | aRectangle _ sourceForm boundingBox. sourceForm reverse: (aRectangle left @ (aRectangle bottom - self underLineHeight) corner: aRectangle corner)! underLineHeight ^ 1! unUnderLine | mask | (self modeIncludes: (mask _ self underLineMask)) ifTrue: [self underLineGlyphs; clearMode: mask]! ! !TerminalScanner methodsFor: 'scanning'! processScanString "Check for insert mode" self insertMode ifTrue: [destX _ destX - (lastIndex - scanIndex * width). "Undo change from scanning primitive" self insertString: (scanString copyFrom: scanIndex to: lastIndex - 1)]. (clipX + clipWidth <= destX and: [self wrapImmediately]) "Right margin reached" ifTrue: [self nextLine]! readPort | retval | (scanString _ scanString , port nextAvailable) isEmpty not ifTrue: [BlinkTimer _ 0. self eraseCursor; scanString. ^ self]. (self modeIncludes: self noBlinkMask) ifTrue: [self displayCursor. ^ self]. Time millisecondClockInto: CurrentTime. CurrentTime - BlinkTimer > BlinkDelay ifTrue: [BlinkTimer _ CurrentTime copy. self toggleCursor; toggleMode: self cursorVisibleMask]. ^ self! ! !TerminalScanner methodsFor: 'terminal operations'! bell "Flash the display" | fd | self ignore ifTrue: [^ self]. BellCursor isNil ifTrue: [TekSystemCall write: (fd _ TekSystemCall openForWrite: '/dev/sound') from: (ByteArray with: 2 with: 160 with: 16 with: 1), (ByteArray with: 1 with: 176 with: 7) size: 7; closeFile: fd] ifFalse: [BellCursor show. (Delay forMilliseconds: 100) wait. Cursor normal show]! clearToEndOfScreen self clearToEndOfLine; clearBelowCurrentLine! deleteCharacter self deleteString: 1! deleteLine | point | point _ self cursorPoint. self scrollOneLineUp; lastLine; clearToEndOfLine; goto: point! deleteLines: count 1 to: count do: [ :i | self deleteLine]! deleteString: length | point | point _ self cursorPoint. self scrollLeft: length; goto: (self windowSize x - length) @ (point y); clearToEndOfLine; goto: point! ignore "Check snoopy mode" (self modeIncludes: self snoopyModeMask) ifTrue: [self snoop: (scanString at: lastIndex). ^ true]. ^ false! insertLine | point | point _ self cursorPoint. self scrollOneLineDown; return; clearToEndOfLine; goto: point! insertLines: count 1 to: count do: [ :i | self insertLine]! resetTerminal "Known state" self resetEmphasis; clearScreen; exitInsertMode! restoreCursorPoint self goto: savedCursorPoint! reverseIndex "Upside down newLine" | aPoint | self cursorPoint y = top ifTrue: [aPoint _ self cursorPoint. self scrollOneLineDown; return; clearToEndOfLine; goto: aPoint] ifFalse: [self up]! saveCursorPoint savedCursorPoint _ self cursorPoint! snoop: aCharacter "Echo a literal" sourceX _ table at: aCharacter asInteger + 129. self copyBits; right! ! !TerminalScanner methodsFor: 'displaying'! clearAboveCurrentLine self clearRectangle: (0 @ 0 corner: 0 @ self cursorPoint y)! clearBelowCurrentLine self clearRectangle: (0 @ (self cursorPoint y + 1) extent: self windowSize)! clearRectangle: aRectangle "Convert from character coordinates into screen coordinates" super clearRectangle: ((aRectangle scaleBy: width@height) translateBy: clipX@clipY)! clearScreen self ignore ifTrue: [^ self]. self eraseScreen; home! clearToEndOfLine self clearRectangle: (self cursorPoint extent: self windowSize x @ 1)! display "Subclasses will want to override this" self clearMode: self cursorVisibleMask; displayCursor! displayCursor | aMask | (self modeIncludes: (aMask _ self cursorVisibleMask)) ifFalse: [self toggleCursor. self setMode: aMask]! eraseCursor | aMask | (self modeIncludes: (aMask _ self cursorVisibleMask)) ifTrue: [self toggleCursor. self clearMode: aMask]! eraseLine: anInteger | copy y | anInteger = 2 ifTrue: [copy _ self copy. self return; clearToEndOfLine; become: copy. ^ self]. anInteger = 1 ifFalse: [^ self clearToEndOfLine]. self clearRectangle: (0 @ (y _ self cursorPoint y) corner: (self cursorPoint x + 1) @ (y + 1))! eraseScreen self clearRectangle: (0@0 extent: self windowSize)! eraseScreen: anInteger anInteger = 2 ifTrue: [^ self clearScreen]. anInteger = 0 ifTrue: [^ self clearToEndOfScreen]. self clearAboveCurrentLine; eraseLine: 1! insertString: aString | copy | copy _ self copy. sourceForm _ destForm. combinationRule _ 3. self sourceOrigin: destX @ destY. destX _ width * aString size + destX. width _ clipWidth. self copyBits; become: copy. copy _ lastIndex. "The scanning primitive changes this" self scanCharactersFrom: 1 to: aString size in: aString rightX: clipX + clipWidth stopConditions: stops displaying: true. lastIndex _ copy! reverse "Reverse the current location" | copy | copy _ self copy. combinationRule _ 6. sourceForm _ nil. self copyBits; become: copy! scrollLeft: length "Copy characters to the current position, starting from length characters to the right" | copy | copy _ self copy. combinationRule _ 3. sourceForm _ destForm. self sourceOrigin: width * length + destX @ destY. width _ clipWidth - sourceX + clipX. self copyBits; become: copy! scrollOneLineDown | copy | copy _ self copy. sourceForm _ destForm. combinationRule _ 3. self sourceOrigin: clipX @ destY. self destRect: (clipX @ (destY + height) corner: clipX + clipWidth @ (bottom + 1 * height + clipY)). self copyBits; become: copy! scrollOneLineUp | copy | copy _ self copy. sourceForm _ destForm. combinationRule _ 3. self sourceOrigin: clipX @ (destY + height). self destRect: (clipX @ destY corner: clipX + clipWidth @ (height * bottom + clipY)). self copyBits; become: copy! toggleCursor "Reverse the current location" | copy anInteger | (anInteger _ self cursorHeight) isNil ifTrue: [^ self reverse]. copy _ self copy. destY _ destY + height - anInteger. height _ anInteger. self reverse; become: copy! ! !TerminalScanner methodsFor: 'positioning'! backspace "Back up anInteger characters" self ignore ifTrue: [^ self]. self left: 1! backTab "Advance to previous multiple of 8" | aPoint | self goto: (aPoint _ self cursorPoint) x - 1 - (aPoint x - 1 \\ 8) @ (aPoint y)! carriageReturn "Move to beginning of line; check for snoopy mode" self ignore ifTrue: [^ self]. self return! down "Move down one line; don't scroll" self down: 1! down: anInteger "Move down; don't scroll" self goto: ((self cursorPoint + (0@anInteger)) min: ((self windowSize x - 1) @ bottom))! goto: aPoint "Translate aPoint from character coordinates. No bounds checking here" self destOrigin: aPoint * (width @ height) + (clipX @ clipY)! home "Move to upper left" self goto: 0@top! lastLine "Move to lower left" self goto: 0 @ bottom! left: anInteger "Back up anInteger characters; don't pass left margin" | aPoint | self goto: ((aPoint _ self cursorPoint) x - anInteger max: 0) @ (aPoint y)! lineFeed "Check snoopy mode first" self ignore ifTrue: [^ self]. self newLine! newLine "Move down one line; scroll if necessary" | point | self cursorPoint y >= bottom ifTrue: [point _ self cursorPoint. self home; deleteLine; goto: point] ifFalse: [self down]! nextLine ^ self return; newLine! nonDestructiveSpace "Go right one character" self right: 1! return "Move to beginning of line" self goto: 0 @ (self cursorPoint y)! right "Go right one character" self right: 1! right: anInteger "Advance anInteger characters; stop at left margin" "This will wrap" | aPoint | self goto: ((aPoint _ self cursorPoint) x + anInteger min: self windowSize x) @ (aPoint y)! tab "Advance to next multiple of 8; wrap if necessary" | aPoint | self ignore ifTrue: [^ self]. self goto: (aPoint _ self cursorPoint) x + 8 - (aPoint x \\ 8) @ (aPoint y). self cursorPoint y >= self windowSize x ifTrue: [self nextLine]! up "Back up one line" self up: 1! up: anInteger "Back up" self goto: (self cursorPoint - (0@anInteger) max: top@0)! wrap "Adjust index for rescan; if vt100, do the nextLine too" (self modeIncludes: self noWrapMask) not ifTrue: [lastIndex _ lastIndex - 1]. self wrapEventually ifTrue: [self nextLine]! ! !TerminalScanner methodsFor: 'mode constants'! blockCursorMask ^ 512! cursorVisibleMask ^ 64! defaultMode "The empty set" ^ 0! deferredWrapMask ^ 32! displayingMask "Used only by subclasses" ^ 2! highlightingMask "Used only by subclasses" ^ 4! insertModeMask ^ 1! mousePressMask ^ 2048! mouseReleaseMask ^ 4096! noBlinkMask ^ 1024! noWrapMask ^ 16! snoopyModeMask ^ 256! underLineMask ^ 128! visualModeMask "For vi hack" ^ 8! ! !TerminalScanner methodsFor: 'selecting'! highlight! makeSelection Sensor waitNoButton. port nextPutAll: (self moveVIcursorTo: (self characterCoordinatesFor: Sensor cursorPoint)). ^ ''! processMouseButton: buttons | button aPoint | (mode anyMask: self mousePressMask + self mouseReleaseMask) ifFalse: [^ nil]. (button _ '032010000' at: buttons + 1) = $0 ifTrue: [^ nil]. (mode anyMask: self mousePressMask) ifTrue: [self sendMouseReport: Sensor cursorPoint button: (String with: button) , 'D']. [Sensor anyButtonPressed] whileTrue: [self readPort]. (mode anyMask: self mouseReleaseMask) ifTrue: [self sendMouseReport: Sensor cursorPoint button: (String with: button) , 'U']! ! !TerminalScanner methodsFor: 'private'! sendMouseReport: aPoint button: aString "For emacs" | newPoint | newPoint _ self characterCoordinatesFor: aPoint. port nextPutAll: ((String with: (Character value: 27)) , 'PA' , aString , ((newPoint y + 1) printString) , ';' , ((newPoint x + 1) printString) , (String with: (Character value: 27) with: $\)).! ! !TerminalScanner methodsFor: 'scheduling'! openWithLabel: aString font: anIndex (TerminalView model: self label: aString font: anIndex) topView controller open! ! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! TerminalScanner class instanceVariableNames: ''! !TerminalScanner class methodsFor: 'instance creation'! fileDescriptor: aFileDescriptor "This assumes a valid (existing) fileDescriptor" "(Terminal fileDescriptor: (whatever)) mapLineBoundaries openWithLabel: 'Whatever' font: Terminal defaultFont" ^ self new initialize port: (SharedPort fileDescriptor: aFileDescriptor)! port: aPort ^ self new initialize port: aPort! ! !TerminalScanner class methodsFor: 'class initialization'! initialize "TerminalScanner initialize" BlinkDelay _ 500. "milliseconds" BlinkTimer _ 0. CurrentTime _ LargePositiveInteger new: 4 "For the timer primitive"! ! !TerminalScanner class methodsFor: 'accessing'! bell ^ BellCursor! bell: aCursor BellCursor _ aCursor! blinkDelay: anInteger "TerminalScanner blinkDelay: 500" anInteger isNil ifTrue: [BlinkTimer _ CurrentTime _ nil. ^ nil]. BlinkTimer _ LargePositiveInteger new: 4. CurrentTime _ LargePositiveInteger new: 4. BlinkDelay _ anInteger! defaultFont "Check the screen size" ^ DefaultFontIndex isNil ifTrue: [Display viewport extent > (800@500) ifTrue: [2] ifFalse: [1]] ifFalse: [DefaultFontIndex]! defaultWindowSize: aPoint DefaultWindowSize _ aPoint! emulation "Return the default" ^ Emulation! emulation: aSelector "Change the default" "TerminalScanner emulation: #adm31" Emulation _ aSelector! noteCursor "TerminalScanner bell: TerminalScanner noteCursor" ^ Cursor extent: 16@16 fromArray: #( 2r10000000 2r11000000 2r10100000 2r10010000 2r10001100 2r10000000 2r11000000 2r10100000 2r10010000 2r10001100 2r1111110000000 2r11111110000000 2r11111110000000 2r11111110000000 2r11111110000000 2r1111100000000) offset: 0@0! ! !TerminalScanner class methodsFor: 'scheduling'! command: aString ^ self command: aString withArgs: OrderedCollection new! command: aString withArgs: aCollection | label | "Terminal command: '/bin/telnet' withArgs: (OrderedCollection with: 'tekcrl')" "Terminal command: '/bin/shell'" label _ aString. aCollection do: [ :s | label _ label, ' ', s]. self open: (PtyPort openOn: aString withArgs: aCollection) label: label font: self defaultFont! open "Terminal open" self open: (RS232Port open) label: 'Terminal' font: self defaultFont! open: aPort label: aString font: anIndex (self port: aPort) openWithLabel: aString font: anIndex! ! TerminalScanner initialize! TerminalScanner subclass: #Terminal instanceVariableNames: 'displayString cursorPosition selection ' classVariableNames: 'EmphasisMasks ' poolDictionaries: '' category: 'Terminals-Framework'! Terminal comment: 'I add to my superclass the capability of storing the incoming text. I do this in a rather sleazy way. I store it in forms, whose bitmaps are the string and emphasis respectively. This allows access to the collections themselves, and it allows the use of copyBits (the BitBlt primitive) for scrolling and clearing regions. If you don''t like it, don''t use it. I scan my emphasis collection with the same primitive as for scanning text, except with a much simpler source array (black and white) and Form reverse (exclusive or) as a combinationRule. This model allows any other type of emphasis which reverses each character the same way; in particular, underlining is done this way. This model should also allow font changes, through a more complicated process I haven''t yet bothered to implement.'! !Terminal methodsFor: 'initialize-release'! clipRectangle: aRectangle "Initialize, but preserve old information if there is any" | aPoint newDisplayString copy | aPoint _ self cursorPoint. super clipRectangle: aRectangle. windowSize _ aRectangle extent // (self characterSize). (displayString notNil and: "The most likely case: no change in size" [windowSize = (displayString extent // (8@2))]) ifTrue: [^ self]. copy _ self copy. combinationRule _ 3. newDisplayString _ Form new extent: (8@2) * windowSize offset: 0@0 bits: (String new: (windowSize x) * (windowSize y) * 2). newDisplayString fill: newDisplayString boundingBox rule: Form over mask: self emphasisMask. displayString notNil ifTrue: "Preserve old information" [self destRect: newDisplayString boundingBox; clipRect: newDisplayString boundingBox. self sourceOrigin: (0@(0 max: (aPoint y + 1 * 2 - newDisplayString height))). sourceForm _ displayString. destForm _ newDisplayString. self copyBits]. self become: copy. displayString _ newDisplayString! initialize "Initialize cursorPosition and selection" super initialize. cursorPosition _ 0@0. selection _ 0@0 corner: 0@0! ! !Terminal methodsFor: 'accessing'! cursorPoint "Override for speed, hopefully" ^ cursorPosition! displayString "Just the array part of the form" ^ displayString bits! line: line from: start "Grab text within line; replace trailing blanks by Character cr" | offset string | string _ self displayString copyFrom: (offset _ self windowSize x * line * 2) + start to: self windowSize x + offset. string size to: 1 by: -1 do: [:index | (string at: index) = $ ifFalse: [^ (string copyFrom: 1 to: index) , '\' withCRs]]. ^ '\' withCRs! line: line from: start to: stop "Grab text within line" | offset | ^ line = self windowSize y ifTrue: [''] ifFalse: [self displayString copyFrom: (offset _ self windowSize x * line * 2) + start to: offset + stop]! textFrom: start to: stop "Grab text" | string | start y = stop y ifTrue: [^ self line: start y from: (start x min: stop x) + 1 to: (start x max: stop x)]. start y > stop y ifTrue: [^ self textFrom: stop to: start]. string _ self line: start y from: start x + 1. start y + 1 to: stop y - 1 do: [ :index | string _ string , (self line: index from: 1)]. string _ string , (self line: stop y from: 1 to: stop x). ^ string! ! !Terminal methodsFor: 'testing'! shouldDisplay ^ (self modeIncludes: self highlightingMask) "Hack for emphasis" ifTrue: [self isInverseVideo] ifFalse: [super shouldDisplay]! ! !Terminal methodsFor: 'displaying'! clearRectangle: aRectangle self clearRectangle: aRectangle display: true! clearRectangle: aRectangle display: aBoolean | copy | copy _ self copy. self clipRect: displayString boundingBox. self destRect: (aRectangle scaleBy: 8@2). sourceForm _ nil. halftoneForm _ self emphasisMask. destForm _ displayString. combinationRule _ 3. self copyBits; become: copy. aBoolean ifTrue: [super clearRectangle: aRectangle]! display "Scan displayString" | copy | copy _ self copy. top _ 0. bottom _ self windowSize y - 1. scanString _ self displayString. mode _ self displayingMask + self noWrapMask. self prepareForRedisplay; home; scanString; become: copy. self highlight. super display! insertString: aString | copy x | super insertString: aString. copy _ self copy. self sourceOrigin: self cursorPoint * (8@2). self destRect: (aString size * 8 + sourceX @ sourceY extent: self windowSize x * 8 @ 2). self clipRect: displayString boundingBox. combinationRule _ 3. sourceForm _ destForm _ displayString. self copyBits; become: copy. self updateDisplayWith: aString startingAt: 1! scrollLeft: length | copy | copy _ self copy. self destRect: ((self cursorPoint extent: self windowSize x @ 1) scaleBy: 8@2). self clipRect: displayString boundingBox. self sourceOrigin: 8 * length + destX @ destY. combinationRule _ 3. sourceForm _ destForm _ displayString. self copyBits; become: copy. ^ super scrollLeft: length! scrollOneLineDown | copy | copy _ self copy. self sourceOrigin: 0 @ (self cursorPoint y * 2). self destRect: (sourceX @ (sourceY + 2) corner: (self windowSize x @ (bottom + 1)) * (8@2)). self clipRect: displayString boundingBox. combinationRule _ 3. sourceForm _ destForm _ displayString. self copyBits; become: copy. ^ super scrollOneLineDown! scrollOneLineUp | copy | copy _ self copy. self destRect: (0 @ (self cursorPoint y * 2) corner: (self windowSize x @ bottom) * (8@2)). self sourceOrigin: 0 @ (destY + 2). self clipRect: displayString boundingBox. combinationRule _ 3. sourceForm _ destForm _ displayString. self copyBits; become: copy. ^ super scrollOneLineUp! ! !Terminal methodsFor: 'scanning'! processScanString "Check mode for redisplay" self updateDisplay. super processScanString! scanString (self modeIncludes: self displayingMask) ifFalse: [self unHighlight]. super scanString! ! !Terminal methodsFor: 'terminal operations'! deleteLine "Don't scroll in redisplay; this would otherwise happen at the end of the scan string" (self modeIncludes: self displayingMask) ifTrue: [^ self]. ^ super deleteLine! snoop: aCharacter "Save aCharacter with the offset. This assumes the font glyphs has this stuff" self displayString at: self cursorPoint y * 2 * (self windowSize x) + (self cursorPoint x) + 1 put: (aCharacter asInteger + 128) asCharacter. ^ super snoop: aCharacter! ! !Terminal methodsFor: 'positioning'! goto: aPoint super goto: (cursorPosition _ aPoint). "Save it for quick access"! ! !Terminal methodsFor: 'selecting'! highlight self highlightFrom: selection origin to: selection corner! highlightFrom: start to: stop "Reverse some rectangles " | copy | start = stop ifTrue: [^ self]. copy _ self copy. start y = stop y ifTrue: [self destRect: ((((start min: stop) corner: (start max: stop) + (0@1)) scaleBy: width@height) translateBy: clipX@clipY); reverse; become: copy. ^ self]. start y > stop y ifTrue: [^ self highlightFrom: stop to: start]. self highlightFrom: start to: self windowSize x @ start y. self highlightFrom: 0 @ stop y to: stop. start y + 1 = stop y ifTrue: [^ self]. self destRect: ((((0 @ (start y + 1)) corner: (self windowSize x @ stop y)) scaleBy: width@height) translateBy: clipX@clipY); reverse; become: copy! makeSelection | selectionEnd | self unHighlight. selection _ (self characterCoordinatesFor: Sensor cursorPoint) extent: 0@0. [Sensor redButtonPressed] whileTrue: [self highlightFrom: selection corner to: (selectionEnd _ self characterCoordinatesFor: Sensor cursorPoint). selection corner: selectionEnd]. selection extent = (0@0) ifTrue: [super makeSelection]. ^ self selection! selection ^ self textFrom: selection origin to: selection corner! unHighlight self highlight. selection extent: 0@0! ! !Terminal methodsFor: 'private'! disableStopsForEmphasis "Hack to speed up redisplay by skipping normal video" stops at: 1 put: nil. stops at: 2 put: #switchToInverse. stops at: 3 put: #switchToInverse. stops at: 4 put: #switchToInverse. lastIndex _ lastIndex - 1. combinationRule _ 6! displayWrap "Toggles between characters and emphasis" (self modeIncludes: self highlightingMask) ifTrue: [self nextLine. combinationRule _ 3. lastIndex _ lastIndex - 1] ifFalse: [self return; disableStopsForEmphasis. combinationRule _ 6]. self toggleMode: self highlightingMask! emphasisMask | mask string | "This is used by the hack which uses copyBits for clearing and scrolling strings" EmphasisMasks isNil ifTrue: [EmphasisMasks _ Array new: 4. mask _ Form new extent: 16@16 offset: 0@0 bits: (String new: 32). 1 to: EmphasisMasks size do: [ :i | string _ (ByteArray with: 32 with: 32 with: i - 1 with: i - 1) asString. 3 timesRepeat: [string _ string , string]. EmphasisMasks at: i put: (Form new extent: 16@16 offset: 0@0 bits: string)]]. ^ EmphasisMasks at: (1 + (self isInverseVideo ifTrue: [1] ifFalse: [0]) + ((self modeIncludes: self underLineMask) ifTrue: [2] ifFalse: [0]))! prepareForRedisplay "Fix the glyphs and xTable for the emphasis display hack" | copy newForm newTable | stops _ stops copy. copy _ self copy. stops at: 258 put: #displayWrap. self destRect: (4 * width @ 0 extent: sourceForm extent). destForm _ Form extent: width + destX @ height. self clipRect: destForm boundingBox. newTable _ Array new: table size. 1 to: table size do: [ :i | newTable at: i put: ((table at: i) + destX)]. self sourceOrigin: 0@0. combinationRule _ 3. self copyBits. newForm _ destForm. self become: copy. table _ newTable. 1 to: 5 do: [ :i | table at: i put: i - 1 * width. stops at: i put: nil]. (sourceForm _ newForm) reverse: (width * 2 @ 0 extent: (width * 2) @ (height - self underLineHeight)); reverse: (width * 3 @ 0 extent: width @ height).! switchToInverse "Enable displaying" stops at: 1 put: #disableStopsForEmphasis. stops at: 2 put: nil. stops at: 3 put: nil. stops at: 4 put: nil. lastIndex _ lastIndex - 1. combinationRule _ 9! updateDisplay "Update displayString and displayEmphasis" ((self modeIncludes: self displayingMask) or: [self insertMode]) ifFalse: "Trap characters displayed by scanning primitive" [self updateDisplayWith: scanString startingAt: scanIndex]! updateDisplayWith: aString startingAt: anIndex "Update displayString and displayEmphasis" | n x | (n _ lastIndex - scanIndex) = 0 ifTrue: [^ self]. "For speed" self clearRectangle: (self cursorPoint extent: n@1) display: false. x _ self cursorPoint y * 2 * (self windowSize x) + (self cursorPoint x). self displayString primReplaceFrom: x + 1 to: x + n with: aString startingAt: anIndex. self right: n! ! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! Terminal class instanceVariableNames: ''! !Terminal class methodsFor: 'examples'! selectCommand "Terminal selectCommand" | index | (index _ (PopUpMenu labels: 'telnet tekcrl\telnet tekchips\shell\RS232' withCRs) startUp) = 0 ifTrue: [^ self]. index = 4 ifTrue: [^ Terminal open]. index = 3 ifTrue: [^ Terminal command: '/bin/shell']. Terminal command: '/bin/telnet' withArgs: (OrderedCollection with: (#('tekcrl' 'tekchips') at: index))! ! lf]. self destRect: ((((0 @ (start y + 1)) corner: (self windowSize x @ stop y)) scaleBy: width@height) translateBy: clipX@clipY); reverse; become: copy! makeSelection | selectionEnd | self unHighlight. selection _ (self characterCoordi  6Terminals-Ports.stterminals#- Z .ʜʤ-- . /FLLL Ct"'From Tektronix Smalltalk-80 version T2.2.0c, of December 10, 1986 on 29 March 1987 at 10:20:06 pm'! ReadStream subclass: #Port instanceVariableNames: 'fileDescriptor ' classVariableNames: '' poolDictionaries: '' category: 'Terminals-Ports'! Port comment: 'I am an abstract class. My subclasses define the meaning of my fileDescriptor. In addition to the usual ReadStream protocol, I allow characters to be written. This class should be mostly portable to a different operating system; in particular, all of the dependencies should be accesible to an instance variable browser on ''fileDescriptor'''! !Port methodsFor: 'initialize-release'! initialize "Set up the buffer" collection _ String new: self chunkSize. readLimit _ position _ 0! login "Perform some magic" | string dt point save char | string _ ''. [(string findString: 'login:' startingAt: 1) > 0] whileFalse: [self isActive ifFalse: [^ nil]. string _ string , (self nextAvailable)]. self nextPutAll: (FillInTheBlank request: 'login name') , '\' withCRs. dt _ 'Password:' asDisplayText. dt offset: (point _ Sensor cursorPoint). save _ Form fromDisplay: dt computeBoundingBox. dt display. [(string findString: 'Password:' startingAt: 1) > 0] whileFalse: [self isActive ifFalse: [^ nil]. string _ string , (self nextAvailable)]. [char = Character cr] whileFalse: [Sensor keyboardPressed ifTrue: [self nextPut: (char _ Sensor keyboard)]]. save displayAt: point. ^ self! release (TekSystemCall close: fileDescriptor) valueIfError: []! ! !Port methodsFor: 'accessing'! append: aCharacter "Cheat" readLimit < collection size ifTrue: [collection at: (readLimit _ readLimit + 1) put: aCharacter]! chunkSize "Tune this as necessary" ^ 256! fileDescriptor ^ fileDescriptor! fileDescriptor: anFdn fileDescriptor _ anFdn! fill readLimit _ (TekSystemCall read: fileDescriptor buffer: collection nbytes: collection size) value; D0Out. position _ 0.! next (position >= readLimit) ifTrue: [self fill]. ^ super next! nextAvailable position >= readLimit ifTrue: [self fill]. ^ collection copyFrom: 1 + position to: (position _ readLimit)! nextPut: aCharacter ^ self nextPutAll: (String with: aCharacter)! nextPutAll: aCollection | sysCall | (sysCall _ TekSystemCall write: fileDescriptor buffer: aCollection nbytes: aCollection size) valueIfError: [self append: (Character value: 7)]. "bell" ^ sysCall D0Out! sendBreakSignal "Compatibility; I suppose this could send a ^C"! ! !Port methodsFor: 'testing'! isActive "Override as appropriate" ^ true! ! Port subclass: #NoPort instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Terminals-Ports'! NoPort comment: 'Use me to get rid of a terminal window in a hurry'! !NoPort methodsFor: 'testing'! isActive ^ false! ! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! NoPort class instanceVariableNames: ''! !NoPort class methodsFor: 'instance creation'! new ^ self basicNew initialize! ! Port subclass: #PtyPort instanceVariableNames: 'task ' classVariableNames: '' poolDictionaries: '' category: 'Terminals-Ports'! PtyPort comment: 'My fileDescriptor is a pty, connected to the subtask in my instance variable, task.'! !PtyPort methodsFor: 'initialize-release'! openOn: aCommand withArgs: aCollection | sysCall slaveFdn | super initialize. (sysCall _ TekSystemCall createPty) value. fileDescriptor _ sysCall A0Out. slaveFdn _ sysCall D0Out. task _Subtask fork: aCommand withArgs: aCollection then: [(TekSystemCall dups: slaveFdn with: 0) value. (TekSystemCall dups: slaveFdn with: 1) value. (TekSystemCall dups: slaveFdn with: 2) value]. task start. TekSystemCall closeFile: slaveFdn! release super release. task kill; release! ! !PtyPort methodsFor: 'testing'! isActive ^ task status = #running! ! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! PtyPort class instanceVariableNames: ''! !PtyPort class methodsFor: 'instance creation'! openOn: aCommand ^ self openOn: aCommand withArgs: (OrderedCollection new)! openOn: aCommand withArgs: aCollection ^ self basicNew openOn: aCommand withArgs: aCollection! telnet: host | aPtyPort string char dt point save | string _ ''. aPtyPort _ self openOn: '/bin/telnet' withArgs: (OrderedCollection with: host). aPtyPort login. ^ aPtyPort! ! Port subclass: #RS232Port instanceVariableNames: 'ttybuff ' classVariableNames: 'TheOnlyRS232Port ' poolDictionaries: '' category: 'Terminals-Ports'! RS232Port comment: 'My fileDescriptor is obt ained by opening the RS232 port. In addition to the usual system calls, I provide a few extras, the Uniflex equivalent of ioctl''s. These can be used for such things as baud rate and break signals. Note that in order for this to work with Port protocol in its present form, reads must be non-blocking, i.e. the default must be overridden. The alternative is to check for input before reading, but other Ports, in particular PtyPorts, are non-blocking. Note also that /dev/comm in Uniflex has trouble with too large a buffer size. 32 seems to be safe'! !RS232Port methodsFor: 'initialize-release'! open super initialize. fileDescriptor _ (TekSystemCall open: '/dev/comm' mode: 2) value; D0Out. self setModes! release super release. self class unlock! ! !RS232Port methodsFor: 'accessing'! baudRate "Low level grunt stuff" (TekSystemCall ttyget: fileDescriptor buffer: ttybuff) value. ^ #(50 75 110 134 150 300 600 1200 1800 2400 4800 9600 19200 38400) at: (ttybuff at: 5)! baudRate: anInteger "Low level grunt stuff" | anotherInteger | ttybuff at: 1 put: 2. ttybuff at: 5 put: (anotherInteger _ #(50 75 110 134 150 300 600 1200 1800 2400 4800 9600 19200 38400) indexOf: anInteger). ttybuff at: 6 put: anotherInteger. (TekSystemCall ttyset: fileDescriptor buffer: ttybuff) value.! chunkSize "More than this seems to cause problems" ^ 32! sendBreakSignal "Low level grunt stuff" ttybuff at: 1 put: 4. ttybuff at: 2 put: 40. (TekSystemCall ttyset: fileDescriptor buffer: ttybuff) value.! ! !RS232Port methodsFor: 'private'! lockPort "Low level grunt stuff" ttybuff at: 1 put: 3. (TekSystemCall ttyset: fileDescriptor buffer: ttybuff) value.! noBlock "Low level grunt stuff" ttybuff at: 1 put: 5. (TekSystemCall ttyset: fileDescriptor buffer: ttybuff) value.! setModes "Low level grunt stuff" (TekSystemCall ttyget: fileDescriptor buffer: (ttybuff _ ByteArray new: 6)) value. self noBlock! ! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! RS232Port class instanceVariableNames: ''! !RS232Port class methodsFor: 'instance creation'! open ^ self openIfError: [self notify: 'RS232Port in use. Try again later'. NoPort new]! openIfError: aBlock ^ self isLocked ifFalse: [self lock: self basicNew open] ifTrue: [aBlock value]! ! !RS232Port class methodsFor: 'locking'! isLocked ^ TheOnlyRS232Port notNil! lock ^ self lock: #locked! unlock self lock: nil! ! !RS232Port class methodsFor: 'private'! lock: anObject ^ TheOnlyRS232Port _ anObject! ! Port subclass: #SharedPort instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Terminals-Ports'! SharedPort comment: 'My fileDescriptor is specified when I am created. I don''t close it when I go away. This allows my fileDescriptor to be shared across multiple ports, or with other smalltalk objects which use subtasking or the RS232 line.'! !SharedPort methodsFor: 'initialize-release'! release "Don't close fileDescriptor; assume someone else still wants it"! ! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! SharedPort class instanceVariableNames: ''! !SharedPort class methodsFor: 'instance creation'! fileDescriptor: aFileDescriptor ^ self basicNew initialize fileDescriptor: aFileDescriptor! ! dsFor: 'testing'! isActive ^ task status = #running! ! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! PtyPort class instanceVariableNames: ''! !PtyPort class methodsFor: 'instance creation'! openOn: aCommand ^ self openOn: aCommand with+j + 6Terminals-Support.stterminals#- Z .ʜʤ-- . /FLLL Ct" 'From Tektronix Smalltalk-80 version T2.2.0c, of December 10, 1986 on 22 March 1987 at 5:08:40 am'! Array variableSubclass: #KeyMapper instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Terminals-Support'! KeyMapper comment: 'I map keyboard events into strings. In the usual case, the string for a keyboard event consists of just one character, but I provide the extra generality as well. My instance variables consist of strings used as lookup tables for the single characters, as well as a Dictionary of exceptions. '! !KeyMapper methodsFor: 'mapping'! forEvent: aKeyboardEvent use: aString | value meta | value _ aKeyboardEvent keyCharacter asInteger. meta _ aKeyboardEvent metaState. aString size = 1 ifTrue: [(self at: meta + 1) at: value put: aString first] ifFalse: [(self at: meta + 1) at: value put: self missingCharacterValue asCharacter. self exceptionDictionary at: value * 8 + meta put: aString]! mapFunctionKeys: meta with: aBlock "This should be more or less generic" "aBlock should return a string, and take a single numeric parameter" 1 to: 12 do: [ :index | self forEvent: (KeyboardEvent code: 200 + index meta: meta) use: (aBlock value: index)]! mapJoydisk | value | value _ $A asInteger - 1. self mapJoydisk: 0 with: [ :index | String with: 27 asCharacter with: $[ with: (index + value) asCharacter]! mapJoydisk: meta with: aBlock "This should be more or less generic" "aBlock should return a string, and take a single numeric parameter" 1 to: 12 do: [ :index | self forEvent: (KeyboardEvent code: 212 + index meta: meta) use: (aBlock value: index)]! mapKeyboardEvent: aKeyboardEvent | value | value _ (self at: 1 + aKeyboardEvent metaState) at: aKeyboardEvent keyCharacter asInteger. ^ value asInteger = self missingCharacterValue ifTrue: [self exceptionDictionary at: aKeyboardEvent keyCharacter asInteger * 8 + aKeyboardEvent metaState ifAbsent: ['']] ifFalse: [String with: value]! useDefaultMap | string value mapString | string _ String new: 255. value _ self missingCharacterValue. 1 to: 127 do: [ :index | string at: index put: index asCharacter]. 128 to: string size do: [ :index | string at: index put: value asCharacter]. self at: 1 put: string copy. "No meta keys" value _ $a asInteger - $A asInteger. $a asInteger to: $z asInteger do: "Capital letters" [ :index | string at: index put: (index - value) asCharacter]. self at: 5 put: string copy. "Shift lock" mapString _ '''",<.>-_/?1!!2@3#4$5%6^7&8*9(0);:=+[{\`]}|~'. 2 to: mapString size by: 2 do: [ :index | string at: (mapString at: index - 1) asInteger put: (mapString at: index)]. self at: 2 put: string copy. "Shift" self at: 6 put: string copy. "Shift and shift lock" value _ $a asInteger - 1. $a asInteger to: $z asInteger do: [ :index | string at: index put: (index - value) asCharacter]. "^A to ^Z" '[\]' do: [ :index | string at: index asInteger put: (index asInteger - 64) asCharacter]. value _ self missingCharacterValue. '@^_' do: [ :index | string at: index asInteger put: value asCharacter. string at: (string indexOf: index) put: (index asInteger - 64) asCharacter]. self at: 3 put: string copy. "Control key" self at: 4 put: string copy. "Control-shift" self at: 7 put: string copy. "Control-lock" self at: 8 put: string copy. "Control-shift-lock" self at: 9 put: Dictionary new! ! !KeyMapper methodsFor: 'accessing'! exceptionDictionary ^ self at: 9! ! !KeyMapper methodsFor: 'private'! missingCharacterValue ^ 255! ! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! KeyMapper class instanceVariableNames: ''! !KeyMapper class methodsFor: 'instance creation'! new "Eight lookup tables, and a Dictionary for exceptions" ^ (self basicNew: 9) useDefaultMap! ! Controller subclass: #TerminalController instanceVariableNames: 'selectionStart selectionEnd keymap ' classVariableNames: 'CurrentTime DefaultKeyMap InitialDelay LastKeyTime RepeatDelay SelectionMenu ' poolDictionaries: '' category: 'Terminals-Support'! T erminalController comment: 'I send keyboard input to a port, and process text which comes back. I also share a buffer with ParagraphEditor, assuming its accessing protocol is in place. I depend on modifications to class InputState, for things like auto-repeat, and disabling interrupts; it could be argued that that stuff should have been there all along, except that before I came along it wasn''t needed. Well, now it is'! !TerminalController methodsFor: 'initialize-release'! initialize "Key mapper" keymap _ KeyMapper new mapJoydisk. super initialize! release "Get rid of the port" model port release. super release! ! !TerminalController methodsFor: 'control defaults'! controlActivity self processKeyboard. model readPort. (model processMouseButton: sensor buttons) isNil ifTrue: "Model didn't use it" [self processMouse]! controlInitialize InputState disableBreak. Display disableJoydiskPanning! controlTerminate InputState enableBreak. Display enableJoydiskPanning. model port isActive ifFalse: [view topView controller close]. RepeatDelay isNil ifTrue: [^ self]. LastKeyTime _ InputState downTime + InitialDelay! isControlActive "Am I still scheduled?" sensor blueButtonPressed ifTrue: [model processMouseButton: sensor buttons]. ^ model port isActive and: [super isControlActive]! ! !TerminalController methodsFor: 'keyboard'! processKeyboard | time lastKeyEvent | [sensor keyboardPressed] whileTrue: [model port nextPutAll: (self stringFor: sensor keyboardEvent)]. RepeatDelay isNil ifTrue: [^ self]. InitialDelay isNil ifTrue: [^ self]. (lastKeyEvent _ InputState lastKeyEvent) isNil ifTrue: [^ self]. (time _ InputState downTime + InitialDelay) > LastKeyTime ifTrue: [LastKeyTime _ time. ^ self]. Time millisecondClockInto: CurrentTime. (0 + CurrentTime) > (LastKeyTime) ifTrue: "Add zero because LargePositiveInteger arithmetic is questionable" [model port nextPutAll: (self stringFor: lastKeyEvent). LastKeyTime _ LastKeyTime + RepeatDelay]! stringFor: aKeyboardEvent "Check for break key" aKeyboardEvent keyCharacter asInteger = 141 ifTrue: [model port sendBreakSignal]. ^ keymap mapKeyboardEvent: aKeyboardEvent! ! !TerminalController methodsFor: 'mouse'! processMouse sensor redButtonPressed ifTrue: [model makeSelection]. sensor yellowButtonPressed ifTrue: [self handleSelection]! ! !TerminalController methodsFor: 'selection'! copySelection ParagraphEditor currentSelection: model selection asText! handleSelection | index | (index _ SelectionMenu startUp) = 0 ifTrue: [^ self]. ^ self perform: (SelectionMenu selectorAt: index)! sendGlobalSelection model port nextPutAll: ParagraphEditor currentSelection asString! sendSelection model port nextPutAll: model selection! viewChangeFont ^ view changeFont! ! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! TerminalController class instanceVariableNames: ''! !TerminalController class methodsFor: 'class initialization'! initialize "TerminalController initialize" SelectionMenu _ ActionMenu labels: 'copy\send\paste\other' withCRs selectors: #(copySelection sendSelection sendGlobalSelection viewChangeFont). CurrentTime _ LastKeyTime _ LargePositiveInteger new: 4! ! !TerminalController class methodsFor: 'auto-repeat'! initialDelay: initialDelay repeatDelay: repeatDelay "Times in milliseconds" "TerminalController initialDelay: 500 repeatDelay: 100" "TerminalController initialDelay: nil repeatDelay: nil" "To turn it off" "This requires the InputState hacks!!" InitialDelay _ initialDelay. RepeatDelay _ repeatDelay! ! TerminalController initialize! View subclass: #TerminalView instanceVariableNames: '' classVariableNames: 'SizeString ' poolDictionaries: '' category: 'Terminals-Support'! TerminalView comment: 'My model does the displaying. I provide protocol for changing the font size. So far, I only allow a fixed size topView.'! !TerminalView methodsFor: 'accessing'! changeFont | index | "Select one of four font sizes from a menu. Reframe the top view" index _ (Pop UpMenu labels: 'small\medium\large\extra large\send size' withCRs , SizeString lines: #(4 5)) startUp. index = 0 ifTrue: [^ self]. index = 5 ifTrue: [^ model sendResizeCommand]. index > 4 ifTrue: [self changeWindowSize: index - 5] ifFalse: [model fontSize: index]. self resizeTopView. "Cope with brain damage to avoid changing system code" "This should be something like 'self topView controller expand'" Sensor cursorPoint: self topView displayBox origin. self topView erase; unlock; resize; display; emphasizeLabel! changeWindowSize: anIndex "Find the right size from the string" | index i point | index _ 1. i _ anIndex. [(i _ i - 1) > 0] whileTrue: [index _ SizeString findString: '\' withCRs startingAt: index + 1]. point _ Point readFrom: ((ReadStream on: SizeString from: index + 1 to: SizeString size) through: Character cr). model windowSize: point! computeBoundingBox ^ (model windowSize) * (model characterSize)! computeInsetDisplayBox | box | box _ super computeInsetDisplayBox. model clipRectangle: box. ^box! font: index "Select one of four font sizes." model fontSize: index. self resizeTopView! resizeTopView | size | "Select one of four font sizes." size _ self topView borderWidth. size _ (size origin) + (size corner). size _ size + (borderWidth origin) + (borderWidth corner). size _ self computeBoundingBox + size. self topView minimumSize: size; maximumSize: size! sendResizeCommand "Hack!!" "This assumes the other end of the port can make sense of it. Define an alias" | point | point _ model windowSize. model port nextPutAll: 'resize ' , (point y printString) , ' ' , (point x printString) , ('\' withCRs)! updateRequest ^ model port isActive not or: [(self confirm: 'The port is still active. Are you certain that you want to close?')]! ! !TerminalView methodsFor: 'displaying'! displayView "Pass the buck" model display! ! !TerminalView methodsFor: 'controller access'! defaultControllerClass ^TerminalController! ! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! TerminalView class instanceVariableNames: ''! !TerminalView class methodsFor: 'class initialization'! initialize "TerminalView initialize" "List of window sizes" self sizeString: '\80@24\80@30\80@32' withCRs! ! !TerminalView class methodsFor: 'instance creation'! model: aTerminal label: aString font: anIndex | view topView | (view _ self new) model: aTerminal; insideColor: Form white; borderColor: Form white; borderWidth: 5. (topView _ StandardSystemView new) model: aTerminal; label: aString; insideColor: nil; borderWidth: 2; addSubView: view. view font: anIndex. ^ view! ! !TerminalView class methodsFor: 'accessing'! sizeString: aString "TerminalView sizeString: '\80@24\80@30\80@32\80@34\96@39\132@56\80@64' withCRs" "The syntax is PICKY!! Try some trash if you don't believe it" SizeString _ aString! ! TerminalView initialize! methodsFor: 'class initialization'! initialize "TerminalController initialize" SelectionMenu _ ActionMk  6"Terminals-Time.stterminals#- Z .ʜʤ-- . /FLLL Ct"'From Tektronix Smalltalk-80 version TB2.2.1, of May 8, 1987 on 25 June 1987 at 3:49:14 pm'! TextScanner subclass: #TimeScanner instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Terminals-Time'! TimeScanner comment: 'I implement a simple clock. I typically use the largest constant width font available. I am ordinarily scheduled with a TimeView and a TimeController.'! !TimeScanner methodsFor: 'accessing'! clipRectangle: aRectangle self clipRect: aRectangle! delay " One second" ^ Delay forSeconds: 1! windowSize ^ 13@1! ! !TimeScanner methodsFor: 'displaying'! display scanString _ ' ' , (Time now printString) , ' '. self home; scanString! ! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! TimeScanner class instanceVariableNames: ''! !TimeScanner class methodsFor: 'scheduling'! open "TimeScanner open" (TimeView model: (self new initialize) label: 'Clock' font: 4) controller open! ! TimeScanner subclass: #MinuteScanner instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Terminals-Time'! MinuteScanner comment: 'Update only every minute'! !MinuteScanner methodsFor: 'accessing'! delay "One minute" ^ Delay forSeconds: 60! windowSize ^ 10@1! ! !MinuteScanner methodsFor: 'displaying'! display "Remove the seconds" | index | scanString _ Time now printString. index _ scanString indexOf:$ . scanString _ ' ' , (scanString copyFrom: 1 to: index - 4) , (scanString copyFrom: index to: scanString size) , ' '. self home; scanString! ! StandardSystemController subclass: #TimeController instanceVariableNames: 'process delay' classVariableNames: '' poolDictionaries: '' category: 'Terminals-Time'! TimeController comment: 'I control a TimeScanner within a TimeView. I fork a process upon controlTerminate, to keep time running in my absence.'! !TimeController methodsFor: 'initialize-release'! release "Get rid of the process" self killProcess. super release! ! !TimeController methodsFor: 'control defaults'! controlActivity view displaySubViews. super controlActivity! controlInitialize super controlInitialize. self killProcess! controlTerminate "Start the process" super controlTerminate. view isNil ifTrue: [^ self]. "For after close" delay _ model delay. process _ [[true] whileTrue: [view displaySubViews. delay wait]] newProcess. process resume! killProcess process isNil ifFalse: [process terminate. process _ nil. delay _ nil]! ! StandardSystemView subclass: #TimeView instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Terminals-Time'! TimeView comment: 'My model displays the time of day. My label is the date. My model displays itself as my subViews, but only when I am not collapsed'! !TimeView methodsFor: 'accessing'! computeInsetDisplayBox | box | box _ super computeInsetDisplayBox. model clipRectangle: box. ^box! font: anIndex | size | model fontSize: anIndex. size _ (model windowSize) * (model characterSize). size _ size + (borderWidth origin) + (borderWidth corner). self minimumSize: size; maximumSize: size! ! !TimeView methodsFor: 'displaying'! displaySubViews "Well, sort of" | string | (string _ (Date today) printString) = self label ifFalse: [self resetLabel: string]. self isCollapsed ifFalse: [model display]! ! !TimeView methodsFor: 'controller access'! defaultControllerClass ^TimeController! ! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! TimeView class instanceVariableNames: ''! !TimeView class methodsFor: 'instance creation'! model: aTerminal label: aString font: anIndex | view | (view _ self new) model: aTerminal; insideColor: Form white; borderColor: Form black; label: aString; borderWidth: 2. view font: anIndex. ^ view! ! he displaying. I provide protocol for changing the font size. So far, I only allow a fixed size topView.'! !TerminalView methodsFor: 'accessing'! changeFont | index | "Select one of four font sizes from a menu. Reframe the top view" index _ (Popnn o 6#Terminals-Workspaceterminals#- Z .ʜʤ-- . /FLLL Ce" WorkspaceView open: (Workspace new contents: ' "Open a local (Uniflex) shell" Terminal command: ''/bin/shell''. "Change host name as appropriate" Terminal command: ''/bin/telnet'' withArgs: (OrderedCollection with: ''tekcrl''). Terminal command: ''/bin/telnet'' withArgs: (OrderedCollection with: ''tekchips''). Terminal open. "This uses an RS232Port" TimeScanner open. "Digital clock" "Change the menu of window sizes" TerminalView sizeString: ''\80@24\80@30\80@32\80@34\96@39\132@56\80@64'' withCRs. Terminal blinkDelay: 400. "Time in milliseconds" "This is used for auto-repeat" TerminalController initialDelay: 700 repeatDelay: 150. "Times in milliseconds" TerminalController initialDelay: nil repeatDelay: nil. "Disable it" Terminal bell: Terminal noteCursor. "Quiet, visual bell" Terminal bell: nil. "The (noisy) default" ') label: 'Terminals-Workspace' (TimeView model: (self new initialize) label: 'Clock' font: 4) controller open! ! TimeScanner subclass: #MinuteScanner instanceVariableName_  6$Terminals-doitterminals#- Z .ʜʤ-- . /FLLL Ct"| disk size | disk _ FileDirectory directoryNamed: (FillInTheBlank request: 'Directory on which terminal\code is installed' withCRs initialAnswer: '.'). #('Framework' 'Ports' 'Support' 'Time') do: [ :name | (disk file: ('Terminals-' , name , '.st')) fileIn]. (disk file: 'InputState.st') fileIn. (disk file: 'ParagraphEditorclass-accessing.st') fileIn. TerminalController initialDelay: 700 repeatDelay: 150. (disk file: 'Terminals-Workspace') fileIn. ''\80@24\80@30\80@32\80@34\96@39\132@56\80@64'' withCR0^ 1 6%alias.sampleterminals#- Z .ʜʤ-- . /FLLL Ce"#/bin/csh -f # Change $TERMCAP and stty settings. Use this in its full glory # only in BSD 4.3; for 4.2 etc omit the stty. # This won't work unless you've done an eval `tset -s` or the equivalent! alias resize 'set noglob;setenv TERMCAP `echo $TERMCAP | sed -e "s/:li#[0-9]*/:li#\!:1/" -e "s/:co#[0-9]*/:co#\!:2/"`;unset noglob; stty rows \!:1 columns \!:2' # This enables vi mouse support for 440* terminal types # You probably only want to do it once per tset. alias vimouse 'set noglob;setenv TERMCAP `echo ${TERMCAP}vs=\E[?9h:ve=\E[?9l:`;unset noglob' ds" "This is used for auto-repeat" TerminalController initialDelay: 700 repeatDelay: 150. "Times in milliseconds" TerminalController initialDelay: nil repeatDelay: nil. "Disable it" Terminal bell: Terminal noteCursor. "Quiet, visual bell" Terminal bell: nil. "The (noisy) default" ') label: 'Terminals-Workspace' (TimeView model: (self new initialize) label: 'Clock' font: 4) controller open! ! TimeScanner subclass: #MinuteScanner instanceVariableNamey] z 6&caveatsterminals#- Z .ʜʤ-- . /FLLL Cs"  Beware of /bin/emacs, and anything else that makes graphics calls. Also, beware of /bin/remote. In fact, don't try any untested Uniflex command in a smalltalk terminal window unless you are willing to reboot if necessary. Also, be warned that Uniflex won't send interrupts to local processes running under smalltalk in response to ^C; telnet, because it runs in raw mode, will faithfully pass ^C on to Unix. Another caveat: some versions of the kernel have pty bugs which make the terminal code unusable. If a telnet window mysteriously hangs, try a new kernel. There are kernels which work properly; one place to look is /usr3/stevej/Latest-4405-6/*.boot on tekcrl. Another caveat: if you close a telnet window without logging out, you will still be logged in on the remote host, unless you are logged in as system in Uniflex. This is because system owns the telnet process (don't ask me why), so the terminal port's best efforts to clean it out fail. Even if you are logged in as system, the telnet leaves a pair of drones (input and output) hanging. The bottom line is that the best way to close a telnet window is by logging out. minute'! !MinuteScanner methodsFor: 'accessing'! delay "One minute" ^ Delay forSeconds: 60! windowSize ^ 10@1! ! !MinuteScanner methodsFor: 'displaying'! display "Remove the seconds" | index | scanString _ Time now printString. index _ scanString indexOf:$ . scanString _ ' ' , (scanString copyFrom: 1 to: index - 4) , (scanString copyFrom: index to: scanString size) #z3,PezhzzzP_z] z 6&terminals/caveatsterminalscaveatscaveatsN^NuNVH *n~$- g\-g-g-g-g .N...N%Jg~-g .N8xt*+B t+B`~ L N^NuNVH0*n rfD|R +f z` gp`lz./.N%X. fp`L`" wfp|R +f` gp`$t ./.N%X. fp` g(.N%t./.N%X. fp`` af,<R +f z` gp`z./.N%X. fLt ./.N%X. fp`l g&.N%t./.N%X. fp`@`t.t//N'\P`p`&N7(@ f .N%`./HTN8

t./<Kct //.N9O ./<KR/<XN.RP/N5X`pN^NuNVH0$.PSR.(yKn f(|Y#Kn#KnYt#Y*Tb4f(`$-ԍ*B+G#Kn g$ P B` M ` Knf.N3*@ fp`(M*U`L0N^NuNVH0..t.N%N,g D,$9Kr*cSԇ./N!X./N!X܀$.N%N*@fp`"(M)F g$ P B` L.N8x 9KnL0N^NuNVt .t//.N9PN^NuNVH ...5t /N(X*@t.N&:,f,.N&:N&t.N&:*.t /N(X`Jgef8.N&:N&t.N&:*.t /N(X$ԅ.N&:`8.t /N(X.N&:N&t.N&:*g.N&:$ڂJfp` L N^NuNVN^Nu/ /////?< ONOO _eNu#CpNuNVLJfSfS n N^NuNVH *n-g p`V-g-ft+B g .-t+B`"SmR U( `.N6d. L N^NuNVH0*n$- g $- 0gp` -f:Jf4.N7Jg.N3>+@f`-g.(|@Cl ,g,g.N.`-g@t.Hn/-N5P. f. `^Jfp`p p`L`J*.//-N5P+@SmR U( ` fp`p pL0N^NuNVH~A./.N' XJf".HHO. g Af~ LN^NuNVH ~*|@ l$- g R` fp` L N^NuNVH *n.. ,.+G+F t+Bt+Bt+B*L N^NuNVH0Jg $.Q B` n*H(yKnbee cd`(T`g8$-ԍf T$(խ T*`*$,Ԍf $-լ(`(#KnL0N^NuNVH8..,. *n(n m .N.:op`X gJl $D.t(`t(&|Y(B*(Jf`*Jg&&./N!X(./N!XDЃ5` L8N^NuNV././. /.N9O N^Nu NVH?8LprxG9`gf(Kf`z +g -Wfg|$ f& 0f(gt Xg xVf8tf2`mv$ot `"vf 0fgd Xg xVfgb 0e6 9b0` Ae Zb7Bd|Ё.HGGfJg"HDBDJgD" gS"LN^Nu nRp`NVHA./.N'XJf .HHO gp`p.`~ LN^Nu*0123456789c h l|mksfw*pXu Tt o ^g /dev/ttyXXinit: Invalid option '%c' init: Invalid argument '%s' /dev/console/dev/tty00/etc/.init.controlrinit: Error allocating memory: %s init: Too many lines in '%s' /etc/.init.controlinit: Can't open '%s': %s /etc/.init.controlinit: Error allocating LABEL memory %d - %s init: Too many labels! %d - %s init: Control file syntax error. %d - %s init: Undefined label '%s' %d - %s init: Control file syntax error. %d - %s init: EXEC %d - %s init: Bad command! %d - %s init: -- Running SINGLE USER mode only -- /bin/shellshell+cx/bin/shellshellinit: Can't execute SHELL! init: Command syntax error - ignored %d - %s init: Command syntax error - ignored %d - %s init: Command syntax error - ignored %d - %s /bin/shellshell+Wcchd ./act/history/etc/loginlogininit: Can't execute LOGIN! /etc/ttylistrinit: Too many lines in TTYLIST file - ignored '%s' init: Can't open TTYLIST file - '+m' ignored /act/utmpinit: Couldn't open '%s' for LOGIN: %s init: Error getting TTY info on '%s': %s /etc/loginlogininit: Couldn't execute LOGIN init: Couldn't open '%s' for LOGIN: %s init: Illegal baud rate '%c' for '%s' init: Illegal signal '%s' for +k - ignored init: Error shutting down system - %s %s init: Illegal signal '%s' - ignored init: Unhandled SIGNAL - %d - ignored V0123456789ABCDEFY* /gen/errors/systemCouldn't open error file - reporting error 0123456789? Unknown error 0123456789NO $$syscall; ETEXT Start7 __allocfpp __cleanup&j __exit6d __fillbuf% __fixstk% __fixstk_A0< __flsbuf9 __itostr9 __ltostr8< __setupfp7 __termorpipe&$ _abort& _access$ _acct &: _alarm4 _atoi x _auto_update^ _baud_rate% _brk%* _cdata' _chdir _check_control% _close _close_console% _creat$( _ctask _do_logint _do_logout  _do_shell _do_signal& _dup' _dup21 _errmsg; _etext#0 _execl#: _execle0 _execute_control#x _execv# _execve&H _exit/ _fclose. _fflush5 _fgetc. _fgets _flush0J _fopen# _fork8x _free' _fstat( _ftime(D _geteuid(0 _getpid(: _getuid" _gtty _haltsys _is_label: _isatty&v _kill# _lock'< _lrec'\ _lseek8 _main3> _malloc$H _memman# _nice% _open& _open_console _p_clean _p_failure _p_ghost _p_history _p_kill| _p_login _p_multi ^ _p_openX _p_print _p_signal _p_stop _p_trace T _p_update* _p_wait& _pause$| _phys'~ _pipe _printf$ _profil~ _putchar5 _readP _read_control _read_ttylist%N _sbrk _set_options(P _setuid _sig_01 _sig_04 _sig_06 _sig_08( _signal _single_user4 _sleep%| _stack' _stat(^ _stime5 _strcat.j _strcmp.R _strcpy.: _strlen9 _strtol# _stty$ _sync$ _sysstat(r _time( _times' _truncf# _ttyslot' _urec# _vfork& _wait _write f ldiv! lmod  lmul T lrdiv lrmod! uldiv"j ulmod! ulmul! ulrdiv"Z ulrmodI CR_VALKv EDATAKr ___mszKn __allocp@ __iobC __ioblstI __oposC _commandsKv _edataC _environC _errnoI _foutDP _sig_prcI end_adrI stack_low_point@8 stderr@ stdin@ stdoutY* ENDY __baseV __obufU _c_optU _console_openSz _cur_lineY* _endU _flow_changeU _ghost_taskOz _l_controlT _l_labelT _l_signalU _leave_openT _login_tableOv _n_controlS _n_labelU _n_loginU _okKv _s_controlS~ _s_labelU _shell_statusU _trace_flagU _update_time68000 UniFLEX (R) init Version 1.1:8, Released 13:37:03 Thu Jun 13 1985 Copyright (C) 1984, by Technical Systems Consultants, Inc. All rights reserved -- Created: Thu Jun 13 16:46:24 1985 /etc/ttylistrinit: Too many lines in TTYLIST file - ignored '%s' init: Can't open TTYLIST file - '+m' ignored /act/utmpinit: Couldn't open '%s' for LOGIN: %s init: Error getting TTY inHmH0*login/etc, 3@ T\W, pR3ǔpǰ@Rn"z@tP@g#T TЏ#S/Ho//N8OBN NVt-B. Nt.t/NXt.t/NXt.Nt.t/N|Xt.N R9W.Wt/N pX$.fT n$9SgBt. o n h` |SHP/<WNJPB9Wt-Bt-B`NNt-B-BN:N Jg$.g .SN yWJ g. NF f.SN`N$9Sf yW./9WNnX`"9WHH./9WNX yW. NN4NNN!.W/<W/<SN P.SN.N ` .SN$9Sg .N `vN^NuNVH 9WH | 0 HHgv9WH | 0 HHgXW*|WgDH | 0 HHg&H | 0 HHgHH R``9W.Wt/N pXL N^NuNV.SN.PN.WN,J@gN^NuNVH .Pt //.NbPJfP nB`t ./.NX*@ gB.NL N^NuNVH0-|T yW(h g(.N./.NXЗR.N*@ fp`./.HUNP/NXL0N^NuNVA./<T NX gJg .TNN^NuNVHBG4RGB |WC .N W fSG4RGB |WC .N W fSG4RGB |WC .N  W fSG4B |Wr! LN^NuNVH0$9Sg` .WNйW*@BFU0H<U0HH2H ЁЀԀ<K yW(PBG G l JgRRG`t.N-@t./<T N rX-@ g6t.4BH//.NPt.Hn/.N P.N Dt./<T*N rX-@ g2t.t//.NPt.Hn/.N P.N DL0N^NuNVH0.T7Nt.N-@A.Nv(@t .HTNX*@ gBt/./9WN$X*@ f yW`$ R B*H.$ /HT$  //<THNOL0N^NuNV.Te/.N6X-@g8./<HnNbPJg.PHnN X`.NN^NuNVH0-|Tg-|Tn-|T}-|T yWJf .N`p. yW(h .N=@g.N4.HԀނ.N./.NXЗЇR.N*@ fp`.HUNXJng.THTNXJft:.HUN$ @XB`.HTHUNP/NX yWJf.HUNX.HUNXL0N^NuNV.Wt/NX gD9WHHO f,.Wt/N RX gt.N#WfN `.T n/NXJgp`p#SN^NuNVH *|W yWJf $9Sg |T` |T**T`*T*T yW*t*L N^NuNVH8-|T.WNйW*@.T/<TN6X-@fp`.tP/HnNbPJgt:.HnNX(@ g,f ,-g`t:.RHTNX&@ gLB$ ./.NXЗR.N*@ g&.N./.HUNP/NX` .NpL8N^NuNVH .WN#Wg yWJgV.TN*@.TN.HnN!XJWfp` yW.HnNXJgp`p`pL N^Nu/ /////?< ONOO _eNu#SpNu0 HHHHHHHHHH BBBBBB DDDDDD /// / ?<- ONO\ _e*BNu/// / ?<. ONO\ _e BNuNO3eNu#SpNu//9S` /A Jf/Ho//?<; ONO f>NOO#Sp _Nu//9S`///////?<; ONO f>NOO#Sp _NuNO`e@NupNu///?< ONO\ _e$pNu /NO#epNuNO8`e Nup//Nu#SpNu///?< ONO\ _eB#TNu///?<$ ONO\ _eB#TNu/ /йT/?< ONO\ _eX/9T#T NuNV/ O NOd #Sp`p _N^NuA|Tb #TNOdNBNu#SpNu /NOeBBNu/// // ?< ONOO _e Nu/// // ?< ONOO _eNu#SpNuNVNO NO !NO,` /NO+eNuKPJ g HUNXKSf /NOeVNu/// / ?< ONO\ _e:BNuNO,e0BNuNVH@NOe"/gÈY LN^Nu#Sp`#SpNu/// // ?< ONOO _eBNu /NOeHNu/ o /NO _eNu/ /// ?< ONO\ _eBNu/// / ?</ ONO\ _eBNu/ /////?< ONOO _erNuHNOe"o H0H""LBNuL`L/// // ?< ONOO _e0BNuNV .NO7d #Sp`pN^Nu /NO0eBNu#SpNu/// // ?< ONOO _eBNu/// // ?< ONOO _eBNu/// /?<4 ONO\ _epBNu/ o //?<4 ONO\ _ePBNu///?< ONO\ _e6BNuNV/ n (/.?<4 ONO\ep`#Sp _N^Nu#SpNu///?< ONO\ _eBNu///?<' ONO\ _eBNuNO eNu/NO! _Nu/NO!  _Nu /NO"ehBNu/ o NO( _eTBNu/HyT?<' ONOO _e6 9TJg/ o T _Nu///?<) ONO\ _eBNu#SpNuH@ /"/A|CT/1# g g 0///?< ONOO d L`Jj.LNu| ,<L\l| ,<L\l| ,<L\l|"0>LZ/9T/<`/9T/<`/9T/<`/9T/<`/9T/<`/9T/<`/9T/<`|/9T/<`l/9U/<`\/9U/< `L/9U/< `` /9U/<?H o@//N^NuNVH8..A./NXJf.HHO f4.H,.UN=*@ g.N>&@ g4H¼f +tf +tf +yf+HH bp+H | 0 HHgV+HH bF+H | 0 HHg,J+ f&A./<U/<WNP/NX(@`F.N= L8N^NuNVH0*nN!N >(@ g./NXJf L0N^NuNVH0.PN=lJg.PHN=lJg./<P8N.XJmj.X/9PN RXJfP.t/NX#Y.t/NX#Y.t/NX#Y.t /NX#Y |X"|Yt2Q9Y.Y/9PN pXJf(|Y~$SJo".PN$, g g`Jl.PN$, g fB*|Y.X/9PN pX.Yt/NX.Yt/NX.Yt /NX.Yt/NX`t#S L0N^NuNV.X/9PN pXP .Yt/NX.Yt/NX.Yt/NX.Yt /NX.N~/N XN^NuNVH0JUf.V/<UN6X#UJUg$ f.U/</<Y NbP(@ g#Y :gt:.HTNX(@ gB#Yt:.HTNX(@ gB.YNJft#YH | 0 HHgjt .HnHTN3P#Y(n :fD#Y :g6t:.HTNX(@ g B#Yt .HTNX(@ g B.YNJft#Y*|Y` L0N^NuNVJUg .UN1HN^NuNVJUg.UNt#UN^NuNVH"n <OABfCR f "/$?B0/6C@?@ C2/@?@2@>Sf /Ѩ "Ӏ rA"nkaQBOLN^NuHpLt4f4fLNu$&HCHAրHCԃ LNuHx"/gt$/`Hx"/gd$/cp`p0f$i 0JLNu(BDHD 0H@0H@`&( dp0"HAHA؁lSJ` `Hx"/gv$/`Hx"/gf$/c `p0f$i HB0JLNu(BDHD 0B@H@`&( dp0"HAHA؁lք `NuJ`NVH . *n -g p`p-fJg +|*SmR UG(HH `.HH/N%X, f-g.N f| L N^NuNVH *n-g p`V-g-ft+B g .-t+B`"SmR U( `.N'. L N^NuNVH *n -g~~-g4-f,.N=lJft.t//-NP f~ g,t.Hn /-N P f . `p.t+B`Jf.N+@f~-g4-f,.N=lJft.t//-NP f~ g,t.Hn /-N P f . `p.t+B`>+|*R Un .N'TJgp@`p . .`~-g-g,.N=lJft.t//-NP f~ gTJo -`pD../-/-N Pg~`"+|*R Un . .`"+|*R Un . . L N^NuNVH~A./.NXJf".HHO. g Af~ LN^NuNVH0*n$- g $- 0gp` -f:Jf4.N'TJg.N+@f`-g.(|PSl ,g,g.N`-g@t.Hn/-N(P. f. `^Jfp`p p`L`J*.//-N(P+@SmR U( ` fp`p pL0N^Nu/ /////?< ONOO _eNu#SpNuNVH8~ n (X-H &n HH(gh %g./N#XR`H-LA.N1 `A-Ht -B|`vt-Bt -B|`dt-Bt-B.gp`p,`H-|V`-|Vt-Bt-B|.g .gJg|`B.` Jg|`B.`-|V&.g-SX.g-SX.g./././N4O *@X`./././N4O *@X 0fJfR.N*DЮ&lv .df$.f .f.gR$.Ԕ-Blt-B.f $.SJg.t /N#XR`tgL$.g.t-/N#XR`2.g.t+/N#XR`.g.t /N#XR.g.HH ``.t0/N#XR`d.t0/N#XR.tx/N#XR`>.t0/N#XR.tX/N#XR` og xg XgJo$SJg.t0/N#XR`JoHH(g./N#XR`.g $.SJg.t /N#XR``.g-SX.g-SX(X o $.S `p,Jo".f$SJg.t /N#XR`./N#XR.g$SJg.t /N#XR``.g-SX.g-SX*SX.N&Jl `o .` ,o ` .*&o".f$SJg.t /N#XR` g $SJg.HH/N#XR`Jo$SJg.t /N#XR``0.g-SX.g-SX.t%/N#XR``.g-SX.g-SX-KA.Hn/.N1bPހ&n`*n$.Д,$SJg.HH/N#XR`` dg\ ugf ogl xg~ Xg~ cg sg^ %g g8 eg2 Eg( fg gg Gg `B(n` n(gp` L8N^NuNVA ./.N)XN^NuNVH *n.. ,.t+B-g-g(-g-f-g$-  f-g".//-NP gz`z`.N=lJg t #Sz`f f4-f$Jl $-l Jmn xߕz`xt`xt$g$t+B.//-NP fz`z`z-g-g-gV-gN.N=lJf4.N g .//-NP gz`z`z` t #Sz` t#Sz f L N^NuNVH *n-g-g$-g-f-g8$-  f,t.t//-NP. g -f`Z-g-g-g8-g0t.t//-NP. g-f$ނ` t#S~ L N^NuNVt.//.N.PN^NuNVN^NuNVN^NuNVN^NuNVN^NuNVH8*n(Ut+B+B B-B-B-B-B-g< -fttB`, +fttB`  fttB` #fttB```H | 0 HHg&t .Hn$ S/N3P+@(nB-` *gp`p@g .f\H | 0 HHg"t .HnHTN3P+@ (nB-`R *gp`p@g`t+B `B- lgp`p@gGJf$ S B` L+H-HH L8N^NuNVH ~*|P l$- g R` fp` L N^NuNVH *n.. ,.+G+F t+Bt+Bt+B*L N^NuNVH0Jg $.Q B` n*H(yV2bee cd`(T`g8$-ԍf T$(խ T*`*$,Ԍf $-լ(`(#V2L0N^NuNV./. /.N4PN^NuNVH8..,. *n(n m .Nop`X gJl $D.t(`t(&|YB*(Jf`*Jg&&./N"X(./N"XDЃ5` L8N^NuNV././. /.N4O N^Nu NVH?8LprxG4`gf(Kf`z +g -Wfg|$ f& 0f(gt Xg xVf8tf2`mv$ot `"vf 0fgd Xg xVfgb 0e6 9b0` Ae Zb7Bd|Ё.HGGfJg"HDBDJgD" gS"LN^Nu nRp`NVH0t./<Vt //.N4O (@.NDЮ .o"KSmt0`.HUNXA ` L0N^NuNVH0*n(|Y$- |V:.(HTNXVt $- |VV.(HTNXVt t./- N5X.HTNXTt t./-N5X.HTNXTt:t./-N5X.HTNXTt:t./N5X.HTNXTt t.$-l/N5X.HTNXXt B <YL0N^NuNVH n.JWlN<$W.l~`($9Wg .N9Jfp`p#Z@g.N7LN^NuNVt#Z@ n.N7N^NuNVH..t<./N<(X#Z t<./N;X.t<./N<(X#Z$t<./N;X.t./N<(X#Z(t./N;X,Tt./N<(X#Z8 l r#z`:./N;XRtd./N;"X*./N<(X, mmJRm m X` mm(Rm mmRm mmRm#Z4#ZNu*jDDJjDDop`ⶁf(BDHD$4HB4HB`(&( dt4"HAHA؁lSJjD ` `H|"/g /`H|"/g~ /g6Höfi H@HL>NuJjDD*jDo$`Bf(BDHD$4BBHB`*&( dt4"HAHAԁ$lԄJjD ` `NVHA.Nb.HH#W4.Hr<./N;"X#W4.Hr<./N<(XJfF4.H./N;XY.m. n&$ |W#(W$ |W#(W`t#W#WLN^NuNVHA./.NXJf .HHO gp`p.`~ LN^NuNVH *n g.N D.N3jL N^NuNVH A./.NX g(.HHO f.TN*@ fp`@+nt./.N rX* fp`t+BA +H+m+m L N^NuNVH<*nE.N?V-@fp` nJPg n4G n(HHft.HhHSNJPB+`V nIHHg>BnBn nl JgRn` nm nl.N?V-@fBA.N5@ L<N^NuNVH *n$-f@$-mp`L./- /N(P-@o+m $- Ԯ+B`p`-m .L N^NuNVH *n+m +mt.+B/-/NPL N^NuNVH *n+m +mt./. N<(XJg+m`t.+n /-/NPL N^NuNV n (N^Nusystem/etc/log/motdCannot access login directory. /bin/shellCannot execute "/bin/shell". Login incorrect. Login: HOME=.mailYou have mail. /act/utmp/act/history/etc/log/message%9.9s%11.11s%4.4s %s rPATH=::/bin:/usr/bin:/etc/bin/newusershell+shell+sshell+cxTERM=/etc/ttylistrPassword: ZD /dev/dev//etc/log/passwordr0123456789abcdef0123456789ABCDEF0123456789VVVVVVVVVVVVVVVVVVVSunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDec0123456789WVWZW^WbWfWjWnWrWvWzW~WWWASTADTESTEDTCSTCDTMSTMDTPSTPDTYSTYDTHSTHDT68000 UniFLEX (R) login Version 2.02, Released May 10, 1985 Copyright (C) 1985, by Technical Systems Consultants, Inc. All rights reserved. -- Created: Sat Jun 01 14:23:58 1985 mmJRm m X` mm(Rm mmRm mmRm#Z4#Z.t0/NXR.tX/NXR` og xg XgJo$SJg.t0/NXR`JoHH(g./NXR`.g $.SJg.t /NXR``.g-SX.g-SX(X o $.S `p,Jo".f$SJg.t /NXR`./NXR.g$SJg.t /NXR``.g-SX.g-SX*SX.N&Jl `o .` ,o ` .*&o".f$SJg.t /NXR` g $SJg.HH/NXR`Jo$SJg.t /NXR``0.g-SX.g-SX.t%/NXR``.g-SX.g-SX-KA.Hn/.NPހ&n`*n$.Д,$SJg.HH/NXR`` dg\ ugf ogl xg~ Xg~ cg sg^ %g g8 eg2 Eg( fg gg Gg `B(n` n(gp` L8N^NuNVA ./.NXN^NuNV m ?nt./<$N RX-@ f@t./<$t //.NO ./<$/<%(NP/NX`t.$.Ԃ//.NPt.Hn/.N Pt.4.H//.NPt.Hn/.N P4.H./<%(/.N P.N $ <%(`H`FJg>t./<%t //.NO ./<%/<%(NP/NX`pN^NuNVt .t//.NPN^Nu/ /////?< ONOO _eNu##pNu /NOeBBNu/// // ?< ONOO _e Nu/// // ?< ONOO _eNu##pNu/// // ?< ONOO _eBNu /NOeHNu/ o /NO _eNu/ /// ?< ONO\ _eBNu/// / ?</ ONO\ _eBNu/ /////?< ONOO _erNuHNOe"o H0H""LBNuL`L/// // ?< ONOO _e0BNuNV .NO7d ##p`pN^Nu /NO0eBNu##pNuNV nJf SN^NuNVLf n N^NuNVLJfSfS n N^NuNVH . *n -g p`p-fJg +|*SmR UG(HH `.HH/NX, f-g.NF f| L N^NuNVH *n -g~~-g4-f,.NJft.t//-NP f~ g,t.Hn /-NP f . `p.t+B`Jf.N"+@f~-g4-f,.NJft.t//-NP f~ g,t.Hn /-NP f . `p.t+B`>+|*R Un .NJgp@`p . .`~-g-g,.NJft.t//-NP f~ gTJo -`pD../-/-NPg~`"+|*R Un . .`"+|*R Un . . L N^NuNVH~A./.N XJf".HHO. g Af~ LN^Nu/ /////?< ONOO _eNu##pNuNVH *n|-g-fJg l-g-g,.NJft.t//-NP f| gBJm -`pD../-/-NPfp`p,*+|`|`| L N^NuNVH *n~$- g\-g-g-g-g .NF..N $Jg~-g .Nt*+B t+B`~ L N^NuNVN^NuNVN^NuNVN^NuNVN^NuNVH8*n(Ut+B+B B-B-B-B-B-g< -fttB`, +fttB`  fttB` #fttB```H |Y0 HHg&t .Hn$ S/N>P+@(nB-` *gp`p@g .f\H |Y0 HHg"t .HnHTN>P+@ (nB-`R *gp`p@g`t+B `B- lgp`p@gGJf$ S B` L+H-HH L8N^NuNVH0$.PSR.(y% f(|&(#% #% &(t#&,*Tb4f(`$-ԍ*B+G#% g$ P B` M ` % f.N*@ fp`(M*U`L0N^NuNVH0..t.N",g D,$9%$*cSԇ./NX./NhX܀$.N"*@fp`"(M)F g$ P B` L.N 9% L0N^NuHpLt4f4fLNu$&HCHAրHCԃ LNuHx"/gt$/`Hx"/gd$/cp`p0f$i 0JLNu(BDHD 0H@0H@`&( dp0"HAHA؁lSJ` `Hx"/gv$/`Hx"/gf$/c `p0f$i HB0JLNu(BDHD 0B@H@`&( dp0"HAHA؁lք `NuJ`NVH0Jg $.Q B` n*H(y% bee cd`(T`g8$-ԍf T$(խ T*`*$,Ԍf $-լ(`(#% L0N^NuNV./. /.NPN^NuNVH8..,. *n(n m .Nop`X gJl $D.t(`t(&|&PB*(Jf`*Jg&&./NX(./NhXDЃ5` L8N^NuNV././. /.NZO N^Nu NVH?8LprxG`gf(Kf`z +g -Wfg|$ f& 0f(gt Xg xVf8tf2`mv$ot `"vf 0fgd Xg xVfgb 0e6 9b0` Ae Zb7Bd|Ё.HGGfJg"HDBDJgD" gS"LN^Nu nRp`NVHA./.N XJf .HHO gp`p.`~ LN^NuYou must be system manager to run "%s". Syntax: /etc/makdev '%c' is not a valid type of device. Error creating "%s": %s Invalid major device number: %s Invalid minor device number: %s &R 0123456789abcdef0123456789ABCDEF0123456789/gen/errors/systemCouldn't open error file - reporting error 0123456789? Unknown error 012345678968000 UniFLEX (R) makdev utility Version 1.00, Released October 16, 1984 Copyright (C) 1984, by Technical Systems Consultants, Inc. All rights reserved. N"+@f~-g4-f,.NJft.t//-NP f~ g,t.Hn /-NP f . `p.t+B`>+|*R Un .NJgp@`p . .`~-g-g,.NJft.t//-NP f~ gTJo -`pD../-/-NPg~`"+|*R Un . .`"+|*R Un . . GmG0,mount/etc, 3@ T\W, pR3ǔpǰ@Rt"z>@@g#D TЏ#C/Ho//N8OBN NVt-B-B-BBntt-B f*t./<CN xX-@ f.CNvt.N td.Hn/.NP dfJ.gA .Hn/<C/<@NO A.N..HnN XB.B..NH-@f0A$X.A$ //<C/<@NO `4 n.A$X/A$ //<C/<@NO`$.N Jt.N t-B$.l n -p( .`R-n`l-n`d.C/.N XJg.C/.N XJfR`t=B`*t=B`"S b@ |00NR`h4.f f.C/<@8NXt.N A./.N X f4.CN././<D/<@8NO .CN .HHO gP//.N Ptd.HnH/.NP.N JN^Nu/ /////?< ONOO _eNu#CpNu/ /////?< ONOO _eNu#CpNuHpLt4f4fLNu$&HCHAրHCԃ LNuHx"/gt$/`Hx"/gd$/cp`p0f$i 0JLNu(BDHD 0H@0H@`&( dp0"HAHA؁lSJ` `Hx"/gv$/`Hx"/gf$/c `p0f$i HB0JLNu(BDHD 0B@H@`&( dp0"HAHA؁lք `NuJ`///?<2 ONO\ _eBNu/// / ?<5 ONOO _eNuNV//./. /.?<9 ONOOd #Cp`p _N^NuNV//.?<6 ONOd #Cp`Jnp\ _N^Nu/////////?<% ONOO _e,NuNO*e$BNuNV/.?<1 ONOT _d N^Nu#CpNu///?< ONO\ _eB#DNu///?<$ ONO\ _eB#DNu/ /йD/?< ONO\ _eX/9D#D NuNV/ O NOd #Cp`p _N^NuA|Db #DNOdNBNu#CpNu /NOeBBNu/// // ?< ONOO _e Nu/// // ?< ONOO _eNu#CpNuNVNO NO !NO,` /NO+eNuK@J g HUN$XKCf /NOeVNu/// / ?< ONO\ _e:BNuNO,e0BNuNVH@NOe"/gÈY LN^Nu#Cp`#CpNu/// // ?< ONOO _eBNu///////?< ONOO _e\BNu///////?< ONOO _e8BNu///?< ONO\ _eBNu///?< ONO\ _eBNu#CpNu/// // ?< ONOO _eBNu /NOeHNu/ o /NO _eNu/ /// ?< ONO\ _eBNu/// / ?</ ONO\ _eBNu/ /////?< ONOO _erNuHNOe"o H0H""LBNuL`L/// // ?< ONOO _e0BNuNV .NO7d #Cp`pN^Nu /NO0eBNu#CpNu/// // ?< ONOO _eBNu/// // ?< ONOO _eBNu/// /?<4 ONO\ _epBNu/ o //?<4 ONO\ _ePBNu///?< ONO\ _e6BNuNV/ n (/.?<4 ONO\ep`#Cp _N^Nu#CpNu///?< ONO\ _eBNu///?<' ONO\ _eBNuNO eNu/NO! _Nu/NO!  _Nu /NO"ehBNu/ o NO( _eTBNu/HyD?<' ONOO _e6 9DJg/ o D _Nu///?<) ONO\ _eBNu#CpNuNV nJf SN^NuNVLf n N^NuNV/ L$HfJfp` !HH$_N^NuNVH8~ n (X-H &n HH(gh %g./N FXR`H-LA.N, `A-Ht -B|`vt-Bt -B|`dt-Bt-B.gp`p,`H-|E`-|Et-Bt-B|.g .gJg|`B.` Jg|`B.`-|E$.g-SX.g-SX.g./././N0jO *@X`./././N0O *@X 0fJfR.N *DЮ&lv .df$.f .f.gR$.Ԕ-Blt-B.f $.SJg.t /N FXR`tgL$.g.t-/N FXR`2.g.t+/N FXR`.g.t /N FXR.g.HH ``.t0/N FXR`d.t0/N FXR.tx/N FXR`>.t0/N FXR.tX/N FXR` og xg XgJo$SJg.t0/N FXR`JoHH(g./N FXR`.g $.SJg.t /N FXR``.g-SX.g-SX(X o $.S `p,Jo".f$SJg.t /N FXR`./N FXR.g$SJg.t /N FXR``.g-SX.g-SX*SX.N &Jl `o .` ,o ` .*&o".f$SJg.t /N FXR` g $SJg.HH/N FXR`Jo$SJg.t /N FXR``0.g-SX.g-SX.t%/N FXR``.g-SX.g-SX-KA.Hn/.N+Pހ&n`*n$.Д,$SJg.HH/N FXR`` dg\ ugf ogl xg~ Xg~ cg sg^ %g g8 eg2 Eg( fg gg Gg `B(n` n(gp` L8N^NuNVA ./.N XN^NuNV m ?nt./<E0N xX-@ f@t./<Eot //.N0O ./<EC/<GN P/N &X`t.$.Ԃ//.N Pt.Hn/.NPt.4.H//.N Pt.Hn/.NP4.H./<G/.NP.N J <G`H`FJg>t./<Et //.N0O ./<Ez/<GN P/N &X`pN^NuNV.N3.N2N^NuNVH ..N<BnBn nl JgRn` nm nl.Nv-@fBA.N 5@ L<N^NuNVH *n$-f@$-mp`L./- /NP-@o+m $- Ԯ+B`p`-m .L N^NuNVH *n+m +mt.+B/-/N PL N^NuNVH *n+m +mt./. NXJg+m`t.+n /-/N PL N^NuNV n (N^NuNVH0.HnN8XJgA.N SAB0.N=|*@ g.N Jf.HnN8XJgtA.N . fB.`$SAr/(t./.N=X*@ g2A.N .HUN XЗ l.HnN &X(@A.N L0N^NuHxL4H°f4H²fLNu(jDJjDD$&HCHAրHCԃJjD LNuH|"/g /`H|"/g~ /g6Höf iHL>Nu*jDDJjDDop`ⶁf(BDHD$4HB4HB`(&( dt4"HAHA؁lSJjD ` `H|"/g /`H|"/g~ /g6Höfi H@HL>NuJjDD*jDo$`Bf(BDHD$4BBHB`*&( dt4"HAHAԁ$lԄJjD ` `NVLJfSfS n N^NuNVH . *n -g p`p-fJg +|*SmR UG(HH `.HH/N X, f-g.N# f| L N^NuNVH *n -g~~-g4-f,.N8ZJft.t//-N P f~ g,t.Hn /-NP f . `p.t+B`Jf.N.|+@f~-g4-f,.N8ZJft.t//-N P f~ g,t.Hn /-NP f . `p.t+B`>+|*R Un .N#"Jgp@`p . .`~-g-g,.N8ZJft.t//-N P f~ gTJo -`pD../-/-NPg~`"+|*R Un . .`"+|*R Un . . L N^NuNVH~A./.N @XJf".HHO. g Af~ LN^NuNVH0*n(n g .HH/N FX fp``pL0N^NuNVH *n|-g-fJg l-g-g,.N8ZJft.t//-N P f| gBJm -`pD../-/-NPfp`p,*+|`|`| L N^NuNVH *n~$- g\-g-g-g-g .N#..N JJg~-g .N/t*+B t+B`~ L N^NuNVH0*n rfD|R +f z` gp`lz./.N xX. fp`L`" wfp|R +f` gp`$t ./.N ZX. fp` g(.N Jt./.N xX. fp`` af,<R +f z` gp`z./.N xX. fLt ./.N ZX. fp`l g&.N Jt./.N xX. fp`@`t.t//N P`p`&N-(@ f .N J`./HTN.@P L0N^NuNVH8*n.. ,.(nzJnp`@,g p`,,g,ft)B g$SJo$,t)B$S(Jofn &x`Jo ,`p&D؀t)B&T$g $SJg`($g".N("& f  `S`z$SJop(Jodn &x`Jo ,`p&D؀t)B&T$g $SJg`($g .N("& f  `S`R` L8N^NuNVH0*n$- g $- 0gp` -f:Jf4.N#"Jg.N.|+@f`-g.(|@Cl ,g,g.N#`-g@t.Hn/-NP. f. `^Jfp`p p`L`J*.//-NP+@SmR U( ` fp`p pL0N^NuNVH *n.. ,.t+B-g-g(-g-f-g$-  f-g".//-N P gz`z`.N8ZJg t #Cz`f f4-f$Jl $-l Jmn xߕz`xt`xt$g$t+B.//-N P fz`z`z-g-g-gV-gN.N8ZJf4.N# g .//-N P gz`z`z` t #Cz` t#Cz f L N^NuNVH *n-g-g$-g-f-g8$-  f,t.t//-N P. g -f`Z-g-g-g8-g0t.t//-N P. g-f$ނ` t#C~ L N^NuNVt.//.N)bPN^NuNVN^NuNVN^NuNVN^NuNVN^NuNVH8*n(Ut+B+B B-B-B-B-B-g< -fttB`, +fttB`  fttB` #fttB```H |-w0 HHg&t .Hn$ S/N0NP+@(nB-` *gp`p@g .f\H |-w0 HHg"t .HnHTN0NP+@ (nB-`R *gp`p@g`t+B `B- lgp`p@gGJf$ S B` L+H-HH L8N^Nu0 HHHHHHHHHH BBBBBB DDDDDD NVH ~*|@ l$- g R` fp` L N^NuNVH *n.. ,.+G+F t+Bt+Bt+B*L N^NuNVH0$.PSR.(yFX f(|Jx#FX#FXJxt#J|*Tb4f(`$-ԍ*B+G#FX g$ P B` M ` FXf.N/"*@ fp`(M*U`L0N^NuNVH0..t.N,g D,$9F\*cSԇ./NX./N>X܀$.N*@fp`"(M)F g$ P B` L.N/ 9FXL0N^NuNVH0Jg $.Q B` n*H(yFXbee cd`(T`g8$-ԍf T$(խ T*`*$,Ԍf $-լ(`(#FXL0N^NuNV./. /.N1$PN^NuNVH8..,. *n(n m .N ȼop`X gJl $D.t(`t(&|JB*(Jf`*Jg&&./NX(./N>XDЃ5` L8N^NuNV././. /.N0jO N^Nu NVH?8LprxG1 `gf(Kf`z +g -Wfg|$ f& 0f(gt Xg xVf8tf2`mv$ot `"vf 0fgd Xg xVfgb 0e6 9b0` Ae Zb7Bd|Ё.HGGfJg"HDBDJgD" gS"LN^Nu nRp`NVL .SmWf`BQ n N^NuNVH0t./<Ft //.N0O (@.N DЮ .o"KSmt0`.HUN XA ` L0N^NuNVH0*n(|J$- |F`.(HTN XVt $- |F|.(HTN XVt t./- N2ZX.HTN XTt t./-N2ZX.HTN XTt:t./-N2ZX.HTN XTt:t./N2ZX.HTN XTt t.$-l/N2ZX.HTN XXt B <JL0N^NuNVH n.JG4lN7$G4.l~`($9G8g .N6 Jfp`p#Jg.N4\LN^NuNVt#J n.N4\N^NuNVH..t<./NX#Jt<./NX.t<./NX#Jt<./NX.t./NX#Jt./NX,Tt./NX#J l r#z`:./NXRtd./NX*./NX, mmJRm m X` mm(Rm mmRm mmRm#J#Jt./NXJftd./NXJgp`p#Gx$ |G(m$ |G(R`#J$R#J <JLN^NuNVH.../NXt./NX*.Q/NX,Tt./NX& l r#x`:./NXRtd./NX(./NX, mmJRm m X` mm(Rm mmRm moRm$r./NXDw-@$Ӕr./NXD/-@t./NXJftd./NXJgRRom f lf mp`pLN^NuNVHA.N .HH#G84.Hr<./NX#G44.Hr<./NXJfF4.H./NXY.m. n&$ |GD#(G<$ |GD#(G@`t#G<#G@LN^NuNVHA./.N @XJf .HHO gp`p.`~ LN^NuNVDH [r]] Error processing "%s": %s Error processing "%s": %s Error processing "%s": %s Error processing "%s": %s Error opening "%s": %s ...Warning: Directory "%s" is not empty. Error mounting "%s" on "%s": %s /etc/mtabK 0123456789abcdef0123456789ABCDEF0123456789/gen/errors/systemCouldn't open error file - reporting error 0123456789? Unknown error 0123456789/gen/errors/systemr/gen/errors/systemr/gen/errors/errorfileXXXX: No message for errno = 0123456789/gen/errors/localr/gen/errors/errorfileXXXXrNo message for errno = 0123456789FFFFFFFFFFFFFFFFFFFSunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDec0123456789G|GGGGGGGGGGGGGASTADTESTEDTCSTCDTMSTMDTPSTPDTYSTYDTHSTHDT./..../etc/mtab/???/etc/log/passwordr.68000 UniFLEX (R) mount - mount device Version 1.00:00, Released May 13, 1985 Copyright (C) 1984, 1985 by Technical Systems Consultants, Inc. All rights reserved. -- Created: Sat Jun 01 14:19:11 1985 ./NXJftd./NXJgRRom f lf mp`pLN^NuNVHA.N .!/! ,5mountDisk1/etc, 3@ T\W, pR3ǔpǰ@R1"z* @g#$P TЏ##/Ho//N8OBN$NVN-@Jg "f.#/< N XX.#/< N XXN-@f,t./<#/<#/<#/<#N\O`.NzN-@Jf.#/< N XX`.$/< N XXN^NuNVN-@f,t./<$H/<$=/<$7/<$,N\O`A.Nz$.-B .N^Nu//9#` /A Jf/Ho//?<; ONO f>NOO##p _Nu//9#`///////?<; ONO f>NOO##p _NuNO`e@NupNu///?< ONO\ _e$pNu /NO#epNuNO8`e Nup//Nu##pNu///?< ONO\ _eB#$PNu///?<$ ONO\ _eB#$PNu/ /й$P/?< ONO\ _eX/9$P#$P NuNV/ O NOd ##p`p _N^NuA|$Vb #$VNOdNBNu##pNuNVNO NO !NO,` /NO+eNuK J g HUNXK#f /NOeVNu/// / ?< ONO\ _e:BNuNO,e0BNuNVH@NOe"/gÈY LN^Nu##p`##pNuNVH8~ n (X-H &n HH(gh %g./N XR`H-LA.N `A-Ht -B|`vt-Bt -B|`dt-Bt-B.gp`p,`H-|$Z`-|$kt-Bt-B|.g .gJg|`B.` Jg|`B.`-|$|.g-SX.g-SX.g./././NO *@X`./././NO *@X 0fJfR.N r*DЮ&lv .df$.f .f.gR$.Ԕ-Blt-B.f $.SJg.t /N XR`tgL$.g.t-/N XR`2.g.t+/N XR`.g.t /N XR.g.HH ``.t0/N XR`d.t0/N XR.tx/N XR`>.t0/N XR.tX/N XR` og xg XgJo$SJg.t0/N XR`JoHH(g./N XR`.g $.SJg.t /N XR``.g-SX.g-SX(X o $.S `p,Jo".f$SJg.t /N XR`./N XR.g$SJg.t /N XR``.g-SX.g-SX*SX.N r&Jl `o .` ,o ` .*&o".f$SJg.t /N XR` g $SJg.HH/N XR`Jo$SJg.t /N XR``0.g-SX.g-SX.t%/N XR``.g-SX.g-SX-KA.Hn/.NPހ&n`*n$.Д,$SJg.HH/N XR`` dg\ ugf ogl xg~ Xg~ cg sg^ %g g8 eg2 Eg( fg gg Gg `B(n` n(gp` L8N^NuNVA ./.NXN^NuNV nJf SN^NuNVH . *n -g p`p-fJg +|*SmR UG(HH `.HH/N (X, f-g.N f| L N^NuNVH *n -g~~-g4-f,.NJft.t//-N jP f~ g,t.Hn /-N P f . `p.t+B`Jf.N+@f~-g4-f,.NJft.t//-N jP f~ g,t.Hn /-N P f . `p.t+B`>+|*R Un .N fJgp@`p . .`~-g-g,.NJft.t//-N jP f~ gTJo -`pD../-/-N Pg~`"+|*R Un . .`"+|*R Un . . L N^NuNVH~A./.N *XJf".HHO. g Af~ LN^Nu/ /////?< ONOO _eNu##pNu/// // ?< ONOO _eBNu /NOeHNu/ o /NO _eNu/ /// ?< ONO\ _eBNu/// / ?</ ONO\ _eBNu/ /////?< ONOO _erNuHNOe"o H0H""LBNuL`L/// // ?< ONOO _e0BNuNV .NO7d ##p`pN^Nu /NO0eBNu##pNuNVH *n|-g-fJg l-g-g,.NJft.t//-N jP f| gBJm -`pD../-/-N Pfp`p,*+|`|`| L N^NuNVH *n~$- g\-g-g-g-g .N..N^Jg~-g .Nlt*+B t+B`~ L N^Nu /NOehBNu/// // ?< ONOO _eFNu/////////?<= ONOO _e Nu/// // ?<  ONOO _eNu##pNuNVN^NuNVN^NuNVN^NuNVN^NuNVH8*n(Ut+B+B B-B-B-B-B-g< -fttB`, +fttB`  fttB` #fttB```H |[0pHHg&t .Hn$ S/NP+@(nB-` *gp`p@g .fZH |[0pHHg"t .HnHTNP+@ (nB-`R *gp`p@g`t+B `B- lgp`p@gGJf$ S B` L+H-HH L8N^Nu0 HHHHHHHHHH BBBBBB DDDDDD NVH0$.PSR.(y$ f(|$#$#$$t#$*Tb4f(`$-ԍ*B+G#$ g$ P B` M ` $f.N*@ fp`(M*U`L0N^NuNVH0..t.N,g D,$9$*cSԇ./NnX./N"X܀$.N*@fp`"(M)F g$ P B` L.Nl 9$L0N^NuHpLt4f4fLNu$&HCHAրHCԃ LNuHx"/gt$/`Hx"/gd$/cp`p0f$i 0JLNu(BDHD 0H@0H@`&( dp0"HAHA؁lSJ` `Hx"/gv$/`Hx"/gf$/c `p0f$i HB0JLNu(BDHD 0B@H@`&( dp0"HAHA؁lք `NuJ`NVH0Jg $.Q B` n*H(y$bee cd`(T`g8$-ԍf T$(խ T*`*$,Ԍf $-լ(`(#$L0N^NuNV./. /.NPN^NuNVH8..,. *n(n m .N rop`X gJl $D.t(`t(&|$B*(Jf`*Jg&&./NnX(./N"XDЃ5` L8N^NuNV././. /.NO N^Nu NVH?8LprxG`gf(Kf`z +g -Wfg|$ f& 0f(gt Xg xVf8tf2`mv$ot `"vf 0fgd Xg xVfgb 0e6 9b0` Ae Zb7Bd|Ё.HGGfJg"HDBDJgD" gS"LN^Nu nRp`NVA./.N *XJf&.HHO f$.fp`pN^Nu Auxiliary disk - /dev/disk1 may be corrupted - running `diskrepair' /etc/diskrepairdiskrepair/dev/disk1+vi Auxiliary disk1 mounted Auxiliary disk1 mounted /etc/mountmount/dev/disk1/disk1$ 0123456789abcdef0123456789ABCDEF0123456789NO $$syscall ETEXT Start[ __chcodesF __exit __fixstk __fixstk_A0 ( __flushbuf __fmtout __fprtf __fprtfp __fscnfp __itostr __ltostr __sprtfp __sscnfp __strtoi f __termorpipe _abort _access _alarm8 _brk\ _cdata^ _closen _creat _create_contiguous  _dup  _dup2 _etext\ _execlf _execle _execv _execve$ _exit _fclose _fflush _fork X _fprintf _fputcl _free * _fstat _isattyR _kill _lock J _lrec j _lseek8 _main _malloc _mountDisk1 _nice _openp _pause _pipe _sbrk _stack _stat r _strlen _strtol _truncf _urec _vforkz _wait _writen uldiv ulmod" ulmul^ ulrdiv ulrmod$T CR_VAL$ EDATA$ ___msz$ __allocp __iob# __ioblst$ _edata# _environ# _errno$P end_adr$V stack_low_point 8 stderr stdin  stdout$ END$ __base$ _endTektronix 4404 - Mount Auxiliary Disk Drives Utility - Version 1.1.1 Copyright (c) 1985, by Tektronix, Inc. All rights reserved.  DDDDc d mtab/etc, 3@ T\W, pR3ǔpǰ@Rb"zCR_VAL$ EDATA$ ___msz$ __allocp __iob# __ioblst$ _edata# _environ# _errno$P end_adr$V stack_low_point 8 stderr stdin  stdout$ END$ __base$ _endTektronix 4404 - Mount Auxiliary Disk Drives Utility - Version 1.1.1 Copyright (c) 1985, by Tektronix, Inc. All rights reserved.  DDDD)//)00.owner/etc, 3@ T\W, pR3ǔpǰ@Rr"z#D0@g#4N TЏ#3/Ho//N8OBNNVt-B l& n ./<3/<08N P.NNJJg& n ./<3/<08N P.N n .N-@lP f n ./<3/<08N P` n ./<3/<08N P.Nt-B$.l^. n /0(N0X f:.3N .$. n /0(/<4)/<08N O -y3R`.NN^NuNVH .N -@Jf.4L/.NXJgt-BN .-@g6 n./.NXJg n$(fN n (`0`N nHH-B |70(HHgp`pL N^Nu0 HHHHHHHHHH BBBBBB DDDDDD ///?< ONO\ _eB#4NNu///?<$ ONO\ _eB#4NNu/ /й4N/?< ONO\ _eX/94N#4N NuNV/ O NOd #3p`p _N^NuA|4Tb #4TNOdNBNu#3pNuNVNO NO !NO,` /NO+eNuK0J g HUN4XK3f /NOeVNu/// / ?< ONO\ _e:BNuNO,e0BNuNVH@NOe"/gÈY LN^Nu#3p`#3pNu/// // ?< ONOO _eBNu/// // ?< ONOO _eBNu/// /?<4 ONO\ _epBNu/ o //?<4 ONO\ _ePBNu///?< ONO\ _e6BNuNV/ n (/.?<4 ONO\ep`#3p _N^Nu#3pNu///?< ONO\ _eBNu///?<' ONO\ _eBNuNO eNu/NO! _Nu/NO!  _Nu /NO"ehBNu/ o NO( _eTBNu/Hy4X?<' ONOO _e6 94XJg/ o 4X _Nu///?<) ONO\ _eBNu#3pNuNV/ L$HfJfp` !HH$_N^NuNVH8~ n (X-H &n HH(gh %g./NXR`H-LA.N `A-Ht -B|`vt-Bt -B|`dt-Bt-B.gp`p,`H-|4``-|4qt-Bt-B|.g .gJg|`B.` Jg|`B.`-|4.g-SX.g-SX.g./././N!2O *@X`./././N!O *@X 0fJfR.Nz*DЮ&lv .df$.f .f.gR$.Ԕ-Blt-B.f $.SJg.t /NXR`tgL$.g.t-/NXR`2.g.t+/NXR`.g.t /NXR.g.HH ``.t0/NXR`d.t0/NXR.tx/NXR`>.t0/NXR.tX/NXR` og xg XgJo$SJg.t0/NXR`JoHH(g./NXR`.g $.SJg.t /NXR``.g-SX.g-SX(X o $.S `p,Jo".f$SJg.t /NXR`./NXR.g$SJg.t /NXR``.g-SX.g-SX*SX.Nz&Jl `o .` ,o ` .*&o".f$SJg.t /NXR` g $SJg.HH/NXR`Jo$SJg.t /NXR``0.g-SX.g-SX.t%/NXR``.g-SX.g-SX-KA.Hn/.NPހ&n`*n$.Д,$SJg.HH/NXR`` dg\ ugf ogl xg~ Xg~ cg sg^ %g g8 eg2 Eg( fg gg Gg `B(n` n(gp` L8N^NuNVA ./.NXN^NuNV m ?nt./<4N.X-@ f@t./<4t //.N!O ./<4/<5NP/NX`t.$.Ԃ//.NPt.Hn/.NPt.4.H//.NPt.Hn/.NP4.H./<5/.NP.N <5`H`FJg>t./<4t //.N!O ./<4/<5NP/NX`pN^NuNVt .t//.N!PN^NuNVH0J4f.5 /<4NX#4J4g$ f.4/</<6NBP(@ g#6 :gt:.HTNX(@ gB#6t:.HTNX(@ gB.6NzJft#6H |70 HHgjt .HnHTN!P#6(n :fD#6 :g6t:.HTNX(@ g B#6t .HTNX(@ g B.6NzJft#6*|6` L0N^NuNVJ4g .4NN^NuNVJ4g.4N4t#4N^Nu/ /////?< ONOO _eNu#3pNu /NOeBBNu/// // ?< ONOO _e Nu/// // ?< ONOO _eNu#3pNu/// // ?< ONOO _eBNu /NOeHNu/ o /NO _eNu/ /// ?< ONO\ _eBNu/// / ?</ ONO\ _eBNu/ /////?< ONOO _erNuHNOe"o H0H""LBNuL`L/// // ?< ONOO _e0BNuNV .NO7d #3p`pN^Nu /NO0eBNu#3pNuNV nJf SN^NuNVLf n N^NuNV n . gfS` N^NuNVLJfSfS n N^NuNVH . *n -g p`p-fJg +|*SmR UG(HH `.HH/NX, f-g.Nb f| L N^NuNVH *n -g~~-g4-f,.N"Jft.t//-NP f~ g,t.Hn /-NP f . `p.t+B`Jf.N+@f~-g4-f,.N"Jft.t//-NP f~ g,t.Hn /-NP f . `p.t+B`>+|*R Un .NJgp@`p . .`~-g-g,.N"Jft.t//-NP f~ gTJo -`pD../-/-NPg~`"+|*R Un . .`"+|*R Un . . L N^NuNVH~A./.NXJf".HHO. g Af~ LN^Nu/ /////?< ONOO _eNu#3pNuNVH0*n,. (nSo.N. g  - g`B ff |` n L0N^NuNVH *n-g p`V-g-ft+B g .-t+B`"SmR U( `.N". L N^NuNVH0*n$- g $- 0gp` -f:Jf4.NJg.N+@f`-g.(|03l ,g,g.Nb`-g@t.Hn/-NP. f. `^Jfp`p p`L`J*.//-NP+@SmR U( ` fp`p pL0N^NuNVH *n|-g-fJg l-g-g,.N"Jft.t//-NP f| gBJm -`pD../-/-NPfp`p,*+|`|`| L N^NuNVH *n~$- g\-g-g-g-g .Nb..NJg~-g .N t*+B t+B`~ L N^NuNVH0*n rfD|R +f z` gp`lz./.N.X. fp`L`" wfp|R +f` gp`$t ./.NX. fp` g(.Nt./.N.X. fp`` af,<R +f z` gp`z./.N.X. fLt ./.NX. fp`l g&.Nt./.N.X. fp`@`t.t//NP`p`&Nv(@ f .N`./HTNP L0N^NuNVH *n.. ,.t+B-g-g(-g-f-g$-  f-g".//-NP gz`z`.N"Jg t #3z`f f4-f$Jl $-l Jmn xߕz`xt`xt$g$t+B.//-NP fz`z`z-g-g-gV-gN.N"Jf4.Nb g .//-NP gz`z`z` t #3z` t#3z f L N^NuNVH *n-g-g$-g-f-g8$-  f,t.t//-NP. g -f`Z-g-g-g8-g0t.t//-NP. g-f$ނ` t#3~ L N^NuNVt.//.NbPN^NuNVN^NuNVN^NuNVN^NuNVN^NuNVH8*n(Ut+B+B B-B-B-B-B-g< -fttB`, +fttB`  fttB` #fttB```H |70 HHg&t .Hn$ S/N!P+@(nB-` *gp`p@g .f\H |70 HHg"t .HnHTN!P+@ (nB-`R *gp`p@g`t+B `B- lgp`p@gGJf$ S B` L+H-HH L8N^NuNVH ~*|0 l$- g R` fp` L N^NuNVH *n.. ,.+G+F t+Bt+Bt+B*L N^NuNVH0$.PSR.(y5 f(|6#5 #5 6t#6*Tb4f(`$-ԍ*B+G#5 g$ P B` M ` 5 f.N*@ fp`(M*U`L0N^NuNVH0..t.N,g D,$95*cSԇ./NX./N@X܀$.N*@fp`"(M)F g$ P B` L.N 95 L0N^NuHpLt4f4fLNu$&HCHAրHCԃ LNuHx"/gt$/`Hx"/gd$/cp`p0f$i 0JLNu(BDHD 0H@0H@`&( dp0"HAHA؁lSJ` `Hx"/gv$/`Hx"/gf$/c `p0f$i HB0JLNu(BDHD 0B@H@`&( dp0"HAHA؁lք `NuJ`NVH0Jg $.Q B` n*H(y5 bee cd`(T`g8$-ԍf T$(խ T*`*$,Ԍf $-լ(`(#5 L0N^NuNV./. /.N!PN^NuNVH8..,. *n(n m .Nzop`X gJl $D.t(`t(&|6B*(Jf`*Jg&&./NX(./N@XDЃ5` L8N^NuNV././. /.N!2O N^Nu NVH?8LprxG!`gf(Kf`z +g -Wfg|$ f& 0f(gt Xg xVf8tf2`mv$ot `"vf 0fgd Xg xVfgb 0e6 9b0` Ae Zb7Bd|Ё.HGGfJg"HDBDJgD" gS"LN^Nu nRp`NVHA./.NXJf .HHO gp`p.`~ LN^NuSyntax: %s You must be system manager to run "%s". "%s" is not a valid user name. %s is not a valid user identification number. Error changing owner for "%s": %s 06 0123456789abcdef0123456789ABCDEF0123456789/gen/errors/systemCouldn't open error file - reporting error 0123456789? Unknown error 0123456789/etc/log/passwordr68000 UniFLEX (R) owner utility Version 1.00, Released October 16, 1984 Copyright (C) 1984, by Technical Systems Consultants, Inc. All rights reserved. g&.Nt./.N.X. fp`@`t.t//NP`p`&Nv(@ f .N`./HTNP L0N^NuNVH *n.. ,.t+B-g-g(-g-f-g$-  f-4/restoreOS/etc, 3@ T\W, pR3ǔpǰ@RS"zsabort on echo "4404P01 Operating System Utilities Restore" copy /tmp /gen/help +doP copy /tmp /gen/spooler +doP copy /tmp /lib +doP copy /tmp /lib/include +doP copy /tmp /lib/include/sys +doP copy /tmp /public +doP copy /tmp /samples +doP copy /tmp /samples/printer +doP rename /bin/shell /bin/shell.f rename /dev/tty00 /dev/tty00.f rename /dev/console /dev/console.f copy /etc/log/password /etc/log/password.bak +loP /gen/system/backup /dev/floppy +lR remove /bin/shell.f /dev/tty00.f /dev/console.f echo echo "4404P01 Operating System Utilities files restored." exit echo "4404P01 Operating System Utilities Restore Error." rename /bin/shell.f /bin/shell rename /dev/tty00.f /dev/tty00 rename /dev/console.f /dev/console b0` Ae Zb7Bd|Ё.HGGfJg"HDBDJgD" gS"LN^Nu nRp`NVHA./.NXJf .HHO gp`p.`~ LN^Nu$ termcap/etc, 3@ T\W, pR3ǔpǰ@Rp"z4404:\ :al=\E[1L:bl=^G:bs:cd=\E[J:ce=\E[K:cl=\E[;H\E[2J:cm=\E[%i%d;%dH:\ :co#80:cr=^M:cs=\E[%i%d;%dr:dc=\E[P:dl=\E[1M:do=^J:ei=\E[4l:ho=\E[H:\ :im=\E[4h:kd=\E[B:ke=\E[?1h:kl=\E[D:kr=\E[C:ks=\E[?1l:ku=\E[A:li#32:\ :mb=\E[5m:md=\E[1m:me=\E[m:nd=\E[C:nl=^J:pt:rc=\E8:sc=\E7:\ :se=\E[27m:so=\E[7m:\ :ti=\E%\!1\E[1;32r\E[?6l:\ :te=\E[1;1H\E[0J\E[?6h\E[?1l:\ :ue=\E[m:up=\E[A:us=\E[4m: rd /etc/log/password.bak +loP /gen/system/backup /dev/floppy +lR remove /bin/shell.f /dev/tty00.f /dev/console.f echo echo   00ttylist/etc, 3@ T\W, pR3ǔpǰ@Rt"z+ 00::system: [1L:bl=^G:bs:cd=\E[J:ce=\E[K:cl=\E[;H\E[2J:cm=\E[%i%d;%dH:\ :co#80:cr=^M:cs=\E[%i%d;%dr:dc=\E[P:dl=\E[1M:do=^J:ei=\E[4l:ho=\E[H:\ :im=\E[4h:kd=\E[B:ke=\E[?1h:kl=\E[D:kr=\E[C:ks=\E[?1l:ku=\E[A:li#32:\ :mb=\E[5m:md=\E[1m:me=\E[m:nd=\E[C:nl=^J:pt:rc=\E8:sc=\E7:\ :se=\E[27m:so=\E[7m:\ :ti=\E%\!1\E[1;32r\E[?6l:\ :te=\E[1;1H\E[0J\E[?6h\E[?1l:\ :ue=\E[m:up=\E[A:us=\E[4m: rd /etc/log/password.bak +loP /gen/system/backup /dev/floppy +lR remove /bin/shell.f /dev/tty00.f /dev/console.f echo echo ]m^01unmount/etc, 3@ T\W, pR3ǔpǰ@Rt"z* @g## TЏ##/Ho//N8OBNNVnt-B g.#/< 8N Xt.N n -hA./.NX f4.#N ././<#/< 8N O .#N-nN4.N f4.#N ././<#/< 8N O .#Nt./<#N^X-@ gtd.Hnr/.NP dfl$.rfZt.td//.N$P//.NfPt-B dl$.ArB0(R`td.Hnr/.NP`R`z.N0N^Nu/ /////?< ONOO _eNu##pNu/ /////?< ONOO _eNu##pNuHpLt4f4fLNu$&HCHAրHCԃ LNuHx"/gt$/`Hx"/gd$/cp`p0f$i 0JLNu(BDHD 0H@0H@`&( dp0"HAHA؁lSJ` `Hx"/gv$/`Hx"/gf$/c `p0f$i HB0JLNu(BDHD 0B@H@`&( dp0"HAHA؁lք `NuJ`///?<2 ONO\ _eBNu/// / ?<5 ONOO _eNuNV//./. /.?<9 ONOOd ##p`p _N^NuNV//.?<6 ONOd ##p`Jnp\ _N^Nu/////////?<% ONOO _e,NuNO*e$BNuNV/.?<1 ONOT _d N^Nu##pNu///?< ONO\ _eB##Nu///?<$ ONO\ _eB##Nu/ /й#/?< ONO\ _eX/9### NuNV/ O NOd ##p`p _N^NuA|#b ##NOdNBNu##pNu /NOeBBNu/// // ?< ONOO _e Nu/// // ?< ONOO _eNu##pNuNVNO NO !NO,` /NO+eNuK J g HUN^XK#f /NOeVNu/// / ?< ONO\ _e:BNuNO,e0BNuNVH@NOe"/gÈY LN^Nu##p`##pNu/// // ?< ONOO _eBNu///////?< ONOO _e\BNu///////?< ONOO _e8BNu///?< ONO\ _eBNu///?< ONO\ _eBNu##pNu/// // ?< ONOO _eBNu /NOeHNu/ o /NO _eNu/ /// ?< ONO\ _eBNu/// / ?</ ONO\ _eBNu/ /////?< ONOO _erNuHNOe"o H0H""LBNuL`L/// // ?< ONOO _e0BNuNV .NO7d ##p`pN^Nu /NO0eBNu##pNuNVH8~ n (X-H &n HH(gh %g./N`XR`H-LA.N `A-Ht -B|`vt-Bt -B|`dt-Bt-B.gp`p,`H-|#`-|$t-Bt-B|.g .gJg|`B.` Jg|`B.`-|$.g-SX.g-SX.g./././NO *@X`./././NlO *@X 0fJfR.N*DЮ&lv .df$.f .f.gR$.Ԕ-Blt-B.f $.SJg.t /N`XR`tgL$.g.t-/N`XR`2.g.t+/N`XR`.g.t /N`XR.g.HH ``.t0/N`XR`d.t0/N`XR.tx/N`XR`>.t0/N`XR.tX/N`XR` og xg XgJo$SJg.t0/N`XR`JoHH(g./N`XR`.g $.SJg.t /N`XR``.g-SX.g-SX(X o $.S `p,Jo".f$SJg.t /N`XR`./N`XR.g$SJg.t /N`XR``.g-SX.g-SX*SX.N&Jl `o .` ,o ` .*&o".f$SJg.t /N`XR` g $SJg.HH/N`XR`Jo$SJg.t /N`XR``0.g-SX.g-SX.t%/N`XR``.g-SX.g-SX-KA.Hn/.NPހ&n`*n$.Д,$SJg.HH/N`XR`` dg\ ugf ogl xg~ Xg~ cg sg^ %g g8 eg2 Eg( fg gg Gg `B(n` n(gp` L8N^NuNVA ./.NXN^NuNV m ?nt./<$"N^X-@ f@t./<$at //.NlO ./<$5/<$N(P/N@X`t.$.Ԃ//.NfPt.Hn/.NPt.4.H//.NfPt.Hn/.NP4.H./<$/.NP.N0 <$`H`FJg>t./<$}t //.NlO ./<$l/<$N(P/N@X`pN^NuNV nJf SN^NuNVLf n N^NuNVLJfSfS n N^NuNVH . *n -g p`p-fJg +|*SmR UG(HH `.HH/NX, f-g.N f| L N^NuNVH *n -g~~-g4-f,.NJft.t//-NfP f~ g,t.Hn /-NP f . `p.t+B`Jf.N+@f~-g4-f,.NJft.t//-NfP f~ g,t.Hn /-NP f . `p.t+B`>+|*R Un .N Error processing "%s": %s Error unmounting "%s": %s /etc/mtab% 0123456789abcdef0123456789ABCDEF0123456789/gen/errors/systemCouldn't open error file - reporting error 0123456789? Unknown error 012345678968000 UniFLEX (R) unmount - unmount device Version 1.00A, Released November 1, 1984 Copyright (C) 1984, by Technical Systems Consultants, Inc. All rights reserved.  SN^NuNVLf n N^NuNVLJfSfS n N^NuNVH . *n -g p`p-fJg +|*SmR UG(HH `.HH/ //  -unmountDisk1/etc, 3@ T\W, pR3ǔpǰ@R1"z|* @g## TЏ##/Ho//N8OBNNVNf-@Jf.#/< NXN^NuNVNz-@f&t./<#/<#/<#NO `A.N$.-B .N^Nu//9#` /A Jf/Ho//?<; ONO f>NOO##p _Nu//9#`///////?<; ONO f>NOO##p _NuNO`e@NupNu///?< ONO\ _e$pNu /NO#epNuNO8`e Nup//Nu##pNu///?< ONO\ _eB##Nu///?<$ ONO\ _eB##Nu/ /й#/?< ONO\ _eX/9### NuNV/ O NOd ##p`p _N^NuA|#b ##NOdNBNu##pNuNVNO NO !NO,` /NO+eNuK J g HUN6XK#f /NOeVNu/// / ?< ONO\ _e:BNuNO,e0BNuNVH@NOe"/gÈY LN^Nu##p`##pNuNVH8~ n (X-H &n HH(gh %g./NXR`H-LA.NX `A-Ht -B|`vt-Bt -B|`dt-Bt-B.gp`p,`H-|#`-|#t-Bt-B|.g .gJg|`B.` Jg|`B.`-|#.g-SX.g-SX.g./././NrO *@X`./././NO *@X 0fJfR.N*DЮ&lv .df$.f .f.gR$.Ԕ-Blt-B.f $.SJg.t /NXR`tgL$.g.t-/NXR`2.g.t+/NXR`.g.t /NXR.g.HH ``.t0/NXR`d.t0/NXR.tx/NXR`>.t0/NXR.tX/NXR` og xg XgJo$SJg.t0/NXR`JoHH(g./NXR`.g $.SJg.t /NXR``.g-SX.g-SX(X o $.S `p,Jo".f$SJg.t /NXR`./NXR.g$SJg.t /NXR``.g-SX.g-SX*SX.N&Jl `o .` ,o ` .*&o".f$SJg.t /NXR` g $SJg.HH/NXR`Jo$SJg.t /NXR``0.g-SX.g-SX.t%/NXR``.g-SX.g-SX-KA.Hn/.N8Pހ&n`*n$.Д,$SJg.HH/NXR`` dg\ ugf ogl xg~ Xg~ cg sg^ %g g8 eg2 Eg( fg gg Gg `B(n` n(gp` L8N^NuNVA ./.NXN^NuNV nJf SN^NuNVH . *n -g p`p-fJg +|*SmR UG(HH `.HH/N X, f-g.N d f| L N^NuNVH *n -g~~-g4-f,.N6Jft.t//-N P f~ g,t.Hn /-N P f . `p.t+B`Jf.N:+@f~-g4-f,.N6Jft.t//-N P f~ g,t.Hn /-N P f . `p.t+B`>+|*R Un .N Jgp@`p . .`~-g-g,.N6Jft.t//-N P f~ gTJo -`pD../-/-N Pg~`"+|*R Un . .`"+|*R Un . . L N^NuNVH~A./.N XJf".HHO. g Af~ LN^Nu/ /////?< ONOO _eNu##pNu/// // ?< ONOO _eBNu /NOeHNu/ o /NO _eNu/ /// ?< ONO\ _eBNu/// / ?</ ONO\ _eBNu/ /////?< ONOO _erNuHNOe"o H0H""LBNuL`L/// // ?< ONOO _e0BNuNV .NO7d ##p`pN^Nu /NO0eBNu##pNuNVH *n|-g-fJg l-g-g,.N6Jft.t//-N P f| gBJm -`pD../-/-N Pfp`p,*+|`|`| L N^NuNVH *n~$- g\-g-g-g-g .N d..NJg~-g .Nt*+B t+B`~ L N^Nu /NOehBNu/// // ?< ONOO _eFNu/////////?<= ONOO _e Nu/// // ?< ONOO _eNu##pNuNVN^NuNVN^NuNVN^NuNVN^NuNVH8*n(Ut+B+B B-B-B-B-B-g< -fttB`, +fttB`  fttB` #fttB```H |0pHHg&t .Hn$ S/NVP+@(nB-` *gp`p@g .fZH |0pHHg"t .HnHTNVP+@ (nB-`R *gp`p@g`t+B `B- lgp`p@gGJf$ S B` L+H-HH L8N^Nu0 HHHHHHHHHH BBBBBB DDDDDD NVH0$.PSR.(y# f(|$####$t#$*Tb4f(`$-ԍ*B+G## g$ P B` M ` #f.N*@ fp`(M*U`L0N^NuNVH0..t.N,g D,$9$*cSԇ./NX./NX܀$.N*@fp`"(M)F g$ P B` L.N 9#L0N^NuHpLt4f4fLNu$&HCHAրHCԃ LNuHx"/gt$/`Hx"/gd$/cp`p0f$i 0JLNu(BDHD 0H@0H@`&( dp0"HAHA؁lSJ` `Hx"/gv$/`Hx"/gf$/c `p0f$i HB0JLNu(BDHD 0B@H@`&( dp0"HAHA؁lք `NuJ`NVH0Jg $.Q B` n*H(y#bee cd`(T`g8$-ԍf T$(խ T*`*$,Ԍf $-լ(`(##L0N^NuNV./. /.N,PN^NuNVH8..,. *n(n m .Nмop`X gJl $D.t(`t(&|$,B*(Jf`*Jg&&./NX(./NXDЃ5` L8N^NuNV././. /.NrO N^Nu NVH?8LprxG(`gf(Kf`z +g -Wfg|$ f& 0f(gt Xg xVf8tf2`mv$ot `"vf 0fgd Xg xVfgb 0e6 9b0` Ae Zb7Bd|Ё.HGGfJg"HDBDJgD" gS"LN^Nu nRp`NVA./.N XJf&.HHO f$.fp`pN^NuAuxiliary disk1 unmounted /etc/unmountunmount/dev/disk1$. 0123456789abcdef0123456789ABCDEF0123456789NO $$syscall| ETEXT Start __chcodes __exit0 __fixstk4 __fixstk_A0 __flushbufX __fmtout __fprtf8 __fprtfpP __fscnfp __itostrr __ltostr@ __sprtfpH __sscnfpV __strtoi __termorpipe^ _abort @ _accesst _alarm _brk _cdata _close _creat _create_contiguous b _dup r _dup2| _etext _execl _execle _execv _execve _exit6 _fclose d _fflushD _fork _fprintf _fputc _free _fstat6 _isatty _killR _lock _lrec _lseek8 _main: _mallocl _nice _open _pause _pipe _sbrk _stack  _stat _strlen, _strtol . _truncff _unmountDisk1 L _urecz _vfork _wait  _write uldivR ulmod ulmul ulrdivB ulrmod# CR_VAL$ EDATA$ ___msz# __allocp __iob# __ioblst$ _edata# _environ# _errno# end_adr# stack_low_point 8 stderr stdin  stdout$. END$ __base$. _endTektronix 4404 - Unmount Auxiliary Disk Drives Utility - Version 1.1.1 Copyright (c) 1985, by Tektronix, Inc. All rights reserved. gGJf$ S B` L+H-HH L8N^Nu0 HHHHHHHHHH BBBBBB DDDDDD NVH0$.PSR.(y# f(|$####$t#$*Tb4f(`$-ԍ*B+G## g$ P B` M ` #f./ 002password/etc/log, 3@ T\W, pR3ǔpǰ@Rd"zsystem::0:/: stop::0:/:stop public::10:/public: __base$. _endTektronix 4404 - Unmount Auxiliary Disk Drives Utility - Version 1.1.1 Copyright (c) 1985, by Tektronix, Inc. All rights reserved. gGJf$ S B` L+H-HH L8N^Nu0 HHHHHHHHHH BBBBBB DDDDDD NVH0$.PSR.(y# f(|$####$t#$*Tb4f(`$-ԍ*B+G## g$ P B` M ` #f. ? //floppypass, . /05system/gen/errors, 3@ T\W, tR3ǔtǰ@Rm"z7Mbw(Pg%9Sh  #&),*** No error! *** I/O error System Fault Data section overflow Not a directory Device full Too many open files 1Bad file descriptor or not open in correct mode File doesn't exist Missing directory Permission denied File already exists Bad argument to system call Seek error Crosses devices Not a block special file Device is busy File not mounted Bad device specified &Too many arguments in an 'exec' call File is a directory File is not executable binary Binary file is too large Stack overflow No living children Too many active tasks Bad system call Interrupted system call Task not found Not a tty device Write to a broken pipe Record lock error TEXT segment overflow Illegal operation during VFORK Device may be corrupted Device is write-protected bee cd`(T`g8$-ԍf T$(խ T*`*$,Ԍf $-լ(`(##L0N^NuNV./. /.N,PN^NuNVH8..,. *n(n m .Nмop`X gJl $D.t(`t(&|$,B*(Jf`*Jg&&./NX(./NXDЃ5` L8N^NuNV././. /.NrO N^Nu NVH?8LprxG(`gf(Kf`z +g -Wfg|$ f& 0f(gt Xg xVf8tf2`mv$ot `"vf 0fgd Xg w x05adduser/gen/help, 3@ T\W, tR3ǔtǰ@Rr"z Syntax: /etc/adduser Description: This command installs all of the necessary directories and files for creating a new user account. Only the user 'system' is allow to execute this command. See help on "deluser". Example: adduser sam This creates a directory /sam with the default .shellbegin, .shellhistory, and .login files. File already exists Bad argument to system call Seek error Crosses devices Not a block special file Device is busy Fi alias/gen/help, 3@ T\W, tR3ǔtǰ@Rs"z Syntax: alias [] [] Description: Defines or reports the list of alternate names (aliases) for a command sequence. "alias" with no arguments outputs the list of aliases defined. If one argument is given the associated alias is printed. If two arguments are given then the first is defined to be an alias for the second. Command line arguments are extracted via the "shell" conventions. See help on "unalias". See "shell" in the Reference manual for more information. Arguments: name of the alias may consist of combinations of utility commands and environment variables (i.e. "list $*" ). Examples: To create an alias such that "long" invokes the command "dir +l", and pauses every 30 lines until you press the space bar, type: alias long 'dir +l $* |page +30' To see your currently defined aliases, type: alias corrupted Device is write-protected v w07asm/gen/help, 3@ T\W, tR3ǔtǰ@Rm"z Syntax: asm file ... [+options] Description: Assemble 68000/68010 assembly language files producing a relocatable output module. Options: +b - Do not produce binary output +e - Suppress end summary information +f - Suppress auto-fielding of output listing +l - Produce output listing +n - Produce decimal line numbers in listing +o=filename - Output file name +s - Print symbol table +t - Assemble for 68000 vs. 68010 +u - Make all unresolved symbols external +F - Enable "Fix-mode". +L - List input file during pass 1 +S - Limit symbols to 8 characters internally and environment variables (i.e. "list $*" ). Examples: To create an alias such that "long" invokes the command "dir +l", and pauses every 30 lines until you press the space bar, type: alias long 'dir +l $* |page +30' To see your currently defined aliases, type: alias corrupted Device is write-protected  +backup/gen/help, 3@ T\W, tR3ǔtǰ@Rp"z Syntax: backup [+options] [file or dir ...] Description: This utility is used to create and maintain backup copies of files and directories. See help on "restore". Options: +a=N - Only copy files newer than "N" days old. +b - Print file sizes in bytes. +d - Copy entire directory structure. +l - List file names as they are copied. +p - Prompt before any action. +r - Retension streaming tape cartridge before any action. +t - Maintain a backup time file on file ".backup.time". +t=F - Maintain a backup time file on file "F". +A - Append to an existing backup. +B - Don't copy files which end in ".bak". +C - Print a catalog of the backup volume. +T - Backup to streaming tape instead of floppy. +T=L - Backup to streaming tape instead of floppy. Tape length parameter "L" default is 450 foot tape, eg. (+T=300 for 300 foot tape). corrupted Device is write-protected c d09badblocks/gen/help, 3@ T\W, tR3ǔtǰ@Rs"z Syntax: /etc/badblocks block-number [diskrepair options] Description: badblocks" removes disk blocks from the free list on the specified device. The bad block information is recorded in the file "/.badblocks". Once the bad-block information is recorded, the "diskrepair" utility is run to check the file system integrity. Bad blocks are identified by the "devcheck" utility. "devcheck" reports bad-blocks by HEX block number, "badblocks" expects the bad- block number to be in decimal radix, be warned! Hard-disks utilize the controller option to mask out bad-blocks so the "/.badblocks" file is initially empty. Should blocks become defective they are masked out by software via the "badblocks" utility. Total system reformat and rebuild will utilize the controller option to mask out bad-blocks. meter "L" default is 450 foot tape, eg. (+T=300 for 300 foot tape). corrupted Device is write-protected @ A09blockcheck/gen/help, 3@ T\W, tR3ǔtǰ@Rk"z Syntax: /etc/blockcheck Description: Check the block allocation integrity of all blocks used in files and the free list for the specified device. It locates problems such as duplicate blocks, missing blocks and invalid block addresses. This command is primarily intended for use by the "diskrepair" utility, which calls it. It may also be used on its own. However, "blockcheck" can only check the disk; it cannot repair it. If the output from the command suggests that the disk is damaged, use "diskrepair" on the disk. controller option to mask out bad-blocks so the "/.badblocks" file is initially empty. Should blocks become defective they are masked out by software via the "badblocks" utility. Total system reformat and rebuild will utilize the controller option to mask out bad-blocks. meter "L" default is 450 foot tape, eg. (+T=300 for 300 foot tape). corrupted Device is write-protected 3 40:chd/gen/help, 3@ T\W, tR3ǔtǰ@Rd"z Syntax: chd [directory] Description: Change to the specified working directory. If no directory is specified, change to the user's home directory. Examples: To change to directory "/lib/include", type: chd /lib/include To change to your home directory, type: chd for use by the "diskrepair" utility, which calls it. It may also be used on its own. However, "blockcheck" can only check the disk; it cannot repair it. If the output from the command sugge 0;commset/gen/help, 3@ T\W, tR3ǔtǰ@Rt"z Syntax: commset [parameters...] Description: Set or display the control parameters for the TEK 4404 communications port Parameters: baud - Select baud rate[s] Default = 9600 baud=nnn valid rates are: 50,75,110,134,150,300,600,1200, 1800,2400,4800,9600,19200,38400 baud=nnn/mmm receive/transmit rates. baud=external flag - Select flow control flag method Default = inout flag=dtr DTR/CTS flag=input ctl-s/ctl-q flagging input only flag=output ctl-s/ctl-q flagging output only flag=inout ctl-s/ctl-q flagging on input and output flag=none no flagging parity - Select character parity Default = low parity=even parity=odd parity=low parity=high parity=none stop - Select the number of stop bits Default = 1 stop=nn nn may be 1 or 2 cts - Select CTS mode  Default = enable cts=disable ignore RS-232C Clear-To-Send signal cts=enable wait for Clear-To-Send true before transmitting reset - Reset communications port show - Display current/updated values D.t(`t(&|$,B*(Jf`*Jg&&./NX(./NXDЃ5` L8N^NuNV././. /.NrO N^Nu NVH?8LprxG(`gf(Kf`z +g -Wfg|$ f& 0f(gt Xg xVf8tf2`mv$ot `"vf 0fgd Xg 7 81compare/gen/help, 3@ T\W, tR3ǔtǰ@Re"z Syntax: compare [+] Description: Compare two text files line by line and print the differences. Options: + - an integer used as the number of matching lines required before considering the files synchronized. This integer must be between 1 and 250; the default is 3. Example: compare oldfile newfile > diffile This command compares "oldfile" with "newfile" and creates a file "diffile" containing the differences. put only flag=output ctl-s/ctl-q flagging output only flag=inout ctl-s/ctl-q flagging on input and output flag=none no flagging parity - Select character parity Default = low parity=even parity=odd parity=low parity=high parity=none stop - Select the number of stop bits Default = 1 stop=nn nn may be 1 or 2 cts - Select CTS mode $ %1conset/gen/help, 3@ T\W, tR3ǔtǰ@Rt"z Syntax: conset [parameters...] Description: Set or display the console parameters for the TEK 4404 Parameters: +raw/-raw set or clear raw mode +echo/-echo enable or disable character echoing +tabs/-tabs automatically expand tabs or don't +becho/-becho echo space/bs to erase on backspace or don't +schar/-schar enable/disable single character mode +xon/-xon enable/disable ctl-s ctl-q to stop output +any/-any  allow or don't any character to restart output +crnl/-crnl when enabled cr's displayed as cr/lf chardel=n hex number specifies character delete character linedel=n hex number specifies line delete character +screensave/-screensave enable/disable screen blanking after 10 minutes +video/-video normal video (black on white) or inverse video +cursor/-cursor make graphic cursor visible or invisible +track/-track  enable or disable graphic cursor tracking the mouse +mousepan/-mousepan enable/disable mouse panning of viewport +diskpan/-diskpan enable/disable joydisk panning of viewport show display current settings default restore default settings /NXDЃ5` L8N^NuNV././. /.NrO N^Nu NVH?8LprxG(`gf(Kf`z +g -Wfg|$ f& 0f(gt Xg xVf8tf2`mv$ot `"vf 0fgd Xg ( ) 3 copy/gen/help, 3@ T\W, tR3ǔtǰ@Ry"z Syntax: copy [+dbncotBplLDP] copy [+dbncotBplDFLMP] Description: The first form copies file1 into file2, replacing any existing file2. The second form copies a list of files or a entire directory structure into the destination directory. Options: +b - Do not copy a file unless it already exists in the destination directory. +c - Do not copy file if it already exists in the destination. Cannot be used with +n. +d - Copy directory structure for all named directories. +n - Copy a file if it is newer than the one in the destination directory. If no file exists, the copy will be performed. +l - List file names as they are copied. +o - Retain original file ownership. +p - Prompt user to see if he really wants file copied. +t - Do not copy source directory unless the destination directory already exits. +B - Do not copy files ending in ".bak". +D - Preserve source directory structure at the destination directory. +F - If the destination file does not exist, create it as a regular file, not a directory. +L - Don't unlink the destination file. +M - Convert CR newline to LF newline. +P - Preserve modification time of source file. XDЃ5` L8N^NuNV././. /.NrO N^Nu NVH?8LprxG(`gf(Kf`z +g -Wfg|$ f& 0f(gt Xg xVf8tf2`mv$ot `"vf 0fgd Xg i j1crdir/gen/help, 3@ T\W, tR3ǔtǰ@Rr"z Syntax: crdir name ... Description: Create the directories specified. Each directory is created with the standard '.' and '..' entries. The directory is created with default permissions 'rwxrwx' unless altered by the "dperm" command. Example: crdir dir1 dir2 dir3 This example creates directories "dir1", "dir2", and "dir3". it already exists in the destination directory. +c - Do not copy file if it already exists in the destination. Cannot be used w; <1create/gen/help, 3@ T\W, tR3ǔtǰ@Re"z Syntax: create file ... Description: Create a file or list of files. The files will be empty when created. The default permissions for files is rw-rw- unless altered by the "dperm" command. Example: create myfile yourfile This example creates two files, "myfile" and "yourfile". eates directories "dir1", "dir2", and "dir3". it already exists in the destination directory. +c - Do not copy file if it already exists in the destination. Cannot be used wi j1date/gen/help, 3@ T\W, tR3ǔtǰ@Re"z Syntax: date [ [MM-DD[-YY]] HH:MM[:SS] ] [+s] Description: With no arguments, the local date and time will be printed. Otherwise, the system date and time and hardware time-of-day clock are set. Only the system manager may set the date. Options: +s - tells "date" to use the hardware time-of-day clock to set the system time. it already exists in the destination directory. +c - Do not copy file if it already exists in the destination. Cannot be used w 1debug/gen/help, 3@ T\W, tR3ǔtǰ@Rg"z Syntax: debug Description: "debug" is an aid used in testing and debugging of machine language programs. It is used to examine, modify, set breakpoints, single step, examine and change registers, and more. Once in "debug", the "?" command displays the menu of commands available. Arguments: - executable file to debug. The file "core" is the default. f it already exists in the destination. Cannot be used w| }1deluser/gen/help, 3@ T\W, tR3ǔtǰ@Rr"z Syntax: /etc/deluser [+x] Description: This utility is used to delete a user from the system. The utility removes the specified user name from the password file and destroys the user's files and directories. Only the user 'system' may use this utility. See help on "adduser". Options: +x - Do not remove the users files from the system. o debug. The file "core" is the default. f it already exists in the destination. Cannot be used w] 1devcheck/gen/help, 3@ T\W, tR3ǔtǰ@Rk"z Syntax: /etc/devcheck [+fsv] Description: Check the specified device for I/O errors. "devcheck" always checks the boot-sector and the SIR (system-information-record). By default, it also checks the FDN (File Descriptor Node) space, the paging/swapping space and the volume space. For each error, it displays the hex block number. When finished, it displays a summary error report. Bad block numbers are input to the "badblocks" program which removes them from the volume space. If a floppy contains one or more bad blocks it should be discarded. Options: +f - check only the FDN space. +s - check only the swap space. +v - check only the volume space. - List file names as they are copied. +o - Retain original file ownership. +p - Prompt user to see if he really wants file copied. +t - Do not copy source directory unless the destination directory already exits. +B - Do not copy files ending in ".bak". +D - Preserve sou- .1dir/gen/help, 3@ T\W, tR3ǔtǰ@Rr"z Syntax: dir [] [+options] Description: "dir" is used to list either the names of the files in the current working directory, the specified directory or, if the argument is not a directory, information about the specified file. Arguments: - list of files to process. Options: +a - list all files in directory including those beginning with '.'. +b - list file size in bytes rather that blocks. +d - list names of files within directories also. +f - list the file descriptor node for each file. +l - give detailed information about each file. +r - list directory in reverse order. +s - list one file name on each line. +t - sort files by time of most recent modification. +S - print a summary after listing all files. ompt user to see if he really wants file copied. +t - Do not copy source directory unless the destination directory already exits. +B - Do not copy files ending in ".bak". +D - Preserve sou ~ dirs/gen/help, 3@ T\W, tR3ǔtǰ@Rs"z Syntax: dirs Description: List the current working directory and the directory stack created by the "pushd" command and maintained by the shell. The directory stack is listed top first. See "shell" in the Reference manual for more information. nts: - list of files to process. Options: +a - list all files in directory including those beginning with '.'. +b - list file size in bytes rather that blocks. +d - list names of files within directories aR} S1 diskrepair/gen/help, 3@ T\W, tR3ǔtǰ@Rr"z Syntax: diskrepair ... [+options] Description: Checks the structure of the specified disk(s). Any errors are reported and optionally repaired. Two modes of operation are "simple" (by default) and "verbose" ("+v" option). "Verbose" reports all errors while "simple" reports only those which require deletion of files or directory entries. If no "+n" or "+p" option, all errors will be repaired. If in "simple" mode and "+p" option is on, only those errors which require deletion of files or directory entries will be promted. All others will be repaired without prompting. Options: +b - perform only blockcheck operation +f - perform only fdncheck operation +m - do not rebuild free list because of missing blocks +n - do not fix any errors, disk is opened for read only +p - prompt user for action on each reported error +q - quiet mode, inhibits certain messages and warnings +r - unconditionally rebuild the free list +u - report disk block usage at end +v - verbose mode, all errors are always reported ile does not exist, create it as a regular file, not a directory. +L - Don't unlink the destination file. +M - Convert CR newline to LF newline. +P - Preserve modification time of source file. XDЃ5` L8N^NuNV././. /.NrO N^Nu NVH?8LprxG(`gf(Kf`z +g -Wfg|$ f& 0f(gt Xg xVf8tf2`mv$ot `"vf 0fgd Xg | 1 dperm/gen/help, 3@ T\W, tR3ǔtǰ@Rm"z Syntax: dperm [u-rwx] [o-rwx] Description: Set the default permissions associated with the current user for file and directory creation. "dperm" alone sets file creation defaults as 'rw-rw-' (read and write for user and others), and directory defaults as 'rwxrwx'. You may only deny these permissions by use of the "dperm" command. See help on "perms". Parameters: u-[rwx] = deny read, write, or execute permission for user o-[rwx] = deny read, write, or execute permission for others Example: dperm u-w o-rwx This example denies default write permission to the owner and denies all permissions to others. eck operation +f - perform only fdncheck operation +m - do not rebuild free list because of missing blocks +n - do not fix any errors, disk is opened for read only +p - prompt user for action on each reported error +q - quiet mode, inhibits certain messages and warnings +r - unconditionally rebuild the free list +u - rep{ 1 dump/gen/help, 3@ T\W, tR3ǔtǰ@Rp"z Syntax: dump [+i] dump [] Description: "dump" outputs a hexadecimal and ASCII listing of a file to the standard output. The two versions appear side by side. Arguments: - name of the file to dump. Default is standard input. Options: +i - interactive mode. "dump" prompts for address at which to begin. User may specify a decimal address, preceded by '.', default is hexadecimal. User may also specify a single address, a range of addresses (separated by a '-'), or an initial address and an offset (address followed by a ',' or ' ', followed by a number). hers. eck operation +f - perform only fdncheck operation +m - do not rebuild free list because of missing blocks +n - do not fix any errors, disk is opened for read only +p - prompt user for action on each reported error +q - quiet mode, inhibits certain messages and warnings +r - unconditionally rebuild the free list +u - repz 1 echo/gen/help, 3@ T\W, tR3ǔtǰ@Ro"z Syntax: echo [+l] [+hex] [argument] ... Description: Echo prints its arguments to the standard output. Options: +l - suppress the line feed. +hex - output the equivalent hex byte. . Arguments: - name of the file to dump. Default is standard input. Options: +i - interactive mode. "dump" prompts for address at which to begin. User may specify a decimal address, preceded by '.', default is hexadecimal. User may also specify a single address, a ry 1 edit/gen/help, 3@ T\W, tR3ǔtǰ@Rt"z Syntax: edit [+options] edit file [+options] edit file1 file2 [+options] Description: Edit a text file. Options: +b - do not create backup file +n - do not read in text +y - delete backup file me of the file to dump. Default is standard input. Options: +i - interactive mode. "dump" prompts for address at which to begin. User may specify a decimal address, preceded by '.', default is hexadecimal. User may also specify a single address, a rx 1 exit/gen/help, 3@ T\W, tR3ǔtǰ@Rt"z Syntax: exit Description: Terminate a subshell. "exit" will sound the bell if the user attempts to exit the login shell. ptions: +b - do not create backup file +n - do not read in text +y - delete backup file me of the file to dump. Default is standard input. Options: +i - interactive mode. "dump" prompts for address at which to begin. User may specify a decimal address, preceded by '.', default is hexadecimal. User may also specify a single address, a rw 1filetype/gen/help, 3@ T\W, tR3ǔtǰ@Re"z Syntax: filetype file ... Description: This utility attempts to identify the type of the files specified on the command line. Some of the types recognized are: Directories Character/Block devices Many types of binary files Many types of ascii text files Many types of smalltalk files The "filetype" command makes an intelligent guess as to the type of text file based on the first character of each line. Binary files are detected based on known header information. of addresses (separated by a '-'), or an initial address and an offset (address followed by a ',' or ' ', followed by a number). hers. eck operation +f - perform only fdncheck operation +m - do not rebuild free list because of missing blocks +n - do not fix any errors, disk is opened for read only +p - prompt user for action on each reported error +q - quiet mode, inhibits certain messages and warnings +r - unconditionally rebuild the free list +u - rep 1fdncheck/gen/help, 3@ T\W, tR3ǔtǰ@Rk"z Syntax: /etc/fdncheck Description: Verify integrity of the file descriptor nodes (FDNS) for the file system on the specified device. An FDN contains all the information the operating system needs to know about a file. "fdncheck" generally runs as a sub-process(child) of the "diskrepair" utility. It can be used in a stand alone mode to check the disk structure, but will not attempt to fix any errors. e. Binary files are detected based on known header informatv 1find/gen/help, 3@ T\W, tR3ǔtǰ@Rd"z Syntax: find [+options] pattern [file ...] Description: This utility will search for the text 'pattern' in one or more files or standard input and will output to standard output those lines which contain the pattern. Arguments: - the string to search for - the second string to search for if the 'and' operator is used. - list of files to search. Default is standard input. Options: +b - do check files ending in ".bak" +c - output of matching lines is suppressed, a count of matching lines will be printed +n - do not print line number on match +s - print skipped filenames +u - ower case letters in pattern will match both upper and lower case letters in the file(s) If the following matching characters are used, the pattern must be enclosed in single or double quotes: \\ remove special meaning from a matching character ? match any character except a newline < match at beginning of line > match at end of lines only & match if both subpattern before and after are in line | match if either subpattern before or after are in line [range] indicates a character class range CR newline to LF newline. +P - Preserve modification time of source file. XDЃ5` L8N^NuNV././. /.NrO N^Nu NVH?8LprxG(`gf(Kf`z +g -Wfg|$ f& 0f(gt Xg xVf8tf2`mv$ot `"vf 0fgd Xg su t1format/gen/help, 3@ T\W, tR3ǔtǰ@Rt"z Syntax: format [+options] Description: Tek 4404 floppy disk format utility Options: +f - Specify the number of FDN blocks. Given by "+f=NN", where NN is a decimal number +n - Don't issue the input prompts. +q - Don't issue the verification prompt. +v - Verify the disk surface before writing the file system information. This is useful for devices on which the format operation does not verify the usability of a given track. The verify operation will  perform a write/read check of each sector on the disk volume, reporting any bad sectors found and placing them in the "/.badblocks" file. +F - Logical format ONLY. NO physical format performed. For floppy diskettes, the default is: TEK4404 - DoubleSided, DoubleDensity, 40 TPI, eight 512 byte sectors per track. tes: \\ remove special meaning from a matching character ? match any character except a newline < match at beginning of^ 1fdup/gen/help, 3@ T\W, tR3ǔtǰ@Rp"z Syntax: fdup Description: Duplicate floppies. Read master floppy and then write/verify one or more copies of the master. . Given by "+f=NN", where NN is a decimal number +n - Don't issue the input prompts. +q - Don't issue the verification prompt. +v - Verify the disk surface before writing the file system information. This is useful for devices on which the format operation does not verify the usability of a given track. The verify operation will 0t 1free/gen/help, 3@ T\W, tR3ǔtǰ@Re"z Syntax: free device ... [+d] Description: Free is used to print the number of free disk blocks (bytes), free fdn's, used disk blocks (bytes) and used fdn's on a device. Options: +d - give a detailed description, including system name and amount of swap space if applicable. sk surface before writing the file system information. This is useful for devices on which the format operation does not verify the usability of a given track. The verify operation will {s |"headset/gen/help, 3@ T\W, tR3ǔtǰ@Rt"z Syntax: headset file ... [+options] Description: Change entries in the binary header of an executable module. Options: +a= - Set minimum page allocation +b= - Specify task size. Valid task sizes are: 128K, 256k, 512K, 1M, 2M, 4M, 8M. +c= - Specify source module type +d/-d - Set/clear no core dump bit +t/-t - Set/clear shared text bit +A= - Set maximum page allocation +B/-B - Set/clear non-zero BSS bit +C= - Specify overriding configuration +S= - Set initial stack size em in the "/.badblocks" file. +F - Logical format ONLY. NO physical format performed. For floppy diskettes, the default is: TEK4404 - DoubleSided, DoubleDensity, 40 TPI, eight 512 byte sectors per track. tes: \\ remove special meaning from a matching character ? match any character except a newline < match at beginning ofr 1help/gen/help, 3@ T\W, tR3ǔtǰ@Rp"z Syntax: help [] Description: Display a brief description of the use and syntax of the specified command. um> - Set minimum page allocation +b= - Specify task size. Valid task sizes are: 128K, 256k, 512K, 1M, 2M, 4M, 8M. +c= - Specify source module type +d/-d - Set/clear no core dump bit +t/-t - Set/clear shared text bit +A= - Set maximum page allocation +B/-B - Seq 1history/gen/help, 3@ T\W, tR3ǔtǰ@Ry"z Syntax: history Description: A shell command which displays list of previous commands. Scrolling and editing functions are selected by control keys (or function key sequences) and may be used to recall and modify commands. The command history will be saved from one login to the next in the file ".shellhistory" in the user's home directory. The saved history is limited to 30 commands. clear shared text bit +A= - Set maximum page allocation +B/-B - Sep 1info/gen/help, 3@ T\W, tR3ǔtǰ@Ro"z Syntax: info file Description: Output the information field of the binary file specified. This field usually contains information such as copyright notices and version numbers. Not all binary files have this field. mmands. The command history will be saved from one login to the next in the file ".shellhistory" in the user's home directory. The saved history is limited to 30 commands. clear shared text bit +A= - Set maximum page allocation +B/-B - Se'o (1int/gen/help, 3@ T\W, tR3ǔtǰ@Rt"z Syntax: int [+int_num] [+s] Description: Send an interrupt to the specified task. If no int_num is specified, the terminate interrupt 'SIGTERM, #11' is sent. See the 4404 Reference Manual for int_num definitions. Options: +s - a "soft" interrupt is sent n to the next in the file ".shellhistory" in the user's home directory. The saved history is limited to 30 commands. clear shared text bit +A= - Set maximum page allocation +B/-B - SeSn T1jobs/gen/help, 3@ T\W, tR3ǔtǰ@Rs"z Syntax: jobs Description: List the currently executing background jobs. t to the specified task. If no int_num is specified, the terminate interrupt 'SIGTERM, #11' is sent. See the 4404 Reference Manual for int_num definitions. Options: +s - a "soft" interrupt is sent n to the next in the file ".shellhistory" in the user's home directory. The saved history is limited to 30 commands. clear shared text bit +A= - Set maximum page allocation +B/-B - SeGm H1libgen/gen/help, 3@ T\W, tR3ǔtǰ@Rn"z Syntax: libgen o= n= [u=] [] [+al] Description: "libgen" creates a new library of relocatable or executable modules or updates an existing library. Arguments: o= - name of an existing library file to update. n= - name of a new library. u= - name of a file containing modules to add to the library. - list of the names of modules to delete from the old library. Options: +a - produce an abbreviated report +l - suppress production of a report figuration +S= - Set initial stack size em in the "/.badblocks" file. +F - Logical format ONLY. NO physical format performed. For floppy diskettes, the default is: TEK4404 - DoubleSided, DoubleDensity, 40 TPI, eight 512 byte sectors per track. tes: \\ remove special meaning from a matching character ? match any character except a newline < match at beginning ofZl [1libinfo/gen/help, 3@ T\W, tR3ǔtǰ@Ro"z Syntax: libinfo file ... [+options] Description: Print out information about a library. Options: +e - Print entry points defined in the library +m - Print module names in the library +M=module name - Print information about a particular module in a library Defaults to +me. See also 'relinfo'. le containing modules to add to the library. - list of the names of modules to delete from the old library. Options: +a -k 1link/gen/help, 3@ T\W, tR3ǔtǰ@Rk"z Syntax: link file1 newFile Description: Make a new link to "file1" and call it "newFile". Example: link dir catalog This example creates a link to "dir" called "catalog". You can now invoke "dir" by typing "catalog". a particular module in a library Defaults to +me. See also 'relinfo'. le containing modules to add to the library. - list of the names of modules to delete from the old library. Options: +a -j 1list/gen/help, 3@ T\W, tR3ǔtǰ@Rt"z Syntax: list [file ...] [+options] Description: List file(s) specified. If no file is specified or if a '+' is specified, then standard input will be listed. See help on "tail". Options: +l - include line numbers in the listing. +nnn - where nnn is an integer greater than zero. The number given is the line number where the listing will start. ry. - list of the names of modules to delete from the old library. Options: +a -+i ,:load/gen/help, 3@ T\W, tR3ǔtǰ@Rd"z Syntax: load file ... [+options] Description: Invoke the linking loader. This program combines relocatable modules to form a single executable or relocatable module. Options: +a=n - Minimum page allocation +b= - Specify task size. Valid task sizes are: 128K, 256k, 512K, 1M, 2M, 4M, 8M; default is 128K +c= - Specify source module type +d - Do not produce a core dump +e - Print all occurrences of unresolved externals +f - Load text pages when first referenced (demand load) +i - Write out all symbols for debugging +l=library - Library name to be searched +m - Print load and module maps +n - Produce separate i + d space module +o=filename - Output file name +r - Produce relocatable module +s - Print global symbol table +t - Produce shared text module +u - Don't print unresolved message if relocatable module is being produced +x= - incremental load file name  +A=n - Maximum page allocation +B - Do not zero BSS space +D=n - Data segment bias (n in hex, default 0) +F[=fname] - Options file (default 'ldr_opts') +L - Don't search libraries +M[=fname] - Where to write maps and symbol table (default stdout) +N=name - Internal name for output module +P=n - Page size (n in hex, default $0) +S=n - Initial stack size (n in hex, default 0) +T=n - Text segment bias (n in hex, default 0) +U=n - Set trap number for system calls 7Bd|Ё.HGGfJg"HDBDJgD" gS"LN^Nu nRp`NVA./.N XJf&.HHO f$.fp`pN^Nuh 1login/gen/help, 3@ T\W, tR3ǔtǰ@Rn"z Syntax: login Description: Login a new user. This is the same as 'logging out' and logging back in with a new name. a single executable or relocatable module. Options: +a=n - Minimum page allocation +b= - Specify task size. Valid task sizes are: 128K, 256k, 512K, 1M, 2M, 4M, 8M; default is 128K +c= - Specify source module type +d - Do not produce a core dump +e - Print all occurrences of unresolved eFg G1logout/gen/help, 3@ T\W, tR3ǔtǰ@Rt"z  Syntax: logout Description: Terminate interactive session. s the same as 'logging out' and logging back in with a new name. a single executable or relocatable module. Options: +a=n - Minimum page allocation +b= - Specify task size. Valid task sizes are: 128K, 256k, 512K, 1M, 2M, 4M, 8M; default is 128K +c= - Specify source module type +d - Do not produce a core dump +e - Print all occurrences of unresolved e 1makdev/gen/help, 3@ T\W, tR3ǔtǰ@Rv"z Syntax: /etc/makdev Description: The "makdev" command is used to create a new device-type file on the system. The device is created in the current directory. Only the system manager may use this command. Arguments: - 'c' or 'b' for character or block device. - major device number. - minor device number. _type> - Specify source module type +d - Do not produce a core dump +e - Print all occurrences of unresolved e Z  [1makefile/gen/help, 3@ T\W, tR3ǔtǰ@Re"z Syntax: update [+q] Description: The "makefile" is used by the "update" command to perform the appropriate "compilations" on a given set of files for which the source file is newer than the object file. See help on "update". Format of "makefile": [::;] The "makefile" consists of two portions, each portion made up of lines. The first portion gives the rule for "compilation". This rule uses a simple parameter mechanism, using "&" as the parameter indicator (see example). The second section of the file contains a list of files which are to be updated using the rule. These file names should be complete enough to be fully specified when "update" is run. Example: If you have a large number of assembly language files in a single directory which need to be re-assembled if the source file is changed, the following "makefile" will accomplish this task: &::&.b;asm & +sly file-1 ... file-n The "&" in the first line stands for one of the files in the second section. All files will be processed in the order given one at a time. The "::" indicates the "is newer than" measure. If this test is true, the command which follows the ";" will be executed, performing the appropriate substitutions. The command to be executed may actually be more than one command. In this case, the commands must be separated by semicolons and the entire command sequence must fit on one line. If the sequence will not fit on a single line, it may be broken across lines by enclosing the entire command sequence in !...!. More than one command sequence can be in a single file. Simply conform to the format given above and separate each new sequence by a "%" in column 1 on a line between each sequence. E.g. &::&.b;!asmb & +sly; list &.r >>new_binary ! file-1 ... file-n %  &.b::library;list *.b >library file-1 ... file-n This command file assembles any files newer than their binary form and then produces a "library" file if any changes were made. You construct a "makefile" to represent all the dependencies in a linear fashion by using multiple command sequences. z {1mount/gen/help, 3@ T\W, tR3ǔtǰ@Rt"z Syntax: /etc/mount [r] Description: Insert a block device at a node of the directory tree structure. Arguments: - the name of the device to mount. It must be a block device. - the name of the directory on which to mount the specified device. Options: r - mount the device for reading only ons, each portion made up of lines. The first portion gives the rule for "compilation". This rule uses a simple parameter meX Y1 move/gen/help, 3@ T\W, tR3ǔtǰ@Re"z Syntax: move [+options] move [+options] Description: Move (or rename) a file from one place to another. Arguments: - name of file to move. - name of file to which to move . - name of the directory to which to move specified files. Options: +k - do not remove the original file from the file system. +l - list the name for each file as it is moved. +p - prompt for permission to replace existing files. +s - stop as soon as an error is encountered. he file contains a list of files which are to be updated using the rule. These file names should be complete enough to be fully specified when "update" is run. Example: If you have a large number of assembly language files in a single directory which need to be re-assembled if the source file is changed, the following "makefile" will accomplish this task: &::&.b;asm & +sly file-1b c1 nice/gen/help, 3@ T\W, tR3ǔtǰ@Re"z Syntax: nice Description: Lowers the priority of the specified command. ns] Description: Move (or rename) a file from one place to another. Arguments: - name of file to move. - name of file to which to move . - name of the directory to which to move specified files. Options: +k - do not remove the original file from the file system. +l - list the name for each file as it is moved. +p - prompt for! 1!owner/gen/help, 3@ T\W, tR3ǔtǰ@Rr"z Syntax: /etc/owner name file ... Description: Change the owner of the files specified to that of name. Only the system manager may execute this utility. r. Arguments: - name of file to move. - name of file to which to move . - name of the directory to which to move specified files. Options: +k - do not remove the original file from the file system. +l - list the name for each file as it is moved. +p - prompt for 1"page/gen/help, 3@ T\W, tR3ǔtǰ@Re"z Syntax: page [+options] [file] ... Description: Page format a file or files. May also be used to display lines on a terminal, N lines at a time. Options: +l - issue line numbers +f - use line feeds instead of form feeds +N - N is a decimal number representing crt screen length +pN - N is a decimal number representing printer page length, it must be 10 or greater file from the file system. +l - list the name for each file as it is moved. +p - prompt for 1#password/gen/help, 3@ T\W, tR3ǔtǰ@Rd"z Syntax: password [name] Description: Set or change a user's password. Only the system manager may change the password of another. nes at a time. Options: +l - issue line numbers +f - use line feeds instead of form feeds +N - N is a decimal number representing crt screen length +pN - N is a decimal number representing printer page length, it must be 10 or greater file from the file system. +l - list the name for each file as it is moved. +p - prompt forZ [1$path/gen/help, 3@ T\W, tR3ǔtǰ@Rh"z Syntax: path Description: Print the pathname of the current working directory. system manager may change the password of another. nes at a time. Options: +l - issue line numbers +f - use line feeds instead of form feeds +N - N is a decimal number representing crt screen length +pN - N is a decimal number representing printer page length, it must be 10 or greater file from the file system. +l - list the name for each file as it is moved. +p - prompt for!+ ,1%perms/gen/help, 3@ T\W, tR3ǔtǰ@Rs"z Syntax: perms parameters file ... Description: Set the permissions for the files specified. See help on "dperm". Parameters: u+[rwx] = set read, write, or execute permission for user u-[rwx] = clear read, write, or execute permission for user o+[rwx] = set for others o-[rwx] = clear for others s+ = set user id bit s- = clear user id bit Example: perms u+rw o-w test This example sets the owner's permissions for file "test" to read and write and removes write permission from others. s - stop as soon as an error is encountered. he file contains a list of files which are to be updated using the rule. These file names should be complete enough to be fully specified when "update" is run. Example: If you have a large number of assembly language files in a single directory which need to be re-assembled if the source file is changed, the following "makefile" will accomplish this task: &::&.b;asm & +sly file-1 popd/gen/help, 3@ T\W, tR3ǔtǰ@Rd"z Syntax: popd Description: Changes the working directory to the one whose name is on the top of the directory stack. The directory stack is created by the "pushd" command. See "shell" in the Reference manual for more information. ission for user o+[rwx] = set for others o-[rwx] = clear for others s+ = set user id bit s- = clear user id bit Example: perms u+rw o-w test This example sets the owner's permissions for file "test" to read and writt upushd/gen/help, 3@ T\W, tR3ǔtǰ@Rd"z Syntax: pushd [dir] Description: Push the name of the working directory on the directory stack and change to the specified directory. With no argument, exchange the top of the directory stack and the current working directory. The "dirs" command may be used to view the directory stack. See "shell" in the Reference manual for more information. ar user id bit Example: perms u+rw o-w test This example sets the owner's permissions for file "test" to read and writ 1'relinfo/gen/help, 3@ T\W, tR3ǔtǰ@Ro"z" Syntax: relinfo [+options] Description: Print information about an object file. Arguments: - list of names of files to report on. Options: +e - print information about external records. +h - print information about the binary header. +r - print information about relocation records. +s - print information about the global symbol table. perms u+rw o-w test This example sets the owner's permissions for file "test" to read and writ 1(remote/gen/help, 3@ T\W, tR3ǔtǰ@Re"z Syntax: remote [+options] Description: Allows the 4404 to be used as a terminal to a remote host computer connected to the "/dev/comm" port. This utility also allows file transfers to and from the host. Options: +l= - output from host can be redirected to filename, this action can be toggled using function key F3. +n - ignore linefeed characters when redirecting to the file specified by the +l option. Function Key Actions: F1 terminates remote. F2 enter a subshell. File transfers will continue. F3 toggles output to file specified by the +l option. File transfers: Remote also supports a file transfer protocol which works in conjunction with a program running on the remote host. The C source code for a sample of such a program which will run under the Unix operating system is found in "/samples/xfer.c" Baud rate: The baud rate of the serial port may be set using the commset command, for example: commset baud=9600 See "commset" help text for further information on configuring the communications port. en one at a time. The "::" indicates the "is newer than" measure. If this test is true, the command which follows the ";" will be executed, performing the appropriate substitutions. The command to be executed may actually be more than one command. In this case, the commands must be separated by semicolons and the entire command 1)remove/gen/help, 3@ T\W, tR3ǔtǰ@Re"z Syntax: remove [+options] Description: Removes the specified file, which may be any type of file, from the file system. Arguments: - a list of the names of files to remove Options: +d - removes a directory if empty +k - delete directory and all files in it. +l - list the files as removed +p - prompt for permission +q - don't report any errors +w - prompt for permission to remove files for which the user does not have write permission. terminates remote. F2 enter a subshell. File transfers will continue. F3 toggles output to file specified by the +l option. File transfers: Remote also supports a file transfer protocol which works in conjunction with a program running on the remote host. The C source code for a sample of such a program which will run under the Unix operating system is found in "/samples/xfer.c" Baud rate: The baud rate of the serial port may be set using the com" 1*rename/gen/help, 3@ T\W, tR3ǔtǰ@Re"z Syntax: rename Description: Change the name of the specified file or directory. Directories may only be renamed if the parent of both names specified is the same. s of files to remove Options: +d - removes a directory if empty +k - delete directory and all files in it. +l - list the files as removed +p - prompt for permission +q - don't report any errors +w - prompt for permission to remove files for which the user does not have 1*restore/gen/help, 3@ T\W, tR3ǔtǰ@Re"z Syntax: restore [+options] [file or dir ...] Description: This utility is used to retrieve and examine backup copies of files and directories. See help on "backup". Options: +b - Print file sizes in bytes. +d - Restore entire directory structure. +l - List file names as they are restored. +n - Only restore files for which the backup copy is newer than any existing copy. +p - Prompt before any action. +r - Retension streaming tape cartridge before any action. +B - Don't restore files which end in ".bak". +C - Print a catalog of the backup volume. +L - Don't unlink files before restoring. +T - Restore from streaming tape instead of floppy. +T=L - Restore from streaming tape instead of floppy. Tape length parameter "L" default is 450 foot tape, eg. (+T=300 for 300 foot tape). ting system is found in "/samples/xfer.c" Baud rate: The baud rate of the serial port may be set using the comO Pscript/gen/help, 3@ T\W, tR3ǔtǰ@Rt"z Syntax: script [+options] [] Description: Script is the batch command file processor. designates a file containing operating system commands. The script processor will execute the commands from this file, substituting values from the optional into the commands. See "script" in the Reference manual for more information. Options: +a - start execution with the "sabort" attribute off. +b - ignore control-C and control-\. +c - process the argument list as a command. +n - run all background tasks with lowered priority. +v - start execution with the verbose attribute on. +x - execute the next command without forking unless necessary. This option is only used when calling a script from another program. foot tape, eg. (+T=300 for 300 foot tape). ting system is found in "/samples/xfer.c" Baud rate: The baud rate of the serial port may be set using the com#R Sset/gen/help, 3@ T\W, tR3ǔtǰ@Rt"z Syntax: set [file] Description: Displays the current state of the shell and the values of the environment variables if no arguments are given. If a file argument is specified then the commands in it are executed as if they were typed from the keyboard. See "shell" in the Reference manual for more information. nt-list> into the commands. See "script" in the Reference manual for more information. Options: +a - start execution with the "sabort" attribute off. +b - igno shell/gen/help, 3@ T\W, tR3ǔtǰ@Rl"z Syntax: shell [+l] [+h=filename] [+c string] Description: "shell" is the interactive command processor for the 4404. See "shell" in the Reference manual for more information. Arguments: +l - indicates that this is a top level shell. +h=filename - cause "shell" to initialize itself from the state saved in the named file. +c string - causes "shell" to execute the string and then terminate. - commands are read from the file before starting to run interactive from the keyboard. Commands in the file .shellbegin in the user's home directory are run during initialization. mand without forking unless necessary. This option is only used when calling a script from another program. foot tape, eg. (+T=300 for 300 foot tape). ting system is found in "/samples/xfer.c" Baud rate: The baud rate of the serial port may be set using the com 1.status/gen/help, 3@ T\W, tR3ǔtǰ@Rs"z Syntax: status [+options] Description: This utility will list the status about programs running on the system. Options: +a - List all tasks, not just those belonging to the user. +l - Produce a long, detailed list for each task listed. +s - Produce a statistical summary of the use of the operating system. +w - Wait after listing (about 30 seconds) and produce another listing. +x - List every task in the system. then terminate. - commands are r 1/stop/gen/help, 3@ T\W, tR3ǔtǰ@Rp"z# Syntax: stop Description: Bring the system to a halt. Using the "stop" command is the only safe way to shut down the system. +a - List all tasks, not just those belonging to the user. +l - Produce a long, detailed list for each task listed. +s - Produce a statistical summary of the use of the operating system. +w - Wait after listing (about 30 seconds) and produce another listing. +x - List every task in the system. then terminate. - commands are r 1/strip/gen/help, 3@ T\W, tR3ǔtǰ@Rp"z Syntax: strip Description: Remove the symbol table from an executable binary file. Arguments: - list of files to process. ose belonging to the user. +l - Produce a long, detailed list for each task listed. +s - Produce a statistical summary of the use of the operating system. +w - Wait after listing (about 30 seconds) and produce another listing. +x - List every task in the system. then terminate. - commands are r 10tail/gen/help, 3@ T\W, tR3ǔtǰ@Rl"z Syntax: tail file [n] Description: This utility will print the last 'n' characters of a text file. If 'n' is not given, the default is 250 characters. cess. ose belonging to the user. +l - Produce a long, detailed list for each task listed. +s - Produce a statistical summary of the use of the operating system. +w - Wait after listing (about 30 seconds) and produce another listing. +x - List every task in the system. then terminate. - commands are r: ;11time/gen/help, 3@ T\W, tR3ǔtǰ@Re"z Syntax: !time % Description: The time command will determine the actual time spent processing the given command list, the user CPU time and the system CPU time, and will then print those times to standard output. Examples: ++ !time dir ++ % cc test.c the operating system. +w - Wait after listing (about 30 seconds) and produce another listing. +x - List every task in the system. then terminate. - commands are r 12touch/gen/help, 3@ T\W, tR3ǔtǰ@Rh"z$ Syntax: touch file ... Description: The touch utility is used to set the last update time of a file to the current time and date. given command list, the user CPU time and the system CPU time, and will then print those times to standard output. Examples: ++ !time dir ++ % cc test.c the operating system. +w - Wait after listing (about 30 seconds) and produce another listing. +x - List every task in the system. then terminate. - commands are r unalias/gen/help, 3@ T\W, tR3ǔtǰ@Rs"z Syntax: unalias [name] ... [+a] Description: The named aliases are deleted from the set of aliases. See "shell" in the Reference manual for more information. See help on "alias". Options: +a - remove all aliases times to standard output. Examples: ++ !time dir ++ % cc test.c the operating system. +w - Wait after listing (about 30 seconds) and produce another listing. +x - List every task in the system. then terminate. - commands are r 14unmount/gen/help, 3@ T\W, tR3ǔtǰ@Rt"z Syntax: /etc/unmount Description: Unmount a previously mounted device from the file system. Arguments: - the name of the device to unmount. help on "alias". Options: +a - remove all aliases times to standard output. Examples: ++ !time dir ++ % cc test.c the operating system. +w - Wait after listing (about 30 seconds) and produce another listing. +x - List every task in the system. then terminate. - commands are r unset/gen/help, 3@ T\W, tR3ǔtǰ@Rt"z Syntax: unset [name] Description: The named variables are deleted from the set of environment variables. See "shell" in the Reference manual for more information. . help on "alias". Options: +a - remove all aliases times to standard output. Examples: ++ !time dir ++ % cc test.c the operating system. +w - Wait after listing (about 30 seconds) and produce another listing. +x - List every task in the system. then terminate. - commands are r> ?15update/gen/help, 3@ T\W, tR3ǔtǰ@Re"z$ Syntax: update [make_file] [arguments] [+q] Description: The "update" utility takes a desired function to be performed from the file "makefile" or another given file and performs the function on the series of files also given in "makefile" or the specified file. Type "help makefile" for details on the format of the "makefile". Arguments: If a makefile is specified any further arguments are passed in as $1,$2, etc. Options: +q - perform in the quiet mode, which inhibits printing of messages to the terminal by "update". ractive from the keyboard. Commands in the file .shellbegin in the user's home directory are run during initialization. mand without forking unless necessary. This option is only used when calling a script from another program. foot tape, eg. (+T=300 for 300 foot tape). ting system is found in "/samples/xfer.c" Baud rate: The baud rate of the serial port may be set using the com 16wait/gen/help, 3@ T\W, tR3ǔtǰ@Rt"z Syntax: wait [task_id] [any] Description: Wait with no argument for all background processes to terminate; wait with "task_id" for the specified background process to terminate; wait with "any" for any single background process to terminate; and report their termination status. If the wait command is interrupted then a list of currently active processes is displayed. ny further arguments are passed in as $1,$2, etc. Options: +q - perform in the quiet mode, which inhib ? //gen/spoolerwait,   .login/gen/system, 3@ T\W, tR3ǔtǰ@Rn"z+ , .shellbegin/gen/system, 3@ T\W, tR3ǔtǰ@Rn"zPATH=".:/bin:" PROMPT="++ " TERMCAP=/etc/termcap alias clear 'echo +l ' JOYUP='' JOYDOWN='' JOYRIGHT='' JOYLEFT='' joyup='' joydown='' joyright='' joyleft='' CJOYRIGHT='F' CJOYLEFT='B' CJOYUP='' CJOYDOWN='' f5='' f6='D' f7=' ' f8='' F5='' F6='H' arrow='clearn' ARROW='' BREAK='' s. If the wait command is interrupted then a list of currently active processes is displayed. ny further arguments are passed in as $1,$2, etc. Options: +q - perform in the quiet mode, which inhib% 19.shellhistory/gen/system, 3@ T\W, tR3ǔtǰ@Ry"z[ oZ !!backup/gen/systemUniFLEX Backup#Lа, аАNzд@Rp"z 8@`F```````&`4`x`````````````` .`x`t` 0`l`h` 2` 2` 2` 2` 2` 2`L`H`D`@`<`8` P` r` ` ` ` ` ` ` ` ` ` ` ` ` ``````H` ` ` ` ` ` ` $``` ~` ` ` (` V` d` r` ` ``*``n``0```p`l```"`8``4`\`````h`8````J`P````Z`p`x````$`,`j```$`8`j``h````````` `R`v```<`r`Z`J96g #$#NO' TA#rNO fNO`B9oNO fNO#A:paJ(f/a AZpaAzpa#ZA#^//KVIG H*|MI:GZEVpH:,|K y2$yH8#2I!GRN 9 g8 g.A pafaNAaD 9aaJ yga6AZa 9 NO# `H瀀ga`LNu/ < a NuH瀀 y# f( 9#pNO#LNuH| H@?H@HR @f00aSfLANu@!@K!M fK!MK!M !|| BhaNuB( (NOe^9fgR(Nu"o,/IH0&H$@f f m fYng fSfL Nu# H#xNO ep/NOveb NO zeP NOveB NO e2 NOe& NOa^Aa@Aa6aFaPa>Aa 9 NR`A`Call of undefined procedure!aaaM ^,g fBad (NOeMfS _3*y, g,y#OLa##$_.h"_" "_"O y2L##2N _H MMԽd/A#NOe* _ M HM# OJNL`a _H MJ96g8`$e M H (/AAd#NOe _MK## OJRNOLb## _.INaf@"_*,f*DNH瀂,o 9$ VО/N cD#@SH瀀NO>Ld y$>f* oB`# 9@#$B B UnLANu,oa"_mbNa"_mb,ANa"_mbAN"_mఙbܐANѱgNuab"_mnC NaB"_LHN"_LAHN"_ b @,HFH Na"_$"  b @,HFH RoNa"_LHN"_H0,&@$Hf" f HgS@$QJFg SFQL N"_, NB`UfN /lD/@Num`g`n `m `g`npNupNua$e`ag`ab`a e`ag`ab`"_Lfff fpNpN"_LFȀfFʁfF̂fF΃f`"_Lfκfʼfƾf`"_LFȀfFʁfF̂fF΃f`"_ b @,HFH 7fB`pONH瀂,o BXUn/N LANu"_LAØŘǘN"_LAׁN"_LAFFØFŘFǘN _"_"$N _#$N## y2"yHX#2*_# NOe#DNO L@e 9DNO@e09L @f 9#JRg(/</9N?< 9DANOO "9R`"9%N 9ЁRm`##M 9DNOd`0/Hy:HyZ/.(y/ / 9DNO,y*y.,GxNA TaaaWrong file type!A zaaxaCan't perform 'RUN' - not enough memory!af //@/WONuH瀆 o*hM gMJhf4aeKf/oLaONu| 0( @gA $aAttempt to 'GET' past EOFH瀆 o(g0"(M gMaSf o/HLaONuA `|File open in wrong mode - PutH瀀 o ( gp`p/@/o LONuH瀀 o Jhfp`p/@/o LONuH瀀 yf |:Jhf@J(g( g a@`< @`( g/a|`/at(LNuH瀀 y,f |Z| HaJ(gaLNu# /W O Nu#/WONu/ yzfa# NuatAz#NuJ(fB(HaNuHaB(NuH yf |:a$#6B90J(gHa( g g +g -fR90HaV( g> g8 +g2 -g, 0mT 9nN/ 96r NП#6`pJ90fй6`6"o"/o LO NuAaaRDI - Digit expected!H瀀 yf |:a$a f< "o"/oLO NuHJ(g ,| Vga(MfLANuH瀆 y,fAZB91,/fR91,/ f|*FB90 /l R90p,|r N0?M fM KJ90gKo&< J91g<0@/a"KfJ90g<-@/aK0@/aKf/oLaO NuH瀆 y,fAZ*oKo| /aKf /@/a/oLaO NuH瀆 y,fAZ*|,ogK`l pMaR/ g,o @/a(Kf*_ / lMla/oLaO Nu< @/aMfNuH瀀 o | /a/o LONu oa.Nu o#*NO(e.Nua / g$!h Bh/a /f (!@!@ ` (!@/aH _O N/ yaa!o |M!NM!N!N /# #NOd fNOe!@BhBaR#/aD/o ,_ONu/ ya.a`!o |M!N!NM!N /## NOeXNOePNOeD!@| Bha#/o ,_ONu/ yaj (NOe y|M!NM!N!N BhBa^#/aP,_Nu/ ya (NOe y|M!N!NM!N BhBa#,_NuH,h fB (!@!@ ## (NOe& g,hM!N `!N<L@Nu1|<`H,h!N f4# ( # (NOe!hM!N L@Nu/J(g. (g$# (#!@ (NOep _NuH瀂 g(,|fa (NOeLB` MfLANuH,| gMfA`-H,L@Nu oa.Nu oaL / "(#0 (NO.e oNuNO`/NOf#LLON#d/9rHy\HyP?<;ANOe/yLNu0o /H瀀?<ANOeBH"o" o O&N o0</?<ANOeBH"o " oON o / H瀀?<ANOeBH"o" o ON0o /H瀀?<ABNOH"o" o O&N o /H瀀?<ANOe"o"BH"o" o ON0o /H瀀?< ANOeNOBH"o" o O&NNV$n "n0n .$H?<=ANOeNOBH"n" nN^O N"o0// @ /,H?<ANOeBH"o" oO 9#$`3> _XN//aPNu///aP/@a"P NuH8$/(lD&/lDD02HBHC҂HABAЁJlDLNuNVH<z .lDD&". lDD( lB@H@40H@0H@`* l$//N $PlS JlDLN@Af/p/p/NT ./p/p/NLN .R-@ . nS . .R-@ . n SB-@` .g\ .o: . nSB /g .R-@ . nSp/` .R-@ . nSp/p-@p nSB-@ . /Nxgp-@p nSB-@ .g> .R-@ . nS . .R-@ . nSB-@` .R nSpNN.A  nNXp-@/ . 8n* . nS ./ nSB"_R`p8R nSpNN .R-@ . nS . .R-@ . nSB-@`p-@p nSB-@ .g> .R-@ . nS . .R-@ . nSB-@` .R nSpNNOp-@p-@ . Nt/ . g( .R-@ . nSBNx-@` .-@NNtbp-@ . 8n .ASpR`p-@p-@p-@ . / . gT ./pA/pR/A/A/NA|/ ./ -/a .gA ANXp-@ .gYpA/N gnp-@pASB/  m2pASp/ASB/ / "_`p-@A  nNX8`VpASp/ASB/ / "_ ./A/ ./aYA/a -@`p-@` .-@ NNHpp"n"A/ ./p/A/NA/ ./ -/aJ -f*p/Ap/a` ./ .p/p/Ap/A/Np-@p-@ . / . gTY ./ ./A/at -@ . g&"n  l"n R"n""n A0S f "n A0S/ _NL"n A0S  @/A  _NX8"n ASp -gA/A/a ./A/At/p/aDAt/At/A/NA/At/ -/a"n A0S  @A8/A  _NX`p-@` .gjA/p/p/NT ./p/p/NTA/p/p/NTN0NN@A*/p/p/NTA[/p/p/NTN