home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
229.lha
/
Calc_v1.01
/
sources
/
Calc.mod
< prev
next >
Wrap
Text File
|
1989-04-04
|
4KB
|
122 lines
MODULE Calc;
(*======================================================================*)
(* M2Sprint Demo Program *)
(*======================================================================*)
(* Copyright (c) 1989 Martin Taillefer, All Rights Reserved *)
(* This is freely redistributable *)
(*======================================================================*)
(* Version: 1.00 Author : Martin Taillefer *)
(* Date : 20-Mar-89 Changes: Original *)
(*======================================================================*)
(* Version: 1.01 Author : Martin Taillefer *)
(* Date : 25-Mar-89 Changes: Memory overwrite bug fixed. *)
(* More keyboard shortcuts. *)
(* Internal layout modifications *)
(*======================================================================*)
(**************************** Notes on Calc *****************************)
(* *)
(* Calc is a full-featured programmer's calculator. See the *)
(* documentation for the program elsewhere. *)
(* *)
(* Not only is Calc a very useful program, it is also an invaluable *)
(* example showing the intended use for many of the M2Sprint Easy *)
(* modules. It also is an excellent example of Modula-2 programming. *)
(* *)
(************************************************************************)
FROM SYSTEM IMPORT ADDRESS, ADR, BYTE, SETREG, SHIFT;
FROM Intuition IMPORT IntuiMessage;
FROM EasyIDCMP IMPORT ProcTable, ProcessEvents;
FROM CalcMenus IMPORT InitMenuStuff, HandleMenuPick;
FROM CalcGadgets IMPORT InitGadgetStuff, HandleGadget, FakeGadget,
GadgetType, base, Base;
FROM CalcDisplay IMPORT PrepareDisplay, KillDisplay, window;
FROM CalcBrains IMPORT InitBrains;
VAR
procTable : ProcTable;
result : INTEGER;
PROCEDURE HandleVanillaKey(VAR intui:IntuiMessage; keyCode:CARDINAL): INTEGER;
VAR
gad : GadgetType;
c : CHAR;
good : BOOLEAN;
BEGIN
c:=CAP(CHR(keyCode));
good:=TRUE;
CASE c OF
|"0".."9" : gad:=VAL(GadgetType,ORD(c)-ORD("0"));
|"A".."F" : gad:=VAL(GadgetType,ORD(c)-ORD("A")+10);
|"(" : gad:=LeftParen;
|")" : gad:=RightParen;
|"=",15C : gad:=Equal;
|"+" : gad:=Plus;
|"-" : gad:=Minus;
|"*" : gad:=Times;
|"/" : gad:=Divide;
|"~","!" : gad:=Not;
|"&" : gad:=And;
|"|","O" : gad:=Or;
|"X" : gad:=Xor;
|"<" : gad:=ShiftLeft;
|">" : gad:=ShiftRight;
|"S" : gad:=Sto;
|"R" : gad:=Rcl;
|33C : RETURN 1; (* ESC = quit *)
|177C : gad:=ClearAll;
|" " : gad:=ClearEntry;
ELSE
good:=FALSE;
END;
IF good THEN
IF (gad>=B0) & (gad<=BF) THEN
good:=(NOT (gad>=B2) & (base=BINA)) OR
(NOT (gad>=B8) & (base=OCTA)) OR
(NOT (gad>=BA) & (base=DECI)) OR
(base=HEXA);
END;
IF good THEN
RETURN FakeGadget(gad);
END;
END;
RETURN 0;
END HandleVanillaKey;
PROCEDURE HandleCloseWindow(VAR intui:IntuiMessage): INTEGER;
BEGIN
RETURN 1;
END HandleCloseWindow;
PROCEDURE InitIDCMPStuff;
BEGIN
WITH procTable DO
WaitForEvent := TRUE;
MenuPick := HandleMenuPick;
CloseWindow := HandleCloseWindow;
GadgetUp := HandleGadget;
GadgetDown := HandleGadget;
VanillaKey := HandleVanillaKey;
END;
END InitIDCMPStuff;
BEGIN
IF PrepareDisplay() THEN
IF InitMenuStuff() & InitGadgetStuff() & InitBrains() THEN
InitIDCMPStuff;
result:=ProcessEvents(window,procTable);
END;
KillDisplay;
END;
END Calc.