image of READY prompt

Wang2200.org

Listing of file='@GENPART' on disk='vmedia/mvp-cs386-1.30-disk1.wvd.zip'

# Sector 255, program filename = '@GENPART'
0005 REM !@GENPART  07/20/91  By PLS (mod.by KKB
0006 REM ! Copyright Wang Laboratories 1985, 1986, 1989, 1990, 1991, 1993
   : REM ! All rights reserved
0007 REM CHANGE MADE TO PREVENT LOADING OF INVALID CONFIGS ON 386 & VLSI.  ALS
     O CORRECTED PROBLEM BOOTING W/ 64K MEM. 3/28/95 MEB
0008 COM V9
   : REM /new logic @2405 rem%%S9=SPACESK
0009 REM % TURBO 32 PART BUG & VLSI BOOT PROB FIXED. KKB 01/03/92
0010 DIM A$34,A(64),A0(64),B,B$(64)1,B0,B1,C$64,C0$1,C2$2,C1,C2,C3,C6,D,D$4,D$
     (33)3,D1$4,D2,D3,E,E$1,E9,F,F$8,F0,F0$8,F1$8,F2$8,I,I1,I2,I3,I$44,K$1,K1$
     2
   : C$=$PSTAT(1)
0011 DIM J$(1)
   : J$=STR(C$,9,1)
   : REM % Corrected "Invalid Configuration" problems with VLSI & 386.  3/3/93
      MEB
0012 DIM J,K,L,L$52,L$(4)52,L1,L9,M,M1,M2,M$78,M1$80,N,N7,N8,N9,O1,P,P$8,P$(64
     )8,Q,Q0,Q1,Q2,Q$(128)2,Q1$8,Q1$(15)8,Q2$3,Q2$(15)3,Q3$2,Q3$(15)2,Q4$(8)8,
     R(64),R0(64),S,S$48,S0,S2,S(64),S9,T$64,T,T1,T1$(15)13,T2,T2$(15)10
0013 DIM U,U$1,U0$1,U1,U6,U7,U9,W$1,W,W0$48,W1$,W2$,W3$(16)8,W4$(33)3,W5$(15)1
     3,W9$,X,X$1,Y$1,Y1,Z,Z$4,Z$(1)3,A$(4)34,S$(4)48,P1$8
0014 REM %0 C0$ OS.type, C2$ OS.rel.#
   : REM %0 O1 Config.via.CPU,  F0  Config.via.item
0015 %STR(C$,9,2)="W ": REM /.TEMP FOR TESTING
0016 C0$=STR(C$,9)
   : HEXUNPACKSTR(C$,10,1)TO C2$
   : F0$="@SYSFILE"
0018 O1=10
   : IF C0$="T"THEN 20
   : O1=4
   : IF C0$="W"THEN 19
   : O1=3
   : IF C2$>"33"THEN 22
   : O1=2
   : IF C2$<"26"THEN O1=1
   : GOTO 22
0019 IF C2$>="20"THEN O1=5
   : REM %%O1=5
0020 BIN(U0$)=0
   : IF C0$<>"M"THEN C0$="W"
0021 REM %0 L1  $INIT ok? 0=N 1=Y
0022 L1=0
   : IF #PART=1AND #TERM=1THEN L1=1
   : IF C0$="M"AND SPACEK<61THEN L1=0
   : IF C0$="W"AND SPACEK<1024THEN L1=0
   : IF L1=0THEN 24
   : L1=0
   : M$=$PSTAT(2)
   : ERRORL1=1
0024 I$=" ##      ########         (##)         (##)"
0026 C2,V9=0
   : INIT(00)A$()
   : Q1$(),Q2$(),Q3$(),T1$(),T2$()=ALL(20)
   : SELECT PRINT 005(80)
0028 REM %0 U1 Max.#.parts, M Min.part.size, T1 Max.#.terminals, M1 Max.#.conf
     igs
0030 U1=16
   : M=2
   : T1=16
   : M1=16
   : S1=1024*8
   : P1,P0=1
0032 IF O1<4THEN 50
   : U1=64
   : T1=64
0038 REM %0 B # memory banks, A( Avail.mem./bank, R(  Remain.mem./bank
   : REM %0 I Current Part.ptr, L Load Flag (msg.dsply), S9 Total Sys.mem.
0040 REM %0 B$( Display flags (Bank boundaries)
   : REM %0 P$ Reconfig.PASSWORD, U # Partitions, T2  # terminals
0044 REM .Partition (I) tables
   : REM %0 A$ Part(I).#.pages, S(  Part(I) size, T$ Part(I).term.#
   : REM %0 P$( Part(I).ProgName, C$ Part(I) Prog?(Y/N)
0046 REM -- F$,F1$,F2$ = Config.name
   : REM -- E$ = Display flag (' '=Partitions, 'E'=Dev.tbl, 'H'=Help, 'L'=Conf
     ig.menu
0050 P$="SYSTEM"
0052 GOSUB 135
0054 REM %^..Initialization (& possible automatic execution)
   : REM %.User modifiable code
0056 REM %.by CPU # allow unique "@SYSFILE"
0058 IF #ID=9999999999THEN F0$="@SYS1234"
0060 M$=$MSG
   : X$=$PSTAT(2)
   : ERROR$MSG,M$=" "
0065 GOSUB 2400
   : REM /.Find Space
0070 GOSUB 150
0072 REM .Retain native CPU memory
   : S0=S9
   : MAT MOVE A()TO A0()
   : MAT MOVE R()TO R0()
   : B0=B
   : U$=" "
   : IF O1>3THEN U$=HEX(00)
0075 GOTO 95
   : REM %Delete this GOTO to prompt for memory size
0080 GOSUB '198
   : L$=HEX(0000)
   : PRINTUSING TO L$,"####.##",S9
0085 PRINT AT(3,0);
   : LINPUT "Amount of memory available for partitioning (in K)?"STR(L$,3,6)
   : CONVERT STR(L$,3,6)TO S9
   : ERRORGOTO 85
0090 S9=FNT(S9)
   : IF S9>229THEN 85
   : GOSUB 160
   : GOTO 115
0095 REM %Initially LOAD a DEFAULT Configuration (pass name to SubRoutine '205
     )
   : GOSUB '205("current")
   : IF F1$<>F$THEN 115
   : E$="?"
   : L=1
   : IF F0=2THEN U0$=U$
   : F9$=F$
0100 GOTO 1150
   : REM %Delete this GOTO for AUTOMATIC EXECUTION
0105 GOTO 420
   : REM %Delete this GOTO to Randomize PASSWORD
0110 CONVERT RND(1)TO P$,(.#######)
   : GOTO 425
0115 GOSUB 320
   : GOSUB 135
   : L=0
   : IF F$=" "THEN 130
   : GOTO 1150
0120 PRINT AT(U7,0,80);
   : IF L<>0THEN PRINT "Configuration '";F$;"' loaded.  ";
   : L=0
   : RETURN
0125 REM %.'0 Clear all partitions
0130 DEFFN'0
   : F0,F=0
   : GOSUB 2800
   : FOR I=1TO 15
   : Q1$(I),Q2$(I),Q3$(I)=" "
   : NEXT I
   : GOSUB '191
   : REM Set T1$()
   : RETURN CLEAR ALL
   : GOSUB 135
   : GOSUB '204
   : GOTO 176
0135 MAT S=ZER
   : C$=ALL("Y")
   : P$()=ALL(" ")
   : U,L=0
   : U7,U6=22
   : MAT MOVE A()TO R()
   : B$()=ALL(" ")
   : E$=" "
   : RETURN
0145 REM % *** CALCULATE MEMORY SIZE ***
0150 IF C0$<>"W"THEN 160
   : MAT A=ZER
   : A(1)=S9
   : B=1
   : RETURN
0160 MAT A=ZER
   : A(1)=MIN(S9,61)
   : J=S9-61
   : X=1
0165 IF J<=0OR X=U1THEN RETURN
   : X=X+1
   : A(X)=MIN(J,56)
   : J=J-56
   : GOTO 165
0170 REM %.'4 Edit configuration
0175 DEFFN'04
   : F=4
   : RETURN CLEAR ALL
   : GOSUB '204
0176 REM .Calculate RAM disk
   : X=0
   : FOR I=1TO U1
   : X=X+S(I)
   : NEXT I
   : K=1+MOD(K,U)
   : PRINT AT(3,0,50);
   : IF F0=-2THEN GOSUB 2690
   : IF C0$="W"AND F0=0THEN GOSUB 2700
   : X=X9-X
   : IF X<0THEN 180
0178 N9=N8
   : IF N8<2THEN N9=4*X
   : D$=HEX(0340)
   : MAT SEARCHD$(),=D$TO Q3$
   : IF Q3$>HEX(0000)THEN REM PRINT" RAM disk memory";N9;"sectors"
0180 GOSUB 120
0185 IF E$<>" "OR U=0THEN 175
   : IF K<1OR K>U1THEN K=1
   : PRINT HEX(0E);"Edit which partition (default =";K;")";
   : INPUT K
   : ERRORGOTO 180
0190 IF K<>INT(K)OR K<=0OR K>UTHEN 180
   : X=INT((K-1)/16)
   : P0=(16*X)+1
   : IF P1<>P0THEN 260
   : GOSUB 230
0195 X=S(K)
   : PRINT AT(U7,0,80);
   : PRINT "Partition size (default =";X;"K)";
   : INPUT X
   : ERRORGOTO 195
0200 IF X<MAND X<>0THEN 195
   : X=FNT(X)
   : IF X>A(1)THEN 195
   : IF S(K)=XTHEN 204
   : S(K)=X
   : GOSUB 1920
   : GOSUB 230
0204 IF F0=0THEN GOSUB 1232
0205 T=VAL(STR(T$,K))
   : PRINT AT(U7,0,80);"Terminal (default =";T;")";
   : INPUT T
   : ERRORGOTO 205
0210 IF T<>INT(T)OR T<0OR T>T1THEN 205
   : IF VAL(STR(T$,K,1))=TTHEN 215
   : STR(T$,K,1)=BIN(T)
   : GOSUB 235
0215 X$=STR(C$,K,1)
   : PRINT AT(U7,0,80);
   : INPUT "Enable programming (Y or N) ",X$
   : $TRAN(X$,"YyNn")R
   : IF POS("YN"=X$)=0THEN 215
   : IF STR(C$,K,1)=X$THEN 220
   : STR(C$,K,1)=X$
   : GOSUB 230
0220 IF P$(K)<>" "THEN P1$=P$(K)
   : PRINT AT(U7,0,80)
   : LINPUT "Name of program to load?"?-P1$
   : P$(K)=P1$
   : GOSUB 240
   : GOTO 175
0230 PRINT HEX(0E);
   : GOSUB '206(K)
   : GOTO 250
0235 PRINT HEX(0E);
0240 GOSUB '206(-K)
0250 K1=MOD(K-1,16)+1
   : PRINT AT(K1+4,1);"*"
   : RETURN
0260 REM .New page
   : REM .Save 16 old params
   : X=INT(P1/16)+1
   : A$(X)=A$
   : S$(X)=S$
   : REM .Move in 16 new page items
   : Z=INT(P0/16)+1
   : A$=A$(Z)
   : S$=S$(Z)
0265 PRINT AT(2,34);"Page ";Z;"of";INT((U-1)/16)+1
0270 FOR X=1TO 16
   : PRINT AT(4+X,0,50)
   : NEXT X
   : X=K
   : FOR K=P0TO MIN(P0+15,U)
   : GOSUB '206(K)
   : NEXT K
   : P1=P0
   : K=X
   : GOTO 180
0300 REM %.'1 Clear Device table
0310 DEFFN'01
   : F=1
   : GOSUB 320
   : E$="?"
   : GOTO 1390
0320 D$()=ALL(00)
   : D$(1)=HEX(021500)
   : D$(2)=HEX(031000)
   : D$(3)=HEX(032000)
   : D$(4)=HEX(033000)
   : D$(5)=HEX(034000)
   : RETURN
0330 REM %.'2 Divide memory
0335 DEFFN'02
   : F=2
   : RETURN CLEAR ALL
   : GOSUB '204
   : L$()=ALL(00)
   : B$(U)="Y"
   : MAT SEARCHB$(),="Y"TO STR(L$(),3)
   : B$(U)="N"
0340 IF ABS(F0)=2THEN 350
   : IF F0=0AND C0$="W"THEN 350
0342 IF B=1THEN 380
   : Q3$="A"
   : PRINT AT(U7,0,80);
   : LINPUT "Divide memory evenly in which bank (default = all)",Q3$
   : X$=Q3$
   : IF X$="A"OR X$="a"THEN 380
   : CONVERT STR(Q3$,,NUM(Q3$))TO J
   : ERRORGOTO 340
0345 IF J<1OR J>BTHEN 342
   : F0=1
   : GOSUB 355
   : GOTO 385
0350 X=S9
   : PRINT AT(U7,0,80);"Divide how much program memory (default =";X;"K)";
   : INPUT X
   : ERRORGOTO 350
0352 IF X<MOR X>S9THEN 350
   : F0=2
   : R(1)=X
   : A,J=1
   : N=0
   : X=U
   : GOSUB 360
   : GOTO 385
0355 N=0
   : X=VAL(STR(L$(),2*J+1),2)
   : IF X=0THEN 385
   : A=VAL(STR(L$(),2*(J-1)+1),2)+1
0360 FOR I=ATO X
   : IF S(I)=0THEN N=N+1
   : NEXT I
   : IF N=0THEN RETURN
   : S2=FNT(R(J)/N)
0365 IF S2>=MTHEN 370
   : S2=J
   : GOSUB 1920
   : GOSUB '200
   : PRINT AT(U7,0,80);"TOO LITTLE REMAINING MEMORY";
   : IF B>1THEN PRINTUSING " IN BANK #",S2;
   : PRINT ".   ";
   : GOTO 185
0370 IF R(J)-(S2*N)<0THEN S2=S2-.25
   : FOR I=VAL(STR(L$(),2*(J-1)+1),2)+1TO VAL(STR(L$(),2*J+1),2)
   : IF S(I)=0THEN S(I)=S2
   : NEXT I
   : RETURN
0380 F0=1
   : FOR J=1TO B
   : GOSUB 355
   : NEXT J
0385 K=0
   : GOSUB 1920
   : GOSUB '200
   : GOTO 175
0390 REM %.'15 Execute configuration
0395 DEFFN'15
   : F=15
   : RETURN CLEAR ALL
   : GOSUB '204
   : IF C0$="W"THEN GOSUB 2710
   : IF L1=1THEN 400
   : M1$="SYSTEM HAS ALREADY BEEN CONFIGURED."
   : GOSUB '196
   : GOTO 185
0400 IF O1=4AND W>16THEN F0=-2
   : IF J$="W"AND W>16THEN 403
   : IF J$="M"AND W>16THEN 403
   :   IF F0>-1THEN 405
0403 M1$="INVALID CONFIGURATION FOR THIS CPU."
   : GOSUB '196
   : GOTO 1150
0405 GOSUB 1860
   : IF X$="T"THEN GOSUB '200
0410 PRINT AT(U7,0,80);"Check configuration.  OK to execute (Y or N)";
0415 KEYIN X$,415,415
   : X$="N"
   : INPUT X$
   : ON POS("YyNn"=X$)GOTO 420,420,180,180
   : GOTO 410
0420 PRINT AT(U7,0,80);
   : LINPUT "Reconfiguration password?"?-P$
0425 GOSUB 510
   : IF X>S0THEN 630
   : GOTO 840
0500 REM .%.OK configuration
0510 FOR I=1TO 15
   : IF Q2$(I)=" "OR Q2$(I)=HEX(000000)THEN 530
   : Q2$=ALL(00)
   : HEXPACKQ2$FROMQ2$(I)
   : ROTATEC(Q2$,-4)
   : MAT SEARCHD$(),=STR(Q2$,,2)TO Q3$STEP 3
   : IF VAL(STR(Q2$,2))<>4AND VAL(Q3$,2)=0THEN 680
   : NEXT I
0530 X=0
   : FOR I=1TO U
   : K=S(I)
   : IF K=0THEN 640
   : IF K<MTHEN 620
   : X=X+K
   : NEXT I
0590 A$=ALL(00)
   : IF ABS(F0)=2THEN 610
0600 REM %VLSI
   : FOR I=1TO B
   : IF R(I)<0THEN 650
   : NEXT I
   : FOR I=1TO U
   : STR(A$,I,1)=BIN(S(I)*4)
   : NEXT I
   : RETURN
0610 REM %.386
   : IF X>A(1)THEN 630
   : FOR I=1TO U
   : Q0=S(I)*4
   : Q1=INT(Q0/256)
   : Q2=Q0-Q1*256
   : Q=I*2-1
   : STR(A$(),Q,1)=BIN(Q1)
   : STR(A$(),Q+1,1)=BIN(Q2)
   : NEXT I
   : RETURN
0620 PRINT AT(U6,0,80);HEX(07);"SIZE OF PARTITION";I;"IS ILLEGAL.  ";
   : GOTO 185
0630 M1$="Configuration too large"
   : GOSUB '196
   : GOTO 185
0640 M1$="All partitions require some memory"
   : GOSUB '196
   : GOTO 175
0650 PRINT AT(U6,0,80);HEX(07);"AVAILABLE MEMORY EXCEEDED IN BANK";I;".    ";
   : GOTO 185
0680 M1$="Re-edit, printer "&Q2$(I)&" is not in the device table"
   : GOSUB '196
   : GOTO 176
0840 D$(33)=ALL(00)
   : I=1
   : FOR D=1TO 32
   : IF STR(D$(D),2,1)=HEX(00)THEN 850
   : D$=D$(D)
   : D$(D)=ALL(00)
   : D$(I)=D$
   : I=I+1
   : GOTO 860
0850 D$(D)=ALL(00)
0860 NEXT D
   : PACK(####.##)S$()FROMS()
0870 DATA LOAD DC OPEN T#0,F0$
   : ERRORGOTO 890
0880 F$="current"
   : GOSUB 2760
0890 MAT REDIM P$(U1)8,A$(U1+2)2
   : IF U<64THEN STR(T$,U+1)=ALL(00)
   : $TRAN(C$,HEX(014E00590020))R
   : FOR I=1TO U1
   : IF P$(I)<>" "THEN STR(C$,I,1)=OR HEX(02)
   : NEXT I
   : T9$=T$
   : C9$=C$
0900 GOSUB '192
   : REM PACK DRIVER DATA FOR INIT STATEMENT
0901 E=0
   : $MSG=M$
0902 REM % Test OS type to $INIT
   : ON O1GOTO 904,903,903
   : GOTO 905
0903 REM .MVP>2.6
   : $INIT(A$,T9$,C9$,P$(),D$(),P$,T2$())
   : ERRORE=ERR
   : IF E=88THEN GOSUB '217
   : IF E=82THEN GOSUB '219
   : ELSE GOSUB '218
0904 REM .MVP<2.6
   : $INIT(A$,T9$,C9$,P$(),D$(),P$)
   : ERRORE=ERR
   : IF E=88THEN GOSUB '217
   : IF E=82THEN GOSUB '219
   : ELSE GOSUB '218
0905 REM .CS/386
   : IF U$>HEX(00)THEN U$=ADDHEX(FF)
   : U$=U$AND HEX(1F)
   : $INIT(U$,A$(),STR(T$,,U1),STR(C$,,U1),P$(),D$(),P$,T2$())
   : ERRORE=ERR
   : IF E=88THEN GOSUB '217
   : IF E=82THEN GOSUB '219
   : ELSE GOSUB '218
0910 REM .$INIT arg1,arg2,arg3,arg4,arg5,[arg6],[arg7]  ref p.16-47
   : REM .Arg.1 Part.size
   : REM .Arg.2 Term #s
   : REM .Arg.3 Part.modes
   : REM .Arg.4 Prog.Names
   : REM .Arg.5 Device table
   : REM .Arg.6 PASSWORD
   : REM .Arg.7 Printer Tables
0912 REM .Arg.0  CPU (CS/386 only)
0919 REM %.'9 Save Configuration
0920 DEFFN'09
   : F=9
   : RETURN CLEAR ALL
   : GOSUB '204
   : GOSUB 1860
   : IF X$="T"THEN GOSUB '200
   : PACK(####.##)S$()FROMS()
   : S$=S$(1)
   : GOSUB 510
0930 PRINT AT(U7,0,80);"Check configuration to save.  Configuration name?";
   : LINPUT ?-F$
   : IF F$=" "THEN 930
0940 LIMITS T#0,F0$,D,I,D2,D3
   : ERRORGOSUB 1120
   : GOTO 940
0950 IF D3>0THEN 980
   : IF D3=-2THEN 970
   : DATA SAVE DC OPEN T#0,(3*(M1+1)+2)F0$
   : ERRORGOSUB 1120
   : GOTO 940
0960 F$="current"
   : GOSUB 2760
   : DATA SAVE DC #0,END
   : GOTO 940
0970 DATA SAVE DC OPEN T#0,F0$,F0$
   : GOTO 960
0980 DATA LOAD DC OPEN T#0,F0$
   : D,I=0
0990 DATA LOAD DC #0,F1$,W
   : IF END THEN 1020
   : D=D+3
   : IF F1$=" "AND I=0THEN I=D
   : IF F$<>F1$THEN 990
0995 IF INT((W-1)/16)+1<>INT((U-1)/16)+1THEN 1015
1000 PRINT AT(U7,0,80);"Configuration '";F$;"' already exists.  Overwrite it (
     Y or N)";
   : INPUT X$
   : ON POS("YyNn"=X$)GOTO 1050,1050,1010,1010
   : GOTO 1000
1010 PRINT AT(U7,0,80);
   : GOTO 1030
1015 PRINT AT(U7,0,80);"Configuration size differs. ";
   : GOTO 1030
1020 IF I>0THEN 1070
   : IF D2<3*(M1+1)+2THEN 1090
   : GOSUB 1340
   : PRINT AT(U7,0,80);"CONFIGURATION FILE FULL.  ";
1030 F1$=" "
   : LINPUT "Old configuration to overwrite?"?-F1$
   : IF F1$="current"OR F1$=" "THEN 1010
   : DBACKSPACE #0,BEG
1040 DATA LOAD DC #0,F2$,W
   : IF END THEN 1080
   : IF F2$<>F1$THEN 1040
1045 IF INT((W-1)/16)+1<>INT((U-1)/16)+1THEN 1015
1050 DBACKSPACE #0,3S
   : GOSUB 2760
1060 GOTO 1110
1070 DBACKSPACE #0,BEG
   : DSKIP #0,IS
   : GOTO 1050
1080 PRINT AT(U7,0,80);"'";F1$;"' DOES NOT EXIST.  ";
   : GOTO 1030
1090 GOSUB 2760
1100 DATA SAVE DC #0,END
1110 PRINT AT(U7,0,80);"Configuration '";F$;"' saved.  ";
   : GOTO 185
1120 PRINT AT(U7,0,80);
   : X=ERR
   : IF X=95THEN PRINT "DISK IS WRITE PROTECTED, ";
   : ELSE PRINT "ERROR";X;
1130 X$=" "
   : LINPUT "Key 'RETURN' to retry."?X$
   : RETURN
1140 REM %.'8 Load Configuration from disk
1150 DEFFN'08
   : F=8
   : RETURN CLEAR ALL
   : E$=" "
   : GOSUB 1340
   : GOSUB 2800
1155 IF F9$<>" "THEN GOSUB '205(F9$)
   : F9$=" "
1160 GOSUB 120
   : F1$=" "
1170 LINPUT "Name of configuration to load?"?-F1$
   : IF F1$=" "THEN 1190
   : PRINT AT(U7,0,80);
1180 GOSUB '205(F1$)
   : IF F$<>F1$THEN 1190
   : P0,L=1
   : GOTO 175
1190 PRINT AT(U7,0,80);"'";F1$;"' DOES NOT EXIST.  ";
   : GOTO 1170
1200 REM %*** LOAD S.R. ***
1210 DEFFN'205(F1$)
   : F0=0
   : F$=" "
   : DATA LOAD DC OPEN T#0,F0$
   : ERRORM1$="NO CONFIGURATIONS SAVED."
   : GOSUB '196
   : RETURN
1220 GOSUB 2730
   : IF LEN(W9$)>1THEN 2320
   : F$=F2$
   : U=W
   : U$=W$
   : S$(),S$=W0$
   : T$=W1$
   : C$=W2$
   : P$()=W3$()
   : D$()=W4$()
   : T1$()=W5$()
   : U9=VAL(U$)
   : IF END THEN 1226
   : IF F$<>F1$THEN 1220
   : IF W>16THEN 2740
   : GOSUB 1232
1226 T2=0
   : Y$=HEX(01)
   : IF STR(T$,32,1)=HEX(20)THEN STR(T$,32,1)=HEX(80)
   : $TRAN(T$,HEX(0020))R
   : $TRAN(T$,HEX(2080))R
   : IF U<32THEN STR(T$,32,1)=HEX(00)
   : REM .Set T2 = # terminals used
1228 MAT SEARCHT$,=Y$TO Q3$
   : IF Q3$>HEX(0000)THEN T2=T2+1
   : Y$=ADDHEX(01)
   : IF VAL(Y$)<=T1THEN 1228
1230 GOSUB '190
   : U6=MIN(22,U+6)
   : UNPACK(####.##)S$()TO S()
   : B$()=ALL(" ")
   : MAT A=ZER
   : A(1)=S1
   : IF ABS(F0)<>1THEN 1920
   : A(1)=61
   : FOR B=2TO 16
   : A(B)=56
   : NEXT B
   : GOTO 1920
1232 IF U$<" "THEN F0=2
   : IF U$=" "THEN F0=1
   : IF C0$="W"AND U$=" "THEN F0=-F0
   : IF C0$<>"W"AND U$<" "THEN F0=-F0
   : RETURN
1234 REM % If ERROR finding '$INIT' then EXECUTE following ERROR routine.
1235 DEFFN'219
   : PRINT HEX(06);AT(23,0,80);"Printer driver table not on current platter (D
     ISK ERROR ";E;")";HEX(0F)
   : STOP #
1236 DEFFN'218
   : PRINT HEX(06);AT(23,0,80);"Error number";E;"encountered initializing syst
     em."
   : PRINT "Incorrect configuration , specified file is not a driver table or
     not enough memory.";HEX(0F)
   : STOP #
1237 DEFFN'217
   : PRINT HEX(06);AT(23,0,80);"Printer driver table error (DISK ERROR ";E;")"
     ;HEX(0F)
   : STOP #
1240 REM %.'10 Delete configuration
1250 DEFFN'10
   : F=10
   : RETURN CLEAR ALL
   : GOSUB 1340
1260 PRINT AT(U7,0,80);
1270 F$,F1$=" "
   : LINPUT "Delete which configuration? "?-F1$
1280 IF F1$="current"THEN 1260
   : DBACKSPACE #0,BEG
1285 REM .Remove unwanted configuration from @SYSFILE
1290 GOSUB 2730
   : IF END THEN 1320
   : IF F1$<>F2$THEN 1290
   : Z=3*(INT((W-1)/16)+1)
   : REM /.Set # Sectors to remove
1295 IF W>16THEN DSKIP #0,Z-3S
1296 REM .Following loop -- Read - skip back - write - skip up  repeat
1300 GOSUB 2730
   : IF END THEN 1310
   : DBACKSPACE #0,3+ZS
   : DATA SAVE DC #0,F2$,W,STR(W9$,,1),W0$,W1$,W2$,W3$(),W4$(),W5$()
   : DSKIP #0,ZS
   : GOTO 1300
1310 DBACKSPACE #0,ZS
   : DATA SAVE DC #0,END
   : E$="?"
   : GOTO 1150
1320 PRINT AT(U6,0,80);"CONFIGURATION '";F1$;"' DOES NOT EXIST.   ";
   : GOTO 1270
1330 REM %*** LIST STORED CONFIGURATIONS ***
1340 DATA LOAD DC OPEN T#0,F0$
   : ERRORM1$="NO CONFIGURATIONS SAVED."
   : GOSUB '196
   : IF U=0THEN 130
   : GOTO 185
1350 IF E$="L"THEN RETURN
   : E$="L"
1360 GOSUB '201
   : PRINT AT(4,0);"O.K.   Configuration  (#Partitions) (CPU number)"
   : I=0
1370 GOSUB 2730
   : IF END THEN RETURN
   : IF F2$<=" "THEN 1370
   : IF W$>" "THEN 1370
1372 IF W$=" "THEN C2$=".."
   : ELSE CONVERT VAL(W$)TO C2$,(##)
1374 Y$=" "
   : IF O1>3AND W$<" "THEN Y$="y"
   : IF O1<4AND W$=" "THEN Y$="y"
1375 IF W=UAND W$=U$AND W0$=S$AND W1$=T$AND W2$=C$AND W3$()=P$()AND W4$()=D$()
     AND W5$()=T1$()THEN PRINT HEX(060E);
   : PRINTUSING I$,Y$;F2$;W;C2$
   : GOTO 1370
1380 REM %.'5 Edit Device table
1385 DEFFN'05
   : F=5
1390 RETURN CLEAR ALL
   : IF E$="E"THEN 1480
   : E$="E"
1400 GOSUB '201
   : PRINT AT(2,0);"      DEVICE PARTITION        DEVICE PARTITION"
   : GOSUB '202(0)
   : D=1
1410 PRINT AT(U7,0,80);HEX(0E);"Edit which entry (default =";D;")";
   : INPUT D
   : ERRORGOTO 1410
1420 IF D<>INT(D)OR D<=0OR D>32THEN 1410
   : PRINT HEX(0E);
   : GOSUB '202(D)
   : IF D<17THEN PRINT AT(2+D,0);"*"
   : ELSE PRINT AT(2+D-16,24);"*"
1430 HEXUNPACKSTR(D$(D),1,2)TO D$
   : P=VAL(STR(D$(D),3))
1440 D1$="/"&STR(D$,2)
   : PRINT AT(U7,0,80);"Device address (default = /";STR(D$,2);", /000 to dele
     te entry)";
   : INPUT D1$
   : M1$=" "
   : PRINT AT(U7,0,80);HEX(060E);M1$;HEX(0F)
   : IF STR(D1$,2,1)="D"THEN 1440
   : IF VER(D1$,"/HHH")<>4THEN 1440
   : IF D1$="/000"THEN 1500
1442 IF POS("Aa"=STR(D1$,2,1))>0THEN 1440
   : STR(Z$,1)=HEX(30)
1443 STR(Z$,2)=STR(D1$,2)
   : HEXPACKZ$(1)FROMZ$
   : STR(Z$(1),3)=HEX(00)
1444 FOR Z=1TO 32
   : IF Z=DTHEN 1446
   : IF STR(D$(Z),2,1)<>STR(Z$(1),2,1)THEN 1446
1445 M1$="Device address already assigned."
   : GOSUB '196
   : GOTO 1440
1446 NEXT Z
1447 STR(D$,2)=STR(D1$,2)
   : PRINT HEX(0E);
   : GOSUB '203(D)
   : HEXPACKD$(D)FROMD$
   : STR(D$(D),3)=HEX(00)
1450 X=0
   : PRINT AT(U7,0,80);"Allocate device to which partition (default = all)";
   : INPUT X
   : ERRORGOTO 1450
1460 IF X<0OR X>UOR X<>INT(X)THEN 1450
   : P=X
   : GOSUB '203(D)
1470 HEXPACKD$(D)FROMD$
   : STR(D$(D),3)=BIN(P)
1480 IF D<17THEN PRINT AT(2+D,0);" ";
   : ELSE PRINT AT(2+D-16,24);" "
1490 D=1+MOD(D,32)
   : GOTO 1410
1500 FOR J=DTO 32
   : D$(J)=D$(J+1)
   : GOSUB '202(J)
   : NEXT J
   : GOTO 1410
1510 REM %*** EDIT $MSG ***
1520 DEFFN'06
   : F=6
   : RETURN CLEAR ALL
1530 PRINT AT(0,0);AT(U7-1,0,80);"Broadcast message:"
   : LINPUT ?-M$
   : PRINT AT(U7-1,0,159);
   : GOTO 175
1540 REM %*** DISPLAY DEVICE TABLE ***
1550 DEFFN'202(I)
   : IF I=0THEN 1580
1560 HEXUNPACKSTR(D$(I),1,2)TO D$
   : P=VAL(STR(D$(I),3))
1570 DEFFN'203(I)
   : PRINT HEX(06);AT(3+MOD((I-1),16),24*INT((I-1)/16),18);
   : PRINTUSING "  ##.",I;
   : IF STR(D$,2,3)="000"THEN RETURN
   : PRINT "  /";STR(D$,2,3);"    ";
   : IF P=0THEN PRINT "all"
   : ELSE PRINT P
   : RETURN
1580 FOR I=1TO 32
   : GOSUB 1560
   : NEXT I
   : RETURN
1690 REM %.'200 *** DISPLAY ALL PARTITIONS ***
1710 DEFFN'200
   : IF O1>3THEN 1715
   : FOR I=MIN(2,U)TO U
   : GOSUB '206(-I)
   : NEXT I
   : GOSUB '206(1)
   : RETURN
1715 FOR I=P0+1TO MIN(U,P0+15)
   : GOSUB '206(-I)
   : NEXT I
   : GOSUB '206(P0)
   : RETURN
1720 REM '206 DISPLAY ONE PARTITION
1730 DEFFN'206(I)
   : J=ABS(I)
   : L$=HEX(0000)
   : Z=J-P0
   : IF Z<0THEN Z=0
1740 IF S(J)>0THEN PRINTUSING TO L$,1820,J,S(J),VAL(STR(T$,J)),STR(C$,J,1),P$(
     J);
   : ELSE PRINTUSING TO L$,1820,J,"  -",VAL(STR(T$,J)),STR(C$,J,1),P$(J);
1750 IF B$(J)="Y"THEN STR(L$,5)=OR ALL(80)
1760 IF J<=UTHEN PRINT HEX(06);AT(5+Z,0);STR(L$,3);TAB(50);HEX(0F);
1770 IF I<0OR ABS(F0)=2THEN 1780
   : IF C0$="W"AND F0=0THEN 1780
   : PRINT AT(2,17);
   : FOR J=1TO B
   : PRINTUSING "-## ",R(J);
   : NEXT J
1780 IF ABS(I)>INT(5/M)OR B=1THEN 1810
   : X=0
   : FOR J=1TO INT(5/M)
   : X=X+S(J)
1785 Z=J-P0
1790 IF X<=5AND S(J)>0THEN X$="u"
   : ELSE X$=" "
   : IF B$(J)="Y"THEN 1810
1800 IF S(J)>0THEN PRINT AT(5+Z,7);STR(X$,,1)
   : IF B$(J)="Y"THEN J=U
   : NEXT J
1810 I=ABS(I)
   : E$=" "
   : RETURN
1820 %   ##    ####.##    ###        #        ##########
1830 REM %*** TRUNCATE TO PAGES ***
1840 DEFFNT(X)=-.25*INT(-4*X)
1850 REM %*** PAD MEMORY BANKS ***
1860 X$="F"
   : MAT SEARCHB$(),="Y"TO L$
1870 FOR I=0TO B-2
   : J=VAL(STR(L$,2*I+1),2)
   : IF J=0THEN 1900
1880 IF R(I+1)=0THEN 1890
   : S(J)=S(J)+R(I+1)
   : X$="T"
1890 NEXT I
1900 GOSUB 1920
   : RETURN
1910 REM %*** CALCULATE REMAINING SPACE ***
1920 MAT MOVE A()TO R()
   : J=1
   : IF B$(1)=" "THEN 1970
1930 FOR I=1TO U
   : R(J)=R(J)-S(I)
   : IF B$(I)="N"THEN 1950
   : J=J+1
   : IF J>BTHEN I=U
1950 NEXT I
   : RETURN
1960 REM ESTABLISH BANK BOUNDARIES
1970 B$()=ALL("N")
   : IF U$<" "THEN 1985
   : FOR I=1TO U
   : IF R(J)-S(I)>=0OR J+1>BTHEN 1980
   : J=J+1
   : B$(I-1)="Y"
1980 R(J)=R(J)-S(I)
   : IF J=BAND R(J)<0THEN R(J)=0
   : NEXT I
   : RETURN
1985 FOR I=1TO U
   : R(1)=R(1)-S(I)
   : NEXT I
   : RETURN
1990 REM %*** PARTITION DISPLAY ***
2000 DEFFN'204
   : IF E$<>" "OR U=0THEN 2010
   : IF K<=0OR K>UTHEN RETURN
   : K1=MOD(K-1,16)+1
   : PRINT AT(K1+5,0,2);
   : GOSUB '206(K)
   : E$=" "
   : RETURN
2010 E$=" "
   : GOSUB '201
   : IF ABS(F0)=2OR F0=0AND O1>3THEN 2035
2020 PRINT AT(1,0,80);"Available memory:";
   : FOR I=1TO B
   : PRINTUSING "-## ",A(I);
   : NEXT I
   : PRINT AT(2,0,80);"Remaining memory:";
   : FOR I=1TO B
   : PRINTUSING "-## ",R(I);
   : NEXT I
   : GOTO 2040
2035 PRINT AT(2,0,50);
   : PRINTUSING 2715,"Available";S9
   : B=1
   : IF F=0THEN GOSUB 2170
2040 PRINT AT(0,0)
2050 IF U>0THEN 2120
   : PRINT AT(5,0,52);
   : INPUT "No. of terminals",T2
   : ERRORGOTO 2050
2060 IF T2>T1OR T2<1THEN 2050
   : B$()=ALL("N")
   : U=0
   : FOR I=1TO B
   : X=-1
2070 PRINT AT(5+I,0,52);"No. of partitions in ";
   : IF B=1THEN PRINT "system";
   : ELSE PRINT "bank";I;
   : INPUT X
   : ERRORGOTO 2070
2075 IF X<>INT(X)THEN 2070
   : IF X=0AND I=1THEN 2070
2076 IF U+X<=U1THEN 2080
   : PRINT HEX(07);"NUMBER OF PARTITIONS EXCEEDS";U1
   : GOTO 2070
2080 IF X<0OR X>U1THEN 2070
   : IF X=0THEN 2090
   : U=U+X
   : B$(MIN(U1,U))="Y"
   : NEXT I
2090 B$(MIN(U1,U))="N"
   : U6=MIN(22,U+6)
   : IF U<=U1THEN 2100
   : U=0
   : U6=19
   : PRINT HEX(07);"NUMBER OF PARTITIONS EXCEEDS";U1
   : GOTO 2060
2100 FOR I=6TO 22
   : PRINT AT(I,0,52);
   : NEXT I
2110 T$=ALL(00)
   : FOR I=1TO T2
   : STR(T$,I,1)=BIN(MOD(I-1,T2)+1)
   : NEXT I
2120  IF U<>INT(U)OR U<=0OR U>U1THEN 2122
   : ELSE GOTO 2125
2122  M1$="INVALID NUMBER OF PARTITIONS."
   : GOSUB '196
   : GOTO 1150
2125 PRINT AT(4,0,52);
   : PRINT "Partitions =";U," Terminals =";T2;TAB(35);"CPU number =";VAL(U$)
2130 PRINT AT(5,0,52);"PARTITION SIZE(K) TERMINAL PROGRAMMABLE PROGRAM"
2140 GOSUB '200
   : RETURN
2160 DEFFN'11
   : F=11
   : RETURN CLEAR ALL
   : IF U$=" "THEN 175
   : GOSUB 2170
   : PRINT AT(3,0,52);
   : GOTO 175
2170 PRINT AT(0,0);AT(MIN(22,U6),0,80);AT(4,0,52);
   : IF U9<1THEN U9=1
   : INPUT "CPU number ( 1 - 31 )",U9
   : ERRORGOTO 2170
2180 IF U9<>INT(U9)OR U9>31OR U9<1THEN 2170
   : BIN(U0$)=U9
   : U$=U0$
   : RETURN
2300 REM % ERROR HANDLER FOR NEW GENPART WITH OLD SYSFILE
2310 GOSUB '198
   : M1$=ERR$(E)
   : IF E=74THEN 2320
   : PRINT AT(4,0);"Error while loading ";F0$;E;"= ";M1$
   : PRINT AT(18,0);
   : END
2320 PRINT AT(4,0,5*80);"In order to use this version of the 2200 MVP operatin
     g system, the System ";
   : PRINT "Configuration File ('";F0$;"') must be converted to a new format."
     ;HEX(0D0A)
2340 PRINT AT(8,0);
   : Y$="Y"
   : LINPUT "Do you want to run the conversion program ",-Y$
   : ERRORGOTO 2340
2350 IF Y$="Y"OR Y$="y"THEN 2360
   : END
2360 V9=1
   : STOP #
   : LOAD T"@MODSYSF"
   : ERRORE=ERR
2370 PRINT
   : PRINT "Sorry - cannot run '@MODSYSF' (Disk error ";E;")"
   : END
2390 REM %^.TBO S.R.s
2392 REM .determine RAM memory
   : REM .On 386 use SPACE SK
   : REM .on VLSI boot use SPACEK
   : REM .On VLSI subsequent tis tough
2400 GOSUB '198
   : S9=SPACEK
   : IF C0$="W"THEN 2405
   : REM .VLSI
   : B=INT(S9/56)
   : IF S9<=61THEN GOSUB 2410
2402 A(1)=61
   : FOR I=2TO U1
   : A(I)=56
   : NEXT I
   : RETURN
2405 REM %%S9=\F3SK
   : REM .386 CODE
   : RETURN
2410 REM .Not VLSI boot
   : FOR I=1TO U1
   : L$=ALL(00)
   : L$=$PSTAT(I)
   : ERRORI=U1
   : GOTO 2430
2420 B=VAL(STR(L$,11))
   : REM /.B = last used bank
2430 NEXT I
2440 B1,N9=0
   : D$="340"
   : SELECT #1<D$>
   : VERIFY T#1,(0,0)N9
   : ERRORGOTO 2480
2450 PRINT AT(5,0,50);"EXAMINING RAM DISK"
   : GOSUB 2600
   : REM /.Find RAM disk
   : N9=N8
   : B1=INT(N9/256)
   : IF N9/256>B1THEN B1=B1+1
   : REM /.B1 = Banks of RAM disk
2480 B=B+B1
   : S9=(56*B)+5
   : IF B>16THEN B=16
   : RETURN
2600 N9,E9=36000
   : IF C2$<"31"THEN 2635
2620 REM ".Verify gross blocks"
   : M2=16*64*4
   : S=100
   : GOSUB 2660
2630 REM ".Verify fine blocks "
   : E9,N9=N8
   : M2=S
   : GOSUB 2660
   : IF N8>0THEN 2640
2635 REM .Check within main memory
   : I1=(17-B)*4*64
   : VERIFY T#1,(0,I1)N8
   : N7=1
2640 PRINT "Sectors of RAM disk = ";N8-1
   : RETURN
2650 E9=E9-M2
2660 N8=N9
   : I2=E9
   : I1=E9-S
   : IF I1>0THEN 2670
   : N9,N8=0
   : RETURN
2670 VERIFY T#1,(I1,I2)N9
   : IF N9>0THEN 2650
   : RETURN
2690 PRINT AT(1,0,200);"CS/386 configuration"
   : PRINTUSING 2715;"Available",S1
   : S9=S1
2700 R(1)=S9-X
   : PRINTUSING 2715,"Remaining",R(1)
2710 IF U$<" "THEN PRINT AT(4,35);"CPU number =";U9
   : RETURN
2715 %######### memory: -##,###,### K
2720 REM .S.R. to read config item
2730 DATA LOAD DC #0,F2$,W,W9$,W0$,W1$,W2$,W3$(),W4$(),W5$()
   : ERRORE=ERR
   : GOTO 2300
2735 W$=W9$
   : RETURN
2740 REM .LOAD >16 partitions
   : IF F$=F1$THEN 2745
   : DSKIP #0,3*(INT((W-1)/16)+1)-3S
   : GOTO 1220
2745 GOSUB 1232
   : S$(1)=S$
   : FOR X=2TO 4
   : GOSUB '194(X)
   : NEXT X
   : GOTO 1226
2750 DEFFN'194(X)
   : IF U<16*X-15THEN RETURN
   : GOSUB 2730
   : STR(S$(),X*48-47)=W0$
   : STR(T$,X*16-15)=W1$
   : STR(C$,X*16-15)=W2$
   : STR(P$(),X*128-127)=W3$()
   : RETURN
2758 REM .S.R. to write config item
2760 GOSUB '191
   : IF O1<4AND F0<>-2THEN U$=" "
   : IF J$="M"THEN 2770
2765 M1$=HEX(004080C0)
   : FOR X=1TO 4
   : GOSUB '193(X)
   : NEXT X
   : GOTO 2775
2770 M1$=HEX(204080C0)
   : FOR X=1TO 4
   : GOSUB '193(X)
   : NEXT X
2775 RETURN
2780 DEFFN'193(X)
   : IF X>INT((U-1)/16)+1THEN RETURN
   : U$=U$AND HEX(1F)XOR STR(M1$,X)
   : W0$=STR(S$(),X*48-47,48)
   : W1$=STR(T$,X*16-15,16)
   : W2$=STR(C$,X*16-15,16)
   : STR(W3$(),,16*8)=STR(P$(),X*128-127)
2790 IF C0$="M"THEN U$=" "
   : DATA SAVE DC #0,F$,U,U$,W0$,W1$,W2$,W3$(),D$(),T1$()
   : ERRORGOSUB 1120
   : GOTO 2760
2795 RETURN
2800 B=B0
   : S9=S0
   : MAT MOVE A0()TO A()
   : MAT MOVE R0()TO R()
   : U$=U0$
   : RETURN
3000 DEFFN'198
   : PRINT HEX(03060E);TAB(10);"***** Multiuser BASIC-2 Partition Generation P
     rogram *****"
   : PRINT TAB(8);"(c) Copr. Wang Laboratories, Inc.  1986/87/89/90/91/93";HEX
     (01)
   : RETURN
3005 DEFFN'126
3006 DEFFN'127
   : PRINT HEX(060E);AT(23,0,80);
   : PRINT "(Returning to System Menu)";HEX(01)
   : $PSTAT=" "
   : LOAD T"@MENU"
3010 DEFFN'201
   : K=0
   : GOSUB '198
3020 PRINT AT(3,51);BOX(18,28);"       \CC\E9\F3\F4\A0\EF\E6\A0\EF\F0\F4\E9\EF
     \EE\F3:"
3030 PRINT AT(4,52);"'00 - clear partitions";AT(5,52);"'01 - clear device tabl
     e";
3040 PRINT AT(7,52);"'02 - divide memory evenly";AT(8,52);"'04 - edit partitio
     ns";
3050 PRINT AT(9,52);"'05 - edit device table";AT(10,52);"'06 - edit $MSG";
3060 IF O1<>1THEN PRINT AT(11,52);"'07 - select printer driver";
3070 PRINT AT(13,52);"'08 - load configuration";AT(14,52);"'09 - save configur
     ation";
3080 PRINT AT(15,52);"'10 - delete configuration";AT(20,52);"Press FN/TAB to e
     xit"
3085 IF U$<" "THEN PRINT AT(17,52);"'11 - edit CPU number"
3090 IF L1=0THEN RETURN
   : PRINT AT(19,52);"'15 - execute"
   : IF F0>0THEN B=B0
   : RETURN
4000 DEFFN'07
   : F=7
   : REM % DRIVER TABLE ENTRY POINT
   : IF O1=1THEN RETURN
   : C2,C1,C3=0
4020 RETURN CLEAR ALL
   : E$="T"
   : IF C1>=1THEN Q1$(C1)=" "
   : GOSUB '198
   : GOSUB '201
   : PRINT TAB(14);AT(4,7,45);"\C4\F2\E9\F6\E5\F2 \D4\E1\E2\EC\E5 \CE\E1\ED\E5
         \D0\F2\E9\EE\F4\E5\F2 \C1\E4\E4\F2\E5\F3\F3  \D4\E5\F2\ED\A0\A3"
   : PRINT
   : FOR I=1TO 15
   : PRINT AT(5+I,1);
   : PRINTUSING "  ##.",I;
   : NEXT I
4030 REM % Set C2 = # of different drivers
4040 FOR I=1TO 15
   : IF Q1$(I)=" "THEN 4050
   : C3=C3+1
   : PRINT AT(5+I,10);Q1$(I);AT(5+I,32);Q2$(I);AT(5+I,47);Q3$(I)
4042 IF C3<>1THEN 4043
   : Q4$(1)=Q1$(I)
   : C2=1
   : GOTO 4050
4043 I3=1
   : FOR I1=1TO C2
   : IF Q1$(I)<>Q4$(I1)THEN 4046
   : I1=C2
   : I3=0
4046 NEXT I1
   : IF I3=0THEN 4050
   : C2=C2+1
   : Q4$(C2)=Q1$(I)
4050 NEXT I
   : IF C3=0THEN 4070
4070 PRINT HEX(06);AT(5+C1,0);" "
   : C1=C1+1
   : IF C1>15THEN C1=1
4075 PRINT AT(U7,0,80);"Edit which driver entry (default=";C1;")";
   : INPUT C1
   : ERRORGOTO 4075
4080 IF C1>15OR C1<1THEN 4070
   : Q1$=Q1$(C1)
   : Q2$=Q2$(C1)
   : Q3$=Q3$(C1)
4090 PRINT HEX(0E06);AT(5+C1,0);"*";AT(5+C1,10,30);Q1$;AT(5+C1,32);Q2$;AT(5+C1
     ,47);Q3$;
   : PRINT HEX(0F)
4100 PRINT AT(U7,0,80);
   : LINPUT "Enter Driver Table Name: (enter '0' to delete from configuration)
     ",?-Q1$
   : IF Q1$=" "THEN 4100
   : IF Q1$<>"0"THEN 4120
4115 REM .Delete
   : IF C1=15THEN 4116
   : FOR I=C1TO 14
   : Q1$(I)=Q1$(I+1)
   : Q2$(I)=Q2$(I+1)
   : Q3$(I)=Q3$(I+1)
   : NEXT I
4116 Q1$(15),Q2$(15),Q3$(15)=" "
   : GOTO 4000
4120 LIMITS T#0,Q1$,I1,I,I,I
   : IF I=2THEN 4125
   : M1$="File not found on default disk"
   : GOSUB '196
   : GOTO 4100
4125 DATA LOAD BA T#0,(I1)Q$()
   : IF Q$(1)=HEX(6911)OR Q$(1)=HEX(6A11)THEN 4130
   : M1$=Q1$&" is not a printer driver file"
   : GOSUB '196
   : GOTO 4100
4130 REM CHECK FOR NEW UNIQUE DRIVER NAMES
   : I3=0
   : FOR I1=1TO 7
   : IF Q1$<>Q4$(I1)THEN 4135
   : I3=1
   : I1=7
4135 NEXT I1
   : IF I3=1THEN 4138
   : C2=C2+1
   : Q4$(C2)=Q1$
4138 C3=C3+1
4140 IF C2<8THEN 4150
   : M1$="Maximum number of drivers is seven"
   : GOSUB '196
   : C2=7
   : Q1$(C1)=" "
   : GOTO 4070
4150 PRINT AT(5+C1,10,8);Q1$;AT(U7,0,80);
   : LINPUT "Enter Associated Printer Address:"?-Q2$
4180 IF VER(Q2$,"HHH")<3THEN 4210
   : IF POS("027C4"=STR(Q2$,1))=0THEN 4210
   : IF STR(Q2$,2,1)>"0"THEN 4220
   : IF STR(Q2$,2,2)="04"THEN 4220
4210 M1$="Illegal value"
   : GOSUB '196
   : GOTO 4150
4220 REM CHECK FOR DUPLICATE ADDRESS
   : IF STR(Q2$,2)="04"THEN 4290
4230 C6=0
   : FOR I=1TO 15
   : IF C1=ITHEN 4240
   : IF STR(Q2$,2)<>STR(Q2$(I),2)THEN 4240
   : C6=1
4240 NEXT I
   : IF C6=0THEN 4290
   : M1$="Duplicate printer address - re-enter"
   : GOSUB '196
   : GOTO 4150
4290 PRINT AT(5+C1,32,5);Q2$
4300 REM CHECK FOR TERMINAL PRINTER
4305 IF STR(Q2$,2,2)="04"THEN 4310
   : Q3$=" "
   : GOTO 4360
4310 PRINT AT(U7,0,80);
   : LINPUT "Enter Terminal no. (between 1 and 64)",?-Q3$
   : ERRORGOTO 4310
4320 CONVERT Q3$TO I1
   : ERRORPRINT HEX(07)
   : GOTO 4310
4325 IF I1<1OR I1>64THEN 4310
   : C6=0
   : FOR I2=1TO 15
   : IF I2=C1THEN 4340
   : CONVERT Q3$(I2)TO I3
   : ERRORGOTO 4340
4330 IF I1<>I3THEN 4340
   : C6=1
   : I2=15
4340 NEXT I2
4345 IF C6=0THEN 4350
   : M1$="Terminal port already allocated"
   : GOSUB '196
   : GOTO 4310
4350 CONVERT I1TO Q3$,(##)
4360 PRINT AT(5+C1,47,3);Q3$
   : Q1$(C1)=Q1$
   : Q2$(C1)=Q2$
   : Q3$(C1)=Q3$
   : GOTO 4070
5000 REM % SUBROUTINES FOR PRINTER DRIVER TABLE
5010 DEFFN'190
   : REM CONVERT @SYSFILE T1$() ARRAY TO INDIVIDUAL DRIVER ARRAYS FOR DISPLA
5020 FOR I=1TO 15
   : Q1$(I)=STR(T1$(I),1,8)
   : Q2$(I)=STR(T1$(I),9,3)
   : Q3$(I)=STR(T1$(I),12,2)
   : NEXT I
   : RETURN
5050 DEFFN'191
   : REM CONVERT DISPLAY DATA FOR PRINTER DRIVER TO @SYSFILE FORMAT
5060 FOR I=1TO 15
   : STR(T1$(I),1,8)=Q1$(I)
   : STR(T1$(I),9,3)=Q2$(I)
   : STR(T1$(I),12,2)=Q3$(I)
   : IF Q1$(I)=" "THEN STR(T1$(I),9,5)=" "
   : NEXT I
   : RETURN
5100 DEFFN'192
   : REM CONVERT PRINTABLE DRIVER TABLE DATA TO FORMAT FOR $INIT STATEMENT
   : IF O1=1THEN RETURN
   : REM SKIP IF OLD OS
5110 FOR I=1TO 15
   : STR(T2$(I),1,8)=Q1$(I)
   : IF STR(T2$(I),1,8)=HEX(0000000000000000)THEN STR(T2$(I),1,8)=ALL(20)
   : IF STR(T2$(I),1,8)=HEX(20)THEN 5130
5120 IF STR(Q2$(I),2,2)=HEX(0000)THEN STR(Q2$(I),2,2)=HEX(3030)
   : HEXPACKSTR(T2$(I),9,1)FROMSTR(Q2$(I),2,2)
   : IF Q3$(I)=" "OR Q3$(I)=HEX(0000)THEN Q3$(I)="00"
   : CONVERT Q3$(I)TO A9
   : STR(T2$(I),10,1)=BIN(A9)
5130 NEXT I
   : RETURN
8000 REM % Next/Prev Screen Routine
8010 REM % Scan Keyboard
   : $IF ON /001,8020
   : GOTO 8010
8020 REM % Get the Char.
   : K$=" "
   : KEYIN K$,,8100
8021 IF K$=HEX(0D)THEN GOSUB 8200
   : ELSE IF K$=HEX(08)AND C=2THEN DO
   : C=1
   : PRINT K$;
   : END DO
8022 IF K$=HEX(08)AND C=2THEN DO
   : C=1
   : PRINT K$;
   : END DO
8030 REM % Check if Numeral key
   : IF POS("0123456789"=K$)>0THEN DO
   : IF C<3THEN STR(K1$,C,1)=K$
   : IF C<3THEN PRINT K$;
   : C=C+1
   : END DO
   : IF C>3THEN PRINT HEX(07);
   : IF C>2THEN 8010
8090 GOTO 8010
8100 REM % Check for Next/Prev/SF'5/SF'6
   : STOP #
8110 IF POS(HEX(05064342)=K$)>0THEN STOP #
8200 RETURN
8900 STOP
9100 DEFFN'196
   : REM DISPLAY MESSAGE M1$, BEEP, AND DELAY
9110 PRINT AT(U7,0,80);HEX(06070E);
   : SELECT P9
   : PRINT M1$;HEX(0F0C)
   : SELECT P
   : RETURN
9200 DEFFN'195
   : REM CHECK FOR UNIQUE DRIVER NAMES
   : I3=0
   : FOR I=1TO 15
   : IF Q1$(I)=" "THEN 9210
   : IF Q1$(C1)<>Q4$(I)THEN 9210
   : I3=1
   : I=15
9210 NEXT I
   : IF I3=1THEN C2=C2+1
   : RETURN
9990 DEFFN'12
   : LIST D9990
   : PRINT F$,"Parts=";U," CPU=";HEXOF(U$),HEXOF(W0$)
   : PRINT "W1$ = Terminals ";HEXOF(W1$)
   : PRINT "W2$ = Programmable ";W2$
   : PRINT "W3$() = Boot program ";W3$()
   : PRINT "D$()=";HEXOF(D$())
   : PRINT "T1$() = ";HEXOF(T1$())
   : RETURN