Variable Model of Memory vs. Disk Costs

Source: Jef Raskin and Peggy Miller, "Variable Model of Memory vs. Disk Costs" (3-4 October 1979)-- in "The Macintosh Project: Selected Papers from Jef Raskin (First Macintosh Designer), Circa 1979," document 10, version 3.
Location: M1007, Apple Computer Inc. Papers, Series 3, Box 10, Folder 1.

*)

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. (*


Document created on 6 June 2000;