*)
PROGRAM TRADEOFF;
TYPE SETOFCHAR=SET OF CHAR; CRTCOMMAND= (ERASEOS,ERASEOL,UP,DOWN,RIGHT,LEFT,LEADIN);
VAR M,X,L,D,s,TIME,COST,f,b,T,G,U,V,W: REAL; ITIME,ICOST,IM:
INTEGER; (*THESE NEEDED FOR PRINTING*) ITC: INTEGER[7]; (* The
variable names have been chosen to correspond to Macintosh document
number 7 which forms the documentation for this p
rogram*) CH: CHAR; CRTINFO: PACKED ARRAY[CRTCOMMAND] OF CHAR;
PREFIXED: ARRAY[CRTCOMMAND] OF BOOLEAN; PRINT, DONE: BOOLEAN;
REPORT : INTERACTIVE; PROCEDURE GETCRTINFO; (***********************************************
*****************) (* *) (* READ SYSTEM.MISCINFO AND GET CRT CONTROL
CHARACTER INFO *) (* *) (*****************************
***********************************) VAR BUFFER: PACKED ARRAY[0..511]
OF CHAR; I,BYTE: INTEGER; F: FILE; BEGIN RESET(F,'*SYSTEM.MISCINFO');
I:=BLOCKREAD(F,BUFFER,1); CLOSE(F); BYTE:=ORD(BUFFER[72]); (*
PREFIX INFORMATION BYTE *) CRT
INFO[LEADIN]:=BUFFER[62]; PREFIXED[LEADIN]:=FALSE; CRTINFO[ERASEOS]:=BUFFER[64];
PREFIXED[ERASEOS]:=ODD(BYTE DIV 8); CRTINFO[ERASEOL]:=BUFFER[65];
PREFIXED[ERASEOL]:=ODD(BYTE DIV 4); CRTINFO[RIGHT]:=BUFFER[66];
PREFIXED[RIGHT]:=ODD(BYTE DIV
2); CRTINFO[UP]:=BUFFER[67]; PREFIXED[UP]:=ODD(BYTE); CRTINFO[LEFT]:=BUFFER[68];
PREFIXED[LEFT]:=ODD(BYTE DIV 32); CRTINFO[DOWN]:=CHR(10); PREFIXED[DOWN]:=FALSE;
END;
PROCEDURE CRT(C: CRTCOMMAND); (*****************************************************************)
(* *) (* CRT COMMANDS ARE: ERASEOS,ERASEOL,UP,DOWN,RIGHT,LEFT.
*) (*
*) (*****************************************************************)
BEGIN IF PREFIXED[C] THEN UNITWRITE(1,CRTINFO[LEADIN],1,0,12);
UNITWRITE(1,CRTINFO[C],1,0,12); END;
PROCEDURE PROMPTAT(X,Y: INTEGER; S: STRING); BEGIN GOTOXY(X,Y);
WRITE(S); CRT(ERASEOL); END;
FUNCTION GETCHAR(OKSET: SETOFCHAR): CHAR; (******************************************************************)
(* *) (* GET A CHARACTER, BEEP IF NOT IN OKSET, ECHO ONLY IF PRINTING
*) (
* *) (******************************************************************)
VAR CH: CHAR; GOOD: BOOLEAN; BEGIN REPEAT READ(KEYBOARD,CH); IF
EOLN(KEYBOARD) THEN CH:=CHR(13);
GOOD:= CH IN OKSET; IF NOT GOOD THEN WRITE(CHR(7)) ELSE IF CH
IN [' '..'}'] THEN WRITE(CH); UNTIL GOOD; GETCHAR:=CH; END;
FUNCTION YES: BOOLEAN; BEGIN YES:= GETCHAR(['Y','y','N','n']) IN ['Y','y']; END;
PROCEDURE INIT; BEGIN GETCRTINFO; GOTOXY(0,0); CRT(ERASEOS);
PROMPTAT(10,20,'DO YOU WANT THE RESULTS PRINTED? '); PRINT:= YES;
F := 55.0; (*FLOPPY DRIVE COST*) B := 1.6; (*MEMORY COST IN DOLLARS
PER KILOBYTE*) T := 0.1; (*DISK TR
ANSFER TIME PER KB*) G := 0.006; (*MEMORY SEARCH TIME PER KB*)
U := 1.0; (*MOTOR START-UP LATENCY*) V := 0.15; (*MOTOR ON LATENCY
(ROTATIONAL + AVERAGE SEEK)*) W := 0.75; (*MOTOR SHUT-DOWN LATENCY*)
D := 18.0 ; (*DOCUMENT SIZE IN KB*) M :
= 16.0; (*INITIAL MEMORY SIZE IN KB*) X := 64.0; (*MAXIMUM MEMORY
SIZE IN KB*) END; (*INIT*)
PROCEDURE TIMECOST; BEGIN IF D <= M THEN BEGIN TIME := (D*G);
COST := (M*b) END ELSE BEGIN s := TRUNC (D/M) + 1; (*for convenience,
s = S + 1 in document 7*) IF (D*G/s) > W
THEN L := U ELSE L := V + W - D*G/s; TIME := D*(G + T) + L*s;
COST := M*b + f END; END; (*timecost*) PROCEDURE MENU; (* DISPLAY
OPTIONS FOR CHANGES*) VAR VALUE:REAL; BEGIN REPEAT PROMPTAT(10,20,'
Enter letter or press RETURN to continue '); CH := GETCHAR(['F','B','T','G','U','V','W','D','X','Q',CHR(13)]);
IF CH IN ['F','B','T','G','U','V','W','D','X'] THEN BEGIN PROMPTAT
(10,22,'Enter new value '); READ (input
,VALUE); CASE CH OF 'F': F:= VALUE; 'B': B:= VALUE; 'T': T:= VALUE;
'G': G:= VALUE; 'U': U:= VALUE; 'V': V:= VALUE; 'W': W:= VALUE;
'D': D:= VALUE; 'X':
X:= VALUE; END; END; GOTOXY(10,20); CRT(ERASEOS); (*CLEAR PROMPT
LINES*) UNTIL ( CH= CHR(13)) OR ( CH = 'Q' ); IF CH = 'Q' THEN
DONE:= TRUE; END; PROCEDURE HEADER (FILEID:STRING) (* PRINT PAGE
HEADINGS FOR REPORT*);
VAR I:INTEGER; BEGIN CLOSE (REPORT); RESET (REPORT,FILEID); WRITELN
(REPORT,CHR(12)); FOR I:= 1 TO 5 DO WRITELN (REPORT); WRITELN(REPORT,'
', 'VARIABLE MODEL OF MEMORY VS. DISK COSTS'); FOR I:= 1 TO 3
DO W
RITELN(REPORT); END; PROCEDURE DISPLAY (FILEID:STRING); (*DISPLAY
RESULTS*) BEGIN CLOSE (REPORT); RESET(REPORT,FILEID); WRITELN(REPORT,'F
',f:10:4,' FLOPPY DRIVE COST typical value: 55.0'); WRITELN(REPORT,'B
',b:10:4,
' MEMORY COST IN DOLLARS PER KILOBYTE typical value: 1.6 '); WRITELN(REPORT,'T
',T:10:4, ' DISK TRANSFER TIME PER KB typical value: 0.1'); WRITELN(REPORT,'G
',G:10:4, ' MEMORY SEARCH TIME PER KB typical value: 0.
006'); WRITELN(REPORT,'U ',U:10:4,' MOTOR START-UP LATENCY typical
value: 1.0'); WRITELN(REPORT,'V ',V:10:4, ' ROTATIONAL + AVERAGE
SEEK LATENCY typical value: 0.15'); WRITELN(REPORT,'W ',W:10:4,'
MOTOR SHUT-DOWN LATENCY typi
cal value: 0.75'); WRITELN(REPORT,'D ',D:10:4,' DOCUMENT SIZE
IN KB typical value: 18.0'); WRITELN(REPORT,'X ',X:10:4, ' MAXIMUM
MEMORY SIZE IN KB typical value: 64.0'); WRITELN(REPORT,'Q QUIT
PROGRAM'); WRITEL
N(REPORT); WRITELN(REPORT,' MEMORY TIME COST TIME/COST'); WRITELN(REPORT,'
SIZE (HUNDREDTHS) DOLLARS * 10000'); END; PROCEDURE CALC(FILEID:STRING);
(*CALCULATE RESULTS*) BEGIN CLOSE (REPORT)
; RESET(REPORT,FILEID); M := 16.0; (*RESET INITIAL MEMORY SIZE*)
WHILE M <= X DO BEGIN TIMECOST; ITIME := TRUNC ((TIME)*100.0);
ICOST := TRUNC (COST); IM := TRUNC (M); IF COST<> 0
THEN ITC := TRUNC((TIME/COST)*10000.0) ELSE ITC := 0; WRITELN(REPORT,'
',IM:8,ITIME:14, ICOST:9, ITC:13); M := M + 16.0; END; (*WHILE*)
END;(*CALC*)
BEGIN (*MAIN PROGRAM*) INIT; DONE:=FALSE; REPEAT GOTOXY(0,0);
CRT(ERASEOS); (*CLEAR SCREEN*) DISPLAY('CONSOLE:'); IF PRINT THEN
BEGIN HEADER('PRINTER:'); DISPLAY('PRINTER:'); END; CALC('CONSOLE:');
IF PRINT THEN CALC ('PRINTER:'); MENU; UNTIL DONE; END. (*