DataMuseum.dk

Presents historical artifacts from the history of:

CP/M

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about CP/M

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦d0093548d⟧ TextFile

    Length: 19840 (0x4d80)
    Types: TextFile
    Names: »INSTALL.PAS«

Derivation

└─⟦8e533ec5a⟧ Bits:30004189 COMPAS Pascal v3.02 til CR7
    └─ ⟦this⟧ »INSTALL.PAS« 

TextFile

PROGRAM INSTALL; (*$A+,C-,R-*)

LABEL EXIT;

CONST

  MAXTERM = 50;

TYPE

  STR2  = STRINGÆ2Å;
  STR3  = STRINGÆ3Å;
  STR4  = STRINGÆ4Å;
  STR5  = STRINGÆ5Å;
  STR8  = STRINGÆ8Å;
  STR12 = STRINGÆ12Å;
  STR16 = STRINGÆ16Å;
  STR24 = STRINGÆ24Å;
  STR31 = STRINGÆ31Å;
  STR36 = STRINGÆ36Å;
  STR48 = STRINGÆ48Å;

  CHARSET = SET OF CHAR;

  TNAMSTR = STRINGÆ31Å;

  DATAREC = RECORD
	      TERMNAME: TNAMSTR;
	      WIDTH,HEIGHT: BYTE;
	      GXYLS: STR8;
	      GXYSS,GXYTS: STR4;
	      COLB4LIN,COOROFS,COORFMT: BYTE;
	      CLHS,CESS,CELS,ILNS,DLNS,RONS,ROFS: STR8;
	      VGXY,VLCS,VLCI,VLCO,VLLO,VLAO,VLAI: INTEGER;
	      PATCH: ARRAYÆ0..511Å OF BYTE;
	      BACKF,INSMF,AUTOF,TABSF: BYTE;
	      RDELAY: INTEGER;
	      ALTKEY: ARRAYÆ0..255Å OF BYTE;
	    END;

VAR

  CF: FILE;
  TF: FILE OF TNAMSTR;
  DF: FILE OF DATAREC;
  CFN: STR16;
  DATA: DATAREC;
  TNAM: ARRAYÆ1..MAXTERMÅ OF STR31;
  B1: ARRAYÆ0..767Å OF BYTE;
  B2: ARRAYÆ0..511Å OF BYTE;
  I,B2S,B2A: INTEGER;
  CH: CHAR;

FUNCTION UPCASE(S: STR24): STR24;
VAR
  I: INTEGER;
  U: STR24;
BEGIN
  U:='';
  FOR I:=1 TO LEN(S) DO
  IF (SÆIÅ>='a') AND (SÆIÅ<='z') THEN
  U:=U+CHR(ORD(SÆIÅ)-32) ELSE U:=U+SÆIÅ;
  UPCASE:=U;
END;

FUNCTION HEX(NUMBER,DIGITS: INTEGER): STR4;
CONST
  HEXDIGITS: ARRAYÆ0..15Å OF CHAR = '0123456789ABCDEF';
VAR
  D: INTEGER;
  H: STR4;
BEGIN
  HÆ0Å:=CHR(DIGITS);
  FOR D:=DIGITS DOWNTO 1 DO
  BEGIN
    HÆDÅ:=HEXDIGITSÆNUMBER AND 15Å;
    NUMBER:=NUMBER SHR 4;
  END;
  HEX:=H;
END;

FUNCTION HEXSEQ(SEQ: STR8): STR24;
VAR
  I: INTEGER;
  S: STR24;
BEGIN
  IF SEQ='' THEN HEXSEQ:='Unconfigured' ELSE
  BEGIN
    S:='';
    FOR I:=1 TO LEN(SEQ) DO S:=S+HEX(ORD(SEQÆIÅ),2)+' ';
    HEXSEQ:=COPY(S,1,LEN(S)-1);
  END;
END;

FUNCTION YESNO(FLAG: INTEGER): STR4;
BEGIN
  IF FLAG<>0 THEN YESNO:='YES' ELSE YESNO:='NO';
END;

PROCEDURE BACKSP(N: INTEGER);
VAR
  I: INTEGER;
BEGIN
  FOR I:=1 TO N DO WRITE(^H' '^H);
END;

FUNCTION READNUM(MIN,MAX: INTEGER): INTEGER;
VAR
  N,P: INTEGER;
  OK: BOOLEAN;
  S: STR5;
BEGIN
  REPEAT
    BUFLEN:=5; READ(S);
    IF S='' THEN OK:=FALSE ELSE
    BEGIN
      VAL(S,N,P);
      OK:=(P=0) AND (N>=MIN) AND (N<=MAX);
    END;
    IF NOT OK THEN BACKSP(LEN(S));
  UNTIL OK;
  WRITELN; READNUM:=N;
END;

FUNCTION READSEQ(MAXLEN: INTEGER): STR8;
CONST
  HEXDIGITS: SET OF '0'..'f' = Æ'0'..'9','A'..'F','a'..'f'Å;
VAR
  D,H,N,P: INTEGER;
  ERROR: BOOLEAN;
  SEQ: STR8;
  S: STR24;
BEGIN
  REPEAT
    BUFLEN:=23; READ(S); S:=S+^M;
    ERROR:=FALSE; P:=1; N:=0;
    REPEAT
      WHILE SÆPÅ=' ' DO P:=P+1;
      IF (SÆPÅ IN HEXDIGITS) AND (N<MAXLEN) THEN
      BEGIN
	H:=0;
	REPEAT
      	  IF SÆPÅ IN Æ'0'..'9'Å THEN D:=ORD(SÆPÅ)-48 ELSE
	  IF SÆPÅ IN Æ'A'..'F'Å THEN D:=ORD(SÆPÅ)-55 ELSE
	  D:=ORD(SÆPÅ)-87;
          H:=H*16+D; P:=P+1;
	UNTIL NOT(SÆPÅ IN HEXDIGITS);
        N:=N+1; SEQÆNÅ:=CHR(H);
      END;
      IF NOT(SÆPÅ IN Æ^M,' 'Å) THEN ERROR:=TRUE;
    UNTIL (SÆPÅ=^M) OR ERROR;
    IF ERROR THEN BACKSP(LEN(S)-1);
  UNTIL NOT ERROR;
  SEQÆ0Å:=CHR(N); WRITELN;
  READSEQ:=SEQ;
END;

FUNCTION READYN: INTEGER;
VAR
  S: STR4;
BEGIN
  REPEAT
    BUFLEN:=3; READ(S); S:=UPCASE(S);
    IF (S<>'YES') AND (S<>'NO') THEN BACKSP(LEN(S));
  UNTIL (S='YES') OR (S='NO');
  IF S='YES' THEN READYN:=255 ELSE READYN:=0;
  WRITELN;
END;

FUNCTION SELECT(PROMPT: STR48; OKCH: CHARSET): CHAR;
VAR
  CH: CHAR;
BEGIN
  WRITE(PROMPT,': ');
  REPEAT
    READ(KBD,CH);
    IF (CH>='a') AND (CH<='z') THEN CH:=CHR(ORD(CH)-32);
  UNTIL CH IN OKCH;
  IF CH=^M THEN BACKSP(LEN(PROMPT)+2) ELSE
  BEGIN
    WRITELN(CH); WRITELN;
  END;
  SELECT:=CH;
END;

PROCEDURE PRESSRETURN;
VAR
  CH: CHAR;
BEGIN
  WRITE('Press RETURN...');
  REPEAT READ(KBD,CH) UNTIL CH=^M;
  BACKSP(15);
END;

PROCEDURE RESETDISKS;
BEGIN
  BDOS(37,-1);
END;

PROCEDURE CONFIGURE;
VAR
  CH: CHAR;

(*$I INSTCRT.PAS*)

PROCEDURE KEYBOARD;
TYPE
  KEYREC = RECORD
             VAL: BYTE; STR: STR12;
           END;
CONST
  STDKEY: ARRAYÆ1..40Å OF STR2 =
    (^J,^S,^D,^A,^F,^Q^S,^Q^D,^E,^X,^Q^E,^Q^X,^R,^C,^Q^R,^Q^C,
     @127,^G,^Q@127,^Q^Y,^T,^Y,^M,^I,^N,^V,^Z,^B,^W,^Q^F,^Q^A,
     ^L,^K^B,^K^K,^K^Y,^K^C,^K^V,^K^P,^K^H,^K^D,^K^X);
VAR
  C,I,N,M: INTEGER;
  CH,MC: CHAR;
  S: STR12;
  AKEY: ARRAYÆ1..40Å OF KEYREC;

FUNCTION KEYSTR(CH: CHAR): STR3;
BEGIN
  CASE CH OF
    @32..@126,@128..@255: KEYSTR:='"'+CH+'"';
    @8: KEYSTR:='BS';
    @13: KEYSTR:='CR';
    @27: KEYSTR:='ESC';
    @127: KEYSTR:='DEL';
  OTHERWISE
    KEYSTR:='^'+CHR(ORD(CH)+64);
  END;
END;

FUNCTION KEYSEQ(KS: STR12): STR48;
VAR
  I: INTEGER;
  S: STR48;
BEGIN
  S:='';
  FOR I:=1 TO LEN(KS) DO S:=S+KEYSTR(KSÆIÅ)+' ';
  KEYSEQ:=COPY(S,1,LEN(S)-1);
END;

PROCEDURE DELAKEY(I: INTEGER);
VAR
  P: INTEGER;
BEGIN
  FOR P:=I+1 TO N DO AKEYÆP-1Å:=AKEYÆPÅ; N:=N-1;
END;

PROCEDURE ADDAKEY;
VAR
  I,L: INTEGER;
  CH: CHAR;
  S: STR12;
BEGIN
  L:=0; FOR I:=1 TO N DO L:=L+LEN(AKEYÆNÅ.STR)+2;
  IF (N=40) OR (L>240) THEN
  WRITELN('No room for further definitions') ELSE
  BEGIN
    WRITE('Standard: ');
    REPEAT
      READ(KBD,CH);
      I:=1; WHILE (I<40) AND (CH<>STDKEYÆIÅÆ1Å) DO I:=I+1;
      IF STDKEYÆIÅÆ1Å=CH THEN
      BEGIN
        S:=CH; WRITE(KEYSEQ(CH),' '); L:=LEN(KEYSEQ(CH))+1;
        IF LEN(STDKEYÆIÅ)=2 THEN
        BEGIN
          READ(KBD,CH); S:=S+CH;
          I:=1; WHILE (I<40) AND (S<>STDKEYÆIÅ) DO I:=I+1;
          IF S=STDKEYÆIÅ THEN
          BEGIN
            S:=S+CH; WRITE(KEYSEQ(CH),' '); L:=L+LEN(KEYSEQ(CH))+1;
          END ELSE
          BEGIN
            S:=''; BACKSP(L);
          END;
        END;
      END ELSE S:='';
    UNTIL S<>'';
    WRITE('':9-L,'Alternate: ');
    S:='';
    REPEAT
      READ(KBD,CH);
      IF (LEN(S)<12) AND (CH<>^M) THEN
      BEGIN
        IF LEN(S)>=1 THEN IF CH IN Æ^A..^ZÅ THEN CH:=CHR(ORD(CH)+64);
        WRITE(KEYSTR(CH),' '); S:=S+CH;
      END;
    UNTIL CH=^M;
    N:=N+1; AKEYÆNÅ.VAL:=I; AKEYÆNÅ.STR:=S;
    WRITELN;
  END;
  WRITELN;
END;

PROCEDURE HELP;
BEGIN
  WRITELN('To be able to benefit fully from the special keys offered by');
  WRITELN('your terminal''s keyboard, COMPAS allows you to define alternate');
  WRITELN('keys to invoke selected editor functions. A typical example of');
  WRITELN('alternate keys is defining your cursor arrows to do the same as');
  WRITELN('^S, ^D, ^E and ^X');
  WRITELN;
  WRITELN('To add an alternate key definition, you must first select the');
  WRITELN('function for which you want to create an alternative. This you');
  WRITELN('do by entering the standard key sequence, i.e. the sequence lis-');
  WRITELN('ted in the manual. Once you have selected a function, you will');
  WRITELN('be prompted for an alternate key sequence, to which you must an-');
  WRITELN('swer by entering the alternate sequence. To end the alternate');
  WRITELN('sequence, press RETURN.');
  WRITELN;
  WRITELN('Note that it is actually possible to override the standard key');
  WRITELN('sequences. If you for instance define ^J to be an alternate key');
  WRITELN('for the ^X function, the original ^J function will become inac-');
  WRITELN('cessible unless you define an alternate sequence for it as well.');
  WRITELN;
  PRESSRETURN;
END;

BEGIN (*KEYBOARD*)
  WITH DATA DO
  BEGIN
    I:=0; N:=0; C:=1;
    WHILE ALTKEYÆIÅ<>0 DO
    BEGIN
      N:=N+1;
      MOVE(ALTKEYÆIÅ,AKEYÆNÅ,ALTKEYÆI+1Å+2);
      I:=I+ALTKEYÆI+1Å+2;
    END;
    REPEAT
      WRITELN('ALTERNATE KEY DEFINITIONS:');
      WRITELN;
      IF N=0 THEN
      BEGIN
        WRITELN('No alternate keys defined'); WRITELN;
        CH:=SELECT('Add(Z), Exit(X), Help(Y)',Æ'Z','X','Y'Å);
      END ELSE
      BEGIN
        IF C+9>N THEN M:=N-C ELSE M:=9;
        FOR I:=0 TO M DO
        BEGIN
          S:=KEYSEQ(STDKEYÆAKEYÆC+IÅ.VALÅ);
          WRITE(CHR(I+65),'. Standard: ',S,'':9-LEN(S));
          WRITELN('Alternate: ',KEYSEQ(AKEYÆC+IÅ.STR));
        END;
        IF N>10 THEN
        BEGIN
          WRITELN; WRITELN('Press RETURN to view more');
        END;
        WRITELN;
        MC:=CHR(M+65);
        CH:=SELECT('Delete(A-'+MC+'), Add(Z), Exit(X), Help(Y)',
                   Æ'A'..MC,'Z','X','Y',^MÅ);
      END;
      CASE CH OF
        'A'..'J': DELAKEY(C+ORD(CH)-65);
        'Z': ADDAKEY;
        'Y': HELP;
        ^M: BEGIN
              C:=C+10; IF C>N THEN C:=1;
            END;
      END;
    UNTIL CH='X';
    I:=0;
    FOR N:=1 TO N DO
    BEGIN
      MOVE(AKEYÆNÅ,ALTKEYÆIÅ,LEN(AKEYÆNÅ.STR)+2);
      I:=I+LEN(AKEYÆNÅ.STR)+2;
    END;
    FILL(ALTKEYÆIÅ,256-I,0);
  END;
END;

PROCEDURE MISC;
CONST
  PA: STR36 = 'A. Use BAK files (YES/NO).........: ';
  PB: STR36 = 'B. Insert mode on (YES/NO)........: ';
  PC: STR36 = 'C. Auto-indent on (YES/NO)........: ';
  PD: STR36 = 'D. TABS mode on (YES/NO)..........: ';
  PE: STR36 = 'E. Replace prompt delay...........: ';
  PF: STR36 = 'F. Configuration name.............: ';
VAR
  CH: CHAR;

PROCEDURE HELP;
BEGIN
  WRITELN('USE BAK FILES. This field must be either YES or NO. If it is');
  WRITELN('set to YES, duplicate files will have their type changed to');
  WRITELN('BAK when the SAVE command is used to save a file. Otherwise,');
  WRITELN('such files are simply deleted.');
  WRITELN;
  WRITELN('INSERT MODE ON. This field defined the initial state of the');
  WRITELN('INSERT mode when COMPAS is cold-started. YES means on and NO');
  WRITELN('means off.');
  WRITELN;
  WRITELN('AUTO-INDENT ON. This field defines the initial state of the');
  WRITELN('auto-indent tabulator when COMPAS is cold-started.');
  WRITELN;
  WRITELN('TABS MODE ON. This field defines the initial state of the TABS');
  WRITELN('mode when COMPAS is cold-started.');
  WRITELN;
  PRESSRETURN;
  WRITELN('REPLACE PROMPT DELAY. This field is used only by the find/re-');
  WRITELN('place function in the editor. It defines the delay used when mo-');
  WRITELN('ving the cursor alternately between the replace prompt and the');
  WRITELN('text. Experiment to find a suitable value (typical values range');
  WRITELN('from 200 to 1000).');
  WRITELN;
  WRITELN('CONFIGURATION NAME. This field defines the name of the current');
  WRITELN('configuration (usually, it is the name of your computer). Up to');
  WRITELN('31 characters may be entered.');
  WRITELN;
  PRESSRETURN;
END;

BEGIN (*MISC*)
  WITH DATA DO
  REPEAT
    WRITELN('MISCELLANEOUS DATA:');
    WRITELN;
    WRITELN(PA,YESNO(BACKF));
    WRITELN(PB,YESNO(INSMF));
    WRITELN(PC,YESNO(AUTOF));
    WRITELN(PD,YESNO(TABSF));
    WRITELN(PE,RDELAY);
    WRITELN(PF,TERMNAME);
    WRITELN;
    CH:=SELECT('Edit(A-F), Exit(X), Help(Y)',Æ'A'..'F','X','Y'Å);
    CASE CH OF
      'A': BEGIN
	     WRITE(PA); BACKF:=READYN; WRITELN;
	   END;
      'B': BEGIN
	     WRITE(PB); INSMF:=READYN; WRITELN;
	   END;
      'C': BEGIN
	     WRITE(PC); AUTOF:=READYN; WRITELN;
	   END;
      'D': BEGIN
	     WRITE(PD); TABSF:=READYN; WRITELN;
	   END;
      'E': BEGIN
	     WRITE(PE); RDELAY:=READNUM(0,32767); WRITELN;
	   END;
      'F': BEGIN
	     WRITE(PF); BUFLEN:=31; READLN(TERMNAME); WRITELN;
	   END;
      'Y': HELP;
    END;
  UNTIL CH='X';
END;

PROCEDURE CLEAR;
BEGIN
  WRITE('Clear configuration data (YES/NO)? ');
  IF READYN<>0 THEN
  BEGIN
    FILL(DATA,SIZE(DATA),0);
    WITH DATA DO
    BEGIN
      WIDTH:=79; HEIGHT:=24; GXYLS:=@27'=';
      COOROFS:=32; CLHS:=@26; BACKF:=255;
      INSMF:=255; AUTOF:=255; RDELAY:=1000;
    END;
  END;
  WRITELN;
END;

PROCEDURE HELP;
BEGIN
  WRITELN('To do a complete installation of COMPAS you should go through');
  WRITELN('all functions of this menu (the order in which you do it is of');
  WRITELN('no importance, as long as you make sure that all fields within');
  WRITELN('all menus have be inspected and modified if necessary).');
  WRITELN;
  WRITELN('CRT CONFIGURATION. This function is used to view and/or modify');
  WRITELN('the CRT configuration table and the user patch area.');
  WRITELN;
  WRITELN('KEYBOARD CONFIGURATION. This function is used to view and/or');
  WRITELN('modify alternate key definitions.');
  WRITELN;
  WRITELN('MISCELLANEOUS DATA. This function allows you to view and/or');
  WRITELN('modify various system informations.');
  WRITELN;
  WRITELN('CLEAR CONFIGURATION DATA. This function will initialize all con-');
  WRITELN('figuration data fields to some appropriate default values. If');
  WRITELN('you are about to install a new terminal, use this function be-');
  WRITELN('fore the above ones - this will save you the trouble of manually');
  WRITELN('removing the existing values.');
  WRITELN;
  PRESSRETURN;
END;

BEGIN (*CONFIGURE*)
  WITH DATA DO
  REPEAT
    WRITELN('MAIN CONFIGURATION MENU:');
    WRITELN;
    WRITELN('1. CRT configuration');
    WRITELN('2. Keyboard configuration');
    WRITELN('3. Miscellaneous data');
    WRITELN('4. Clear configuration data');
    WRITELN;
    CH:=SELECT('Function(1-4), Exit(X), Help(Y)',Æ'1'..'4','X','Y'Å);
    CASE CH OF
      '1': CRT;
      '2': KEYBOARD;
      '3': MISC;
      '4': CLEAR;
      'Y': HELP;
    END;
  UNTIL CH='X';
END;

PROCEDURE LSCONFIG(LOAD: BOOLEAN);
VAR
  I,C,CC: INTEGER;
  CH: CHAR;
  DONE: BOOLEAN;
  LS: STR4;

PROCEDURE LOADC;
VAR
  CH: CHAR;
BEGIN
  IF TNAMÆCÅ<>'' THEN
  BEGIN
    SEEK(DF,C-1); READ(DF,DATA); DONE:=TRUE;
  END ELSE
  BEGIN
    WRITE('ERROR: Undefined configuration. Press RETURN...');
    REPEAT READ(KBD,CH) UNTIL CH=^M;
    BACKSP(47);
  END;
END;

PROCEDURE SAVEC;
BEGIN
  SEEK(TF,C-1); WRITE(TF,DATA.TERMNAME);
  SEEK(DF,C-1); WRITE(DF,DATA);
  TNAMÆCÅ:=DATA.TERMNAME; DONE:=TRUE;
END;

PROCEDURE LOADH;
BEGIN
  WRITELN('To load a standard configuration, simply press the letter de-');
  WRITELN('noting that configuration. If none of the standard configura-');
  WRITELN('tions mentioned match your computer system, you will have to');
  WRITELN('install COMPAS manually (using function 2 on the main menu).');
  WRITELN;
  PRESSRETURN;
END;

PROCEDURE SAVEH;
BEGIN
  WRITELN('To save the current configuration as a standard configuration,');
  WRITELN('use the RETURN key to move to a section that contains an empty');
  WRITELN('entry, and enter the letter of that entry. You may, if you wish');
  WRITELN('save the current configuration on top of an existing configura-');
  WRITELN('tion, in which case that cofiguration is lost. Note that if the');
  WRITELN('terminal name of the configuration you save is empty, you will');
  WRITELN('not be able to load the configuration again.');
  WRITELN;
  PRESSRETURN;
END;

BEGIN (*LSCONFIG*)
  CC:=1; DONE:=FALSE; IF LOAD THEN LS:='Load' ELSE LS:='Save';
  REPEAT
    WRITELN('STANDARD CONFIGURATIONS (MENU ',(CC+9) DIV 10,'):');
    WRITELN;
    FOR I:=0 TO 9 DO
    WRITELN(CHR(I+65),'. ',TNAMÆCC+IÅ);
    WRITELN;
    WRITELN('Press RETURN to view more');
    WRITELN;
    CH:=SELECT(LS+'(A-J), Exit(X), Help(Y)',Æ'A'..'J','X','Y',^MÅ);
    CASE CH OF
      'A'..'J': BEGIN
		  C:=CC+ORD(CH)-65; IF LOAD THEN LOADC ELSE SAVEC;
		END;
      'X': DONE:=TRUE;
      'Y': IF LOAD THEN LOADH ELSE SAVEH;
      ^M: BEGIN
	    CC:=CC+10; IF CC>MAXTERM THEN CC:=1;
	  END;
    END;
  UNTIL DONE;
END;

PROCEDURE GETDATA;
VAR
  A: INTEGER;
BEGIN
  SEEK(CF,0); BLOCKREAD(CF,B1,6);
  A:=B1Æ1Å+SWAP(B1Æ2Å)+3;
  B2S:=A DIV 128-2; B2A:=A MOD 128;
  SEEK(CF,B2S); BLOCKREAD(CF,B2,4);
  MOVE(B1Æ$20Å,DATA.TERMNAME,$285);
  MOVE(B2ÆB2AÅ,DATA.BACKF,$106);
END;

PROCEDURE PUTDATA;
VAR
  I: INTEGER;
BEGIN
  MOVE(DATA.TERMNAME,B1Æ$20Å,$285);
  MOVE(DATA.BACKF,B2ÆB2AÅ,$106);
  SEEK(CF,0); BLOCKWRITE(CF,B1,6);
  SEEK(CF,B2S); BLOCKWRITE(CF,B2,4);
END;

PROCEDURE HELP;
BEGIN
  WRITELN('LOAD STANDARD CONFIGURATION. This function is used to load a');
  WRITELN('standard configuration, i.e. to load all the parameters that');
  WRITELN('define a specific computer system. If your computer system is');
  WRITELN('among the standard configurations, then all you need to do to');
  WRITELN('install COMPAS is to load that configuration and exit. If it');
  WRITELN('is not, you must define your computer system manually, using');
  WRITELN('the function described below.');
  WRITELN;
  WRITELN('EDIT CONFIGURATION PARAMETERS. This function is used to set up');
  WRITELN('new configurations and to edit an existing configuration. It');
  WRITELN('allows you to view and/or modify all parameters that define a');
  WRITELN('specific computer system. If your computer is not mentioned in');
  WRITELN('the list of standard configurations (see above), you must use');
  WRITELN('this function to define it manually.');
  WRITELN;
  WRITELN('SAVE A STANDARD CONFIGURATION. This function is used to add');
  WRITELN('an entry to the list of standard configurations. Normally, you');
  WRITELN('will not need to use this function.');
  WRITELN;
  PRESSRETURN;
END;

BEGIN
  WRITELN;
  WRITELN('              COMPAS-80 V3.02 INSTALL PROGRAM');
  WRITELN('                      CP/M-80 version');
  WRITELN;
  WRITELN('                   Copyright (C) 1983 by');
  WRITELN('                 Poly-Data microcenter ApS');
  WRITELN;
  WRITELN;
  WRITELN('This program is used to view and/or modify the configuration');
  WRITELN('parameters of COMPAS. If you have bought an unconfigured copy');
  WRITELN('of COMPAS, you should use this program to define your computer');
  WRITELN('system before running COMPAS. If your copy is already set up');
  WRITELN('for a specific computer system, there is no need to run this');
  WRITELN('program, unless you wish to make changes to suit your indivi-');
  WRITELN('dual needs.');
  WRITELN;
  WRITE('Do you wish to proceed (YES/NO)? ');
  IF READYN=0 THEN GOTO EXIT;
  WRITELN;
  ASSIGN(TF,'INSTALL.TRM'); ASSIGN(DF,'INSTALL.DAT');
  (*$I-*) RESET(TF); RESET(DF); (*$I+*)
  IF IORES=0 THEN
  FOR I:=1 TO MAXTERM DO READ(TF,TNAMÆIÅ) ELSE
  BEGIN
    WRITELN('The INSTALL.TRM and INSTALL.DAT files are not present on the');
    WRITELN('current drive. The INSTALL program cannot be run without these');
    WRITELN('files, so copy them onto your disk, and run INSTALL again.');
    GOTO EXIT;
  END;
  REPEAT
    WRITE('Input file name (RETURN for COMPAS.COM)? ');
    BUFLEN:=14; READLN(CFN); WRITELN;
    IF CFN='' THEN CFN:='COMPAS.COM';
    ASSIGN(CF,CFN); (*$I-*) RESET(CF) (*$I+*);
    I:=IORES;
    IF I>0 THEN
    BEGIN
      WRITELN('That file does not exist. Please specify another file name.');
      WRITELN('You may insert another disk if you wish.');
      WRITELN;
      RESETDISKS;
    END;
  UNTIL I=0;
  GETDATA;
  REPEAT
    WRITELN('COMPAS-80 INSTALL PROGRAM MAIN MENU:');
    WRITELN;
    WRITELN('1. Load a standard configuration');
    WRITELN('2. Edit configuration parameters');
    WRITELN('3. Save a standard configuration');
    WRITELN;
    WRITE('CURRENT CONFIGURATION: ');
    IF DATA.TERMNAME<>'' THEN
    WRITELN(DATA.TERMNAME) ELSE WRITELN('No terminal selected');
    WRITELN;
    CH:=SELECT('Function(1-3), Exit(X), Help(Y)',Æ'1'..'3','X','Y'Å);
    CASE CH OF
      '1': LSCONFIG(TRUE);
      '2': CONFIGURE;
      '3': LSCONFIG(FALSE);
      'Y': HELP;
    END;
  UNTIL CH='X';
  WRITE('Save configuration in ',CFN,' (YES/NO)? ');
  IF READYN<>0 THEN
  BEGIN
    PUTDATA; CLOSE(CF);
  END;
  CLOSE(TF); CLOSE(DF);
  EXIT:
END.
«eof»