home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1987-04-02 | 5.1 KB | 166 lines |
- IMPLEMENTATION MODULE CalcDisplay;
-
- (*
-
-
- Created: Duncan Prindle, September 1, 1986
-
- Modified: Perhaps
-
- *)
-
- FROM CalcFunctions IMPORT ErrorType, X, SAME, NDeci;
-
- FROM Conversions IMPORT ConvertToString;
- FROM Intuition IMPORT IntuitionTextPtr, IntuitionText, PrintIText,
- WindowPtr;
- FROM MathLib0 IMPORT log, power;
- FROM M2Conversions IMPORT ConvertReal;
- FROM SYSTEM IMPORT ADDRESS, ADR, BYTE, NULL, WORD;
-
-
-
- VAR
- Display : ARRAY[0..18] OF CHAR;
- DISPLAY : IntuitionText;
- Cexp : LONGCARD; Emask : LONGBITSET; Eshift : LONGCARD;
- LDisp : LONGCARD; Mmask : LONGBITSET; Mshift : LONGCARD;
- HiddenBit : LONGCARD;
- Shifts : ARRAY[0..23] OF LONGCARD;
-
- PROCEDURE DisplayX( error : ErrorType;
- wp : WindowPtr ) ;
-
-
- VAR NDecimal : INTEGER;
-
-
- BEGIN
-
- (* Delete Old Display *)
- WITH DISPLAY DO
- FrontPen := BYTE (0); BackPen := BYTE (0);
- DrawMode := BYTE (0);
- LeftEdge := 5; TopEdge := 3;
- ITextFont := NULL; NextText := NULL;
- IText := ADR( Display );
- END;
- PrintIText( wp^.RPort^, DISPLAY, 8, 15 );
-
-
- (* Print out any error messages *)
- CASE error OF
- DivideByZero : Display := "Divide by 0 ?"; |
- NegSqrt : Display := "SQRT: X < 0 ?"; |
- NegLog : Display := "Log: X < 0 ?"; |
- NegLn : Display := "Ln: X < 0 ?"; |
- AsinTooBig : Display := "ASIN: X > 1 ?"; |
- XTooBigForSIN : Display := "X Too Big 4 sin"; |
- AcosTooBig : Display := "ACOS: X > 1 ?"; |
- XTooBigForCOS : Display := "X Too Big 4 cos"; |
- XTooBigForTAN : Display := "X Too Big 4 tan"; |
- piOver2 : Display := "X Close to pi/2"; |
- OverFlow : Display := "Result Too Big"; |
- NoError :
- (* No Error. Create character string containing desired format *)
- CASE display OF
- BINARY : IntDisp( 2 ); |
- OCTAL : IntDisp( 8 ); |
- HEX : IntDisp( 16 ); |
- DECIMAL : IF SAME
- THEN IF (X = 1.0) & (NDeci = 0)
- THEN Display := " 1.";
- ELSIF (X = -1.0) & (NDeci = 0)
- THEN Display := " -1.";
- ELSE ConvertReal( X, 15, NDeci, Display );
- END;
- ELSE ConvertReal( X, 15, NDecDigits, Display );
- END; |
- SCIENTIFIC: ConvertReal( X, 15, NSciDigits, Display );
- Display[11] := ' '
- END;
- |
- ELSE Display := " ? ERROR ?";
- END;
-
- (* Now display new number *)
- WITH DISPLAY DO
- FrontPen := BYTE (2); BackPen := BYTE (0);
- DrawMode := BYTE (0);
- LeftEdge := 5; TopEdge := 3;
- ITextFont := NULL; NextText := NULL;
- IText := ADR( Display );
- END;
- PrintIText( wp^.RPort^, DISPLAY, 8, 15 );
-
- END DisplayX;
-
-
- PROCEDURE IntDisp( Base : CARDINAL );
- VAR neg : BOOLEAN;
- done : BOOLEAN;
- I : INTEGER;
- ILast : INTEGER;
- DispL : ARRAY[0..33] OF CHAR;
-
- PROCEDURE Shift( VAR items : ARRAY OF WORD ) : LONGCARD;
-
- BEGIN
- RETURN Shifts[ INTEGER( items[1] ) ];
- END Shift;
-
- BEGIN
- neg := X < 0.0;
- (* We turn a REAL into a LONGCARD.
- This procedure will give us up to 24 bits *)
- Cexp := LONGCARD( LONGBITSET( X ) * Emask ) DIV Eshift;;
- IF Cexp < 126
- THEN LDisp := 0;
- ELSIF Cexp > 150
- THEN Display := "24 BIT OverFlow";
- RETURN;
- ELSE Cexp := 150 - Cexp;
- Mshift := Shift( Cexp );
- LDisp := ( LONGCARD( LONGBITSET( X ) * Mmask ) + HiddenBit )
- DIV Mshift;
- END;
-
- ConvertToString( LDisp, Base, neg, DispL, done);
- IF ~done
- THEN Display := "Display Error";
- ELSE
- (* Copy from DispL to Display, justifying to right of Display *)
- I := 0; ILast := 0;
- WHILE (DispL[I] # ' ') & ( I < 15 ) DO
- INC(I);
- ILast := I;
- END;
- FOR I := 0 TO ILast DO
- Display[I+15-ILast] := DispL[I];
- END;
- END;
-
- END IntDisp;
-
-
-
- BEGIN
-
- display := DECIMAL;
- NDecDigits := 3;
- NSciDigits := 3;
- Emask := LONGBITSET{23..30};
- Eshift := 8388608;
- HiddenBit := 8388608;
- Mmask := LONGBITSET{1..22};
- Shifts[ 0] := 1; Shifts[ 1] := 2; Shifts[ 2] := 4;
- Shifts[ 3] := 8; Shifts[ 4] := 16; Shifts[ 5] := 32;
- Shifts[ 6] := 64; Shifts[ 7] := 128; Shifts[ 8] := 256;
- Shifts[ 9] := 512; Shifts[10] := 1024; Shifts[11] := 2048;
- Shifts[12] := 4096; Shifts[13] := 8192; Shifts[14] := 16384;
- Shifts[15] := 32764; Shifts[16] := 65528; Shifts[17] := 131072;
- Shifts[18] := 262144; Shifts[19] := 524288; Shifts[20] := 1048576;
- Shifts[21] := 2097152; Shifts[22] := 4194304; Shifts[23] := 8388608;
-
- END CalcDisplay.
-