image of READY prompt

Wang2200.org

Listing of file='VVIEW' on disk='vmedia/731-8011A.wvd.zip'

# Sector 517, program filename = 'VVIEW'
0004 REM % (c) Copyright Wang Laboratories, Inc. 1986
0005 REM % VIEW DMS/VDISK STATUS -"VVIEW" ** Nori Odoi ** Rev. 1.00 * 12/10/86
      **
0010 REM % Variables used by screen subs
0015 DIM T1$(416)1, R1, S0, T1(8),S4$80,T1$1
0020 REM % Disk variables- VDISKMAP record, desired VDISK rec,temp,temp
0022 DIM F1$(50)12,F1,F$,F,F6$40
0023 REM /VDISK status file variables-Status file name,#VDISKs in file,Disk ad
     dr, packing format,VS filename,#sectors,file handle, Exc/Sh,record buffer
     (must be redimmed to (8)28 for VDISK config file)
0024 DIM F2$8,F2,F2$(33)3,F3$,F3$(33)8,F4$(33)8,F5$(33)8,F6$(33)10,F7$(33)2,F7
     (33),F9$(8)30
0025 $FORMAT F3$=A3,A8,A8,A8,A2,P1
0027 REM / VDISK config file format
0029 $FORMAT E7$=A3,A8,A8,A8,P1
0030 REM % Storage variables-E1$()?=cntlr add,primary disk addr,config file; E
     2$=2200 addr;E3$()=vol name,E4$()=libe name;E5$()=file name;E6$()=platter
      size;E7()=mode;E8$()=err msgs;E1$=alternate config file name;E1=last Vdi
     sk
0035 DIM E1$(4)8, E2$(33)3, E3$(33)8, E4$(33)8, E5$(33)8, E6$(33)5, E7$(3)9,E7
     (33),E8$(32)21,E1, E$(33)8
   : E7$(1)="Exclusive"
   : E7$(2)="Read only"
   : E7$(3)="Shared"
0040 REM % Input variables-D1$()=cntlr add,primary disk addr,config file; D2$=
     2200 addr;D3$()=vol name,D4$()=libe name;D5$()=file name;D6$()=platter si
     ze;D7()=mode;D8$()=err msgs,D1$=alternate config file name;D1=last VDISK
0045 DIM D1$(4)8, D2$(8)3, D3$(8)8, D4$(8)8, D5$(8)8, D6$(8)10, D7(8),D8$(8)21
     ,D1$8,D1
0050 REM % Control variables-C=EXIT,P$=Search variable, P9=Screen #,P9$='100 o
     ptions,P8$=1st field,E9$=Error msg,E9=print line,E=error,V=valid flag, E5
     =main loop,Work var,locator array
0055 DIM C,P$16,P9,P9$,P8$1,E9$80,E,V,E5,W$(1)66,L$(33)2,C,C1$
0070 REM % Scratch
   : DIM I,J,D
0083 REM $GIO regs,DMS
   : DIM A$16,V$32, V0$1,V1$1, V2$1, V3$1, V4$2, V5$2, V6$6,V7$32, V8$, V8$(16
     ), V9$2, V9$(16,5)
0099 REM % Goto beginning of program
0100 REM %Start
   : GOTO 2000
0110 REM % **** DEFFN'44 - VDISK\A0STATUS (disk address-bottom 2 digits)
0111 REM /** Response in V0$-=0-no DMS, =1-illegal disk addr, =2-not in VDISK
     table, =80h-ok. V2$=mode, V7$=SMB hdr, V9$=file handle ***
0112 REM / ** VDISK table, =80h-ok--V2$=mode, V7$=SMB hdr, V9$=file handle ***
0113 DEFFN'44(D1$)
   : REM construct command
   : STR(A$,7,1)=HEX(62)
   : STR(A$,6,1) = BIN(#PART-1) AND HEX(0F) OR HEX(60)
   : $OPEN #2,#4
   : $GIO #2 (4660 4270 8701, A$)
0115 V0$=STR(A$,1,1)
   : IF STR(V0$,1,1)<>HEX(00) THEN 117
   : $CLOSE#2,#4
   : RETURN
   : REM % Send platter address
0117 $GIO #2(A000 8701,A$)D1$
   : V0$=STR(A$,1,1)
   : STR(V0$,1,1)=ADD HEX(01)
   : IF STR(V0$,1,1)>=HEX(80) THEN 119
   : $CLOSE#2,#4
   : RETURN
   : REM % Get SMB hdr, file handle, open mode, data block
0119 REM Get status from 2258
   : V9$()=ALL(" ")
   : $GIO #2 (1800 C340 1801 C340 1802 C340 8703 8704 1803 C340, A$) V7$;V9$;V
     2$;STR(V9$(),1,VAL(STR(A$,3,2),2))
   : V1=VAL(STR(A$,3,2),2)
0121 $CLOSE#2,#4
   : RETURN
0130 REM % **** DEFFN'45 - DMS\A0STATUS -- V<0=err
0131 REM /* Response-F6$,len V1-assignment,2200SRV status,disk addr,VDISK stat
     us *
0132 DEFFN'45
   : V=1
   : REM construct command
   : F6$=ALL(00)
   : STR(A$,7,1)=HEX(52)
   : STR(A$,6,1) = BIN(#PART-1) AND HEX(0F) OR HEX(50)
   : $OPEN 138,#2,#3
   : ERRORV=-1
   : GOTO 139
0133 $GIO#2(4500)
   : ERRORV=-1
   : GOTO 139
0134 $BREAK
   : FOR D=1 TO 1200
   : $IF ON #2,135
   : NEXT D
   : V=-10
   : GOTO 139
0135 $IF ON #3,137
   : ERRORV=-1
   : GOTO 139
0136 $GIO#3(4550 405F)
   : $BREAK
   : FOR D=1 TO 1200
   : $IF ON #3,137
   : NEXT D
   : V=-10
   : GOTO 139
0137 $GIO #3 (4660 4270 8703 8704 1801 C340, A$)A$;STR(F6$,1,VAL(STR(A$,3,2),2
     ))
   : V1=VAL(STR(A$,3,2),2)
   : GOTO 139
0138 V=-20
0139 $CLOSE#2,#3
   : RETURN
0140 REM % **** DEFFN'48 - SET\A0DEVICE\A0TABLE(comm addr) V<0 if err
0142 DEFFN'48(A9$)
   : V=1
   : IF STR(A9$,1,1)<>"0" OR STR(A9$,2,1)="0" THEN 146
   : HEXPACK T1$ FROM STR(A9$,2,2)
   : IF MOD(VAL(T1$),4)>0 THEN 146
0143 REM /status addr
   : T1$=ADD HEX(01)
   : HEXUNPACK T1$ TO STR(A9$,2,2)
   : SELECT #1 <A9$>
   : ERRORGOTO 146
0144 REM /command addr
   : T1$=ADD HEX(01)
   : HEXUNPACK T1$ TO STR(A9$,2,2)
   : SELECT #2 <A9$>
   : ERRORGOTO 146
0145 REM /data addr
   : T1$ =ADD HEX(01)
   : HEXUNPACK T1$ TO STR(A9$,2,2)
   : SELECT #3 <A9$>
   : GOSUB '45
   : IF V<0 THEN RETURN
   : T$="D"
   : HEXUNPACK STR(F6$,4,1) TO STR(T$,2,2)
   : SELECT #4<T$>
   : RETURN
0146 V=-1
   : RETURN
0160 REM %** DEFFN'46-DMS\A0VERSION-ok-V0$=FFh,err=0h,response=STR(V9$(),34,V1
     )
0162 DEFFN'46
   : V=1
   : V7$=ALL(HEX(00))
   : STR(V7$,,5)=HEX(FF)&"SMB"&HEX(FF)
   : STR(V7$,7,1)=HEX(2B)
   : STR(V7$,23,2)=HEX(FFFF)
   : V8$()=ALL(" ")
   : STR(V8$(),1,3)=HEX(000000)
   : GOSUB '199
   : IF V0$=HEX(5A)THEN 164
   : V0$=HEX(FF)
   : V1=VAL(STR(V9$(),33,1))*2
   : RETURN
0164 V0$=HEX(00)
   : RETURN
0220 REM % **** DEFFN'50 - READ\A0MAP
0222 REM / ****  Reads VDISKMAP & stores in F1$() ***
0224 DEFFN'50
   : V=1
   : DATA LOAD DC OPEN T"VDISKMAP"
   : ERRORE=ERR
   : V=0
   : RETURN
0226 MAT REDIM F1$(50)12
   : DATA LOAD DC F1$()
   : DATA SAVE DC CLOSE
   : RETURN
0230 REM % **** DEFFN'52 - GET\A0CTLR routine
0232 REM / **** OK-V=1,no addr-=-1,no platter-=-2,not in VDISKMAP-=-3 ***
0234 REM / **** If found, F1=entry else =trailer record ***
0235 DEFFN '52
   : V=1
   : D1$(1)=A0$
   : GOSUB '48(A0$)
   : IF V<0 OR STR(F6$,,1)=HEX(00) THEN RETURN
   : D1$(2)=T$
0236 REM /Find configuration file
   : MAT SEARCH F1$(),=STR(D1$(1),1,3) TO P$ STEP 12
   : IF STR(P$,1,2)=HEX(0000) THEN GOSUB 238
   : F=VAL(P$,2)
0237 REM /found address
   : F1=F/12 + 1
   : D1$(3)=STR(F1$(F1),4,8)
   : D1$(4)=STR(F1$(F1),12,1)
   : RETURN
0238 REM /gosub if controller not found
   : D1$(3)=" "
   : RETURN
0240 REM % **** DEFFN'55 - READ\A0VSTATUS
0242 REM / ****  Inp=cntlr addr, Out=succ-V=1, open failed or empty=-1, read
     ******
0243 REM / **** failed-V=-2                                         **********
0244 DEFFN'55(F$)
   : V=1
   : F2$="V"&F$
   : DATA LOAD DC OPEN T F2$
   : ERRORE=ERR
   : V=0
   : RETURN
0245 F2=0
   : MAT REDIM F9$(8)30
   : FOR I=1 TO 5
   : DATA LOAD DC F9$()
   : ERRORE=ERR
   : V=0
   : RETURN
0246 IF END  THEN I=5
   : ELSE GOSUB 247
   : NEXT I
   : DATA SAVE DC CLOSE
   : IF F2=0 THEN V=-1
   : RETURN
0247 REM /gosub to unpack records
   : FOR J=1 TO 8
   : IF STR(F9$(J),1,3)="ZZZ" THEN 248
   : F2=F2+1
   : $UNPACK(F=F3$)F9$(J) TO F2$(F2),F3$(F2),F4$(F2),F5$(F2),F7$(F2),F7(F2)
   : NEXT J
   : RETURN
0248 REM /End of records
   : I=5
   : RETURN
0340 REM % **** DEFFN'65 - LOAD\A0TO\A0SCRN (specific to VVIEW)
0344 DEFFN'65(P9)
   : P1= (P9*8)-7
   : J=1
   : D2$(),D3$(),D4$(),D5$(),D6$(),D8$()=" "
   : MAT D7=ZER
   : P2=P1+7
   : IF P2>F2 THEN P2=F2
   : FOR I=P1 TO P2
   : D2$(J)=F2$(I)
   : D3$(J)=F3$(I)
   : D4$(J)=F4$(I)
   : D5$(J)=F5$(I)
   : D6$(J)=F6$(I)
   : D8$(J)=E8$(I)
0348 J=J+1
   : NEXT I
   : RETURN
0360 REM % **** DEFFN'66 - LOAD\A0FROM\A0SCRN routine  ***********************
     **
0362 REM / ****  Loads storage variables from screen variables    ************
     *
0364 DEFFN'66(P9)
   : P1= (P9*8)-7
   : J=1
   : FOR I=P1 TO P1+7
   : E3$(I)=D3$(J)
   : E4$(I)=D4$(J)
   : E5$(I)=D5$(J)
   : E2$(I)=D2$(J)
   : E8$(I)=D8$(J)
   : E7(I)=D7(J)
0368 J=J+1
   : NEXT I
   : RETURN
0370 REM % **** DEFFN'67 - GET\A0PLATTER
0372 REM / ****  Gets platter size and mode & fills platter status ***********
     *
0373 REM / ****  if successful, V=1, if 2200SRV problems, V=-1   ************
0374 DEFFN'67
   : V=1
   : IF STR(F6$,3,1)=HEX(FF) THEN 376
0375 V=-1
   : RETURN
0376 FOR P1=1 TO F2
   : HEXPACK T1$ FROM STR(F2$(P1),2,2)
   : GOSUB '44(T1$)
   : IF V0$<HEX(80) THEN 380
   : IF V9$<>F7$(P1) THEN 375
   : REM /Wrong file handle - System has been corrupted
   : E8$(P1)=E7$(F7(P1))
0378 T=VAL(STR(V9$(),10,2),2)+(VAL(STR(V9$(),8,2),2)*65536)
   : CONVERT T TO F6$(P1),(##########)
   : F6$(P1)=STR(F6$(P1),POS(F6$(P1)<>"0"))
   : GOTO 382
0380 REM /can't access VDISK
   : E8$(P1)="Not ready"
0382 NEXT P1
   : RETURN
0430 REM % **** DEFFN'72 - VDISK\A0VAL
0432 REM / ****  Validates VDISK entries-V=1 if valid,<0 if not   ************
0433 REM / ****  V=0 if both fields blank,T=entry to validate    ************
0435 DEFFN'72(T)
   : V=1
   : IF D5$(T)=" " OR D2$(T)=" " THEN V=-1
   : IF D5$(T)=" " AND D2$(T)=" " THEN V=0
   : RETURN
0460 REM % **** DEFFN'74 - FIND\A0ATTACHED/DETACHED
0461 REM / ****  If T="A" then find 1st attached, else 1st detached ***
0462 REM / ****  V=index if fnd, else V<0 ***
0465 DEFFN'74(F$)
   : V=-2
   : FOR I=1 TO 50
   : IF STR(F1$(I),1,3)="ZZZ" THEN 468
   : GOSUB '48(STR(F1$(I),1,3))
   : IF V<0 THEN 469
   : IF F$="A" THEN 466
   : IF STR(F6$,,1)<>HEX(00)THEN 469
   : ELSE V=I
   : IF V>0 THEN RETURN
0466 IF STR(F6$,,1)=HEX(00) THEN 469
   : V=I
   : RETURN
0468 I=50
0469 NEXT I
   : V=-5
   : RETURN
0470 REM % **** DEFFN'75 - GET\A0CONTROLLER\A0STATUS routine *****************
     **
0471 REM / **** If controller works, gets status. Else helps recover 2200SRV *
     *
0472 REM / ****  if fnd, V=1. if VS down & is term 1 V=-2, else V=-1 *********
     *
0473 DEFFN'75
   : D1$(3)=STR(F1$(F1),4,8)
   : V=1
   : IF STR(F6$,3,1)<>HEX(FF) THEN 476
   : REM /open VDISK status file
   : GOSUB '55(D1$(1))
   : IF V=1 THEN 475
   : E9$="No VDISKs open"
   : V=-1
   : GOTO 483
0475 REM /set up screen
   : GOSUB '67
   : IF V<>1 THEN 476
   : REM /get status
   : GOSUB '65(1)
   : GOTO 483
0476 REM /DMS/VDISK disabled
   : GOSUB '95
   : IF V=1 THEN 477
   : REM /not terminal 1 so see system administrator
   : E9$="2200SRV malfunction at this controller - Please see your system admi
     nistrator"
   : V=-1
   : GOTO 483
0477 REM /user is at terminal 1
   : V=-1
   : E9$="2200SRV malfunction - Please detach and re-attach this controller"
   : V=-1
   : GOTO 483
0479 T$=" "
   : KEYIN T$
   : IF T$=HEX(50) OR T$=HEX(F0) THEN 480
   : IF T$=HEX(82) OR T$=HEX(A1) THEN 481
   : GOTO 479
0480 REM /cancel
   : PRINT AT(22,0,160);
   : V=-1
   : E9$="2200SRV is not responding to this controller"
   : GOTO 483
0481 REM /execute
   : PRINT AT(22,0,160);
   : V=-2
   : REM /!!!!send 2258 commands to attach to DMS & retrieve correct screen
   : E9$="Returned from VS emulation"
0483 REM /Exit
   : E9=99
   : P9$=HEX(F218000150)
   : RETURN
0600 REM % **** DEFFN'95 - CHECK\A0FOR\A0TERMINAL\A01
0606 REM / ****  Return V=1 if true, V=0 if false.                       *****
     *
0607 REM / ****  NOTE - This version does not print error message.       *****
     *
0615 DEFFN'95
   : V=1
   : IF #TERM=1 THEN RETURN
   : ELSE V=0
   : RETURN
0950 REM % Changes in '100
0955 REM % 1007
   : REM /Add display screen only option - FA-NEXT T4
   : IF POS(S9$=FA)=0 THEN 1008
   : REM /else only display
   : RETURN
0995 REM % 1013
   : REM Add '73 to prefill-MAT REDIM T1$(001)008-GOSUB '126(4,52,8,1,1,001,1,
     1,D1$(3),S0$,"X",1,T9," ",1)-IF R1<=0 OR T9<>-1 THEN RETURN-D1$(3)=T1$()-
     GOSUB '73-IF V=1 THEN RETURN-GOSUB '128(D1$(3),4,52,20)-RETURN
1000 DEFFN'100(S9$,S0$)
   : REM Display and Accept VIEWV    (VER 7.00)
1001 S4=1
   : S3=01
   : S2=0
   : S1=0
   : T0$=" "
1002 IF POS(S9$=F3)>0 THEN S4=VAL(STR(S9$,POS(S9$=F3)+1))
1003 IF POS(S9$=F2)>0 THEN T0$=STR(S9$,POS(S9$=F2)+1,4)
1004 IF POS(S9$=F6)>0 THEN GOTO 1008
   : RESTORE LINE 1050
   : GOSUB '129
1005 T9=0
   : FOR T4=1TO 08
1006 ON T4GOSUB 1013,1018,1023,1028,1033,1038,1043,1048
1007 NEXT T4
1008 T9=-1
   : IF POS(S9$=F9)>0 THEN T3=VAL(STR(S9$,POS(S9$=F9)+1))
   : ELSE T3=S4
1009 ON T3GOSUB 1013
1010 ON R1GOTO ,,,,1011,1012
   : RETURN
1011 T3=MOD(T3+1,S3+1)
   : IF T3=0 THEN T3=S4
   : GOTO 1009
1012 T3=MOD(T3-1,S3+1)
   : IF T3<S4 THEN GOTO 1012
   : GOTO 1009
1013 MAT REDIM T1$(001)003
   : GOSUB '126(4,52,3,1,1,001,1,1,D1$(1),S0$,"X",1,T9," ",1)
   : IF R1<=0 OR T9=0 THEN RETURN
   : D1$(1)=T1$()
   : IF VER(T1$(),"HHH")=3 THEN RETURN
   : GOSUB '128("Invalid characters in field",99,0,20)
   : T0$=HEX(18000150)
   : GOTO 1013
1018 MAT REDIM T1$(001)008
   : GOSUB '127(5,52,8,1,1,001,1,1,D1$(3)," ")
   : RETURN
1023 MAT REDIM T1$(008)003
   : GOSUB '127(9,1,3,8,1,008,1,1,D2$()," ")
   : RETURN
1028 MAT REDIM T1$(008)008
   : GOSUB '127(9,11,8,8,1,008,1,1,D3$()," ")
   : RETURN
1033 MAT REDIM T1$(008)008
   : GOSUB '127(9,21,8,8,1,008,1,1,D4$()," ")
   : RETURN
1038 MAT REDIM T1$(008)008
   : GOSUB '127(9,31,8,8,1,008,1,1,D5$()," ")
   : RETURN
1043 MAT REDIM T1$(008)010
   : GOSUB '127(9,43,10,8,1,008,1,1,D6$()," ")
   : RETURN
1048 MAT REDIM T1$(008)021
   : GOSUB '127(9,60,21,8,1,008,1,1,D8$()," ")
   : RETURN
1050 DATA 01,13,00,"*****"
1051 DATA 01,21,00,"V I E W  D M S / V D I S K  S T A T U S"
1052 DATA 01,63,00,"*****"
1054 DATA 02,34,00,"Revision 2.0 "
1055 DATA 04,22,00,"Enter communications address:"
1056 DATA 05,27,00,"Configuration file name:"
1057 DATA 07,01,00,"2200"
1058 DATA 07,11,00,"-- VDISK Name on VS System --"
1059 DATA 07,43,00,"Platter"
1060 DATA 08,01,00,"Platter"
1061 DATA 08,11,00,"Volume"
1062 DATA 08,21,00,"Library"
1063 DATA 08,31,00,"File Name"
1064 DATA 08,43,00,"Size (sectors)"
1065 DATA 08,60,00,"VDISK Status"
1066 DATA 20,47,00,"PREV SCRN/SF2 - Previous screen"
1067 DATA 21,48,00,"NEXT SCRN/SF3 - Next screen"
1068 DATA 22,52,00,"EXEC/RUN - View new status"
1069 DATA 23,49,00,"CANCEL/EDIT - Exit"
1070 DATA 09,01,99,HEX(0006)
1071 DATA 09,11,99,HEX(0005)
1072 DATA 09,21,99,HEX(0006)
1073 DATA 09,31,99,HEX(0008)
1074 DATA 09,43,99,HEX(000D)
1075 DATA 09,60,99,HEX(000B)
1076 DATA 0,0,0," "
1649 DEFFN'199
1650 STR(V8$,7,1)=HEX(53)
1651 STR(V8$,6,1)=BIN(#PART-1)AND HEX(0F)OR HEX(50)
1653 $OPEN #3
   : $GIO#3(466042708701,V8$)
   : IF STR(V8$,1,1)<>HEX(80)THEN 1664
1655 V1=LEN(V8$())+34
   : STR(V8$,6,2)=BIN(V1,2)
   : $GIO#3(40E3426042701800A0001801A00040008701,V8$)V7$;STR(V8$(),,V1)
1656 IF STR(V8$,1,1)<>HEX(80)THEN 1664
1657 V9$()=ALL(" ")
   : $GIO#3(870387041801C340,V8$)V8$;STR(V9$(),1,VAL(STR(V8$,3,2),2))
1658 $GIO#3(4000,V8$)
1660 $CLOSE#3
1662 V0$=HEX(FF)
   : RETURN
1664 V0$=HEX(5A)
   : RETURN
1999 REM % *********************** Start of Main Program *********************
2000 REM %Read VDISKMAP & get addr
   : PRINT HEX(03)
   : C=0
   : GOSUB '50
   : IF V<>1 THEN 2070
   : REM /get 1st attached
   : GOSUB '74("A")
   : IF V<0 THEN 2070
   : F1=V
2010 REM / default to first attached cntrlr
   : D1$(1)=STR(F1$(F1),1,3)
   : REM /open VDISK status file
   : IF D1$(1)<>" " THEN GOSUB '75
   : ELSE V=-1
   : IF V<0 THEN 2230
2070 REM /initialize loop
   : P9=1
2080 REM %Repeat loop until (EXIT = FALSE)
   : REM /Display input screen
   : GOSUB '100(P9$,"NP")
   : E9=99
2090 REM % case ( RESPONSE(R1) )
   : REM /CASE-screen not found
   : IF R1=-2 THEN 2100
   : REM / CASE-shift cancel/cancel, exit program
   : IF R1<=0 THEN 2105
   : REM / CASE-execute, do it
   : IF R1=1 THEN 2125
2095 REM /CASE-previous screen
   : IF R1=2 THEN 2200
   : REM /CASE-next screen
   : IF R1=3 THEN 2215
2100 REM %  case-screen not found
   : E9$="Could not access screen"
   : P9$=HEX(F224000180)
   : C=1
   : E9=23
   : GOTO 2230
2105 REM %  case-shift cancel/cancel, exit program
   : E9$="View DMS/VDISK Status Utility cancelled"
   : C=1
   : E9=23
   : GOTO 2230
2125 REM %case-exec
   : D1$(3),D2$(),D3$(),D4$(),D5$(),D6$(),D8$()=" "
   : IF D1$(1)=" " THEN 2127
   : A0$=D1$(1)
   : GOSUB '52
   : IF V<1 THEN 2126
   : IF STR(F6$,,1)>HEX(00) THEN 2130
   : E9$="Controller not attached"
   : P9$=HEX(F218000150)
   : GOTO 2230
2126 IF V=-1 THEN E9$="Illegal communications address"
   : IF V=-10 THEN E9$="Controller not responding"
   : IF V=-20 THEN E9$="Controller is being accessed by another partition"
   : P9$=HEX(F218000150)
   : GOTO 2230
2127 E9$="Please enter communications address"
   : P9$=HEX(F218000150)
   : GOTO 2230
2130 REM /get status info on controller
   : GOSUB '75
   : GOTO 2230
2200 REM %  case-previous screen, get it if possible, or display error
   : IF P9<=1 THEN 2205
   : GOSUB '66(P9)
   : P9=P9-1
   : GOSUB '65(P9)
   : P9$=HEX(F218000140)
   : GOTO 2210
2205 REM /Error
   : E9$="No previous screen"
   : P9$=HEX(F218000140F6)
2210 P7=60
   : GOTO 2230
2215 REM %  case-next screen, get it if possible, or display error
   : IF P9=4 THEN 2220
   : REM /Validate
   : GOSUB '72(8)
   : IF V<=0 THEN 2220
   : GOSUB '66(P9)
   : P9=P9+1
   : GOSUB '65(P9)
   : P9$=HEX(F218000140)
   : GOTO 2230
2220 REM /Error
   : E9$="No next screen"
   : P9$=HEX(F218000140F410F6)
2230 REM %until (EXIT = TRUE) repeat, else exit program
   : PRINT AT(23,0,80);
   : IF E9$<>" " THEN GOSUB '128(E9$,E9,0,20)
   : E9$=" "
   : IF C=0 THEN 2080
3015 REM % VIEW exit
3025 PRINT AT(23,00,80);
   : GOSUB '128("Loading VS Services Menu",24,0,20)
3030 LOAD RUN  "@VSMENU"
3799 REM % *********************** SCREEN SUBS - APEERS *********************
3800 REM SE.SUBS, RELEASE 7.00, (08/23/82) SCREEN SUBROUTINES
3801 DIM T1(8),T2(2),S1$,S2$124,S3$1,S4$80,T1$1,T2$80,T3$1,T4$3,T$(10)1
3802 DEFFN'126(T1(1),T1(2),T1(3),T1(4),T1(5),T1(6),T1(7),T1(8),T1$(),S0$,S2$,T
     2,T9,T$(),S9)
   : S3$=S2$
   : I=20
   : GOSUB 3864
   : T2,T5=MIN(MAX(1,T2),T1(6))
   : $TRAN(T$(),HEX(202E))R
   : T$(5)="5"
   : R1=1
   : IF S9>1THEN 3806
   : IF T9<0THEN 3803
   : T$(5)="5"
   : T3$=S2$
   : GOSUB 3831
   : S2$=T3$
   : IF T9=0THEN 3805
   : T2=T5
3803 GOSUB 3835
   : GOSUB '130(T0,T1,T1(3),S3$,T1$(T2),S0$," ",T$(),T0$)
   : T1$(T2)=S4$
   : IF T$(10)=" "THEN 3804
   : GOSUB '125
   : IF R1=-2THEN 3803
3804 IF R1<5OR R1=11OR R1=14THEN 3805
   : IF R1=5THEN T2=T2+1
   : IF R1=6THEN T2=T2-1
   : IF T2>=1AND T2<=T1(6)THEN 3803
3805 RETURN
3806 S8$=S0$
   : SELECT PRINT 205(80)
   : PRINT HEX(0202020F);
   : $TRAN(S2$,HEX(8520))R
   : T2=T2-1
3808 T2=MAX(1,MOD(T2+1,T1(6)))
   : IF STR(T1$(T2),,1)=HEX(00)THEN 3808
3810 IF T9<0THEN 3814
   : T5=T2
   : FOR T2=1TO T1(6)
   : IF S9=2THEN 3811
   : T4$=STR(S2$,T2,1)&HEX(0F09)
   : GOTO 3812
3811 IF T2=T5THEN T4$=HEX(8B0E09)
   : ELSE T4$=HEX(900F09)
3812 GOSUB 3835
   : GOSUB 3824
   : NEXT T2
   : T2=T5
   : IF T9=0THEN 3825
3814 IF S9=3THEN S8$=S8$&"DI"
   : GOSUB 3835
   : PRINT HEX(06);AT(T0-1,T1-1);
   : T8=1
   : GOSUB 3839
   : IF S9=2AND R1>08AND R1<15THEN 3825
   : IF R1<7THEN 3825
   : IF S9=2THEN 3818
   : IF POS(HEX(8B85)=STR(S2$,T2,1))=0THEN 3819
   : ON R1-8GOTO 3815,3816
   : GOTO 3819
3815 STR(S2$,T2,1)=HEX(85)
   : GOTO 3817
3816 STR(S2$,T2,1)=HEX(8B)
3817 T4$=STR(S2$,T2,1)&HEX(0F09)
   : GOSUB 3824
   : I=1
   : GOTO 3822
3818 T4$=HEX(900F09)
   : GOSUB 3824
3819 ON POS(HEX(2008)=T1$)GOTO 3820,3821
   : GOSUB 3826
   : GOTO 3823
3820 I=1
   : GOTO 3822
3821 I=-1
3822 T2=T2+I
   : T2=MOD(T2,T1(6))
   : IF T2=0THEN T2=T1(6)
   : IF T1$(T2)=" "OR STR(T1$(T2),,1)=HEX(00)THEN 3822
3823 IF S9=3THEN T4$=STR(S2$,T2,1)&HEX(0F09)
   : ELSE T4$=HEX(8B0E09)
   : GOSUB 3835
   : GOSUB 3824
   : GOTO 3814
3824 PRINT HEX(06);AT(T0-1,T1-1);
   : IF T1$(T2)>" "THEN PRINT HEX(0E);T4$;STR(T1$(T2));
   : ELSE IF STR(T1$(T2),,1)>HEX(00)THEN PRINT TAB(T1-1+2);STR(T1$(T2));
   : RETURN
3825 $TRAN(S2$,HEX(2085))R
   : T0=T2
   : PRINT HEX(0F0202000F);
   : IF S2=2THEN RETURN
   : MAT REDIM T1$(T1(6))1
   : T1$()=S2$
   : SELECT PRINT 005(80)
   : RETURN
3826 T1$=OR HEX(20)
   : S=-1
   : IF T2=T1(6)THEN 3827
   : FOR I=T2+1TO T1(6)
   : T3$=STR(T1$(I),1,1)OR HEX(20)
   : IF T3$<>T1$THEN NEXT I
   : ELSE S=I
3827 IF T2=1OR S>0THEN 3828
   : FOR I=1TO T2-1
   : T3$=STR(T1$(I),1,1)OR HEX(20)
   : IF T3$<>T1$THEN NEXT I
   : ELSE S=I
3828 IF S>-1THEN T2=S
   : RETURN
3830 DEFFN'127(T1(1),T1(2),T1(3),T1(4),T1(5),T1(6),T1(7),T1(8),T1$(),T$())
   : $TRAN(T$(),HEX(202E))R
3831 SELECT PRINT 405(80)
   : IF T$(7)=" "THEN PRINT HEX(020402000E06);
   : ELSE PRINT HEX(0F06)
   : FOR T2=1TO T1(6)
   : GOSUB 3835
   : S2$=T1$(T2)
   : IF T$(3)=" "OR S2$=" "THEN 3832
   : STR(S2$,,LEN(S2$))=ALL(8B)
3832 IF T$(5)>" "THEN $TRAN(S2$,HEX(8520))R
   : PRINT AT(T0-1,T1-1);
   : IF STR(S2$,,1)>HEX(00)THEN PRINT STR(S2$,,T1(3));
   : NEXT T2
   : SELECT PRINT 005(80)
   : RETURN
3835 IF T$(4)>" "THEN T0=INT((T2-1)/T1(8))*T1(7)+T1(1)
   : ELSE T0=MOD((T2-1),T1(4))*T1(7)+T1(1)
   : IF T$(4)>" "THEN T1=MOD((T2-1),T1(8))*T1(5)+T1(2)
   : ELSE T1=INT((T2-1)/T1(4))*T1(5)+T1(2)
   : T0=T0+T2(1)
   : T1=T1+T2(2)
   : RETURN
3836 IF T0$<>" "THEN GOSUB 3860
   : IF T>0THEN GOSUB 3862
   : RETURN
3838 T=1
   : PRINT HEX(06070E);AT(23,0,40);" Invalid key ignored";AT(T0-1,T1-2+T8);
3839 R1=99
   : IF T$(9)=" "THEN PRINT HEX(02050F);
   : KEYIN T1$,,3845
   : GOSUB 3836
   : IF T1$>HEX(82)THEN 3838
   : IF T$(9)=" "THEN 3841
   : IF POS(HEX(8182)=T1$)=0OR POS(S8$=T1$)=0THEN 3838
3841 IF T1$>HEX(82)THEN 3838
   : ON POS(HEX(81820D)=T1$)GOTO 3847,3843,3849
   : RETURN
3843 R1=1
   : RETURN
3845 GOSUB 3836
   : IF T1$>HEX(1F)THEN 3846
   : IF POS(S8$=T1$)=0THEN 3846
   : R1=4
   : S0=VAL(T1$)
   : RETURN
3846 ON POS(HEX(F01F50)=T1$)GOTO 3847,3847,3848
   : IF T$(9)=" "THEN ON POS(HEX(7E7F)=T1$)GOTO 3849,3850
   : GOTO 3851
3847 R1=0
   : RETURN
3848 R1=-1
   : RETURN
3849 R1=5
   : RETURN
3850 R1=6
   : RETURN
3851 T1$=AND HEX(0F)
   : IF POS(HEX(0203050608090A0C0D)=T1$)>0THEN 3852
   : GOTO 3838
3852 $TRAN(T1$,HEX(0B060E05))R
   : R1=VAL(T1$)
   : T2$="*PN****EDIuewd**"
   : IF POS(S8$=STR(T2$,R1,1))>0THEN RETURN
   : GOTO 3838
3853 ON POS(HEX(2008)=T1$)GOTO 3854,3855
   : GOTO 3856
3854 IF T$(4)>" "THEN R1=12
   : ELSE R1=14
   : GOTO 3856
3855 IF T$(4)>" "THEN R1=13
   : ELSE R1=11
3856 I=T1(6)
   : IF T$(4)=" "THEN 3857
   : IF R1=14THEN T2=MOD(T2+T1(8),I)
   : IF R1=11THEN T2=MOD(T2-T1(8),I)
   : GOTO 3858
3857 IF R1=14THEN T2=MOD(T2+1,I)
   : IF R1=11THEN T2=MOD(T2-1,I)
3858 IF T2=0THEN T2=T1(6)
   : IF T2>T1(6)THEN 3853
   : RETURN
3860 FOR I=1TO VAL(STR(T0$,3))
   : PRINT HEX(06);AT(VAL(STR(T0$,1))-2+I+T2(1),VAL(STR(T0$,2))+T2(2),VAL(STR(
     T0$,4)));
   : NEXT I
   : T0$=" "
   : GOSUB 3898
   : RETURN
3862 PRINT HEX(06);AT(23,0,40);
   : T=0
   : GOSUB 3898
   : RETURN
3864 S1$=HEX(0204)&BIN(I/10)&BIN(MOD(I,10))&HEX(0E)
   : PRINT STR(S1$,,5);
   : RETURN
3866 DEFFN'128(S2$,T0,T1,I)
   : SELECT PRINT 005(80)
   : IF T0=99THEN PRINT HEX(07);
   : IF T1=99THEN T1=40-(LEN(S2$)/2)
   : T0=MIN(24,T0)
   : T1=MAX(1,T1)
   : GOSUB 3864
   : I=1
   : STR(S2$,LEN(S2$)+1,1)=HEX(AF)
   : S=POS(S2$=HEX(AF))
3867 PRINT HEX(06);AT(T0-1,T1-1);STR(S2$,I,S-1);
   : I=I+S
   : S=POS(STR(S2$,I)=HEX(AF))
   : T0=T0+1
   : IF S>0THEN 3867
   : PRINT HEX(020402000F06);
   : RETURN
3869 DEFFN'129
   : SELECT PRINT 205(80)
3870 READ T0,T1,I,S4$
   : ERRORR1=-2
   : RETURN
3871 IF T0=0THEN RETURN
   : T0=T0+T2(1)
   : T1=T1+T2(2)
   : IF I=99THEN 3872
   : IF I=0THEN PRINT HEX(0F);
   : ELSE GOSUB 3864
   : PRINT HEX(06);AT(T0-1,T1-1);STR(S4$,,LEN(S4$));
   : GOTO 3870
3872 PRINT HEX(06);AT(T0-1,T1-1);BOX(VAL(S4$),VAL(STR(S4$,2)))
   : GOTO 3870
3874 DEFFN'130(T0,T1,T5,S2$,S4$,S8$,T2$,T$(),T0$)
   : SELECT PRINT 405(80)
   : PRINT HEX(0202000F020402000E);
   : $TRAN(T$(),HEX(202E))R
   : IF T2$>" "THEN PRINT HEX(060F);AT(T0-1,T1-2-LEN(T2$));T2$;HEX(0E);
   : S2$=ALL(S2$)
   : T6=POS("H#X"=S2$)
   : PRINT HEX(0202020F);
   : T8=1
   : IF T$(9)>" "THEN 3876
   : GOSUB 3897
   : IF S8$<>" "THEN S8$=S8$&"IDEew"
   : ELSE S8$="IDEew"
3876 GOSUB 3839
   : IF T$(9)>" "THEN 3905
   : IF R1<7THEN 3899
   : IF R1=11OR R1=14THEN 3899
   : ON R1-7GOTO 3880,3884,3882,3876,3886,3890,3876
   : IF T1$=HEX(08)THEN 3890
   : IF T8<=T5THEN 3878
   : PRINT HEX(07);
   : GOTO 3876
3878 STR(S4$,T8,1)=T1$
   : $TRAN(T1$,HEX(8020))R
   : IF T$(3)=" "THEN PRINT HEX(0E);T1$;
   : ELSE PRINT HEX(0E8B);
   : GOTO 3887
3880 IF T5<T8THEN 3876
   : STR(S4$,T8)=" "
   : GOSUB 3897
   : GOTO 3876
3882 IF T5<T8THEN 3876
   : MAT COPY -S4$<T8,T5-T8>TO -S4$<T8+1,T5-T8>
   : STR(S4$,T8,1)=" "
   : GOSUB 3897
   : GOTO 3876
3884 IF T5<T8THEN 3876
   : MAT COPY S4$<T8+1,T5-T8>TO S4$<T8,T5-T8>
   : STR(S4$,T5,1)=" "
   : GOSUB 3897
   : GOTO 3876
3886 IF T8<T5+1THEN PRINT HEX(09);
3887 IF T8<>T5THEN 3888
   : IF T$(1)=" "THEN 3888
   : R1=5
   : GOTO 3899
3888 T8=MIN(T5+1,T8+1)
   : GOTO 3876
3890 IF T8>1THEN 3891
   : IF T$(2)=" "THEN 3876
   : R1=6
   : GOTO 3899
3891 PRINT HEX(08);
   : T8=T8-1
   : IF T1$<>HEX(08)THEN 3876
   : STR(S4$,T8,1)=" "
   : PRINT HEX(8508);
   : GOTO 3876
3892 PRINT HEX(06070E);AT(23,0,50);T2$;
   : T=1
   : GOSUB 3898
   : GOTO 3876
3893 T2$=" Invalid key ignored"
   : GOTO 3892
3894 T2$=" Information required, please enter"
   : GOTO 3892
3895 T2$=" Invalid characters in field"
   : GOTO 3892
3897 PRINT HEX(06);AT(T0-1,T1-1);
   : T2$=S4$
   : IF T$(3)>" "AND T2$>" "THEN STR(T2$,,LEN(T2$))=ALL(8B)
   : $TRAN(T2$,HEX(8520))R
   : PRINT STR(T2$,,T5);
3898 PRINT HEX(06);AT(T0-1,T1-2+T8);
   : RETURN
3899 IF T$(7)=" "OR T$(3)>" "THEN 3900
   : PRINT HEX(0F);
   : GOSUB 3897
3900 $TRAN(S4$,HEX(20802085))R
   : IF R1<1THEN 3902
   : IF S4$=" "AND T$(6)>" "THEN 3894
3902 ON T6GOTO 3904,3903,3905
   : GOTO 3904
3903 IF NUM(S4$)<T5THEN 3895
   : GOTO 3905
3904 IF S4$>" "AND VER(STR(S4$,,T5),S2$)<T5THEN GOTO 3895
3905 SELECT PRINT 005(80)
   : PRINT HEX(0F0202000F);
   : RETURN
3906 %  S$="SE.SUBS ": SCRATCH TS$: SAVE <S>T()S$3800,3999: PRINT HEX(0E);S$;H
     EX(0F);" updated"
4000 REM % ***********************  Text Messages *********************
4010 REM / Disk error messages
4020 DATA "D80  File not open"
4022 DATA "D81  File full"
4024 DATA "D82  File not in catalog or not a data file"
4026 DATA "D83  File already cataloged"
4028 DATA "D84  File not scratched"
4030 DATA "D85  Index full"
4032 DATA "D86  Catalog end error"
4034 DATA "D87  No end-of-file"
4036 DATA "D88  Wrong record type"
4038 DATA "D89  Sector address beyond end-of-file"
4040 DATA "I90  Disk hardware error"
4042 DATA "I91  Disk hardware error"
4044 DATA "I92  Timeout error"
4046 DATA "I93  Format error"
4048 DATA "I94  Format key engaged"
4050 DATA "I95  Device error"
4052 DATA "I96  Data error"
4054 DATA "I97  Longitudinal redundancy check error"
4056 DATA "I98  Illegal sector address or platter not mounted"
4058 DATA "I99  Read-after-write error"
8135 REM
8230 REM
9089 REM /increment VDISK address
   : D1$=E1$ AND HEX(0F)
   : IF D1$=HEX(0F) THEN E1$=ADD HEX(30)
   : E1$=ADD HEX(01)
   : NEXT I
9989 REM % *********************** Useful Text Constants *********************
9992 DEFFN '16  "LIST S"
9994 DEFFN '17  "LIST SD 2000,"
9996 DEFFN '18  "LIST SD 132,"
9997 DEFFN '19  "LIST SD 374, "
9999 DEFFN '31  "SCRATCH T";HEX(22);"VVIEW";HEX(22);": SAVE T()";HEX(22);"VVIE
     W";HEX(22)