RECORDFORMAT  RF(INTEGER  ADR, TYPE, START, END)
!
!
!
      DYNAMICROUTINESPEC  C 
CALL(STRING (31)COMMAND, STRING (255)PARAMS)
      SYSTEMROUTINESPEC  C 
CASTOUT(STRINGNAME  S)
      SYSTEMROUTINESPEC  C 
CONNECT(STRING (31)FILE, INTEGER  MODE, HOLE, PROTECT,
      RECORD (RF)NAME  R, INTEGERNAME  FLAG)
      SYSTEMROUTINESPEC  C 
DISCONNECT(STRING (31)FILE, INTEGERNAME  FLAG)
      SYSTEMSTRINGFNSPEC  C 
FAILUREMESSAGE(INTEGER  FLAG)
      SYSTEMSTRINGFNSPEC  C 
ITOS(INTEGER  N)
      SYSTEMROUTINESPEC  C 
LOAD(STRING (31)COMMAND, INTEGER  I, INTEGERNAME  FLAG)
      EXTERNALROUTINESPEC  C 
PROMPT(STRING (255)S)
      SYSTEMINTEGERFNSPEC  C 
PSTOI(STRING (63)S)
      EXTERNALINTEGERFNSPEC  C 
UINFI(INTEGER  ENTRY)
      EXTERNALSTRINGFNSPEC  C 
VDUS(INTEGER  N)
      SYSTEMROUTINESPEC  C 
ZCOPY2(STRING (255)PARAMS, INTEGER  SILENT, INTEGERNAME  FLAG)
      SYSTEMROUTINESPEC  C 
ZVIEW(STRING (255)PARMS)
      SYSTEMROUTINESPEC  C 
UCTRANSLATE(INTEGER  AD, LEN)
!
!
!
!
INTEGERFN  LOCATE(INTEGER  START, END, STRING (80)TEXT)
INTEGER  L, A, LIM, FIRST CH
LONGINTEGER  SD
      L = LENGTH(TEXT)
      A = ADDR(TEXT) + 1
      LIM = END - START -L
      RESULT  = 0 IF  LIM <= 0
!
      FIRST CH = CHARNO(TEXT, 1) ! (32 << 8)
      *LB_FIRST CH
!
      *LDTB_X'18000000'
      *LDB_L
      *LDA_A
      *STD_SD
!
      *LDTB_X'58000000'
      *LDB_LIM
      *LDA_START
SCAN:
      *SWNE_L =DR 
      *JCC_8,<NOT FOUND>
      *STD_TOS 
      *LDTB_SD
      *LSD_SD
      *CPS_L =DR ,32,0
      *JCC_8,<FOUND>
      *LD_TOS 
      *MODD_1
      *J_<SCAN>
NOT FOUND:
      RESULT  = 0
FOUND:
      *LSS_TOS 
      *EXIT_-64
END ; ! LOCATE
!
!
!
ROUTINE  PRINTCHS(STRING (255)S)
INTEGER  J
      CYCLE  J = 1, 1, LENGTH(S)
         PRINTCH(CHARNO(S, J))
      REPEAT 
END ; ! PRINTCHS
!
!
!
ROUTINE  RSTRG(STRINGNAME  S)
INTEGER  J
      S = ""
      CYCLE 
         READ SYMBOL(J)
         RETURN  IF  J = NL
         S = S . TOSTRING(J)
      REPEAT 
END 
!
!
!
ROUTINE  W(STRING (255)S)
      PRINTSTRING(S)
      NEWLINE
END ; ! W
!
!
!
ROUTINE  SYMBOLS(INTEGER  N, SYMBOL)
      WHILE  N > 0 CYCLE 
         PRINTSYMBOL(SYMBOL)
         N = N - 1
      REPEAT 
END ; ! SYMBOLS
!
!
!
EXTERNALROUTINE  VLOOK(STRING (255)FILE)
INTEGER  I, I0, J, CH, STOP, SET
CONSTINTEGER  TOP PAGE = 250
INTEGERARRAY  K(1:TOPPAGE)
INTEGER  PAGE, MAXPAGE, LINES
STRING (63)VDUS1
STRING (255)LINE, Z, PREVIOUS
RECORD (RF)R
!
!
!
ROUTINE  ANOTHER
INTEGER  LINES, I, I0
      IF  MAXPAGE + 1 = TOP PAGE START 
         W("File > " . ITOS(MAXPAGE) . " pages")
         SET = 1
         RETURN 
      FINISH 
!
      LINES = 0
      MAXPAGE = MAXPAGE + 1
      I0 = K(MAXPAGE)
      CYCLE  I = I0, 1, R_ADR+R_END-1
         K(MAXPAGE+1) = I AND  RETURN  IF  LINES = 20
         CH = BYTEINTEGER(I)
         CH = NL IF  CH = 12
!
         IF  CH = NL START 
            LINES = LINES + 1
            I0 = I + 1
         FINISH  ELSE  START 
            IF  I = I0 + 79 START 
               LINES = LINES + 1
               IF  LINES = 20 START 
                  K(MAXPAGE+1) = I0
                  RETURN 
               FINISH 
            FINISH 
         FINISH 
      REPEAT 
!
      K(MAXPAGE+1) = R_ADR + R_END
      SET = 1
      W("SET set")
END ; ! ANOTHER
!
!
!
      CONNECT(FILE, 1, 0, 0, R, J)
      RETURN  UNLESS  J = 0
      RETURN  UNLESS  R_TYPE = 3
!
      I0 = R_ADR+R_START
      K(1) = I0
      K(2) = 0
      SET = 0; ! true maxpage not yet known
      MAXPAGE = 1
      LINES = 0
      CYCLE  I = I0, 1, R_ADR+R_END-1
         IF  LINES = 20 START 
            K(2) = I
            EXIT 
         FINISH 
!
         CH = BYTEINTEGER(I)
         CH = NL IF  CH = 12; ! a newpage character
!
         IF  CH = NL START 
            LINES = LINES + 1
            I0 = I + 1
         FINISH  ELSE  START 
            IF  I = I0 + 79 START 
               LINES = LINES + 1
               IF  LINES = 20 START 
                  K(2) = I0
                  EXIT 
               FINISH 
            FINISH 
         FINISH 
      REPEAT 
!
      IF  K(2) = 0 {tiny file} C 
      THEN  K(2) = R_ADR+R_END AND  SET = 1
!
      PAGE = 1
      VDUS1 = VDUS(1) . TOSTRING(13)
      PREVIOUS = "T"
      STOP = 0
!
D:
      PRINTCHS(VDUS1)
      PRINTSTRING(FILE)
      IF  PAGE > 1 START 
         LINE = "/" . ITOS(PAGE)
         SPACES(80-LENGTH(FILE)-LENGTH(LINE))
         PRINTSTRING(LINE)
      FINISH 
      NEWLINE
      SYMBOLS(80, '-')
      NEWLINE
!
      CYCLE  J = K(PAGE), 1, K(PAGE+1)-1
         CH = BYTEINTEGER(J)
         CH = NL IF  CH = 12
         PRINTSYMBOL(CH)
         IF  STOP > 0 START 
            STOP = STOP - 1 IF  CH = NL
            EXIT  IF  STOP = 0
         FINISH 
      REPEAT 
!
      IF  PAGE < MAXPAGE OR  SET = 0 C 
      THEN  W("...more") C 
      ELSE  W("End of file")
      PROMPT("Vlook: ")
R:
      RSTRG(LINE)
!
      IF  LINE = "1" OR  LINE = "!" C 
      THEN  LINE = PREVIOUS C 
      ELSE  PREVIOUS = LINE
!
      IF  LINE = "" START 
         IF  PAGE = MAX PAGE START 
            -> R IF  SET = 1
            ANOTHER
         FINISH 
         PAGE = PAGE + 1
         -> D
      FINISH 
!
      UCTRANSLATE(ADDR(LINE)+1, LENGTH(LINE))
!
      -> D IF  LINE = "="
!
      IF  LINE = "-" START 
         -> R IF  PAGE = 1
         PAGE = PAGE - 1
         -> D
      FINISH 
!
      IF  LINE = "/" START 
         ANOTHER WHILE  SET = 0
         -> R IF  PAGE = MAXPAGE
         PAGE = MAXPAGE
         -> D
      FINISH 
!
      IF  LINE = "T" START 
         -> R IF  PAGE = 1
         STOP = 3
         PAGE = 1
         -> D
      FINISH 
!
      RETURN  IF  LINE = "E" OR  LINE = "Q" OR  LINE = "R"
!
      IF  LINE = "V" START 
         ZVIEW("SUBSYS.VIEWBASE")
         -> D
      FINISH 
!
      IF  LINE = "?" OR  LINE = "HELP" START 
      PRINTCHS(VDUS1); ! CLEAR SCREEN
!
W("=         display all current page, eg after reading this page")
W("          just press the 'return' key to get the next page")
W("-         previous page")
W("/n        continuation page n              /     alone goes to end")
W("!com      obey com, any command")
W("F< >      output to file or device")
W("Q, R or E to exit")
W("T         top of file")
W("V file    same as VIEW file                V     alone for VIEW spec")
W(" ")
W("***  VIEW thinks your terminal is a " . VDUS(0))
W("***  use command TERMINALTYPE, outside VIEW, to change it")
         -> R
      FINISH 
!
      -> R IF  LENGTH(LINE) = 1
!
      IF  CHARNO(LINE, 1) = '/' START 
         LINE -> ("/") . LINE
         J = PSTOI(LINE)
         -> R IF  J < 1; ! not a number
         -> R IF  J = PAGE; ! already on display
         ANOTHER WHILE  SET = 0 AND  J > MAXPAGE
         -> R IF  J > MAXPAGE
         PAGE = J
         -> D
      FINISH 
!
      IF  LINE -> ("F<") . LINE . (">") START 
         ZCOPY2("T#OUT," . LINE, 0, J)
         J = 219 IF  J = -7 OR  J = -10
         W(FAILUREMESSAGE(J)) UNLESS  J = 0
         -> R
      FINISH 
!
      IF  CHARNO(LINE, 1) = '!' START 
         LINE -> ("!") . LINE
         Z = ""
         IF  UINFI(16) = 1 START ; ! brackets ON
            IF  LINE -> LINE . ("(") . Z START 
               J = LENGTH(Z)
               LENGTH(Z) = J - 1 IF  J > 0 AND  CHARNO(Z, J) = ')'
            FINISH 
         FINISH  ELSE  START 
            Z = "" UNLESS  LINE -> LINE . (" ") . Z
         FINISH 
!
         CASTOUT(LINE); ! command
         -> R IF  LINE = ""
         CASTOUT(Z) UNLESS  Z = ""; ! parameters
!
         IF  UINFI(26) = 0 START ; ! old loader
            LOAD(LINE, 0, J)
            -> R UNLESS  J = 0
         FINISH 
         CALL(LINE, Z)
         -> R
      FINISH 
!
      IF  LINE -> Z . ("V ") . LINE AND  Z = "" START 
         ZVIEW(LINE)
         -> D
      FINISH 
!
      J = LOCATE(K(PAGE+1), R_ADR+R_END, LINE)
      W("not found") AND  -> R IF  J = 0
      ANOTHER WHILE  K(MAXPAGE+1) < J
      CYCLE  I = 1, 1, MAXPAGE
         IF  K(I+1) > J >= K(I) START 
            PAGE = I
            -> D
         FINISH 
      REPEAT 
      -> R
END ; ! PLUHELP
ENDOFFILE 
ENDOFFILE