(not saved) No workfileS%  O ?(&Ɓ.񄓡9&צThrow away current workfile ?  ءצ*SYEVAL REVERSE /SN^BD[ETOI(8*J1+J2)]]); "WRITELN; "FOR J2:=5 TO 8 DO #WRITE(NAME[BOARD[ETOI(8*J1+J2)]]); "WRITELN; "END;  END;    PROCEDURE INITIALIZE;  VAR P: MOVEPTR;  BEGIN  FOR J:=-9 TO 45 DO BOARD[J]:=MYTHICAL;  FOR J:=1 TO 13 DO BOARD[GLE;  PLAYERKING:=-PLAYERKING;  FOR J:=1 TO 4 DO "DIRECTION[J]:=-DIRECTION[J];  GAIN:=-GAIN;  END;    PROCEDURE DISPLAYBOARD;  VAR J1,J2: INTEGER;  BEGIN  WRITELN;  FOR J1:=0 TO 3 DO BEGIN "WRITE(' '); "FOR J2:=1 TO 4 DO #WRITE(NAME[BOARROCEDURE TAB(N: INTEGER);  VAR I: INTEGER;  BEGIN  FOR I:=1 TO (N-1)*8+(COL-1) MOD 8 DO  WRITE(ANAL,' ');  END;   PROCEDURE REVERSEBOARD;  BEGIN  PLAYER:=-PLAYER;  OPPONSINGLE:=-OPPONSINGLE;  OPPONKING:=-OPPONKING;  PLAYERSINGLE:=-PLAYERSIN JMP,PCE:ARRAY[1..9] OF INTEGER;  PLAYERSINGLE,OPPONSINGLE,PLAYERKING,  OPPONKING:INTEGER;    FUNCTION ITOE(SQ:INTEGER):INTEGER;  BEGIN ITOE := SQ-SQ DIV 9; END;   FUNCTION ETOI(SQR:INTEGER):INTEGER;  BEGIN ETOI:=SQR+(SQR-1) DIV 8; END;   PLY,MINIMUMPLY,MAXIMALLEVEL,  PLAYER,VAL,MAXLEVEL,TOTALKINGS,WINNER,  LOSER,MATERIAL,TOTALNUMBER,LIFE,TIME,  ORIGINALEMPTY:INTEGER;  NUMBER:ARRAY[-4..4] OF INTEGER;  NEWFLAG:BOOLEAN;  MSP,BESTMOVE:MOVEPTR;  CH:CHAR; TEXT] OF MOVE;  TOTAL:ARRAY[-1..1] OF INTEGER;  NAME: ARRAY[-4..4] OF STRING[6];  DIRECTION:ARRAY[1..4] OF INTEGER;  COL,MOVENUMBER,NUMMOVES,J: INTEGER;  FIRSTMOVE,DEBUG,ANALYSIS,FOUNDJUMP:BOOLEAN;  PLAYING:ARRAY[-1..1] OF BOOLEAN;  GAIN,LEVEL,P BAMBI.TEXT rLY; LCUPDATE.TEXT^o㡴 DUMP.TEXTrE^o PATCH.TEXTE^od PATCHER.TEXT^od TERM.TEXTrE^o4 TERM.CODErE^o; PARSER.TEXT^o2 RUNOFF.TEXTTEXTSYSTEM.WRK.PSCAL13OTH.TEXTtW DRAW.TEXTrE^o$ TURTLE.TEXT^o$*PIECEMAKER.TEXT*B DIFF.TEXTrE^oBP CHESS.TEXTE^oP^ OTHELLO.TEXT^o^b DAVE.TEXTrE^ob CHECKERS.TEXT^o(* $L CONSOLE:*)  PROGRAM OTHELLO;  uses turtlegr;   CONST MAXSTACK = 200;  INFINITY = 32000; &MAXDEPTH = 4;    TYPE PIECE = (WHT, BLK, EMPTY, MYTHICAL);  SQUARE = 0..90; %BD = ARRAY[SQUARE] OF PIECE;  TOTALS = ARRAY[PIECE] O  BEGIN  STATIC:=TOTAL[PLAYER]-TOTAL[OPPON];  END;    FUNCTION LOOKAHEAD: INTEGER;  VAR VAL, NUM, P, MAXVAL, FIRST, BEST: INTEGER;  DEEPER: BOOLEAN; $SAVEBOARD: BD;  SAVETOTAL: TOTALS;  BEGIN  LEVEL:=LEVEL+1;  MAXVAL:=-INFINITY;  FII:=1 TO K DO *BOARD[LIST[I]]:=PLAYER; (FLIPPED:=FLIPPED+K; $ END; $END;  TOTAL[PLAYER]:=TOTAL[PLAYER]+FLIPPED+1;  TOTAL[OPPON]:=TOTAL[OPPON]-FLIPPED;  TOTAL[EMPTY]:=TOTAL[EMPTY]-1;  IF DEBUG THEN DISPLAY;  END;    FUNCTION STATIC: INTEGER; START:=STACK[N].SQ;  BOARD[START]:=PLAYER;  FLIPPED:=0;  FOR D:=1 TO 8 DO $BEGIN $K:=0; $DIR:=DIRECT[D]; $SQ:=START + DIR; $WHILE BOARD[SQ]=OPPON DO &BEGIN &K:=K+1; &LIST[K]:=SQ; &SQ:=SQ+DIR; &END; $IF BOARD[SQ]=PLAYER THEN & BEGIN (FOR whtbox,4,0,0,24,24,x,y,10); % empty: drawblock(empbox,4,0,0,24,24,x,y,10); %END; $END;  OLDBOARD:=BOARD;  END;    PROCEDURE MAKEMOVE(N: INTEGER);  VAR START, SQ: SQUARE; $LIST: ARRAY[1..8] OF SQUARE; $FLIPPED, DIR, I, D, K: INTEGER;  BEGIN ('DEPTH: ');  wchar(chr(ord('0')+depth)); $OLDDEPTH:=DEPTH; $END;  FOR I:=9 TO 82 DO "IF BOARD[I]<>OLDBOARD[I] THEN $BEGIN $x:=(i mod 9)*23; $y:=(8-(i div 9))*23; $CASE BOARD[I] OF &BLK: drawblock(blkbox,4,0,0,24,24,x,y,10); &WHT: drawblock(  PROCEDURE DISPLAY;  VAR x,y,I: INTEGER;  BEGIN  IF OLDDEBUG<>DEBUG THEN $BEGIN $moveto(223,30); $IF NOT DEBUG THEN wstring('NO '); $wstring('DEBUG ');  OLDDEBUG:=DEBUG; $END;  IF OLDDEPTH<>DEPTH THEN $BEGIN $moveto(223,50); $wstring TOTAL[MYTHICAL]:=0;  TOTAL[EMPTY]:=0;  TOTAL[WHT]:=0;  TOTAL[BLK]:=0;  FOR I:=0 TO 90 DO "TOTAL[BOARD[I]]:=TOTAL[BOARD[I]]+1;  reset(f,'boxes.data');  blkbox:=f^; get(f);  whtbox:=f^; get(f);  empbox:=f^; get(f);  quest:=f^; get(f);  END;  $END;  BOARD[90]:=MYTHICAL;  BOARD[0]:=MYTHICAL;  BOARD[40]:=WHT;  BOARD[41]:=BLK;  BOARD[49]:=BLK;  BOARD[50]:=WHT;  PAGE(OUTPUT);  PLAYER:=WHT;  OPPON:=BLK;  SP:=1;  DEPTH:=1;  LEVEL:=0;  DEBUG:=FALSE;  OLDDEBUG:=TRUE;  OLDDEPTH:=-1; T[4]:=-9;  DIRECT[5]:=8;  DIRECT[6]:=-8;  DIRECT[7]:=10;  DIRECT[8]:=-10;  FOR I:=1 TO 90 DO BOARD[I]:=EMPTY;  FOR I:=0 TO 90 DO OLDBOARD[I]:=MYTHICAL;  FOR I:=1 TO 9 DO $BEGIN $BOARD[I]:=MYTHICAL; $BOARD[I+81]:=MYTHICAL; $BOARD[I*9]:=MYTHICAL; I]<>OPPON; ,IF BOARD[I]=PLAYER THEN 0BEGIN 0STACK[SP].SQ:=SQ; 0SP:=SP+1; 0NOMOVE:=FALSE; 0END; ( END; (END; $END;  END;    PROCEDURE INIT;  VAR I, J: INTEGER;  BEGIN  initturtle;  DIRECT[1]:=1;  DIRECT[2]:=-1;  DIRECT[3]:=9;  DIREC NOMOVE: BOOLEAN;  BEGIN  FOR SQ:=10 TO 90 DO "IF BOARD[SQ] = EMPTY THEN $BEGIN $J:=8; $NOMOVE:=TRUE; $WHILE (J>0) AND NOMOVE DO (BEGIN (DIR:=DIRECT[J]; (J:=J-1; (I:=SQ+DIR; (IF BOARD[I]=OPPON THEN ,BEGIN ,REPEAT I:=I+DIR; -UNTIL BOARD[BEGIN  IF I>J THEN MIN:=J ELSE MIN:=I;  END;    PROCEDURE switch;  VAR TEMP: PIECE;  BEGIN  PLAYER:=OPPON;  IF OPPON=WHT "THEN OPPON:=BLK "ELSE OPPON:=WHT;  END;    PROCEDURE GETMOVES;  VAR I, SQ: SQUARE;  J, DIR: INTEGER; OVETOTAL, LEVEL: INTEGER; %DESIRE: ARRAY[SQUARE] OF INTEGER;  DIRECT: ARRAY[1..8] OF INTEGER;  DEBUG, OLDDEBUG: BOOLEAN;  f: file of box; %quest,whtbox,blkbox,empbox: box; %TOTAL: TOTALS;    FUNCTION MIN(I,J: INTEGER): INTEGER;  F INTEGER; %box = packed array[1..24,1..32] of boolean; %mov = RECORD .SQ: SQUARE; .VALUE: INTEGER; .END;    VAR OLDBOARD,BOARD: BD; %PLAYER, OPPON: PIECE; %STACK: ARRAY[1..MAXSTACK] OF mov;  OLDDEPTH, I, E, DEPTH, BESTMOVE, %SP, NUM, MRST:=SP;  GETMOVES;  NUM:=SP-FIRST;  IF (LEVEL=1) AND (NUM=1) THEN $BEGIN $MAXVAL:=0; $STACK[FIRST].VALUE:=0; $END !ELSE IF NUM>0 THEN $ BEGIN %DEEPER:=(LEVEL-INFINITY THEN MAKEM* *17: EXIT(PROGRAM); * *4: BEGIN .DEBUG:=NOT DEBUG; .DISPLAY; .END; * *23: BEGIN .FOR J:=0 TO 90 DO OLDBOARD[J]:=MYTHICAL; .OLDDEPTH:=-1; .OLDDEBUG:=NOT DEBUG; .PAGE(OUTPUT); .DISPLAY; .END; *END; (drawblock(empbox,4,0,0,24,24,x,y,10); REPEAT (J:=STACK[I].SQ; (x:=(j mod 9)*23; (y:=(8-j div 9)*23; (drawblock(quest,4,0,0,24,24,x,y,10); (READ(CH); (CASE ORD(CH) OF *8: I:=I-1; * *21: I:=I+1; * *12: BEGIN .GOTOXY(0,22); .WRITE('NEW DEPTH: '); .READLN(DEPTH); .DISPLAY; .END;  +IF DEBUG THEN DISPLAY; +END; 'END;  END;  LEVEL:=LEVEL-1;  BESTMOVE:=BEST;  LOOKAHEAD:=MAXVAL;  END;    PROCEDURE READMOVE;  VAR J: SQUARE;  x,y,I: INTEGER; $CH: CHAR;  BEGIN  SP:=1;  I:=1;  GETMOVES;  IF SP>1 THEN $BEGIN $(RANK+1)*SIZE); $COLOR := ORANGE; $IF ODD(RANK) <> ODD(FIL) THEN COLOR:=WHITE; $FILLSCREEN(COLOR); $IF COLOR<>WHITE THEN (BEGIN (SQ:=SQ+1; (IF ODD(SQ) THEN GUY:=KING ELSE GUY:=SINGLE; (IF SQ<13 THEN *DRAWBLOCK(GUY,2,0,0,16,16,FIL*SIZE+4,RANK*SIZE+4,4); (IF SQ>20 THEN *DRAWBLOCK(GUY,2,0,0,16,16,FIL*SIZE+4,RANK*SIZE+4,6); (VIEWPORT(0,279,0,191); (MOVETO(200,50); (CHARTYPE(10); (WCHAR(CHR(SQ DIV 10 + ORD('0'))); (WCHAR(CHR(SQ MOD 10 + ORD('0')));EGIN *TURNTO(180); *MOVE(7); " WCHAR(' '); *MOVE(7); *DELETE(TEXT,LENGTH(TEXT),1); *END;  UNTIL EOLN;  RESTORE;  END;   FUNCTION GETCOLOR: SCREENCOLOR;  BEGIN  IF NOT MATCH('(') THEN ERROR('MISSING ''(''');  IF MATCH('NONE') THEN GETCAVE;  WSTRING('TURTLE> ');  TEXT:='';  REPEAT $READ(CH); $IF CH IN ['A'..'Z','0'..'9',' ','(',')',',','-'] % THEN BEGIN (WCHAR(CH); (TEXT:=CONCAT(TEXT,' '); (TEXT[LENGTH(TEXT)]:=CH; (END &ELSE IF (ORD(CH)=LEFTARROW) AND (LENGTH(TEXT)>0) (THEN B WHILE TEXT[1] IN ['0'..'9'] DO $BEGIN $DIGITS:=TRUE; $R:=R*10+ORD(TEXT[1])-ORD('0'); $DELETE(TEXT,1,1); $END;  IF NOT DIGITS THEN ERROR('ILLEGAL NUMBER');  IF MINUS THEN R:=-R;  NUMBER:=R;  END;   PROCEDURE READLN;  VAR CH: CHAR;  BEGIN  SNG);  VAR CH: CHAR;  BEGIN  SAVE;  WSTRING(S);  READ(CH);  RESTORE;  EXIT(EVALUATE);  END;   FUNCTION NUMBER: INTEGER;  VAR MINUS,DIGITS: BOOLEAN;  R: INTEGER;  BEGIN  R:=0;  MINUS:=MATCH('-');  DIGITS:=FALSE;  VIEWPORT(VIEW[1],VIEW[2],VIEW[3],VIEW[4]);  END;    FUNCTION MATCH(PATTERN: STRING): BOOLEAN;  BEGIN  MATCH:=FALSE;  IF POS(PATTERN, TEXT)=1 THEN $BEGIN $DELETE(TEXT,1,LENGTH(PATTERN)); $MATCH:=TRUE; $END;  END;   PROCEDURE ERROR(S: STRIGER;  BEGIN  X:=TURTLEX;  Y:=TURTLEY;  ANGLE:=TURTLEANG;  PENCOLOR(NONE);  VIEWPORT(0,279,0,191);  MOVETO(0,0);  FOR I:=1 TO 40 DO WCHAR(' ');  MOVETO(0,0);  END;   PROCEDURE RESTORE;  BEGIN  MOVETO(X,Y);  TURNTO(ANGLE);  PENCOLOR(COLOR); PROGRAM TURTLE;  USES TURTLEGRAPHICS;   CONST LEFTARROW=8; NOOFNAMES=8;   VAR TEXT: STRING;  X, Y, ANGLE: INTEGER; $VIEW, PARAM: ARRAY[1..4] OF INTEGER; $COLOR: SCREENCOLOR; $  PROCEDURE EVALUATE; FORWARD;   PROCEDURE SAVE;  VAR I: INTEN^ (END; $END;  REPEAT UNTIL KEYPRESS;  TEXTMODE;  END.  OLOR:=NONE !ELSE IF MATCH('WHITE1') THEN GETCOLOR:=WHITE1 !ELSE IF MATCH('BLACK1') THEN GETCOLOR:=BLACK1 !ELSE IF MATCH('REVERSE') THEN GETCOLOR:=REVERSE !ELSE IF MATCH('RADAR') THEN GETCOLOR:=RADAR !ELSE IF MATCH('BLACK2') THEN GETCOLOR:=BLACK2 !ELSE IF MATCH('GREEN') THEN GETCOLOR:=GREEN !ELSE IF MATCH('VIOLET') THEN GETCOLOR:=VIOLET !ELSE IF MATCH('WHITE2') THEN GETCOLOR:=WHITE2 !ELSE IF MATCH('BLACK') THEN GETCOLOR:=BLACK !ELSE IF MATCH('ORANGE') THEN GETCOLOR:=ORANGE !ELSE IF MATCH('BLU12 to 12 do $begin $d:=abs(i*i+j*j); $if d<=63 &then boxes[1,i+12,j+12]:=true; $if abs(64-d)<=7 &then boxes[2,i+12,j+12]:=true; $if (abs(i)<= 6) and (abs(j)<= 6) &then boxes[4,i+12,j+12]:=true; $end; &  for i:=1 to 24 do $begin $writeln; $foro 4 do "for j:=1 to 24 do # for k:=1 to 24 do &boxes[i,j,k]:=false;   for i:=1 to 4 do "for j:=1 to 24 do $begin $boxes[i,j,24]:=true; $boxes[i,24,j]:=true; $boxes[i,j,1]:=true; $boxes[i,1,j]:=true; $end;    for i:=-12 to 12 do "for j:=-program test;  uses turtlegraphics;    type box = packed array[1..24,1..32] of boolean;   var boxes: packed array[1..4] of box;  d, i, j, k: integer;  F: file of box;   begin   rewrite(f, 'box.data');   for i:=1 tN^EAT READLN UNTIL LENGTH(TEXT)>0; $EVALUATE; $END;  END.  H('INITTURTLE') THEN $BEGIN $INITTURTLE; $COLOR:=NONE; $VIEW[1]:=0; $VIEW[2]:=279; $VIEW[3]:=0; $VIEW[4]:=191; $END !ELSE ERROR('ILLEGAL PROCEDURE NAME');  END;   BEGIN (* MAIN *)  TEXT:='INITTURTLE';  EVALUATE;  WHILE TRUE DO $BEGIN $REPIT') THEN $BEGIN $TEXTMODE; $EXIT(PROGRAM); $END !ELSE IF MATCH('PENCOLOR') THEN COLOR:=GETCOLOR !ELSE IF MATCH('FILLSCREEN') THEN FILLSCREEN(GETCOLOR) !ELSE IF MATCH('TEXTMODE') THEN TEXTMODE !ELSE IF MATCH('GRAFMODE') THEN GRAFMODE !ELSE IF MATC$MOVETO(PARAM[1],PARAM[2]); $END !ELSE IF MATCH('MOVE') THEN $BEGIN $GETPARAM(1); $MOVE(PARAM[1]); $END !ELSE IF MATCH('VIEWPORT') THEN $BEGIN $GETPARAM(4); $VIEWPORT(PARAM[1],PARAM[2],PARAM[3],PARAM[4]); $VIEW:=PARAM; $END !ELSE IF MATCH('QULUATE;  BEGIN  PENCOLOR(COLOR);  IF MATCH('TURNTO') THEN $BEGIN $GETPARAM(1); $TURNTO(PARAM[1]); $END !ELSE IF MATCH('TURN') THEN $BEGIN $GETPARAM(1); $TURN(PARAM[1]); $END !ELSE IF MATCH('MOVETO') THEN $BEGIN $GETPARAM(2); T MATCH('(') THEN ERROR('MISSING ''('''); $PARAM[1]:=NUMBER; $FOR P:=2 TO N DO (BEGIN (IF NOT MATCH(',') THEN ERROR('MISSING PARAMETER'); (PARAM[P]:=NUMBER; (END; $IF NOT MATCH(')') THEN ERROR('MISSING CLOSE PAREN'); $END;  END;   PROCEDURE EVAE') THEN GETCOLOR:=BLUE !ELSE IF MATCH('WHITE') THEN GETCOLOR:=WHITE !ELSE ERROR('ILLEGAL SCREENCOLOR');  IF NOT MATCH(')') THEN ERROR('MISSING '')''');  END;   PROCEDURE GETPARAM(N: INTEGER);  VAR P: INTEGER;  BEGIN  IF N>0 THEN # BEGIN $IF NO j:=1 to 24 do &if boxes[1,i,j] & then write('x') 'else write(' '); $end;  readln;   writeln('writing boxes');  for i:=1 to 4 do $begin $f^:=boxes[i]; $put(f); $end;  close(f,lock);   initturtle;  pencolor(white);   for i:=0 to 7 do "for j:=0 to 7 do $begin $drawblock(boxes[j mod 4+1],4,0,0,24, (24,i*24-i,j*24-j,10);  end;  readln;  TEXTMODE;  end.  A>B) AND (OP IN [ADD,SUB,MUL,DVD]) THEN $BEGIN $T:=A; $A:=B; $B:=T; $END;  TEMP.OP1:=A;  TEMP.OP2:=B;  ALLOC:=ALLOCATE(TEMP);  END;    FUNCTION ALLOCCON(I: INTEGER): NODEPTR;  VAR TEMP: NODE;  BEGIN  IF I=1 THEN ALLOCCON := ALLOC (ONE, NIL:=TEMP=S[P];  P:=P+1; "END;  IF FOUND !THEN ALLOCATE:=P-1 !ELSE BEGIN &S[N]:=TEMP; &ALLOCATE:=N; &N:=N+1; &END;  END;    FUNCTION ALLOC (OP: OPS; A,B: NODEPTR): NODEPTR;  VAR TEMP: NODE;  T: NODEPTR;  BEGIN  TEMP.OPCODE:=OP;  IF ($IF DEBUG THEN WRITELN('MATCHED ',S); $MATCH:=TRUE; $END "ELSE MATCH:=FALSE;  END;    FUNCTION ALLOCATE(VAR TEMP: NODE): NODEPTR;  VAR P: NODEPTR; $FOUND: BOOLEAN;  BEGIN  P:=1;  FOUND:=FALSE;  WHILE (PNIL "THEN CONSTANT := S[JJ].OPCODE IN [CONS, ONE, ZERO];  END;    FUNCTION VALUE(JJ: NODEPTR): INTEGER;  BEGIN  IF S[JJ].OPCODE = CONS THEN VALUE:=S[JJ].WORD INTEGER OF ) 0: (OP1: NODEPTR); -1: (WORD: INTEGER); 'END;    VAR S: ARRAY[NODEPTR] OF NODE; $PRIO: ARRAY[OPS] OF INTEGER; $OPER: ARRAY[OPS] OF STRING[4]; $TEXT: STRING; $CH: CHAR; $HASO1, HASO2: SET OF OPS; $ $N, EXPTREE, DERIV: NODEPTR;(* $L CONSOLE:*)  PROGRAM DIFFERENTIATE;   CONST DEBUG=FALSE; NIL=0;   TYPE OPS = (ZERO, ONE, E, PI, X, CONS, ADD, SUB, MUL, ,DVD, PWR, NEG, SIN, COS, TAN, ATAN, LOG);  %NODEPTR = 0..100; % %NODE = RECORD 'OPCODE: OPS; 'OP2: NODEPTR; 'CASE MAKE N^, NIL) !ELSE IF I=0 THEN ALLOCCON := ALLOC (ZERO, NIL, NIL) !ELSE BEGIN #TEMP.OPCODE:=CONS; #TEMP.WORD:=I; #TEMP.OP2:=NIL; #ALLOCCON:=ALLOCATE(TEMP); #END;  END;    FUNCTION CONART (OP: OPS; A,B: INTEGER): NODEPTR;  VAR J, I: INTEGER;  BEGIN  CASE OP OF   ADD: CONART := ALLOCCON (A+B);  SUB: CONART := ALLOCCON (A-B);  MUL: CONART := ALLOCCON (A*B);  DVD: BEGIN %IF B=0 THEN CONART := ALLOCCON(0) &ELSE IF A MOD B <> 0 )THEN CONART := ALLOC (OP, ALLOCCON(A), ALLOCCON(B)) )ELSE ) 'ELSE IF RIGHTOP=ZERO THEN M:=ALLOCCON(1) 'ELSE IF (LEFTOP=MUL) AND CONSTANT(O2) /AND (CONSTANT(S[O1].OP1)) (THEN M:=MAKE(MUL,MAKE(PWR,S[O1].OP1,O2), 8 MAKE(PWR,S[O1].OP2,O2)) 'ELSE IF RIGHTOP=ONE THEN M:=O1; & "END; &  IF M=NIL THEN $BEGIN $P=PI) (THEN M:=ALLOCCON(0); ( (  COS: IF (LEFTOP=ZERO) THEN M:=ALLOCCON(1) 'ELSE IF LEFTOP=PI THEN M:=ALLOCCON(-1); ' '  LOG: IF LEFTOP=ONE THEN M:=ALLOCCON(0) 'ELSE IF LEFTOP=E THEN M:=ALLOCCON(1); ' '  PWR: IF LEFTOP=ONE THEN M:=ALLOCCON(1(THEN M:=MAKE(NEG,MAKE(DVD,O1,S[O2].OP1),NIL) 'ELSE IF LEFTOP=ZERO THEN M:=ALLOCCON(0) 'ELSE IF RIGHTOP=ONE THEN M:=O1; &END; &  NEG: IF LEFTOP=ZERO THEN M:=ALLOCCON(0) 'ELSE IF LEFTOP=NEG THEN M:=S[O1].OP1; ' '  SIN: IF (LEFTOP=ZERO) OR (LEFTOWR,S[O1].OP1,MAKE(ADD,S[O1].OP2,S[O2].OP2)); &END;   DVD: BEGIN &IF (LEFTOP=NEG) AND (RIGHTOP=NEG) ' THEN M:=MAKE(DVD,S[O1].OP1,S[O2].OP1) 'ELSE IF LEFTOP=NEG (THEN M:=MAKE(NEG,MAKE(DVD,S[O1].OP1,O2),NIL) 'ELSE IF RIGHTOP=NEG N M:=MAKE(NEG,MAKE(MUL,O1,S[O2].OP1),NIL) 'ELSE IF (LEFTOP=ZERO) OR (RIGHTOP=ZERO) (THEN M:=ALLOCCON(0) 'ELSE IF LEFTOP=ONE THEN M:=O2 'ELSE IF RIGHTOP=ONE THEN M:=O1 'ELSE IF (LEFTOP=PWR) AND (RIGHTOP=PWR) 1AND (S[O1].OP1=S[O2].OP1) (THEN M:=MAKE(P2)=-1 THEN M:=MAKE(NEG,O1,NIL) 'ELSE IF O1=O2 THEN M:=MAKE(PWR,O1,ALLOCCON(2)) 'ELSE IF (LEFTOP=NEG) AND (RIGHTOP=NEG) (THEN M:=MAKE(MUL,S[O1].OP1,S[O2].OP1) 'ELSE IF LEFTOP=NEG (THEN M:=MAKE(NEG,MAKE(MUL,S[O1].OP1,O2),NIL) 'ELSE IF RIGHTOP=NEG (THE& ELSE IF LEFTOP=ZERO THEN M:=MAKE(NEG,O2,NIL) & ELSE IF RIGHTOP=NEG THEN M:=MAKE(ADD,O1,S[O2].OP1) & ELSE IF O1=O2 THEN M:=ALLOCCON(0) & ELSE M:=FACTOR(OP,O1,O2); &END; & #  MUL: BEGIN &IF VALUE(O1)=-1 THEN M:=MAKE(NEG,O2,NIL) & ELSE IF VALUE(O IF OP IN HASO2 THEN RIGHTOP:=S[O2].OPCODE;   CASE OP OF   X,  E,  PI,  ONE,  ZERO: M:=ALLOC(OP,NIL,NIL);   ADD: MAKEADD;   SUB: BEGIN &IF LEFTOP=NEG THEN M:=MAKE(NEG,MAKE(ADD,S[O1].OP1,O2), KNIL) & ELSE IF RIGHTOP=ZERO THEN M:=O1 :=O2 !ELSE IF RIGHTOP=ZERO THEN M:=O1 !ELSE IF RIGHTOP=NEG THEN M:=MAKE(SUB,O1,S[O2].OP1) !ELSE IF O1=O2 THEN M:=MAKE(MUL,ALLOCCON(2),O1) !ELSE M:=FACTOR(OP,O1,O2);  END;    BEGIN (* MAKE *)  M:=NIL;  IF OP IN HASO1 THEN LEFTOP:=S[O1].OPCODE; 1].OP1, = S[O2].OP2)) %ELSE IF S[O1].OP2=S[O2].OP2 'THEN FACTOR:=MAKE(MUL,S[O1].OP2, =MAKE(CODE,S[O1].OP1, GS[O2].OP1)); $END;  END;   PROCEDURE MAKEADD;  BEGIN  IF LEFTOP=NEG THEN M:=MAKE(SUB,O2,S[O1].OP1) !ELSE IF LEFTOP=ZERO THEN M'THEN FACTOR:=MAKE(MUL,S[O1].OP1, =MAKE(CODE,S[O1].OP2, GS[O2].OP2)) $ ELSE IF S[O1].OP1=S[O2].OP2 'THEN FACTOR:=MAKE(MUL,S[O1].OP1, =MAKE(CODE, S[O1].OP2, HS[O2].OP1)) %ELSE IF S[O1].OP2=S[O2].OP1 'THEN FACTOR:=MAKE(MUL,S[O1].OP2, =MAKE(CODE,S[ONODEPTR;  VAR TEMP, M: NODEPTR;  LEFTOP, RIGHTOP: OPS;    FUNCTION FACTOR(CODE: OPS; O1,O2: NODEPTR): NODEPTR;  BEGIN  FACTOR:=NIL;  IF (S[O1].OPCODE=MUL) AND (S[O2].OPCODE=MUL) "THEN BEGIN $IF S[O1].OP1=S[O2].OP1 DIGITS:=FALSE;  R := 0;  NUMBER:=NIL;  WHILE TEXT[1] IN ['0'..'9'] DO $BEGIN $DIGITS:=TRUE; $R := R*10+ORD(TEXT[1])-ORD('0'); $DELETE(TEXT, 1, 1); $END;  IF DIGITS THEN NUMBER := ALLOCCON(R);  END;    FUNCTION MAKE(OP: OPS; O1,O2: NODEPTR): CONART := ALLOCCON (A DIV B); %END;  NEG: CONART := ALLOCCON (-A);  PWR: BEGIN  J:=1; %FOR I := 1 TO B DO J:=J*A; %CONART := ALLOCCON (J); %END; !END;  END;    FUNCTION NUMBER: NODEPTR;  VAR R: INTEGER;  DIGITS: BOOLEAN;  BEGIN  IF CONSTANT(O1) AND CONSTANT(O2) &THEN M:=CONART(OP,VALUE(O1),VALUE(O2)) &ELSE M:=ALLOC(OP,O1,O2); &END;  MAKE:=M;  END;    FUNCTION EXPR(PRECEDENCE: INTEGER): NODEPTR;  VAR OPND: NODEPTR;  MATCHING: BOOLEAN;  BEGIN  IF PRECEDENCE <= 3 THEN OPND:=EXPR(PRECEDENCE+1);   MATCHING:=TRUE;   CASE PRECEDENCE OF   1: WHILE MATCHING DO %IF MATCH('+') THEN OPND:=MAKE(ADD,OPND,EXPR(2)) &ELSE IF MATCH('-') THEN OPND:=MAKE(SUB,OPND,EXPR(2)) 'ELSE MATCHING:=FALSE; ' ; OPER[NEG]:='-';  OPER[SIN]:='SIN'; OPER[COS]:='COS';  OPER[TAN]:='TAN'; OPER[ATAN]:='ATAN';  OPER[LOG]:='LOG';  HASO1:=[ADD,SUB,MUL,DVD,PWR,NEG,SIN,COS,TAN,ATAN,LOG];  HASO2:=[ADD,SUB,MUL,DVD,PWR]  END;    BEGIN (* MAIN PROGRAM *)  INITIALIZO[MUL]:=5; PRIO[DVD]:=5;  PRIO[PWR]:=7; PRIO[NEG]:=4;  OPER[ZERO]:='0'; OPER[ONE]:='1';  OPER[E]:='E'; OPER[PI]:='PI';  OPER[X]:='X'; OPER[CONS]:='?CN?';  OPER[ADD]:='+'; OPER[SUB]:='-';  OPER[MUL]:='*'; OPER[DVD]:='/';  OPER[PWR]:='**' ATAN: BEGIN (WRITE(OPER[OP],'('); (PRINT(S[P].OP1, 0); (WRITE(')'); (END;   CONS: WRITE(S[P].WORD:1);  "END;  END;    PROCEDURE INITIALIZE;  VAR I: OPS;  BEGIN  FOR I:=ZERO TO LOG DO PRIO[I]:=10;  PRIO[ADD]:=3; PRIO[SUB]:=3;  PRI0) AND (PREV>PREC) *THEN BEGIN ,WRITE('-('); ,PRINT(S[P].OP1,0); ,WRITE(')'); ,END *ELSE BEGIN ,WRITE('-'); ,PRINT(S[P].OP1, PREC); ,END; (END;   ZERO,  ONE,  PI,  E,  X: WRITE(OPER[OP]);   SIN,  COS,  TAN,  LOG, OP];  CASE OP OF   ADD,  SUB,  MUL,  DVD,  PWR: BEGIN (IF PREV>PREC THEN WRITE('('); (PRINT(S[P].OP1, PREC); (WRITE(OPER[OP]); (PRINT(S[P].OP2, PREC); (IF PREV>PREC THEN WRITE(')'); (END;   NEG: BEGIN (IF (PRIO[S[S[P].OP1].OPCODE]<11)));   ATAN: DIFF:=MAKE(DVD,DIFF(O1),  MAKE(ADD,ALLOCCON(1), @MAKE(MUL,O1,O1)));  $END;  END; ' '   PROCEDURE PRINT(P: NODEPTR; PREV: INTEGER);  VAR OP: OPS; $PREC: INTEGER;  BEGIN  OP:=S[P].OPCODE;  PREC:=PRIO[7MAKE(COS,O1,NIL));   COS: DIFF:=MAKE(NEG,MAKE(MUL,DIFF(O1), @MAKE(SIN,O1,NIL)), 7NIL);   TAN: DIFF:=MAKE(MUL,DIFF(O1), 7MAKE(ADD,ALLOCCON(1), @MAKE(PWR,P, IALLOCCON(2))));   LOG: DIFF:=MAKE(MUL,DIFF(O1), 7MAKE(PWR,O1, @ALLOCCON(-2)));   PWR: DIFF:=MAKE(ADD,MAKE(MUL,MAKE(MUL,DIFF(O1),O2), @MAKE(PWR,O1,MAKE(SUB,O2, UALLOCCON(1)))), 7MAKE(MUL,MAKE(MUL,MAKE(LOG,O1,NIL), IDIFF(O2)), @P));   NEG: DIFF:=MAKE(NEG,DIFF(O1),NIL);   SIN: DIFF:=MAKE(MUL,DIFF(O1), D,DIFF(O1),DIFF(O2));   SUB: DIFF:=MAKE(SUB,DIFF(O1),DIFF(O2));   MUL: DIFF:=MAKE(ADD,MAKE(MUL,O1,DIFF(O2)), 7MAKE(MUL,O2,DIFF(O1)));   DVD: DIFF:=MAKE(DVD,MAKE(SUB,MAKE(MUL,O2,DIFF(O1)), @MAKE(MUL,O1,DIFF(O2))), 7MAKE(PWR,O2,ALLOCCON( BEGIN  CODE:=S[P].OPCODE;  IF CODE IN HASO1 THEN O1:=S[P].OP1;  IF CODE IN HASO2 THEN O2:=S[P].OP2;  CASE S[P].OPCODE OF   ZERO,  ONE,  E,  PI,  CONS: DIFF:=MAKE(ZERO,NIL,NIL);   X: DIFF:=MAKE(ONE,NIL,NIL);   ADD: DIFF:=MAKE(AD)IF OPND=NIL THEN OPND:=EXPR(6); )END;   6: IF MATCH('(') $THEN BEGIN &OPND:=EXPR(1); &MATCHING:=MATCH(')'); &END $ELSE OPND:=NIL;  !END;  EXPR:=OPND;  END; '   FUNCTION DIFF(P: NODEPTR): NODEPTR;  VAR O1, O2: NODEPTR;  CODE: OPS; IL) $ELSE IF MATCH('LOG') THEN OPND:=MAKE(LOG,EXPR(6),NIL) $ELSE IF MATCH('X') THEN OPND:=MAKE(X,NIL,NIL) $ELSE IF MATCH('E') THEN OPND:=MAKE(E,NIL,NIL) $ELSE IF MATCH('PI') THEN OPND:=MAKE(PI,NIL,NIL) $ELSE BEGIN )OPND:=NUMBER; PR(4),NIL) %ELSE OPND:=EXPR(5); %  5: IF MATCH('SIN') THEN OPND:=MAKE(SIN,EXPR(6),NIL) $ELSE IF MATCH('COS') THEN OPND:=MAKE(COS,EXPR(6),NIL) $ELSE IF MATCH('TAN') THEN OPND:=MAKE(TAN,EXPR(6),NIL) $ELSE IF MATCH('ATAN') THEN OPND:=MAKE(ATAN,EXPR(6),N 2: WHILE MATCHING DO %IF MATCH('*') THEN OPND:=MAKE(MUL,OPND,EXPR(3)) 'ELSE IF MATCH('/') THEN OPND:=MAKE(DVD,OPND,EXPR(3)) ( ELSE MATCHING:=FALSE; )  3: IF MATCH('**') THEN OPND:=MAKE(PWR,OPND,EXPR(3));   4: IF MATCH('-') %THEN OPND:=MAKE(NEG,EXE;  WHILE TRUE DO $BEGIN $N:=1; $WRITELN; $REPEAT (WRITE('F(X) = '); (READLN(TEXT); $UNTIL LENGTH(TEXT)>0; $TEXT:=CONCAT(TEXT,' '); $EXPTREE:=EXPR(1); $WRITE('F(X) = '); PRINT(EXPTREE,0); $IF DEBUG THEN READ(CH); $DERIV:=DIFF(EXPTREE); $WRITELN; $WRITE('F''(X) = '); PRINT(DERIV, 0); $WRITELN; $IF DEBUG THEN READ(CH); $END;  END.   R[WHITE]:=BLACK;  PLAYING[BLACK]:=FALSE;  PLAYING[WHITE]:=FALSE;  PAWNDIR[WHITE]:=-10;  PAWNDIR[BLACK]:=10;  END;   PROCEDURE INIT2;  VAR I: INDEX;  SQ: SQUARE;  J: INTEGER;  BEGIN  QR1[WHITE]:=91;  QN1[WHITE]:=92;  QB1[WHITE]:=93; =21;  FOR J:=0 TO 3 DO KNDIR[J+4]:=-KNDIR[J];  COLR[BLACK]:='B';  COLR[WHITE]:='W';  PCENAME[KING]:='K';  PCENAME[QUEEN]:='Q';  PCENAME[ROOK]:='R';  PCENAME[BISHOP]:='B';  PCENAME[KNIGHT]:='N';  PCENAME[PAWN]:='P';   OTHER[BLACK]:=WHITE;  OTHE STPC[WHITE]:=0;  ENPC[WHITE]:=15;  STPC[BLACK]:=16;  ENPC[BLACK]:=31;  QDIR[0]:=10;  QDIR[1]:=-10;  QDIR[2]:=1;  QDIR[3]:=-1;  QDIR[4]:=-11;  QDIR[5]:=11;  QDIR[6]:=9;  QDIR[7]:=-9;   KNDIR[0]:=19;  KNDIR[1]:=8;  KNDIR[2]:=12;  KNDIR[3]:B1,KN1,KR1: ARRAY[COLOR] OF SQUARE;   KNDIR, QDIR: ARRAY[0..7] OF INTEGER;   MOVSTK: ARRAY[1..STACKSIZE] OF MOVE;   MSP, LEVEL: INTEGER;  PLAYER: COLOR;     PROCEDURE INITIALIZE;   PROCEDURE INIT1;  VAR J: INTEGER;  BEGIN ARRAY[COLOR] OF INTEGER;  OTHER: ARRAY[COLOR] OF COLOR;  PLAYING: ARRAY[COLOR] OF BOOLEAN;  COLR: ARRAY[COLOR] OF CHAR;  STPC,ENPC: ARRAY[COLOR] OF INDEX;   VALUE: ARRAY[PIECE] OF INTEGER;  PCENAME: ARRAY[PIECE] OF CHAR;   QR1,QN1,QB1,Q1,  K1,K,PTON,PXPEP);   MOVE = RECORD (SOURCE,DEST: SQUARE; (CAPT: INDEX; (KIND: MOVETYPE; (END;     VAR   BOARD: ARRAY[SQUARE] OF INDEX;   PCE: ARRAY[INDEX] OF PIECE;  LOC: ARRAY[INDEX] OF SQUARE;  SIDE: ARRAY[INDEX] OF COLOR;   PAWNDIR: (* $L CONSOLE: *)  PROGRAM CHESS;    CONST   MYTHICAL=-1; EMPTY=-2;  STACKSIZE=100;     TYPE   COLOR=(WHITE, BLACK);  PIECE=(KING,QUEEN,ROOK,BISHOP,KNIGHT,PAWN);  SQUARE=0..119;  INDEX=-2..31;  MOVETYPE=(NORMAL,OO,OOO,PTOQ,PTOR,PTOBOTHER N^ Q1[WHITE]:=94;  K1[WHITE]:=95;  KB1[WHITE]:=96;  KN1[WHITE]:=97;  KR1[WHITE]:=98;  QR1[BLACK]:=21;  QN1[BLACK]:=22;  QB1[BLACK]:=23;  Q1[BLACK]:=24;  K1[BLACK]:=25;  KB1[BLACK]:=26;  KN1[BLACK]:=27;  KR1[BLACK]:=28;  PCE[0]:=KING;  PCE[1]:=QUEEN;  PCE[2]:=ROOK;  PCE[3]:=ROOK;  PCE[4]:=BISHOP;  PCE[5]:=BISHOP;  PCE[6]:=KNIGHT;  PCE[7]:=KNIGHT;  LOC[0]:=K1[WHITE];  LOC[1]:=Q1[WHITE];  LOC[2]:=QR1[WHITE];  LOC[3]:=KR1[WHITE];  LOC[4]:=QB1[WHITE];  LOC[5]:=KB1[WHITE];  LOCEGIN +PCE[P]:=BISHOP; +END; % %OO: BEGIN +RK:=BOARD[KR1[PLAYER]]; +BOARD[KR1[PLAYER]]:=EMPTY; +BOARD[KB1[PLAYER]]:=RK; +LOC[RK]:=KB1[PLAYER]; +END; % %OOO: BEGIN +RK:=BOARD[QR1[PLAYER]]; +BOARD[QR1[PLAYER]]:=EMPTY; +BOARD[Q1[PLAYER]]:=RK; :=BOARD[SOURCE]; $BOARD[DEST]:=BOARD[SOURCE]; $BOARD[SOURCE]:=EMPTY; $LOC[CAPT]:=0; $LOC[P]:=DEST; $CASE KIND OF %PTOQ: BEGIN % PCE[P]:=QUEEN; +END; % %PTOR: BEGIN +PCE[P]:=ROOK; +END; % %PTON: BEGIN +PCE[P]:=KNIGHT; +END; % %PTOB: B$IF MV.SOURCE<>0 %THEN CASE P OF % PAWN: GPM; &ROOK: SLIDER(0,3); &BISHOP: SLIDER(4,7); &QUEEN: SLIDER(0,7); &KNIGHT: GNM; &KING: GKM; % END; $END;  END;    PROCEDURE MAKEMOVE(VAR M:MOVE);  VAR P, RK: INDEX;  BEGIN  WITH M DO $BEGIN $PDEST]; $IF (CAPT=EMPTY) OR (SIDE[CAPT]=OPPON) $ THEN GENMOVE; $END;  END;    BEGIN  MV.KIND:=NORMAL;  PD:=PAWNDIR[PLAYER];  OPPON:=OTHER[PLAYER];  FOR I:=STPC[PLAYER] TO ENPC[PLAYER] DO " BEGIN $P:=PCE[I]; $MV.SOURCE:=LOC[I]; 7 DO $BEGIN $DEST:=SOURCE+QDIR[I]; $CAPT:=BOARD[DEST]; $IF (CAPT=EMPTY) OR (SIDE[CAPT]=OPPON) $ THEN GENMOVE; $END;  END;   PROCEDURE GNM;  VAR I: INTEGER;  BEGIN  WITH MV DO "FOR I:=0 TO 7 DO $BEGIN $DEST:=SOURCE+KNDIR[I]; $CAPT:=BOARD[AND (SIDE[CAPT]=OPPON) &THEN GENMOVE; $DEST:=DEST+PD+1; $IF BOARD[SOURCE-PD-PD]=MYTHICAL &THEN BEGIN (CAPT:=BOARD[DEST]; (IF CAPT=EMPTY THEN GENMOVE; (END;  END;  END;    PROCEDURE GKM;  VAR I: INTEGER;  BEGIN  WITH MV DO "FOR I:=0 TO END;   PROCEDURE GPM;  BEGIN  WITH MV DO $BEGIN $DEST:=SOURCE+PD; $CAPT:=BOARD[DEST]; $IF CAPT=EMPTY THEN GENMOVE; $DEST:=DEST+1; $CAPT:=BOARD[DEST]; $IF (CAPT<>EMPTY) AND (SIDE[CAPT]=OPPON) &THEN GENMOVE; $DEST:=DEST-2; $IF (CAPT<>EMPTY) ,N: INTEGER);  VAR I, DIR: INTEGER;  BEGIN  WITH MV DO "FOR I:=M TO N DO $BEGIN $DIR:=QDIR[I]; $DEST:=SOURCE; $REPEAT (DEST:=DEST+DIR; (CAPT:=BOARD[DEST]; (IF (SIDE[CAPT]=OPPON) OR (CAPT=EMPTY) $ THEN GENMOVE; $UNTIL CAPT<>EMPTY; $END; ],'/'); ,PRINTSQUARE(DEST); ,END; $WRITELN; $END;  END;    PROCEDURE LMG;  VAR MV: MOVE;  I: INDEX;  P: PIECE;  PD: INTEGER;  OPPON: COLOR;    PROCEDURE GENMOVE;  BEGIN  PRINTMOVE(MV);  END;    PROCEDURE SLIDER(MTE(CHR(9-(I DIV 10)+ORD('1')));  END;   BEGIN  WITH M DO $BEGIN $WRITE(PCENAME[PCE[BOARD[SOURCE]]],'/'); $PRINTSQUARE(SOURCE); $IF CAPT=EMPTY 'THEN BEGIN ,WRITE('-'); ,PRINTSQUARE(DEST); # END 'ELSE BEGIN ,WRITE('X',PCENAME[PCE[CAPT],IF ODD(I+J) .THEN WRITE('--') .ELSE WRITE('**'); ,END )ELSE WRITE(COLR[SIDE[C]],PCENAME[PCE[C]]); (END; $END;  END;    PROCEDURE PRINTMOVE(VAR M: MOVE);   PROCEDURE PRINTSQUARE(I: SQUARE);  BEGIN  WRITE(CHR(I MOD 10 + ORD('A')-1));  WRIIT2;  END;    PROCEDURE DISPLAY;  VAR I, J: INTEGER; $SQ: SQUARE;  C: INDEX;  BEGIN  FOR I:=2 TO 9 DO " BEGIN $WRITELN; $WRITELN; $FOR J:=1 TO 8 DO (BEGIN (WRITE(' '); (SQ:=I*10+J; (C:=BOARD[SQ]; (IF C=EMPTY THEN ,BEGIN SIDE[I+24]:=BLACK; $END;  FOR SQ:=0 TO 119 DO $BEGIN $J:=SQ MOD 10; $IF (SQ<21) OR (SQ>98) OR (J=0) OR (J=9) &THEN BOARD[SQ]:=MYTHICAL &ELSE BOARD[SQ]:=EMPTY; $END;  FOR I:=0 TO 31 DO BOARD[LOC[I]]:=I;  END;    BEGIN (* INIT *)  INIT1;  IN[6]:=QN1[WHITE];  LOC[7]:=KN1[WHITE];  FOR I:=0 TO 7 DO $BEGIN $PCE[I+8]:=PAWN; $PCE[I+24]:=PAWN; $PCE[I+16]:=PCE[I]; $LOC[I+8]:=LOC[I]-10; $LOC[I+16]:=LOC[I]-70; $LOC[I+24]:=LOC[I]-60; $SIDE[I]:=WHITE; $SIDE[I+8]:=WHITE; $SIDE[I+16]:=BLACK; $+LOC[RK]:=Q1[PLAYER]; +END; % %PXPEP:BEGIN +END; &END;  END;  END;     BEGIN  INITIALIZE;  PLAYER:=WHITE;  LMG;  END.  EVAL REVERSE {SN^B=f^; get(f);  empbox:=f^; get(f);  quest:=f^; get(f);  END;    PROCEDURE DISPLAY;  VAR x,y,I: INTEGER;   procedure print(n: integer; p: piece);  var q: integer;  begin  moveto(265,n);  q:=total[p];  if q div 10 = 0  then wchar(' ') #e:=1;  LEVEL:=0;  DEBUG:=FALSE;  OLDDEBUG:=TRUE;  OLDDEPTH:=-1;  TOTAL[MYTHICAL]:=0;  TOTAL[EMPTY]:=0;  TOTAL[WHT]:=0;  TOTAL[BLK]:=0;  FOR I:=0 TO 90 DO "TOTAL[BOARD[I]]:=TOTAL[BOARD[I]]+1;  reset(f,'boxes.data');  blkbox:=f^; get(f);  whtbox:$BOARD[I]:=MYTHICAL; $BOARD[I+81]:=MYTHICAL; $BOARD[I*9]:=MYTHICAL; $END;  BOARD[90]:=MYTHICAL;  BOARD[0]:=MYTHICAL;  BOARD[40]:=WHT;  BOARD[41]:=BLK;  BOARD[49]:=BLK;  BOARD[50]:=WHT;  PAGE(OUTPUT);  PLAYER:=WHT;  OPPON:=BLK;  SP:=1;  DEPTH'black');  DIRECT[1]:=1;  DIRECT[2]:=-1;  DIRECT[3]:=9;  DIRECT[4]:=-9;  DIRECT[5]:=8;  DIRECT[6]:=-8;  DIRECT[7]:=10;  DIRECT[8]:=-10;  FOR I:=1 TO 90 DO BOARD[I]:=EMPTY;  FOR I:=0 TO 90 DO OLDBOARD[I]:=MYTHICAL;  FOR I:=1 TO 9 DO $BEGIN 15,25,70,78,63,73];  A:=[11,14,27,34,54,61,77,74];  B:=[12,13,75,76,36,45,43,52];   END;   PROCEDURE INIT;  VAR I, J: INTEGER;  BEGIN  initturtle;  moveto(223,50); wstring('empty');  moveto(223,60); wstring('white');  moveto(223,70); wstring(I]<>OPPON; ,IF BOARD[I]=PLAYER THEN 0BEGIN 0STACK[SP].SQ:=SQ; 0SP:=SP+1; 0NOMOVE:=FALSE; 0END; ( END; (END; $END;  END;    PROCEDURE INIT1;  VAR I, J: INTEGER;  S,C,A,B,LA,LB,B1: SET OF 9..80;  BEGIN  S:=[9,16,72,79];  C:=[10,18, NOMOVE: BOOLEAN;  BEGIN  FOR SQ:=10 TO 90 DO "IF BOARD[SQ] = EMPTY THEN $BEGIN $J:=8; $NOMOVE:=TRUE; $WHILE (J>0) AND NOMOVE DO (BEGIN (DIR:=DIRECT[J]; (J:=J-1; (I:=SQ+DIR; (IF BOARD[I]=OPPON THEN ,BEGIN ,REPEAT I:=I+DIR; -UNTIL BOARD[BEGIN  IF I>J THEN MIN:=J ELSE MIN:=I;  END;    PROCEDURE switch;  VAR TEMP: PIECE;  BEGIN  PLAYER:=OPPON;  IF OPPON=WHT "THEN OPPON:=BLK "ELSE OPPON:=WHT;  END;    PROCEDURE GETMOVES;  VAR I, SQ: SQUARE;  J, DIR: INTEGER; OVETOTAL, LEVEL: INTEGER; %DESIRE: ARRAY[SQUARE] OF INTEGER;  DIRECT: ARRAY[1..8] OF INTEGER;  DEBUG, OLDDEBUG: BOOLEAN;  f: file of box; %quest,whtbox,blkbox,empbox: box; %TOTAL: TOTALS;    FUNCTION MIN(I,J: INTEGER): INTEGER;  F INTEGER; %box = packed array[1..24,1..32] of boolean; %mov = RECORD .SQ: SQUARE; .VALUE: INTEGER; .END;    VAR OLDBOARD,BOARD: BD; %PLAYER, OPPON: PIECE; %STACK: ARRAY[1..MAXSTACK] OF mov;  OLDDEPTH, I, E, DEPTH, BESTMOVE, %SP, NUM, M(* $L CONSOLE:*)  PROGRAM OTHELLO;  uses turtlegr;   CONST MAXSTACK = 200;  INFINITY = 32000; &MAXDEPTH = 4;    TYPE PIECE = (WHT, BLK, EMPTY, MYTHICAL);  SQUARE = 0..90; %BD = ARRAY[SQUARE] OF PIECE;  TOTALS = ARRAY[PIECE] Olse wchar(chr(q div 10 + ord('0')));  wchar(chr(q mod 10 + ord('0')));  end;    BEGIN  IF OLDDEBUG<>DEBUG THEN $BEGIN $moveto(223,30); $IF NOT DEBUG THEN wstring('NO '); $wstring('DEBUG ');  OLDDEBUG:=DEBUG; $END;  IF OLDDEPTH<>DEPTH THEN $BEGIN $moveto(223,40); $wstring('DEPTH: ');  wchar(chr(ord('0')+depth)); $OLDDEPTH:=DEPTH; $END;  print(50,empty);  print(60,wht);  print(70,blk);  FOR I:=9 TO 82 DO "IF BOARD[I]<>OLDBOARD[I] THEN $BEGIN $x:=(i mN^GIN  INIT;  WHILE TRUE DO $BEGIN $DISPLAY;  READMOVE; $switch; $E:=LOOKAHEAD; $GOTOXY(0,20); $IF E<>-INFINITY THEN MAKEMOVE(BESTMOVE); $switch; $END;  END.  ]:=MYTHICAL; .OLDDEPTH:=-1; .OLDDEBUG:=NOT DEBUG; .PAGE(OUTPUT); .DISPLAY; .END; *END; (drawblock(empbox,4,0,0,24,24,x,y,10); (IF I=SP THEN I:=1; (IF I=0 THEN I:=SP-1; $UNTIL CH='P'; $MAKEMOVE(I); $SP:=1; $DISPLAY;  END;  END;    BEE ORD(CH) OF *8: I:=I-1; * *21: I:=I+1; * *12: BEGIN .GOTOXY(0,22); .WRITE('NEW DEPTH: '); .READLN(DEPTH); .DISPLAY; .END; * *17: EXIT(PROGRAM); * *4: BEGIN .DEBUG:=NOT DEBUG; .DISPLAY; .END; * *23: BEGIN .FOR J:=0 TO 90 DO OLDBOARD[J PROCEDURE READMOVE;  VAR J: SQUARE;  x,y,I: INTEGER; $CH: CHAR;  BEGIN  SP:=1;  I:=1;  GETMOVES;  IF SP>1 THEN $BEGIN $REPEAT (J:=STACK[I].SQ; (x:=(j mod 9)*23; (y:=(8-j div 9)*23; (drawblock(quest,4,0,0,24,24,x,y,10); (READ(CH); (CASATIC; +IF MAXVAL0 THEN $ BEGIN %DEEPER:=(LEVEL 0 DO $BEGIN $N:=N-1; $REPEAT COL := COL + 1; WRITE (ANAL, ' '); $UNTIL (COL MOD 8) = 0;  END;  END;   PROCEDURE REVERSE;  VAR J: 1..4;  BEGIN E, TIME,  PLAYERSI, OPPONSIN, PLAYERKI,  OPPONKING, ORIGINAL: INTEGER;  MSP, BESTMOVE: MOVEPTR;  CH:CHAR;  JMP, PCE: ARRAY[1..9] OF INTEGER;    FUNCTION ITOE(SQ:INTEGER):INTEGER;  BEGIN ITOE := SQ-SQ DIV 9; END;   FUNCTION ETOI(SQR:INTEGER):I DIRECTION: ARRAY[1..4] OF INTEGER;   COL, MOVENUMBER, NUMMOVES: INTEGER;  NEWFLAG, DEBUG, ANALYSIS, FOUNDJUMP, DYNAM: BOOLEAN;  GAIN, LEVEL, PLY, MINIMUMPLY, MAXIMALLEVEL,  PLAYER, OPPON, MAXLEVEL, TOTALKIN, WINNER,  LOSER, MATERIAL, TOTALNUM, LIF ARRAY[1..35, 1..35] OF INTEGER;   DISTTODD, NEARESTDDSQ: ARRAY[1..35] OF INTEGER;   PLAYING: ARRAY[SIDES] OF BOOLEAN;  TOTAL: ARRAY[SIDES] OF INTEGER;   NAME: ARRAY[PIECES] OF STRING[6];  NUMBER: ARRAY[PIECES] OF INTEGER;  INTEGER; &END;   VAR  ANAL: FILE OF CHAR;   BOARD: ARRAY[CONTENTS] OF INTEGER;   GAME: PACKED ARRAY[1..MAXNOMOVES] OF MOVE;  MOVSTK: ARRAY[MOVEPTR] OF MOVE;  KILLER: ARRAY[1..20] OF MOVE;   LOCATION: ARRAY[PIECES,1..12] OF CONTENTS;  DIST:=600; DIROPP=250; DBLDIAG=4;   TYPE  CONTENTS = -9..45;  SIDES = RED..BLACK;  PIECES = -KING..KING;  MOVEPTR = 0..STACKSIZE;  MOVE = RECORD &SOURCE, DEST: CONTENTS; &LENGTH, EVAL: INTEGER; &CROWNED: BOOLEAN; &JUMPEDSQ, JUMPEDPC: ARRAY[1..9] OF (* $L CONSOLE:*)  (*$S+*)  PROGRAM CHECKERS;  CONST SINGLE=2; KING=4; EMPTY=0; INFINITY=32000;  BLACK=1; RED=-1; BRIDGES=50; KINGCENTER=50;  NEARCROWN=75; MYTHICAL=-1; TRADEOFF=20;  CORNER=10; MAXNOMOVES=200; STACKSIZE=200;  MINORBRIDGES=35; TRAPPEDA ENDEVAL G#N^ OPPON:=PLAYER;  PLAYER:=-PLAYER;  OPPONSINGLE:=-OPPONSINGLE;  OPPONKING:=-OPPONKING;  PLAYERSINGLE:=-PLAYERSINGLE;  PLAYERKING:=-PLAYERKING;  FOR J:=1 TO 4 DO "DIRECTION[J]:=-DIRECTION[J];  GAIN:=-GAIN;  END;    PROCEDURE DISPLAY;  VAR J1,J2: INTEGER;  BEGIN  WRITELN;  FOR J1:=0 TO 3 DO BEGIN "WRITE(' '); "FOR J2:=1 TO 4 DO #WRITE(NAME[BOARD[ETOI(8*J1+J2)]]); "WRITELN; "FOR J2:=5 TO 8 DO #WRITE(NAME[BOARD[ETOI(8*J1+J2)]]); "WRITELN; "END;  END;    FUNCTION MIN(I,BER[PCE]+1;  TOTALNUMBER:=TOTALNUMBER+1;  END;    PROCEDURE PRINTGAME;  VAR I: INTEGER;  BEGIN  WRITELN('CHECKERS V01.01');  FOR I:=1 TO MOVENUMBER DO $BEGIN $WRITE(I:3,'. '); $MOVSTK[0]:=GAME[I]; $PRINTMOVE(0); $END;  END;   PROCEDURE AL[RED]-1 !ELSE TOTAL[BLACK]:=TOTAL[BLACK]-1;  NUMBER[PCE]:=NUMBER[PCE]-1;  TOTALNUMBER:=TOTALNUMBER-1;  END; !  PROCEDURE INSERT(PCE:INTEGER);  BEGIN  IF PCE<0 !THEN TOTAL[RED]:=TOTAL[RED]+1 !ELSE TOTAL[BLACK]:=TOTAL[BLACK]+1;  NUMBER[PCE]:=NUM TOTAL[BLACK]:=NUMBER[SINGLE]+NUMBER[KING];  TOTAL[RED]:=NUMBER[-KING]+NUMBER[-SINGLE];  MATERIAL:=3*(NUMBER[KING]-NUMBER[-KING])+ !2*(NUMBER[SINGLE]-NUMBER[-SINGLE]);  END;   PROCEDURE REMOVE(PCE:INTEGER);  BEGIN  IF PCE<0 !THEN TOTAL[RED]:=TOT TO 35 DO #BEGIN #PCE := BOARD[J]; #NUMBER[PCE] := NUMBER[PCE] + 1; #IF PCE<>EMPTY THEN LOCATION[PCE,NUMBER[PCE]] := J; #END;  TOTALKINGS:=NUMBER[KING]+NUMBER[-KING];  TOTALNUMBER:=TOTALKINGS+NUMBER[SINGLE]+ "NUMBER[-SINGLE]; OR I := 1 TO LENGTH DO (WRITE(ITOE(JUMPEDSQ[I]):3); &END; #IF CROWNED THEN WRITE(' CROWN ME'); #WRITELN; #END;  END;    PROCEDURE COUNTPIECES;  VAR J:INTEGER;  PCE: PIECES;  BEGIN  FOR PCE := -KING TO KING DO NUMBER[PCE] := 0;  FOR J:=1 WRITELN('ANALYSIS');  WRITELN; WRITELN;  END;    PROCEDURE PRINTMOVE(P: MOVEPTR);  VAR I: INTEGER;  BEGIN  WRITE('[',P:1,']');  WITH MOVSTK[P] DO BEGIN #WRITE(ITOE(SOURCE):2,'-',ITOE(DEST):2); #IF LENGTH>0 THEN BEGIN &WRITE(' JUMPING '); &F BEGIN  WRITELN;  WRITELN(' CHECKERS VERSION 1.0');  WRITELN('MINIMUMPLY: ',MINIMUMPLY:2);  WRITELN('MAXIMALLEVEL: ',MAXIMALLEVEL:2);  WRITELN('TIME: ',TIME:4);  IF NOT DEBUG THEN WRITE ('NO '); WRITELN('DEBUG');  IF NOT ANALYSIS THEN WRITE('NO ');  PLAYERKING:=KING;  OPPONSINGLE:=-SINGLE;  OPPONKING:=-KING;  DIRECTION[1]:=4;  DIRECTION[2]:=5;  DIRECTION[3]:=-4;  DIRECTION[4]:=-5;  MSP:=0;  END;   FUNCTION RANDOM(N:INTEGER):INTEGER;  BEGIN RANDOM:=1; END;    PROCEDURE WRITEPARAM; ARD[J]:=MYTHICAL;  FOR J:=1 TO 13 DO BOARD[J]:=SINGLE;  FOR J:=14 TO 22 DO BOARD[J]:=EMPTY;  FOR J:=23 TO 35 DO BOARD[J]:=-SINGLE;  BOARD[9]:=MYTHICAL;  BOARD[18]:=MYTHICAL;  BOARD[27]:=MYTHICAL;  PLAYER:=BLACK;  OPPON:=RED;  PLAYERSINGLE:=SINGLE;1 DO "FOR R2:=0 TO 31 DO $BEGIN $COL1:=(R1 MOD 4)*2+1-((R1 MOD 8) DIV 4); $COL2:=(R2 MOD 4)*2+1-((R2 MOD 8) DIV 4); $ROW1:=R1 DIV 4; $ROW2:=R2 DIV 4; $DIST[ETOI(R1+1),ETOI(R2+1)]:= %MAX(ABS(ROW1-ROW2),ABS(COL1-COL2)); $END;  FOR J:=-9 TO 45 DO BO DISTTODD[24]:=1; NEARESTDDSQ[24]:=20;  DISTTODD[28]:=2; NEARESTDDSQ[28]:=20;  DISTTODD[29]:=1; NEARESTDDSQ[29]:=25;  DISTTODD[32]:=3; NEARESTDDSQ[32]:=20;  DISTTODD[33]:=2; NEARESTDDSQ[33]:=25;  DISTTODD[34]:=1; NEARESTDDSQ[34]:=30;  FOR R1:=0 TO 3RESTDDSQ[13]:=21;  DISTTODD[14]:=1; NEARESTDDSQ[14]:=10;  DISTTODD[17]:=1; NEARESTDDSQ[17]:=21;  DISTTODD[19]:=1; NEARESTDDSQ[19]:=15;  DISTTODD[22]:=1; NEARESTDDSQ[22]:=26;  DISTTODD[23]:=2; NEARESTDDSQ[23]:=15; GIN  DISTTODD[2]:=1; NEARESTDDSQ[2]:=6;  DISTTODD[3]:=2; NEARESTDDSQ[3]:=11;  DISTTODD[4]:=3; NEARESTDDSQ[4]:=16;  DISTTODD[7]:=1; NEARESTDDSQ[7]:=11;  DISTTODD[8]:=2; NEARESTDDSQ[8]:=16;  DISTTODD[12]:=1; NEARESTDDSQ[12]:=16;  DISTTODD[13]:=2; NEAJ: INTEGER): INTEGER;  BEGIN  IF I>J THEN MIN:=J ELSE MIN:=I;  END;   FUNCTION MAX(I,J:INTEGER):INTEGER;  BEGIN  IF I>J THEN MAX:=I ELSE MAX:=J;  END;    PROCEDURE INITIALIZE;  VAR P: MOVEPTR;  J,R1,R2,COL1,COL2,ROW1,ROW2: INTEGER;  BEGETMVS;  VAR L, STSQ: INTEGER;    PROCEDURE GETJUMP(A:INTEGER);  VAR INC,S2,S3,R,LNUM,BA:INTEGER;  BEGIN  LNUM:=0;  BA:=ABS(BOARD[A]);  FOR R:=1 TO BA DO $BEGIN $INC:=DIRECTION[R]; $S2:=A+INC; $S3:=S2+INC; $IF ((BOARD[S2]=OPPONSINGLE) OR &(BOARD[S2]=OPPONKING)) AND &(BOARD[S3]=EMPTY) THEN BEGIN )LNUM:=LNUM+1; )L:=L+1; )JMP[L]:=S2; )PCE[L]:=BOARD[S2]; )BOARD[S3]:=BOARD[A]; )BOARD[S2]:=EMPTY; )BOARD[A]:=EMPTY; )GETJUMP(S3); )BOARD[A]:=BOARD[S3]; )BOARD[S3]:=EMPTY; )BOARD[S2]:=PC+THEN VAL:=VAL+MINORBRIDGES; 'IF (BOARD[1]=SINGLE) AND (BOARD[3]=SINGLE) +THEN VAL:=VAL+BRIDGES; 'IF (BOARD[33]=-SINGLE) AND (BOARD[35]=-SINGLE) ) THEN VAL:=VAL-BRIDGES; 'IF (BOARD[32]=-SINGLE) AND (BOARD[34]=-SINGLE) +THEN VAL:=VAL-MINORBRIDGES; VAL; 'IF (TOTALNUMBER>17) OR (TOTALKINGS=0) *THEN OPENEVAL ELSE MIDDLEEVAL; 'FOR J:=5 TO 8 DO (IF BOARD[J]=-SINGLE THEN VAL:=VAL-NEARCROWN; 'FOR J:=28 TO 31 DO (IF BOARD[J]=SINGLE THEN VAL:=VAL+NEARCROWN; 'IF (BOARD[2]=SINGLE) AND (BOARD[4]=SINGLE) )2*(NUMBER[SINGLE]-NUMBER[-SINGLE]); 'VAL:=100*MATERIAL; 'IF MATERIAL>0 THEN WINNER:=BLACK ELSE WINNER:=RED; 'LOSER:=-WINNER; 'LK:=LOSER*KING; WK:=WINNER*KING; 'LS:=LOSER*SINGLE; 'TOTALKINGS:=NUMBER[KING]+NUMBER[-KING]; 'IF TOTALNUMBER<11 THEN ENDEWKLOC,LKLOC]); 1END; -IF LOCAL<2 THEN LOCAL:=2; -D:=D+LOCAL*LOCAL; -END; )VAL:=VAL+D*LOSER; )END; %END;  END;   BEGIN  IF ABS(GAIN)>2 ! THEN VAL:=200*GAIN "ELSE BEGIN 'MATERIAL:=3*(NUMBER[KING]-NUMBER[-KING])+ :=VAL+DBLDIAG*LOSER; )J:=J+5; %UNTIL J>26; %IF DYNAM AND (NUMBER[LK]>0) THEN )BEGIN )D:=0; )FOR J:=1 TO NUMBER[WK] DO -BEGIN -LOCAL:=7; -WKLOC:=LOCATION[WK,J]; -FOR K := 1 TO NUMBER[LK] DO 1BEGIN 1LKLOC:=LOCATION[LK,K]; 1LOCAL:=MIN(LOCAL,DIST[]+BOARD[35]=LOSER*KING 'THEN VAL:=VAL-CORNER*WINNER; %IF TOTALNUMBER+ORIGINALEMPTY<>32 'THEN VAL:=VAL+TRADEOFF*WINNER; %J:=6; %REPEAT )IF (BOARD[J]=LK) OR (BOARD[J]=LS) +THEN VAL:=VAL+DBLDIAG*LOSER; )IF (BOARD[J+4]=LK) OR (BOARD[J+4]=LS) +THEN VAL PROCEDURE MIDDLEEVAL;  BEGIN  END;   PROCEDURE ENDEVAL;  VAR J, K, D, LOCAL: INTEGER;  BEGIN  COUNTPIECES;  IF (TOTALKINGS=2) AND (TOTALNUMBER=2) "THEN ONETOONE "ELSE BEGIN %IF BOARD[1]+BOARD[5]=LK 'THEN VAL:=VAL-CORNER*WINNER; %IF BOARD[31 IF BLOC MOD 5 > 1 THEN $BEGIN $ODIST:=DISTTODD[BLOC]; $PDIST:=DIST[RLOC,NEARESTDDSQ[BLOC]]; $TEMP:=PDIST-ODIST; $IF (TEMP<=1) AND (ABS(TEMP) MOD 2 = (OPPON+1) DIV 2) 'THEN VAL:=VAL-TRAPPED; $END;  END;   PROCEDURE OPENEVAL;  BEGIN  END;  OC:=LOCATION[KING, 1];  RLOC:=LOCATION[-KING,1];  IF RLOC MOD 5 > 1 THEN $BEGIN $ODIST:=DISTTODD[RLOC]; $PDIST:=DIST[BLOC,NEARESTDDSQ[RLOC]]; $TEMP:=PDIST-ODIST; $IF (TEMP<=1) AND (ABS(TEMP) MOD 2 = (OPPON+1) DIV 2) 'THEN VAL:=VAL+TRAPPED; $END; P;  BEGIN  LKLOC:=LOCATION[LOSER*KING,1];  FOR J:=1 TO NUMBER[WK] DO "IF DIRECTOPP(LOCATION[WK,J],LKLOC) AND (LKLOC MOD 5 > 1) $THEN VAL:=VAL+DIROPP*WINNER;  END;    PROCEDURE ONETOONE;  VAR BLOC, RLOC, ODIST, PDIST, TEMP: INTEGER;  BEGIN  BL VAR WKLOC, LS, LKLOC, WK, LK, J, VAL: INTEGER;    FUNCTION DIRECTOPP(S1,S2: INTEGER): BOOLEAN;  BEGIN  DIRECTOPP:=(DIST[S1,S2]=2) AND (ABS(S1-S2) MOD 2 = 1);  IF S1 IN [3,4,8,13,23,28,32,33] THEN DIRECTOPP:=FALSE;  END;    PROCEDURE CHECKOP*END;  END; !  BEGIN  FOUNDJUMP:=FALSE;  L:=0;  FOR STSQ:=1 TO 35 DO !IF (BOARD[STSQ]=PLAYERSING) OR (BOARD[STSQ]=PLAYERKING) #THEN GETJUMP(STSQ);  IF NOT FOUNDJUMP THEN GETMOVE;  END;    FUNCTION STATIC: INTEGER; !FOR J:=1 TO 35 DO #IF (BOARD[J]=PLAYERSINGLE) OR (BOARD[J]=PLAYERKING) %THEN FOR R:=1 TO ABS(BOARD[J]) DO &IF BOARD[J+DIRECTION[R]]=EMPTY 'THEN BEGIN *WITH MOVSTK[MSP] DO BEGIN ,LENGTH:=0; ,SOURCE:=J; ,DEST:=J+DIRECTION[R]; ,END; *MSP:=MSP+1; E[L]; )L:=L-1; )END; &END; !IF (LNUM=0) AND (L>0) THEN BEGIN $FOUNDJUMP:=TRUE; $WITH MOVSTK[MSP] DO BEGIN 'LENGTH:=L; 'JUMPEDSQ:=JMP; 'SOURCE:=STSQ; 'DEST:=A; 'END; $MSP:=MSP+1; $END; !END; ! !PROCEDURE GETMOVE; !VAR J, R: INTEGER; !BEGIN'VAL:=VAL*PLAYER; 'END;  IF ANALYSIS THEN BEGIN $(* TAB(14-LEVEL); $WRITE(ANAL,VAL:5,GAIN:2,LEVEL:2,PLY:2); $*) $WRITELN(ANAL); $COL:=1; $END;  STATIC:=VAL;  END;   PROCEDURE MAKEMOVE(P:MOVEPTR);  VAR PCE, SQ, J: INTEGER;  BEGIN  WITH MOVSTK[P] DO BEGIN #PCE:=BOARD[SOURCE]; #IF PLAYER=BLACK &THEN CROWNED:=(DEST>=32) AND (PCE=PLAYERSINGLE) &ELSE CROWNED:=(DEST<=4) AND (PCE=PLAYERSINGLE); #IF CROWNED THEN BEGIN &BOARD[DEST]:=PLAYERKING; &REMOVE(PCE); &INSERT(PLAYERKING); &  FOR P:=FIRST TO MSP-1 DO "IF MOVSTK[P].EVAL=MAXVAL THEN $BEGIN $MAKEMOVE(P); $J:=STATIC; $IF DEBUG THEN WRITE('=',J:1); $IF J>MV THEN (BEGIN (MV:=J; (BESTMOVE:=P; (END; $IF DEBUG THEN PRINTMOVE(P); $UNMOVE(P); $END;  DYNAM:=FALSE;  MAXVAL #END !ELSE BEGIN #CONTINUING:=(SCOPE>=NUM) OR (PLYMAXIMALLEVEL THEN CONTINUING:=FALSE;  END;    PROCEDURE REEVALUATE;  VAR J, MV: INTEGER;  BEGIN  MV:=-INFINITY;  DYNAM:=TRUE;   FUNCTION EVALUATE(SCOPE,ALPHA,OLDALPHA:INTEGER): INTEGER;  VAR NUM,NEWSCOPE,MAXVAL: INTEGER; %BEST,P,FIRST:MOVEPTR; %DEEPER: BOOLEAN;    FUNCTION CONTINUING: BOOLEAN;  BEGIN  IF FOUNDJUMP THEN BEGIN #NEWSCOPE:=SCOPE; #CONTINUING:=TRUE;2FOR K:=1 TO LENGTH DO 4IF JUMPEDSQ[K]<>INPUTSQ[K+1] THEN GOTO 1; 4MAKEMOVE(P); 4GAME[MOVENUMBER]:=MOVSTK[P]; 4REVERSE; 4GOTO 90; 4END; ,1:END; ,END; (END;  98: WRITELN('MOVE NOT FOUND');  99: MOVENUMBER:=MOVENUMBER-1;  90: MSP:=0;  END;  1 THEN BEGIN .WRITELN('AMBIGOUS MOVE'); .GOTO 99; .END; +MAKEMOVE(TABLE[1]); +GAME[MOVENUMBER]:=MOVSTK[TABLE[1]]; +REVERSE; +GOTO 90; +END )ELSE BEGIN +FOR J:=1 TO MATCHES DO BEGIN .P:=TABLE[J]; .WITH MOVSTK[P] DO 0IF LEN-2=LENGTH THEN BEGIN DO +BEGIN +IF (INPUTSQ[1]=MOVSTK[P].SOURCE) -AND (INPUTSQ[LEN]=MOVSTK[P].DEST) -THEN BEGIN 2MATCHES:=MATCHES+1; 2TABLE[MATCHES]:=P; 2END; +END; (IF LEN=2 THEN BEGIN +IF MATCHES=0 THEN BEGIN .WRITELN('NOT A MOVE'); .GOTO 99; .END; +IF MATCHES>#THEN WRITELN('YOU HAVE NO MOVES') #ELSE BEGIN (MATCHES:=0; (IF LEN<2 THEN BEGIN +WRITELN('MOVE NOT LONG ENOUGH'); +GOTO 99; +END; (IF (NOT FOUNDJUMPS) AND (LEN>2) THEN BEGIN ) WRITELN('THERE ARE NO JUMPS'); +GOTO 99; +END; (FOR P:=0 TO MSP-1 'WRITELN('ILLEGAL MOVE'); 'GOTO 99; 'END; $LEN:=LEN+1; $INPUTSQ[LEN]:=ETOI(N); $IF (CH<>'-') AND (CH<>' ') AND NOT EOLN THEN & BEGIN 'WRITELN('ILLEGAL DELIMITER'); 'GOTO 99; 'END; $IF NOT EOLN THEN READ(CH); $END;  GETMVS;  IF MSP=0 OLN) #DO READ(CH);  WHILE (CH IN ['0'..'9']) AND (NOT EOLN)  DO BEGIN #NUM:=NUM*10+ORD(CH)-ORD('0'); #READ(CH); #END;  READNUMBER:=NUM;  END;   BEGIN  LEN:=0;  WHILE NOT EOLN DO $BEGIN $N:=READNUMBER; $IF (N=0) OR (N>32) THEN & BEGIN +*)  LABEL 1,90,98,99;  VAR INPUTSQ: ARRAY[1..30] OF INTEGER; $P: MOVEPTR; $LEN, N, MATCHES, J, K: INTEGER; $TABLE: ARRAY[1..30] OF MOVEPTR;   FUNCTION READNUMBER: INTEGER;  VAR NUM: INTEGER;  BEGIN  NUM:=0;  WHILE (CH IN ['-',' ']) AND (NOT E&INSERT(PLAYERSINGLE); &END $ELSE BOARD[SOURCE]:=HOLD; #IF LENGTH>0 THEN BEGIN &GAIN:=GAIN-LENGTH; &FOR J:=1 TO LENGTH DO BEGIN )HOLD:=JUMPEDPC[J]; )BOARD[JUMPEDSQ[J]]:=HOLD; )INSERT(HOLD); )END; &END; #END;  END;   PROCEDURE ACCEPT;  (*$GB(1); &END; #END;  END;   PROCEDURE UNMOVE(P:MOVEPTR);  VAR HOLD, J: INTEGER;  BEGIN  WITH MOVSTK[P] DO BEGIN #HOLD:=BOARD[DEST]; #BOARD[DEST]:=EMPTY; #IF CROWNED THEN BEGIN &BOARD[SOURCE]:=PLAYERSINGLE; &REMOVE(HOLD); (LEVEL>0) THEN BEGIN &IF COL=1 THEN TAB(LEVEL-1); &WRITE(ANAL,ITOE(SOURCE):2); &IF LENGTH>0 THEN WRITE(ANAL,'=') ELSE WRITE(ANAL,'-'); &WRITE(ANAL, ITOE(DEST):2); &COL:=COL+5; &IF CROWNED THEN BEGIN )COL:=COL+1; & WRITE(ANAL,'*'); & END; &TAEND # ELSE BOARD[DEST]:=PCE; #BOARD[SOURCE]:=EMPTY; #IF LENGTH>0 THEN BEGIN &GAIN:=GAIN+LENGTH; &FOR J:=1 TO LENGTH DO BEGIN (SQ:=JUMPEDSQ[J]; (PCE:=BOARD[SQ]; (JUMPEDPC[J]:=PCE; (REMOVE(PCE); (BOARD[SQ]:=EMPTY; (END; # END; #IF ANALYSIS AND:=MV;  END;    BEGIN  LEVEL:=LEVEL+1;  MAXVAL:=-INFINITY;  FIRST:=MSP;  BEST:=FIRST;  GETMVS;  NUM:=MSP-FIRST;  IF NOT FOUNDJUMP THEN PLY:=PLY+1;  IF (LEVEL=1) AND (NUM<=1) THEN BEGIN #MAXVAL:=0; #MOVSTK[FIRST].EVAL:=0; #END !ELSE IF NUM>0 THEN BEGIN $P:=FIRST; $DEEPER:=CONTINUING; $WHILE (P0 ,THEN BEGIN 1MOVSTK[0]:=GAME[MOVENUMBER]; 1UNMOVE(0); 1MOVENUMBER:=MOVENUMBER-1; 1REVERSE; 1END; (END; ! !'W': WRITEPARAMETERS; !END ELSE WRITELN('ILLEGAL COMMAND');  E(MOVENUMBER:=0; (NEWFLAG:=FALSE; (PLAYING[RED]:=FALSE; (PLAYING[BLACK]:=FALSE; (TIME:=100; (END; ! !'S': BEGIN (READ(CH); (IF CH IN ['D','L','T'] *THEN CASE CH OF )'D': READ(MINIMUMPLY); )'L': READ(LIFE); )'T': READ(TIME); )END ELSE WRITEL=FALSE; END; )'R': BEGIN PLAYING[RED]:=TRUE; PLAYING[BLACK]:=FALSE; END; )'S': BEGIN PLAYING[RED]:=TRUE; PLAYING[BLACK]:=TRUE; END; )END ELSE WRITELN('ILLEGAL OPTION'); (END;  !'Q': MOVENUMBER:=MOVENUMBER-1; ! !'R': BEGIN (INITIALIZEBOARD; ',STATIC:1); (DYNAM:=FALSE; (REVERSE; (END; ! !'P': BEGIN (READ(CH); (IF CH IN ['B','G','N','R','S'] *THEN CASE CH OF )'B': BEGIN PLAYING[BLACK]:=TRUE;PLAYING[RED]:=FALSE; END; )'G': PRINTGAME; )'N': BEGIN PLAYING[RED]:=FALSE;PLAYING[BLACK]:ENUMBER:=MOVENUMBER-1;  IF CH IN ['A'..'E','P'..'S','U','W'] "THEN CASE CH OF !'A': ANALYSIS:=NOT ANALYSIS; ! !'B': DISPLAY; ! !'C': CLOSE(ANAL); ! !'D': DEBUG:=NOT DEBUG; ! !'E': BEGIN (REVERSE; (DYNAM:=TRUE; (WRITELN('EVALUATION = FOR E:=1 TO 20 DO KILLER[E].SOURCE:=0;  E:=EVALUATE(TIME,INFINITY,INFINITY);  IF NOT NEWFLAG THEN BEGIN "PRINTMOVE(BESTMOVE); "MAKEMOVE(BESTMOVE); "GAME[MOVENUMBER]:=MOVSTK[BESTMOVE]; "END;  REVERSE;  END;    PROCEDURE COMMAND;  BEGIN  MOV>1 $THEN REEVALUATE $ELSE BESTMOVE:=BEST;  MSP:=FIRST;  NEWFLAG:=NUM=0;  EVALUATE:=MAXVAL;  END;    PROCEDURE PLAY;  VAR E:INTEGER;  BEGIN  GAIN:=0;  LEVEL:=0;  PLY:=0;  COUNTPIECES;  ORIGINALEMPTY:=NUMBER[EMPTY]; NALYSIS THEN BEGIN '(* TAB(14-LEVEL); 'WRITE(ANAL,' LOSS',GAIN:2,LEVEL:2,PLY:2); '*) 'WRITELN(ANAL); 'COL:=1; 'END;  END;  KILLER[LEVEL]:=MOVSTK[BEST];  IF MOVSTK[FIRST].LENGTH=0 THEN PLY:=PLY-1;  LEVEL:=LEVEL-1;  IF LEVEL=0 THEN "IF NUMD )ELSE EVAL:=STATIC; (IF MAXVALN^ FN: STRING;    FUNCTION GETBYTE: INTEGER;  VAR T: INTEGER;  BEGIN  IF OFFSET>511 THEN $BEGIN $BLOCK:=BLOCK+1; $TEMP:=BLOCKREAD(CF,BUFFER,1,BLOCK); $OFFSET:=0; $END;  T:=ORD(BUFFER[OFFSET]);  OFFSET:=OFFSET+1;  LENGTH:=LENGTH-1;  BP:=BP+1; ARRAY[1..16] OF INTEGER); (FALSE:(INFOTBL: PACKED ARRAY[0..511] OF CHAR); (END;   VAR CF: FILE; $BP,LENGTH,SEG,I,TEMP,BLOCK, OFFSET: INTEGER;  HEADER: INFO;  BUFFER: PACKED ARRAY[0..511] OF CHAR;  BYTES: ARRAY[1..10] OF INTEGER;  PROGRAM DUMP;   TYPE NAME = PACKED ARRAY[1..8] OF CHAR; %SEGPAIR = RECORD  BLOCKNO: INTEGER; 'NBYTES: INTEGER; 'END;  INFO = RECORD 'CASE BOOLEAN OF (TRUE: (SEGDESC: ARRAY[1..16] OF SEGPAIR; /SEGNAME: ARRAY[1..16] OF NAME; /SEGTYPE:N^"  BLT:=BLOCKREAD(S,BLK,1,4);  BLK[232]:=234;  BLK[233]:=234;  BLK[235]:=127;   BLT:=BLOCKWRITE(S,BLK,1,4);  CLOSE(S,LOCK);  END.  (* PROGRAM TO MODIFY BIOS MODULE FOR #DAN PAYMARS LOWER CASE ADAPTER. *)   PROGRAM LCUPDATE;   VAR BLK: PACKED ARRAY[0..511] OF 0..255; $BLT, BLN: INTEGER; $S: FILE;  BEGIN  WRITELN('PUT IN APPLE3');  READLN;  RESET(S,'APPLE3:SYSTEM.APPLE');  BYTES[BP]:=T;  GETBYTE:=T;  END;     FUNCTION B: INTEGER;  VAR R: INTEGER;  BEGIN  R:=GETBYTE;  IF R>127 THEN R:=(R-128)*256+GETBYTE;  B:=R;  END;    FUNCTION DB: INTEGER;  BEGIN DB:=GETBYTE;  END;    FUNCTION SB: INTEGER;  VAR R: INTEGER;  BEGIN R:=GETBYTE;  IF R>=128 THEN R:=-R;  SB:=R;  END;    FUNCTION UB: INTEGER;  BEGIN UB:=GETBYTE;  END;    FUNCTION W: INTEGER;  BEGIN W:=GETBYTE+GETBYTE*256;  END;    PROCEDURE WRITEBYTES;  VAR I: INTEGER;  BEEND;    PROCEDURE DCD200;  BEGIN  CASE INST OF !206: TWO('CLP ',UB); !207: TWO('CGP ',UB); !205: THREE('CXP ',DB,UB); !202: TWO('LDL ',B); !204: TWO('STL ',B); !248: ONE('SINDO'); !210: ONE('BYT'); !209: ONE('IXB'); !208: ONE('S1P'); !211:E('CHK'); !195: ONE('EQUI'); !196: ONE('GEQI'); !197: ONE('GTRI'); !175: ONETYPE('EQU'); !176: ONETYPE('GEQ'); !177: ONETYPE('GTR'); !180: ONETYPE('LEQ'); !181: ONETYPE('LES'); !183: ONETYPE('NEQ'); !166: LCA; !179: LDC; !158: STDFNC; !END;  !140: ONE('INT'); !133: ONE('DIF'); !185: TWO('UJP',SB); !161: TWO('FJP',SB); !172: XJP; !128: ONE('ABI'); !130: ONE('ADI'); !145: ONE('NGI'); !149: ONE('SBI'); !143: ONE('MPI'); !152: ONE('SQI'); !134: ONE('DVI'); !142: ONE('MODI'); !136: ON!137: ONE('FLO'); !129: ONE('ABR'); !131: ONE('ADR'); !146: ONE('NGR'); !150: ONE('SBR'); !144: ONE('MPR'); !153: ONE('SQR'); !135: ONE('DVR'); !160: TWO('ADJ ',UB); !151: ONE('SGS'); !148: ONE('SRS'); !139: ONE('INN'); !156: ONE('UNI'); '); !155: ONE('IXS'); !168: TWO('MOV ',B); !162: TWO('INC ',B); !163: TWO('IND ',B); !164: TWO('IXA ',B); !192: THREE('IXP ',UB,UB); !186: ONE('LDP'); !187: ONE('STP'); !132: ONE('LAND'); !141: ONE('LOR'); !147: ONE('LNOT'); !138: ONE('FLT'); ('SRO ',B); !182: THREE('LOD ',DB,B); !178: THREE('LDA ',DB,B); !184: THREE('STR ',DB,B); !154: ONE('STO'); !188: TWO('LDM ',UB); !189: TWO('STM ',UB); !190: ONE('LDB'); !191: ONE('STB'); !169: TWO('MVB ',B); !170: TWO('SAS ',UB); !157: ONE('S2P PROCEDURE DCD100;  BEGIN  CASE INST OF ! !174: TWO('CIP ',UB); !173: TWO('RNP ',DB); !193: TWO('RBP', DB); !159: ONE('LDCN'); !199: TWO('LDCI',W); !194: TWO('CBP ',UB); !198: TWO('LLA ',B); !167: TWO('LDO ',B); !165: TWO('LAO ',B); !171: TWO IF ODD(OFFSET) THEN W1:=GETBYTE;  W1:=W; W2:=W; W3:=W;  WRITEBYTES;  WRITELN('CASE ',W1,',',W2,',',W3);  W2:=W2-W1+1;  WHILE W2>0 DO $BEGIN $WRITELN(' ':16,W); $W2:=W2-1; $BP:=0; $END;  END;    PROCEDURE DECODE;  VAR INST: INTEGER;  ND'); !24: ONE('SIN'); !25: ONE('COS'); !26: ONE('LOG'); !27: ONE('ATAN'); !28: ONE('LN'); !29: ONE('EXP'); !30: ONE('SQT'); !31: ONE('MRK'); !32: ONE('RLS'); !35: ONE('POT'); !END;  END;    PROCEDURE XJP;  VAR W1,W2,W3: INTEGER;  BEGIN ;  VAR I: INTEGER;  BEGIN  I:=UB;  CASE I OF !0: ONE('CALL???'); !1: ONE('NEW'); !2: ONE('MVL'); !3: ONE('MVR'); !4: ONE('EXIT'); !7: ONE('IDS'); !8: ONE('TRS'); !9: ONE('TIM'); !10: ONE('FLC'); !11: ONE('SCN'); !22: ONE('TNC'); !23: ONE('R$BP:=0; $N:=N-1; $END;  WRITELN;  END;    PROCEDURE LCA;  VAR N: INTEGER;  BEGIN  N:=UB;  WRITEBYTES;  WRITE('LCA ',N, '''');  WHILE N>0 DO $BEGIN $WRITE(CHR(UB)); $BP:=0; $N:=N-1; $END;  WRITELN('''');  END;    PROCEDURE STDFNCS,' ',O1);  END;    PROCEDURE THREE(S:STRING; O1,O2: INTEGER);  BEGIN  WRITEBYTES;  WRITELN(S,' ',O1,', ',O2);  END;    PROCEDURE LDC;  VAR N: INTEGER;  BEGIN  N:=UB;  WRITEBYTES;  TWO('LDC ',N);  WHILE N>0 DO $BEGIN $WRITE(W:5); TEBYTES;  WRITE(S);  CASE M OF !6: WRITE('BOOL'); !2: WRITE('REAL'); !8: WRITE('POWR'); !4: WRITE('STR'); !10: WRITE('BYT'); !12: WRITE('WORD'); !END;  WRITELN;  END;    PROCEDURE TWO(S:STRING; O1: INTEGER);  BEGIN  WRITEBYTES;  WRITELN(GIN  FOR I:=1 TO BP DO WRITE(BYTES[I]:4);  FOR I:=1 TO 4-BP DO WRITE(' ');  BP:=0;  END;    PROCEDURE ONE(S: STRING);  BEGIN  WRITEBYTES;  WRITELN(S);  END;    PROCEDURE ONETYPE(S: STRING);  VAR M: INTEGER;  BEGIN  M:=GETBYTE;  WRI TWO('EFJ',SB); !212: TWO('NFJ',SB); !215: ONE('NOP'); !203: ONE('NEQI'); !200: ONE('LEQI'); !201: ONE('LESI'); !END;  END;     BEGIN  INST:=GETBYTE;  IF INST<128 THEN TWO('SLDC ',INST)  ELSE IF INST IN [216..231] "THEN TWO('SLDL ',INST-215)  ELSE IF INST IN [232..247] "THEN TWO('SLDO ',INST-231) !ELSE IF INST IN [248..255] "THEN TWO('SIND ',INST-248) !ELSE IF INST<200 THEN DCD100 !ELSE DCD200;  END;     PROCEDURE DUMPSEGMENT(N: INTEGER);  VAR NUM,IN^dd(BCC OK (CMP #91. (BCS OK (LDX MODE (DEX (BNE NOCVT (ORA #32.   NOCVT CPX #1 (BNE OK (STX MODE  OK LDX WPTR (JMP 0D709 ( (.END  ( (.ORG 0DABE ;BLOCK 5, BYTE 190  PTCH CMP #23. (BNE NOTSHF ;NOT CTLW (LDA MODE (ADC #0 ;C SET FROM EQ ON CMP (AND #3 (STA MODE (BNE JDONEK (INC MODE  JDONEK JMP DONECK   NOTSHF CMP #65. .ABSOLUTE (.PROC PATCH  MODE .EQU 0BF13  DONECK .EQU 0D71D  WPTR .EQU 0BF19  (.ORG 0D687 (NOP (NOP (NOP (NOP (NOP ( (.ORG 0D706 (JMP PTCH ( (.ORG 0D8E8 ;BLOCK 4, BYTE 232 (NOP (NOP (AND #7F N^ddRITELN(SEGNAME[I],' (',SEGDESC[I].BLOCKNO, 0',',SEGDESC[I].NBYTES,')'); $END;  FOR SEG:=1 TO 16 DO DUMPSEGMENT(SEG);  END.  END;  END;    BEGIN  WRITE('FILE TO DUMP --> ');  READLN(FN);  RESET(CF,FN);  WRITE('TO WHERE? ');  READLN(FN);  CLOSE(OUTPUT);  REWRITE(OUTPUT,FN);  TEMP:=BLOCKREAD(CF,HEADER,1,0);  BP:=0;  WITH HEADER DO "FOR I:=1 TO 16 DO $BEGIN $W: INTEGER;  BEGIN  WITH HEADER.SEGDESC[N] DO $BEGIN $BLOCK:=BLOCKNO; $LENGTH:=NBYTES; $END;  OFFSET:=0;  NUM:=0;  TEMP:=BLOCKREAD(CF,BUFFER,1,BLOCK);  IF LENGTH>0 THEN $BEGIN $WRITELN; $WRITELN('SEGMENT #',N:1); $WHILE LENGTH>0 DO DECODE;  (* $L PRINTER:*)  PROGRAM PATCH;   TYPE LONGSTR=STRING[255];   VAR TEMP, BLOCK,OFFSET: INTEGER;  F: FILE; $S: LONGSTR;   PROCEDURE DOIT(S: LONGSTR; BLOCK, OFFSET: INTEGER);  VAR BUFFER: PACKED ARRAY[0..512] OF 0..255; $I,N: INTEGER;  BEGTL;   PROCEDURE COMMAND;  VAR S: CHAR;  FN: STRING;  J, C, I: INTEGER;  BEGIN  WRITELN(CHR(FF));  WRITE('D(IS Q(UITLOG S(END F(ILE L(OGON');  READ(S);  WRITELN(CHR(FF));  CASE S OF ! !'L': BEGIN &LOGGING:=TRUE; ! LP:=0; &END;  = (LOWER, UPCASE, CAPSLOCK);   VAR LP, COL, I, J, K, IP, OP, OC: INTEGER; $CH: CHAR; $BUFFER: PACKED ARRAY[0..255] OF CHAR;  LOG: PACKED ARRAY[0..LOGSIZE] OF CHAR;  LOGFILE: TEXT;  LOGGING: BOOLEAN;  MSG: STRING;  MODE: CASEC (* $L PRINTER: *)  PROGRAM TERMINAL;  USES APPLESTUFF,MODMSTUFF;   (*$G+*)  LABEL 99;   CONST LF=10; CR=13; DEL=127; XOFF=19; CTLF=6; HT=9;  XON=17; FF=12; BELL=7; SHIFT=23; BS=8; CTLY=25;  CTLX=24; LOGSIZE=20000;   TYPE CASECTLN^;4 S:=CONCAT(S,'C9419014C95BB010AE13BFCA');  S:=CONCAT(S,'D0020920EAE001D0038E13BF');  S:=CONCAT(S,'AE19BF4C09D7');  DOIT(S,5,190);  DOIT('EAEA297F',4,232);  CLOSE(F,LOCK);  END.  FER,1,BLOCK);  WRITELN;WRITELN('BLOCK PATCHED');  END;    BEGIN  WRITE(CHR(12),'HIT RETURN WHEN READY');  READLN;  RESET(F,'#4:SYSTEM.APPLE');  DOIT('EAEAEAEAEA',3,135);  DOIT('4CBEDA',3,262);  S:='C917D00DAD13BF690029038D13BF4C1DD7'; N N:=N+ORD(S[1])-ORD('0') %ELSE IF S[1] IN ['A'..'F'] 'THEN N:=N+ORD(S[1])-ORD('A')+10 &ELSE WRITE('ILLEGAL HEX DIGIT'); $DELETE(S,1,1); $END; "WRITELN('BLOCK[',OFFSET,']:=',N); "BUFFER[OFFSET]:=N; "OFFSET:=OFFSET+1; "END;  TEMP:=BLOCKWRITE(F,BUFIN  TEMP:=BLOCKREAD(F,BUFFER,1,BLOCK);  WRITELN;  WRITELN('PATCHING BLOCK ',BLOCK,' OFFSET ',OFFSET);  WRITELN('FIRST BYTE IS: ',BUFFER[OFFSET]);  WHILE LENGTH(S)>1 DO "BEGIN "N:=0; "FOR I:=1 TO 2 DO $BEGIN $N:=N*16; $IF S[1] IN ['0'..'9'] &THE! !'Q': LOGGING:=FALSE; ! !'F': BEGIN &WRITE('FILE NAME --> ');  READLN(FN); &IF LENGTH(FN)>0 THEN (BEGIN (REWRITE(LOGFILE,FN); (C:=0; (FOR J:=0 TO LP DO ( BEGIN ( S:=LOG[J]; *I:=ORD(S); *C:=C+1; *IF I=CR THEN * BEGIN ,C:=0; ,WRITELN(LOGFILE); ,END *ELSE IF I=HT THEN ,REPEAT .WRITE(LOGFILE,' '); .C:=C+1; ,UNTIL (C MOD 8) = 0 *ELSE IF I<>LF THEN WRITE(LOGFILE,S); *END; (CLOSE(LOGFILE,LOCK); (WRITELN('*** FILE RECEIVED ***'); (END; &LOGGING:=FALSE; &LP:=0; &END;   D(IS Q(UITLOG S(END F(ILE L(OGON ع ʹFILE NAME --> Pš򥧝,-.-.ȡa- N+,,+ á ,0+ á ,,,"@* TERMINAL 2));  END.  '65,66,67,68,69,70,71,72,73,74, '75,76,77,78,79,80,81,82,83,84, '85,86,87,88,89,90: +CASE MODE OF ,LOWER: CH:=CHR(ORD(CH)+32); ,UPCASE: MODE:=LOWER; ,END; 'END; & &BUFFER[IP]:=CH; &IP:=(IP+1) MOD 256; &99: END; "END;  DISCON;  WRITELN(CHR(1+COMMAND; ' GOTO 99; +END; ' 'BS: CH:=CHR(127); & 'CTLY: +CH:=CHR(26); & 'SHIFT: +BEGIN +CASE MODE OF ,LOWER: MODE:=UPCASE; ,UPCASE: MODE:=CAPSLOCK; ,CAPSLOCK: MODE:=LOWER; ,END; ' GOTO 99; +END; + ND; &END;  #2: BEGIN (*OUTPUT*) &IF IP<>OP THEN (BEGIN (MDMSND(BUFFER[OP]); (OP:=(OP+1) MOD 256; (END; &END; #END;  "IF KEYPRESS THEN $BEGIN $READ(KEYBOARD,CH); $IF EOLN(KEYBOARD) THEN CH:=CHR(13); & &CASE ORD(CH) OF & 'CTLX: +BEGIN CTLF,LF]) THEN & BEGIN (WRITE(CH); (COL:=COL+1; (IF OC=CR THEN COL:=0; & END & ELSE IF OC=BELL THEN NOTE(50,5) 'ELSE IF OC=HT THEN (BEGIN (MDMSND(CHR(XOFF)); (REPEAT *WRITE(' '); *COL:=COL+1; (UNTIL (COL MOD 8) = 0; & MDMSND(CHR(XON)); (E END;    BEGIN  INITIALIZE;  WHILE CARRIER DO "BEGIN "J:=STAT MOD 4; "IF ODD(J) THEN J:=1; "CASE J OF #1: BEGIN (*RECEIVE*) &CH:=GETMDM; &OC:=ORD(CH); &IF LOGGING THEN (BEGIN (LOG[LP]:=CH; (LP:=LP+1; (END; &IF NOT (OC IN [BELL,HT,XOFF,  WRITELN('DIALING...');  (* DIAL('7531050');  WRITELN('SAY... "CONNECT TO D.S. 0981"');  WRITE('HIT WHEN READY');  READLN; *)  DIAL('18970981');  CARON(TRUE,TRUE);  REPEAT UNTIL CARRIER OR KEYPRESS;  WRITE(CHR(12));  MDMSND(CHR(CR)); LE); *MDMSND(CHR(CR)); *END; (CLOSE(LOGFILE); (WRITELN('**** FILE TRANSFERED ***'); (END; &END; ! !'D': DISCON; " !END;  END;    PROCEDURE INITIALIZE;  BEGIN  MODE:=LOWER;  INITMDM;  IP:=0;  OP:=0;  COL:=0;  LOGGING:=FALSE;  CONNCT;! !'S': BEGIN &WRITELN(CHR(FF)); &WRITE('FILE TO SEND? '); &READLN(FN); &IF LENGTH(FN)>0 THEN (BEGIN (RESET(LOGFILE,FN); (WHILE NOT EOF(LOGFILE) DO *BEGIN *WHILE NOT EOLN(LOGFILE) DO ,BEGIN ,READ(LOGFILE,S); ,MDMSND(S); ,END; ( READLN(LOGFIá+ ˡ --צ*** FILE RECEIVED ***  צFILE TO SEND? Pšu )  𥧝  צ**** FILE TRANSFERED ***-(DS  ,f\Z  צ DIALING...7531050 SAY... "CONNECT TO D.S. 0981"צHIT WHEN READYz']); *write(' '); *i:=i-1; *end; * )'+': reduce(add); ) )'-': reduce(sub); ) )'*': reduce(mul); ) )'/': reduce(dvd); ) )'(': parenlevel:=parenlevel+10; ) )')': parenlevel:=parenlevel-10; ) )';': reduce(eos); ) )end;  i:=i+1;  until chs;  stack[sp].pri:=prio[bos];  repeat ch:=t[i]; (case ch of )'a','b','c','d','e','f','g','h','i','j','k', )'l','m','n','o','p','q','r','s','t','u','v', )'w','x','y','z': *begin *repeat ch:=t[i]; 2write(ch); 2i:=i+1; *until not (t[i] in ['a'..' while stack[sp].pri >= pr do (begin (write(name[stack[sp].opc], ' '); (sp:=sp-1; (end;  sp:=sp+1;  stack[sp].opc:=op;  stack[sp].pri:=pr;  end;    procedure parse;  var ch: char;  begin  parenlevel:=0;  sp:=1;  i:=1;  stack[sp].opc:=bo j:=1;  while not eoln(input) do #begin #read(ch); #if ch<>' ' then (begin (t[j]:=ch; (j:=j+1; (end;  end;  t[j]:=';';  readln;  end;   procedure reduce(op: oper);  var pr: integer;  begin  pr:=prio[op]+parenlevel; ub]:=3;  name[mul]:='*'; prio[mul]:=5;  name[dvd]:='/'; prio[dvd]:=5;  name[bos]:=' '; prio[bos]:=0;  name[eos]:=';'; prio[eos]:=1;  end;   procedure ReadExpr;  var i, j: integer;  ch: char;  begin  writeln;  write('EXPR> ');  array[oper] of integer; (parenlevel, i, o, sp: integer; (t: packed array[1..80] of char;   procedure initialize;  begin  page(output);  writeln('Expression Parser Program');  writeln;  name[add]:='+'; prio[add]:=3;  name[sub]:='-'; prio[sprogram translate;   const stacksize = 20;   type oper = (add, sub, mul, dvd, bos, eos, neg);  stackop = record 8opc: oper; 8pri: integer; 2end; 2  var stack: array[1..stacksize] of stackop; (name: array[oper] of char; (prio:N^22    ʡ N  á /á2# á   á 'ˡ   %E   á%á á  98=Q/Z`*7531050 SAY... "CONNECT TO D.S. 0981"צHIT WHEN READY    ʡ N  á /á2# á   á 'ˡ   %E  = ';';  end;    begin  initialize;  while true do (begin (ReadExpr; (write('polish --> '); (parse; (end;  end.  FOO #N^CLISTELE]:='LISTELEMENT';  C[CPERIOD]:='PERIOD'; C[CNOPERIOD]:='NOPERIOD';  C[CJUSTIFY]:='JUSTIFY';  C[CNOJUSTI]:='NOJUSTIFY';  C[CFILL]:='FILL';  C[CNOFILL]:='NOFILL';  C[CLEFTMAR]:='LEFTMARGIN';  C[CRIGHTMA]:='RIGHTMARGIN';  C[CSPACING]:='SPACI'PAGE';  C[CTESTPAG]:='TESTPAGE'; C[CNUMBER]:='NUMBER';  C[CNONUMBE]:='NONUMBER'; C[CAUTOPARAG]:='AUTOPARGRAPH';  C[CNOAUTOP]:='NOAUTOPARAGRAPH';  C[CLITERAL]:='LITERAL'; C[CENDLITE]:='ENDLITERAL';  C[CLIST]:='LIST'; C[CENDLIST]:='ENDLIST';  C[ TIMEFORPAGE:=FALSE;  INDENT:=0;  LISTS:=0;  PREV:=CHR(CR);  END;    PROCEDURE INIT2;  BEGIN  C[CBREAK]:='BREAK';  C[CSKIP]:='SKIP'; C[CBLANK]:='BLANK';  C[CFIGURE]:='FIGURE'; C[CINDENT]:='INDENT';  C[CPARAG]:='PARAGRAPH'; C[CPAGE]:=RAG:=FALSE;  LOWERCASE:=TRUE;  PERIOD:=TRUE;  JUSTIFY:=TRUE;  FILL:=TRUE;  HEADER:=TRUE;  TITLE:='';  SUBTITLE:='';  IP:=512;  OP:=0;  FILLCHAR(OUTBUF,512,CHR(0));  LINE:='';  CHSTRING:=' ';  LINENO:=0;  PAGENO:=1;  CENTERNEXT:=FALSE; CONCAT(LIST,'.TEXT');  REWRITE(DOC,LIST);  DUMMY:=BLOCKREAD(RNO,INBUF,1);  DUMMY:=BLOCKREAD(RNO,INBUF,1);  FROMLEFT:=TRUE;  LEFTMARG:=0;  RIGHTMARG:=60;  SPACING:=1;  PARAG:=5;  PARAGSP:=1;  PAGESIZE:=58;  PAGENUM:=1;  NUMBERING:=TRUE;  AUTOPA  IF LENGTH(SOURCE)=0 THEN SOURCE:='SYSTEM.WRK';  IF POS('.TEXT',SOURCE)=0 THEN SOURCE:=CONCAT(SOURCE,'.TEXT');  RESET(RNO,SOURCE);  WRITE('OUTPUT FILE: ');  READLN(LIST);  IF LENGTH(LIST)=0 THEN LIST:='PRINTER:';  IF POS('.TEXT',LIST)=0 THEN LIST:=$NUMBERING, AUTOPARAG, LOWERCASE, PERIOD, JUSTIFY, $CENTERNEXT, FILL, HEADER: BOOLEAN; $ $TITLE, SUBTITLE: STRING;    PROCEDURE INIT1;  VAR SOURCE, LIST: STRING; $DUMMY: INTEGER;  BEGIN  PAGE(OUTPUT);  WRITE('INPUT FILE: ');  READLN(SOURCE);]; $LINE: STRING[132]; $FROMLEFT, TIMEFORPAGE: BOOLEAN; $COUNTER: ARRAY[1..10] OF INTEGER; $ $ $(* PARAMETERS FOR RUNOFF *) $ $LEFTMARG, RIGHTMARG, PARAG, PAGESIZE, PAGENUM, $PARAGSP, LISTS, INDENT, SPACING: INTEGER; $ );   VAR INBUF, OUTBUF: PACKED ARRAY[0..511] OF CHAR; $CH, PREV: CHAR; $PAGENO, LINENO, LASTNONBLANK, IP, OP: INTEGER; $DOC, RNO: FILE; $C: ARRAY[COM] OF STRING[16]; $A: ARRAY[COM] OF STRING[3]; $CLASS: ARRAY[CHAR] OF CHCLASS; $CHSTRING: STRING[1OJUSTIFY, CFILL, CNOFILL, CLEFTMARG, CRIGHTMARG, +CSPACING, CPAGESIZE, CCOMMENT, CHEADER, CNOHEADER, +CTITLE, CSUBTITLE, CFIRSTTITLE, CCENTER, CLIST, +CLISTELE, CENDLIST, CHDRLEVEL, CTHEEND); + +  CHCLASS = (OTHER, EOL, DOT, ENDFILE, IGNORE, TAB(* $L PRINTER: *)  PROGRAM RUNOFF;   CONST DLE = 16; &CR = 13; & &  TYPE COM = (CBREAK, CSKIP, CBLANK, CFIGURE, CINDENT, CPARAG, CPAGE, +CTESTPAGE, CNUMBER, CNONUMBER, CAUTOPARAG, CNOAUTOPA, +CLITERAL, CENDLITE, CPERIOD, CNOPERIOD, CJUSTIFY, +CNNG'; C[CPAGESIZE]:='PAGESIZE';  C[CCOMMENT]:='COMMENT'; C[CHEADER]:='HEADER';  C[CNOHEADE]:='NOHEADER'; C[CTITLE]:='TITLE';  C[CSUBTITL]:='SUBTITLE'; C[CFIRSTTI]:='FIRSTTITLE';  C[CCENTER]:='CENTER';   FOR CH:=CHR(0) TO CHR(31) DO CLASS[CH]:=IGNORE;  FOR CH:=' ' TO CHR(126) DO CLASS[CH]:=OTHER;  CLASS['.']:=DOT;  CLASS[CHR(13)]:=EOL;  CLASS[CHR(3)]:=ENDFILE;  CLASS[CHR(127)]:=IGNORE;  CLASS[CHR(DLE)]:=TAB;  END;    PROCEDURE INIT3;  BEGIN TCH); $END;  IF (CH=' ') OR (CH=CHR(CR)) THEN $BEGIN $IF (PREV=' ') OR (PREV=CHR(CR)) THEN EXIT(PUTCH); $CHSTRING[1]:=' '; $LASTNONBLANK:=LENGTH(LINE); $IF (PREV='.') AND PERIOD THEN LINE:=CONCAT(LINE,CHSTRING); $END;  LINE:=CONCAT(LINE,CHSTRING);LANK:=0;  LINE:='';  INDENT:=0;  END;    PROCEDURE PUTCH(CH: CHAR);  VAR LEN: INTEGER;  TEMP: STRING[132];  BEGIN  CHSTRING[1]:=CH;  IF NOT FILL THEN $BEGIN $IF CH=CHR(CR) &THEN OUTPUT(LINE) &ELSE LINE:=CONCAT(LINE,CHSTRING); $EXIT(PU IF TOTALMARGIN=1 THEN PUTOUT(' ') "ELSE IF TOTALMARGIN>1 THEN $BEGIN $PUTOUT(CHR(DLE)); $PUTOUT(CHR(32+TOTALMARGIN)); $END;  IF JUSTIFY THEN DOJUSTIFY(L);  FOR I:=1 TO LENGTH(L) DO PUTOUT(L[I]);  FOR I:=1 TO SPACING DO PUTOUT(CHR(CR));  LASTNONB:=LEFTMARGIN+INDENT;  IF TOTALMARGIN<0 THEN TOTALMARGIN:=0;  IF TOTALMARGIN>=RIGHTMARGIN "THEN WRITELN('ILLEGAL MARGIN SETTING');  IF LENGTH(L)>1 THEN "IF L[1]=CHR(DLE) THEN $BEGIN $TOTALMARGIN:=TOTALMARGIN+ORD(L[2])-32; $DELETE(L,1,2); $END; NO>9 *THEN OUTCH(CHR(PAGENO DIV 10 + ORD('0'))) ( ELSE OUTCH('#'); (OUTCH(CHR(PAGENO MOD 10 + ORD('0'))); (OUTCH(CHR(CR)); (OUTCH(CHR(CR)); (END; $END;  END;    PROCEDURE OUTPUT(L: STRING);  VAR TOTALMARGIN, I: INTEGER;  BEGIN  TOTALMARGIN:=0; $PAGENO:=PAGENO+1; $TIMEFORPAGE:=FALSE; $IF NUMBERING THEN (BEGIN (LINE:=TITLE; (FOR I:=1 TO RIGHTMARGIN-LEFTMARGIN-LENGTH(LINE)-6 DO *LINE:=CONCAT(LINE,' '); (LINE:=CONCAT(LINE,'Page '); (FOR I:=1 TO LENGTH(LINE) DO OUTCH(LINE[I]); (IF PAGE IF CH=CHR(CR) THEN LINENO:=LINENO+1;  END;    PROCEDURE PUTOUT(CH: CHAR);  VAR I: INTEGER; $L: STRING;  BEGIN  OUTCH(CH);  IF (CH=CHR(CR)) AND (TIMEFORPAGE OR (LINENO>=PAGESIZE)) THEN $BEGIN $FOR I:=1 TO 60-LINENO DO OUTCH(CHR(CR)); $LINENO  PROCEDURE OUTCH(CH: CHAR);  VAR DUMMY, I: INTEGER;  BEGIN  IF OP>511 THEN $BEGIN $OP:=0; $DUMMY:=BLOCKWRITE(DOC,OUTBUF,1); $FILLCHAR(OUTBUF,512,CHR(0)); $END;  IF CH='#' THEN OUTBUF[OP]:=' ' *ELSE OUTBUF[OP]:=CH;  OP:=OP+1;  FROMLEFT:=NOT FROMLEFT;  END;    PROCEDURE NEXTCH;  VAR DUMMY: INTEGER;  BEGIN  IP:=IP+1;  IF IP>511 THEN $BEGIN $IF EOF(RNO) &THEN FILLCHAR(INBUF,512,CHR(3)) &ELSE DUMMY:=BLOCKREAD(RNO,INBUF,1); $IP:=0; $END;  CH:=INBUF[IP];  END;  ; END "ELSE BEGIN DIRECT:=-1; J:=I-1; END;  WHILE LENGTH(L)=I THEN J:=0 &ELSE FOR K:=J TO I-1 DO (SPACEINDEX[K]:=SPACEINDEX[K]+1; $END; VAR K, DIRECT, J, I: INTEGER;  SPACEINDEX: ARRAY[0..100] OF INTEGER;  BEGIN  I:=0;  FOR J:=1 TO LENGTH(L) DO "IF L[J]=' ' THEN $BEGIN $SPACEINDEX[I]:=J; $I:=I+1; $END;  IF I=0 THEN EXIT(DOJUSTIFY);  IF FROMLEFT "THEN BEGIN DIRECT:=1; J:=0CHEADER]:='HD';  A[CNOHEADER]:='NHD';  A[CTITLE]:='T';  A[CSUBTITLE]:='ST';  A[CFIRSTTITLE]:='FT';  A[CCENTER]:='C';  A[CLIST]:='LS';  A[CLISTELE]:='LE';  A[CENDLIST]:='ELS';  A[CHDRLEVEL]:='HL';  END;   PROCEDURE DOJUSTIFY(VAR L: STRING); ; A[CFIGURE]:='FG'; A[CINDENT]:='I'; A[CPARAG]:='P';  A[CPAGE]:='PG';  A[CTESTPAGE]:='TP';  A[CNUMBER]:='NM';  A[CNONUMBER]:='NNM';  A[CAUTOPARAG]:='AP';  A[CNOAUTOPARAG]:='NAP';  A[CLITERAL]:='LIT'; A[CENDLITERAL]:='ELI';  A[CPAGESIZE]:='PS';  A[ A[CCOMMENT]:='COM';  A[CPERIOD]:='PR';  A[CNOPERIOD]:='NPR';  A[CJUSTIFY]:='J';  A[CNOJUSTIFY]:='NJ'; A[CFILL]:='F';  A[CNOFILL]:='NF';  A[CLEFTMARGIN]:='LM'; A[CRIGHTMARGIN]:='RM'; A[CSPACING]:='SP';  A[CBREAK]:='B'; A[CSKIP]:='S'; A[CBLANK]:='B'  IF LENGTH(LINE)+LEFTMARGIN = RIGHTMARGIN THEN $BEGIN $LEN:=LENGTH(LINE)-LASTNONBLANK; $IF LEN=0 THEN OUTPUT(LINE) %ELSE BEGIN (TEMP:=COPY(LINE,LASTNONBLANK+1,LEN); (OUTPUT(COPY(LINE,1,LASTNONBLANK)); (LINE:=TEMP; (IF LINE[1]=' ' THEN DELETE(LINE,1,1); (IF LENGTH(LINE)>0 THEN *IF LINE[1]=' ' THEN ,DELETE(LINE,1,1); (END; $END;  END;    PROCEDURE BREAK;  VAR TEMP: BOOLEAN;  BEGIN  TEMP:=JUSTIFY;  JUSTIFY:=FALSE;  IF LENGTH(LINE)>0 THEN OUTPUT(LINE); -ELSE BEGIN 0PUTCH(CH); 0NEXTCH; 0PUTCH(CH); 0END; ,IF ORD(CH)=32 THEN CH:=CHR(CR); ,END; 0 # ENDFILE: ,BEGIN ,FILL:=FALSE; ,PUTCH(CHR(CR)); ,REPEAT PUTOUT(CHR(0)) UNTIL OP=1; ,CLOSE(DOC); ,EXIT(PROGRAM); ,END; %END; $END;  END;   V:=CH; $NEXTCH; $CASE CLASS[CH] OF % %OTHER: PUTCH(CH); % %EOL: IF FILL .THEN PUTCH(' ') .ELSE PUTCH(CH); % %DOT: BEGIN ,IF PREV=CHR(CR) /THEN COMMAND /ELSE PUTCH(CH); % END; % $ TAB: BEGIN ,IF FILL THEN 0BEGIN 0NEXTCH; 0END(JUSTIFY:=FALSE; (END;  !CENDLITERAL: (BEGIN (FILL:=TRUE; (JUSTIFY:=TRUE; (END; !END;  WHILE (CH<>CHR(CR)) AND (CH<>';') DO NEXTCH;  CH:=CHR(CR);  END;    PROCEDURE MAINLOOP;  BEGIN  WHILE TRUE DO $BEGIN $IF CLASS[CH]<>IGNORE THEN PRE; (BREAK; (FOR N:=1 TO PARAGSP DO PUTOUT(CHR(CR)); (IF LISTS=0 *THEN LEFTMARGIN:=LEFTMARGIN-9 *ELSE LEFTMARGIN:=LEFTMARGIN-4; (END; ! !CJUSTIFY: (JUSTIFY:=TRUE;  !CNOJUSTIFY: (JUSTIFY:=FALSE;  !CLITERAL: (BEGIN (BREAK; (FILL:=FALSE; OUNTER[LISTS]+1; (IF N>9 THEN PUTCH(CHR(N DIV 10+ORD('0'))); (PUTCH(CHR(N MOD 10+ORD('0'))); (PUTCH('.'); (IF N<10 THEN PUTCH('#'); (PUTCH('#'); (CH:=';'; (END; ! !CENDLIST: (BEGIN (IF LISTS=0 THEN WRITELN('UNMATCHED LIST END'); (LISTS:=LISTS-1AK; (LISTS:=LISTS+1; (COUNTER[LISTS]:=1; (IF LISTS=1 *THEN LEFTMARGIN:=LEFTMARGIN+9 *ELSE LEFTMARGIN:=LEFTMARGIN+4; (END; ( !CLISTELE: (BEGIN (BREAK; (FOR N:=1 TO PARAGSP DO PUTOUT(CHR(CR)); (INDENT:=-4; (N:=COUNTER[LISTS]; (COUNTER[LISTS]:=C(WHILE CH<>CHR(CR) DO NEXTCH; ! !CTITLE: (BEGIN (TITLE:=''; (WHILE CH<>CHR(CR) DO *BEGIN *CHSTRING[1]:=CH; *TITLE:=CONCAT(TITLE,CHSTRING); *NEXTCH; *END; (END; ! !CINDENT: (BEGIN (BREAK; (NUMBER; (INDENT:=N; (END; ! !CLIST: BEGIN (BREGESIZE:=N; (END;  !CHEADER: (HEADER:=TRUE; !CNUMBER: (NUMBERING:=TRUE;  !CNONUMBER: (NUMBERING:=FALSE; ! !CAUTOPARAG: (AUTOPARAG:=TRUE;   CNOAUTOPARAG: (AUTOPARAGRAPH:=FALSE; !CNOHEADER: (HEADER:=FALSE;  !CCOMMENT: N:=N; (END;  !CRIGHTMARGIN: (BEGIN (BREAK; (NUMBER; (IF N<=LEFTMARGIN *THEN WRITE('ILLEGAL RIGHT MARGIN') *ELSE RIGHTMARGIN:=N; (END;  !CSPACING: (BEGIN (BREAK; (NUMBER; (SPACING:=N; (END;   CPAGESIZE: (BEGIN (BREAK; (NUMBER; (PA; (BREAK; (END; ! !CFILL: BEGIN (FILL:=TRUE; ! BREAK; (END; ! !CNOFILL: (BEGIN (FILL:=FALSE;  BREAK; (END;  !CLEFTMARG: (BEGIN (BREAK; (NUMBER; (IF N>RIGHTMARGIN *THEN WRITELN('ILLEGAL LEFT MARGIN VALUE') *ELSE LEFTMARGI(IF N=0 THEN N:=1; (WHILE N>0 DO + BEGIN ,PUTOUT(CHR(CR)); ,N:=N-SPACING; ,END; (END;  !CBLANK: (BEGIN (BREAK; (NUMBER; (IF N=0 THEN N:=1; (WHILE N>0 DO ,BEGIN ,PUTOUT(CHR(CR)); ,N:=N-1; ,END; (END;  !CPAGE: BEGIN (TIMEFORPAGE:=TRUECT:=CBREAK;  WHILE (CT<>CTHEEND) AND (CMD<>C[CT]) DO CT:=SUCC(CT);  IF CT=CTHEEND THEN "BEGIN "CT:=CBREAK; "WHILE (CT<>CTHEEND) AND (CMD<>A[CT]) DO CT:=SUCC(CT);  END;  CASE CT OF  !CBREAK: (BREAK; ! !CSKIP: BEGIN (BREAK; (NUMBER; (CH)-ORD('0'); $NEXTCH; $END;  END;    BEGIN  LIT:=' ';  CMD:='';  NEXTCH;  WHILE CH IN ['a'..'z','A'..'Z',' '] DO $BEGIN $IF CH IN ['a'..'z'] THEN CH:=CHR(ORD(CH)-32); $LIT[1]:=CH; $IF CH<>' ' THEN CMD:=CONCAT(CMD,LIT); $NEXTCH; $END;   JUSTIFY:=TEMP;  END;    PROCEDURE COMMAND;  VAR LIT: STRING[1];  CT: COM;  CMD: STRING; $N: INTEGER;    PROCEDURE NUMBER;  VAR I: INTEGER;  BEGIN  N:=0;  WHILE CH=' ' DO NEXTCH;  WHILE CH IN ['0'..'9'] DO $BEGIN $N:=N*10+ORD BEGIN  INIT1;  INIT2;  INIT3;  MAINLOOP;  END.  FOO #N^CLISTELE]:='LISTELEMENT';  C[CPERIOD]:='PERIOD'; C[CNOPERIOD]:='NOPERIOD';  C[CJUSTIFY]:='JUSTIFY';  C[CNOJUSTI]:='NOJUSTIFY';  C[CFILL]:='FILL';  C[CNOFILL]:='NOFILL';  C[CLEFTMAR]:='LEFTMARGIN';  C[CRIGHTMA]:='RIGHTMARGIN';  C[CSPACING]:='SPACI'PAGE';  C[CTESTPAG]:='TESTPAGE'; C[CNUMBER]:='NUMBER';  C[CNONUMBE]:='NONUMBER'; C[CAUTOPARAG]:='AUTOPARGRAPH';  C[CNOAUTOP]:='NOAUTOPARAGRAPH';  C[CLITERAL]:='LITERAL'; C[CENDLITE]:='ENDLITERAL';  C[CLIST]:='LIST'; C[CENDLIST]:='ENDLIST';  C[ TIMEFORPAGE:=FALSE;  INDENT:=0;  LISTS:=0;  PREV:=CHR(CR);  END;    PROCEDURE INIT2;  BEGIN  C[CBREAK]:='BREAK';  C[CSKIP]:='SKIP'; C[CBLANK]:='BLANK';  C[CFIGURE]:='FIGURE'; C[CINDENT]:='INDENT';  C[CPARAG]:='PARAGRAPH'; C[CPAGE]:=RAG:=FALSE;  LOWERCASE:=TRUE;  PERIOD:=TRUE;  JUSTIFY:=TRUE;  FILL:=TRUE;  HEADER:=TRUE;  TITLE:='';  SUBTITLE:='';  IP:=512;  OP:=0;  FILLCHAR(OUTBUF,512,CHR(0));  LINE:='';  CHSTRING:=' ';  LINENO:=0;  PAGENO:=1;  CENTERNEXT:=FALSE; CONCAT(LIST,'.TEXT');  REWRITE(DOC,LIST);  DUMMY:=BLOCKREAD(RNO,INBUF,1);  DUMMY:=BLOCKREAD(RNO,INBUF,1);  FROMLEFT:=TRUE;  LEFTMARG:=0;  RIGHTMARG:=60;  SPACING:=1;  PARAG:=5;  PARAGSP:=1;  PAGESIZE:=58;  PAGENUM:=1;  NUMBERING:=TRUE;  AUTOPA  IF LENGTH(SOURCE)=0 THEN SOURCE:='SYSTEM.WRK';  IF POS('.TEXT',SOURCE)=0 THEN SOURCE:=CONCAT(SOURCE,'.TEXT');  RESET(RNO,SOURCE);  WRITE('OUTPUT FILE: ');  READLN(LIST);  IF LENGTH(LIST)=0 THEN LIST:='PRINTER:';  IF POS('.TEXT',LIST)=0 THEN LIST:=$NUMBERING, AUTOPARAG, LOWERCASE, PERIOD, JUSTIFY, $CENTERNEXT, FILL, HEADER: BOOLEAN; $ $TITLE, SUBTITLE: STRING;    PROCEDURE INIT1;  VAR SOURCE, LIST: STRING; $DUMMY: INTEGER;  BEGIN  PAGE(OUTPUT);  WRITE('INPUT FILE: ');  READLN(SOURCE);]; $LINE: STRING[132]; $FROMLEFT, TIMEFORPAGE: BOOLEAN; $COUNTER: ARRAY[1..10] OF INTEGER; $ $ $(* PARAMETERS FOR RUNOFF *) $ $LEFTMARG, RIGHTMARG, PARAG, PAGESIZE, PAGENUM, $PARAGSP, LISTS, INDENT, SPACING: INTEGER; $ );   VAR INBUF, OUTBUF: PACKED ARRAY[0..511] OF CHAR; $CH, PREV: CHAR; $PAGENO, LINENO, LASTNONBLANK, IP, OP: INTEGER; $DOC, RNO: FILE; $C: ARRAY[COM] OF STRING[16]; $A: ARRAY[COM] OF STRING[3]; $CLASS: ARRAY[CHAR] OF CHCLASS; $CHSTRING: STRING[1OJUSTIFY, CFILL, CNOFILL, CLEFTMARG, CRIGHTMARG, +CSPACING, CPAGESIZE, CCOMMENT, CHEADER, CNOHEADER, +CTITLE, CSUBTITLE, CFIRSTTITLE, CCENTER, CLIST, +CLISTELE, CENDLIST, CHDRLEVEL, CTHEEND); + +  CHCLASS = (OTHER, EOL, DOT, ENDFILE, IGNORE, TAB(* $L PRINTER: *)  PROGRAM RUNOFF;   CONST DLE = 16; &CR = 13; & &  TYPE COM = (CBREAK, CSKIP, CBLANK, CFIGURE, CINDENT, CPARAG, CPAGE, +CTESTPAGE, CNUMBER, CNONUMBER, CAUTOPARAG, CNOAUTOPA, +CLITERAL, CENDLITE, CPERIOD, CNOPERIOD, CJUSTIFY, +CN