|
|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 29312 (0x7280)
Types: TextFile
Names: »INSTALL.PAS«
└─⟦c96461903⟧ Bits:30002787 SW1602 COMPAS Pascal Version 3.07 Release 1.1
└─⟦this⟧ »INSTALL.PAS«
PROGRAM INSTALL; (*$C-,K-,R-*)
CONST
MAXTERM = 40;
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;
PDATA: ARRAYÆ0..669Å 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;
DSMIN,DSMAX: INTEGER;
TNAM: ARRAYÆ1..MAXTERMÅ OF STR31;
B1: ARRAYÆ0..1023Å 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;
TYPE
REGPACK = RECORD
AX,BX,CX,DX,BP,SI,DI,DS,ES,FLAGS: INTEGER;
END;
VAR
REGS: REGPACK;
BEGIN
REGS.CX:=37; REGS.DX:=$FFFF; SWINT(224,REGS);
END;
PROCEDURE CONFIGURE;
VAR
CH: CHAR;
PROCEDURE CRT;
CONST
PA1: STR36 = 'A. Screen width (in characters)...: ';
PB1: STR36 = 'B. Screen height (in lines).......: ';
PC1: STR36 = 'C. GOTOXY lead-in sequence........: ';
PD1: STR36 = 'D. GOTOXY separator sequence......: ';
PE1: STR36 = 'E. GOTOXY terminator sequence.....: ';
PF1: STR36 = 'F. Line before column (YES/NO)....: ';
PG1: STR36 = 'G. Coordinate offset..............: ';
PH1: STR36 = 'H. Coordinate format (0/2/3)......: ';
PA2: STR36 = 'A. CLRHOM sequence................: ';
PB2: STR36 = 'B. CLREOS sequence................: ';
PC2: STR36 = 'C. CLREOL sequence................: ';
PD2: STR36 = 'D. INSLIN sequence................: ';
PE2: STR36 = 'E. DELLIN sequence................: ';
PF2: STR36 = 'F. RVSON sequence.................: ';
PG2: STR36 = 'G. RVSOFF sequence................: ';
VAR
SEC: INTEGER;
CH,MC,FIRST,LAST: CHAR;
PROCEDURE HELPS;
BEGIN
WRITELN('Character sequences are entered as sequences of hex values be-');
WRITELN('tween 00 and FF. Each hex value must be separated from the sur-');
WRITELN('rounding ones by at least one blank. To enter an empty sequence');
WRITELN('simply enter a blank line.');
WRITELN;
END;
PROCEDURE HELP1;
BEGIN
WRITELN('All fields on this submenu must be filled in for COMPAS to ope-');
WRITELN('rate correctly.');
WRITELN;
WRITELN('SCREEN WIDTH. This field defines the number of characters per');
WRITELN('line on your video display. If the display scrolls when writing');
WRITELN('a character to the bottom right character position, then specify');
WRITELN('the screen width less one.');
WRITELN;
WRITELN('SCREEN HEIGHT. This field defines the number of lines per screen');
WRITELN('on your video display. Always specify the exact value.');
WRITELN;
HELPS;
PRESSRETURN;
WRITELN('GOTOXY LEAD-IN SEQUENCE. The character sequence sent prior to');
WRITELN('the coordinates. The maximum length is 8.');
WRITELN;
WRITELN('GOTOXY SEPARATOR SEQUENCE. The character sequence sent between');
WRITELN('the coordinates. The maximum length is 4.');
WRITELN;
WRITELN('GOTOXY TERMINATOR SEQUENCE. The character sequence sent after');
WRITELN('the coordinates. The maximum length is 4.');
WRITELN;
WRITELN('LINE BEFORE COLUMN. This field should be set to YES if your');
WRITELN('video display requires the line coordinate (Y) to be sent');
WRITELN('before the column coordinate (X). Otherwise it should be set');
WRITELN('to NO.');
WRITELN;
PRESSRETURN;
WRITELN('COORDINATE OFFSET. This field defines the value (in decimal)');
WRITELN('to be added to the coordinates before they are transmitted.');
WRITELN('If the coordinate format (see below) is 0, then 32 is normally');
WRITELN('used. If the coordinate format is 2 or 3, then 0 or 1 is nor-');
WRITELN('mally used.');
WRITELN;
WRITELN('COORDINATE FORMAT. A value of 0 in this field indicates that');
WRITELN('the coordinates are to be transmitted as single bytes using');
WRITELN('binary format. Other values (2 or 3) indicate that the coor-');
WRITELN('dinates are to be transmitted as decimal character strings of');
WRITELN('2 or 3 characters.');
WRITELN;
PRESSRETURN;
END;
PROCEDURE HELP2;
BEGIN
HELPS;
WRITELN('CLRHOM SEQUENCE. The function sequence which clears the screen');
WRITELN('and returns the cursor to the top left corner. The maximum');
WRITELN('is 8. This function sequence must be specified for COMPAS to');
WRITELN('operate correctly');
WRITELN;
WRITELN('All of the following function sequences are optional. The maxi-');
WRITELN('mum length is 8 for all sequences.');
WRITELN;
WRITELN('CLREOS SEQUENCE. The function sequence which clears all charac-');
WRITELN('ter positions from the cursor to the end of the screen.');
WRITELN;
PRESSRETURN;
WRITELN('CLREOL SEQUENCE. The function sequence which clears all charac-');
WRITELN('ter positions from the cursor to the end of the current line.');
WRITELN;
WRITELN('INSLIN SEQUENCE. The function sequence which scrolls the current');
WRITELN('line, and all lines below it, down, and clears the current line.');
WRITELN;
WRITELN('DELLIN SEQUENCE. The function sequence which deletes the current');
WRITELN('line, and scrolls up all lines below it, with a blank line ap-');
WRITELN('pearing at the bottom. The maximum length is 8.');
WRITELN;
WRITELN('RVSON SEQUENCE. The function sequence which turns on reverse vi-');
WRITELN('deo (or increased intensity). If this function is specified, the');
WRITELN('editor will use it to highlight the status line.');
WRITELN;
WRITELN('RVSOFF SEQUENCE. The function sequence which turns off the at-');
WRITELN('tribute activated by the sequence above.');
WRITELN;
PRESSRETURN;
END;
BEGIN (*CRT*)
SEC:=1;
WITH DATA DO
REPEAT
WRITELN('CRT CONFIGURATION TABLE (SECTION ',SEC,'):');
WRITELN;
CASE SEC OF
1: BEGIN
WRITELN(PA1,WIDTH);
WRITELN(PB1,HEIGHT);
WRITELN(PC1,HEXSEQ(GXYLS));
WRITELN(PD1,HEXSEQ(GXYSS));
WRITELN(PE1,HEXSEQ(GXYTS));
WRITELN(PF1,YESNO(255-COLB4LIN));
WRITELN(PG1,COOROFS);
WRITELN(PH1,COORFMT);
END;
2: BEGIN
WRITELN(PA2,HEXSEQ(CLHS));
WRITELN(PB2,HEXSEQ(CESS));
WRITELN(PC2,HEXSEQ(CELS));
WRITELN(PD2,HEXSEQ(ILNS));
WRITELN(PE2,HEXSEQ(DLNS));
WRITELN(PF2,HEXSEQ(RONS));
WRITELN(PG2,HEXSEQ(ROFS));
END;
END;
WRITELN;
WRITELN('Press RETURN to view more');
WRITELN;
IF SEC=1 THEN MC:='H' ELSE MC:='G';
CH:=SELECT('Edit(A-'+MC+'), All(Z), Exit(X), Help(Y)',
Æ'A'..MC,'Z','X','Y',^MÅ);
IF CH=^M THEN SEC:=3-SEC ELSE
BEGIN
IF CH='Z' THEN
BEGIN
FIRST:='A'; LAST:=MC;
END ELSE
BEGIN
FIRST:=CH; LAST:=CH;
END;
FOR CH:=FIRST TO LAST DO
CASE SEC OF
1: CASE CH OF
'A': BEGIN
WRITE(PA1); WIDTH:=READNUM(40,255);
END;
'B': BEGIN
WRITE(PB1); HEIGHT:=READNUM(8,255);
END;
'C': BEGIN
WRITE(PC1); GXYLS:=READSEQ(8);
END;
'D': BEGIN
WRITE(PD1); GXYSS:=READSEQ(4);
END;
'E': BEGIN
WRITE(PE1); GXYTS:=READSEQ(4);
END;
'F': BEGIN
WRITE(PF1); COLB4LIN:=255-READYN;
END;
'G': BEGIN
WRITE(PG1); COOROFS:=READNUM(0,255);
END;
'H': BEGIN
WRITE(PH1); COORFMT:=READNUM(0,3);
END;
'Y': HELP1;
END;
2: CASE CH OF
'A': BEGIN
WRITE(PA2); CLHS:=READSEQ(8);
END;
'B': BEGIN
WRITE(PB2); CESS:=READSEQ(8);
END;
'C': BEGIN
WRITE(PC2); CELS:=READSEQ(8);
END;
'D': BEGIN
WRITE(PD2); ILNS:=READSEQ(8);
END;
'E': BEGIN
WRITE(PE2); DLNS:=READSEQ(8);
END;
'F': BEGIN
WRITE(PF2); RONS:=READSEQ(8);
END;
'G': BEGIN
WRITE(PG2); ROFS:=READSEQ(8);
END;
'Y': HELP2;
END;
END;
IF CH IN Æ'A'..MCÅ THEN WRITELN;
END;
UNTIL CH='X';
END;
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 MEMORY;
CONST
PA: STR36 = 'A. Minimum memory size in Kbytes..: ';
PB: STR36 = 'B. Maximum memory size in Kbytes..: ';
VAR
CH: CHAR;
PROCEDURE HELP;
BEGIN
WRITELN('MINIMUM MEMORY SIZE. This field defines the minimum number of');
WRITELN('bytes you want allocated for the COMPAS workspace. Note that if');
WRITELN('this amount of memory is not available, COMPAS cannot be run.');
WRITELN('The minimum memory size cannot be less than 8K.');
WRITELN;
WRITELN('MAXIMUM MEMORY SIZE. This field defines the maximum number of');
WRITELN('bytes you want allocated for the COMPAS workspace. When COMPAS');
WRITELN('is invoked, CP/M-86 will never allocate more memory for it than');
WRITELN('this field requests. If you want as much memory as possible,');
WRITELN('enter a number which is larger than the total amount of memory');
WRITELN('in your system.');
WRITELN;
END;
BEGIN (*MEMORY*)
REPEAT
WRITELN('MEMORY ALLOCATION PARAMETERS:');
WRITELN;
WRITELN(PA,DSMIN);
WRITELN(PB,DSMAX);
WRITELN;
CH:=SELECT('Edit(A-B), Exit(X), Help(Y)',Æ'A','B','X','Y'Å);
CASE CH OF
'A': BEGIN
WRITE(PA); DSMIN:=READNUM(8,900); WRITELN;
IF DSMAX<DSMIN THEN DSMAX:=DSMIN;
END;
'B': BEGIN
WRITE(PB); DSMAX:=READNUM(DSMIN,900); WRITELN;
END;
'Y': HELP;
END;
UNTIL CH='X';
END;
PROCEDURE GETDATA;
VAR
A: INTEGER;
BEGIN
SEEK(CF,0); BLOCKREAD(CF,B1,8);
A:=B1Æ$81Å+SWAP(B1Æ$82Å)+6;
B2S:=A DIV 128+1; B2A:=A MOD 128;
SEEK(CF,B2S); BLOCKREAD(CF,B2,4);
MOVE(B1Æ$A0Å,DATA.TERMNAME,$315);
MOVE(B2ÆB2AÅ,DATA.BACKF,$106);
DSMIN:=(B1Æ$0EÅ+SWAP(B1Æ$0FÅ)) SHR 6;
DSMAX:=(B1Æ$10Å+SWAP(B1Æ$11Å)) SHR 6;
END;
PROCEDURE PUTDATA;
VAR
I: INTEGER;
BEGIN
MOVE(DATA.TERMNAME,B1Æ$A0Å,$315);
MOVE(DATA.BACKF,B2ÆB2AÅ,$106);
I:=DSMIN SHL 6; B1Æ$0EÅ:=LO(I); B1Æ$0FÅ:=HI(I);
I:=DSMAX SHL 6; B1Æ$10Å:=LO(I); B1Æ$11Å:=HI(I);
SEEK(CF,0); BLOCKWRITE(CF,B1,8);
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;
PRESSRETURN;
WRITELN('EDIT MEMORY ALLOCATION PARAMETERS. When the standard version of');
WRITELN('COMPAS is executed, it allocates all available memory for its');
WRITELN('workspace, since this is usually what you would want. If you are');
WRITELN('running Concurrent CP/M-86, this will however prevent you from');
WRITELN('activating other programs, since there is no memory for them,');
WRITELN('and you may then want to adjust the memory allocation parameters');
WRITELN('using this function.');
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-86 V3.07 INSTALL PROGRAM');
WRITELN(' CP/M-86 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 HALT;
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.');
HALT;
END;
REPEAT
WRITE('Input file name (RETURN for COMPAS.CMD)? ');
BUFLEN:=14; READLN(CFN); WRITELN;
IF CFN='' THEN CFN:='COMPAS.CMD';
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-86 INSTALL PROGRAM MAIN MENU:');
WRITELN;
WRITELN('1. Load a standard configuration');
WRITELN('2. Edit configuration parameters');
WRITELN('3. Edit memory allocation parameters');
WRITELN('4. 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-4), Exit(X), Help(Y)',Æ'1'..'4','X','Y'Å);
CASE CH OF
'1': LSCONFIG(TRUE);
'2': CONFIGURE;
'3': MEMORY;
'4': 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);
END.
«eof»