|
|
|
|
||
|
DEFINITION MODULE DMSystem; (******************************************************************* Module DMSystem ('Dialog Machine' DM_V3.0) Copyright (c) 1986-2006 by Andreas Fischlin, Alex Itten and ETH Zurich. Purpose Provides information about system specific objects used by the 'Dialog Machine'. Remarks This module belongs to the 'Dialog Machine'. Programming o Design Andreas Fischlin 23/04/1986 o Implementation Andreas Fischlin 23/04/1986 Alex Itten 05/02/1988 ETH Zurich Systems Ecology CHN E 35.1 Universitaetstrasse 16 8092 Zurich SWITZERLAND URLs: <mailto:RAMSES@env.ethz.ch> <http://www.sysecol.ethz.ch> <http://www.sysecol.ethz.ch/SimSoftware/RAMSES> Last revision of definition: 25/02/2005 AF *******************************************************************) (***************************************) (*##### Dialog Machine System #####*) (***************************************) (* All the routines dealing with subprogram levels are only of use if the Dialog Machine has been implemented using a dynamic linking loader. This is the case for the Macintosh implementation of the DM, but may not be the case for implementations on other platforms. However, calling these routines will be of no harm if there is no dynamic linking loader present and the routines will behave as if all subprograms are always just executed on the startUpLevel. However note, when the running program terminates, all installed termination routines (see procedure InstallTermProc) will be executed once, right before final program termination. *) CONST startUpLevel = 1; (* program level on which "Dialog Machine" is loaded *) maxLevel = 5; (* maximum level to which subprograms may be called *) PROCEDURE CurrentDMLevel(): CARDINAL; (* returns current subprogram level *) PROCEDURE TopDMLevel(): CARDINAL; (* current topmost subprogram level *) PROCEDURE LevelisDMLevel(l: CARDINAL): BOOLEAN; (* level is actually a DM level, i.e. RunDialogMachine has been called on level l *) PROCEDURE LevelIsTerminating(): BOOLEAN; (* Installed terminate procedures (see InstallTermProc) are executing on current subprogram level, i.e. returns wether procedure ExecuteTermProcs is currently executing *) PROCEDURE DoOnSubProgLevel(l: CARDINAL; p: PROC); (* force execution of p on level l regardless of current DM level *) PROCEDURE ForceDMLevel(extraLevel: CARDINAL); PROCEDURE ResumeDMLevel(normalLevel: CARDINAL); (* Allows the forcing of the current DM level to another than the normal level. Note that these procedures should be used only as a last resort; try to use DoOnSubProgLevel instead. If these procedures are used, it is recommended to program such an «excursion» in the following reentrant way, which supports also nested calls: PROCEDURE MyExcursionOnStrangeDMLevel (strangeLevel: CARDINAL); VAR normalDMLevel: CARDINAL; BEGIN normalDMLevel := CurrentDMLevel(); ForceDMLevel (strangeLevel); TheActualExcursion; (* on the strange level *) ResumeDMLevel (normalDMLevel); END MyExcursionOnStrangeDMLevel; Note that procedure DoOnSubProgLevel is actually implemented in a similar way. Moreover note, that the actual implementation in the Dialog Machine supports also the abortion in the middle of an excursion. However, note that an abortion means an immediate quitting of the normal level without finishing the remainder of the excursion, nor the rest of the body of procedure MyExcursionOnStrangeDMLevel or any other, remaining part of the program on the normal level. In case of an abortion the DM will automatically resume the original level, i.e. the TopDMLevel, on which the very first excursion was started, independent of any eventual nesting of excursions. Implementation restriction: Note that it is not allowed to make any excursions in termination or initialization procedures. *) (* Installation of initialization and termination procedures called at the begin or the end (reverse order of installation) of a subprogram level. For each kind up to a maximum of 32 can be installed: *) PROCEDURE InstallInitProc(ip: PROC; VAR done: BOOLEAN); PROCEDURE InstallTermProc(tp: PROC; VAR done: BOOLEAN); (* force execution now of all currently installed procs: *) PROCEDURE ExecuteInitProcs; PROCEDURE ExecuteTermProcs; (****************************************) (*##### Screen Size and Colors #####*) (****************************************) PROCEDURE ScreenWidth() : INTEGER; (* of main screen *) PROCEDURE ScreenHeight() : INTEGER; (* of main screen including menu bar *) PROCEDURE MenuBarHeight() : INTEGER; (* on machines with multiple screens first screen has # 1 (normally main) and # of last screen is returned by HowManyScreens. The screens have all a global coordinate system (type INTEGER) where the origin [0,0] is in the lower left bottom of the main screen. *) PROCEDURE MainScreen(): INTEGER; (* is screen which contains menu bar *) PROCEDURE HowManyScreens(): INTEGER; PROCEDURE SuperScreen(VAR whichScreen, x,y,w,h, pixelDepth: INTEGER; colorPriority: BOOLEAN); (* Finds the screen which has the highest number of colors (colorPriority = TRUE) or has the largest size (colorPriority = FALSE). In case there are several screens with the same number of colors (colorPriority = TRUE) it will return the one among them with the largest size. In case there should be several identical screens it will return the one with the lowest ordinal number. The returned whichScreen is a number between 1 and HowManyScreens() and may or may not be identical to MainScreen(). IMPLEMENTATION RESTRICTION: Due to restrictions in the Macintosh system software, this routine does actually test only for the presence of screen interfaces, not the physical presence of screens, which of course would be of greater relevance from the viewpoint of the user. These restrictions have the following consequences: SuperScreen may return a screen which is actually not present or currently not turned on, which may cause a 'Dialog Machine' program to place a window on a screen, on which the user may see nothing at all. In particular, note that a screen, which is currently turned off or disconnected is treated identically as if it would be fully functional, as long as a corresponding interface card is currently present in the machine. Therefore, 'Dialog Machine' programs using SuperScreen to place windows on the best suitable screen, behave only optimally, if you alwyas connect a screen to every present interface card and if you turn on all hooked up screens. A quick remedy to force an absent screen to stop being the super screen may be to reduce its colors and/or resolution such that they become inferior to the properties of a screen on which the user can actually see something. SuperScreen inspects at each call the current configuration and does not require a restart of the computer system. *) PROCEDURE GetScreenSize(screen: INTEGER; VAR x,y,w,h: INTEGER); (* Note that the value h returned by this routine when calling GetScreenSize(MainScreen(),...h) is already corrected for the menu bar. The parameter screen must be a number between 1 and HowManyScreens() or all values returned will be 0. *) PROCEDURE TitleBarHeight(): INTEGER; PROCEDURE ScrollBarWidth(): INTEGER; PROCEDURE GrowIconSize(): INTEGER; (* icon at the lower right corner of a window *) PROCEDURE MaxPixelDepth(): INTEGER; (* Returns the maximum depth of a pixel, i.e. the number of bits per pixel, currently available on the computer system the 'Dialog Machine' is running on. This limit is typically determined by software as well as the graphic hardware of the current computer system. MaxPixelDepth() determines the maximum of simultaneously usable colors = 2^MaxPixelDepth(). NOTE: The returned value is independent of the colors actually visible on any currently connected screen, since it represents what is actually supported by drawing routines (see module DMWindIO). For instance, while using a black and white screen only, the routine may still return a value greater than 1. In such a case the 'Dialog Machine' program may still be capable to produce (cf. module DMPrinting) colors on a color printer (e.g. ImageWriter II with a color ribbon or a color laser printer). To learn about colors actually available, i.e. now visible on a particular screen, use procedure PixelDepthOnScreen. *) PROCEDURE PixelDepthOnScreen(screen: INTEGER): INTEGER; (* Returns the depth of a pixel, i.e. the number of bits per pixel, currently used on a given screen. Note, the returned value can change via preference settings (control panel, systems preferences) under the control of the user. This value is also limited by the specific characteristics of the particular screen and the graphic hardware driving that screen and will never exceed the value returned by routine MaxPixelDepth(). The number of colors which may be displayed simultaneously can be derived from the returned value: 2^PixelDepthOnScreen(). The parameter screen must be a number between 1 and HowManyScreens() or 0 will be returned. *) (****************************************) (*##### Dialog Machine Version #####*) (****************************************) PROCEDURE GetDMVersion(VAR vers,lastModifDate: ARRAY OF CHAR); (* Returns current version of the Dialog Machine, e.g. 2.03a, and the date of the last modification, e.g. 05/Aug/1991. In case the "Dialog Machine" is implemented as a so-called "Batch Dialog Machine" (BatchDM) then the string returns this fact as well, e.g. "BatchDM 2.2". *) (***********************************************) (*##### High Level Platform Inquiries #####*) (***********************************************) (* Simple high level routines returning information about the computer system on which the 'Dialog Machine' is curently running. The use of these routines is recommended in favor of the more technical, riskier, and less portable routines given towards the end of this module. Platform dependent code should use the robust routines RunsOnAMac, RunsOnAnIBMPC, and RunsOnAUnixMachine. Use GetComputerName only to document the current machine, not to derive any conditions about the actual platform. IMPLEMENTATION RESTRICTION: Please note, since the hardware development changes faster than any "Dialog Machine" implementation can keep up with, the information these routines return, may not always be the most precise. Moreover, Apple and other computer vendors change the technique by which such information can be retrieved all the time. *) PROCEDURE GetComputerName(VAR name: ARRAY OF CHAR); (* Returns the brand and/or model name of the computer on which the Dialog Machine is currently running. For some computers the 'Dialog Machine' can also return a unique integer value (see also procedure ComputerSystem). *) PROCEDURE RunsOnAMac(): BOOLEAN; (* Returns TRUE if the 'Dialog Machine' runs on a Machintosh *) PROCEDURE RunsInMacOSClassic(): BOOLEAN; (* Returns TRUE if the 'Dialog Machine' runs in MacOS Classic. Note, if the 'Dialog Machine' program runs as a Classic application, this routine returns always TRUE, regardless whether the Macintosh has been booted natively into Classic or the application is running within the Classic environment of OS X. *) PROCEDURE RunsInMacOSX(): BOOLEAN; (* Returns TRUE only if the 'Dialog Machine' runs as a native Mac OS X application under OS X. *) PROCEDURE RunsOnAnIBMPC(): BOOLEAN; (* Returns TRUE if the 'Dialog Machine' runs on an IBM PC *) PROCEDURE RunsOnAUnixMachine(): BOOLEAN; (* Typically RunsOnAUnixMachine is only TRUE for Sun oder IBM RISC platforms. On a Macintosh using OS X, the routine RunsOnAMac returns TRUE and RunsOnAUnixMachine returns FALSE. *) (* Most of following routines return a string describing the hardware. For routines which return a unique integer value instead see below. *) PROCEDURE GetCPUName(VAR name: ARRAY OF CHAR); PROCEDURE GetFPUName(VAR name: ARRAY OF CHAR); PROCEDURE FPUPresent(): BOOLEAN; PROCEDURE GetROMName(VAR name: ARRAY OF CHAR); (******************************************************) (*##### Specific Platform Dependent Routines #####*) (******************************************************) (*------------------------------*) (*===== Computer Model =====*) (*------------------------------*) (* The following routines offer advanced programmers means to inquire into the present hardware in a way which may be more convenient than the high level routines offered earlier *) CONST unknown = 0; (* value usable for ComputerSystem, Central Processing Unit (CPUType), Floating Point Unit (FPU), or keyboard *) (* Note: The Dialog Machine does not run on the older Mac models, (Lisa XL, Classic with only 128K or the Fat Mac with 512K RAM), since the DM functions properly only if the newer ROMs with size of at least 128 KB are present. *) Mac512KE = 3; (* 68000 ( 8 MHz), no FPU, 128 KB ROM *) MacPlus = 4; (* 68000 ( 8 MHz), no FPU, 128 KB ROM *) MacSE = 5; (* 68000 ( 8 MHz), no FPU, 256 KB ROM *) MacII = 6; (* 68020 (16 MHz), 68881 (16 MHz), 256 KB ROM *) MacIIx = 7; (* 68030 (16 MHz), 68882 (16 MHz), 256 KB ROM *) MacIIcx = 8; (* 68030 (16 MHz), 68882 (16 MHz), 256 KB ROM *) MacSE30 = 9; (* 68030 (16 MHz), 68882 (16 MHz), 256 KB ROM *) MacPortable = 10; (* 68000 (16 MHz), no FPU, 256 KB ROM *) MacIIci = 11; (* 68030 (25 MHz), 68882 (25 MHz), 512 KB ROM *) MacIIfx = 12; (* 68030 (40 MHz), 68882 (40 MHz), 512 KB ROM *) MacClassic = 17; (* 68000 ( 8 MHz), no FPU, 256 KB ROM *) MacIIsi = 18; (* 68030 (20 MHz), 68882 opt.(20 MHz), 512 KB ROM *) MacLC = 19; (* 68020 (16 MHz), 68882 opt.(16 MHz), 512 KB ROM *) MacLCII = 19; (* 68030 (16 MHz), 68882 opt.(16 MHz), 512 KB ROM *) MacQuadra900 = 20; (* 68040 (25 MHz), FPU & MMU integrated, 1024 KB ROM *) MacPowerBook170 = 20; (* 68030 (25 MHz), 68882 (25 MHz), 1024 KB ROM *) MacQuadra700 = 22; (* 68040 (25 MHz), FPU & MMU integrated, 1024 KB ROM *) MacClassicII = 23; (* 68030 (16 MHz), 68882 opt.(16 MHz), 512 KB ROM *) MacPowerBook100 = 24; (* 68HC000 (16 MHz), no FPU, 256 KB ROM *) MacPowerBook140 = 25; (* 68030 (16 MHz), no FPU, 1024 KB ROM *) MacQuadra950 = 26; (* 68040 (33 MHz), FPU & MMU integrated, 1024 KB ROM *) (* PowerBook 145 *) (* 68030 (25 MHz), No FPU, ? KB ROM *) (* PowerBook 160 *) (* 68030 (25 MHz), No FPU, ? KB ROM *) (* PowerBook 180 *) (* 68030 (33 MHz), 68882, ? KB ROM *) (* Duo 210 *) (* 68030 (25 MHz), No FPU, ? KB ROM *) (* Duo 230 *) (* 68030 (33 MHz), No FPU, ? KB ROM *) (* MacIIvi *) (* 68030 (16 MHz), 68882 opt.(16 MHz), ? KB ROM *) (* MacIIvx *) (* 68030 (32 MHz), 68882, ? KB ROM *) (* ============================================================== IMPORTANT COMMENT: Since machines are manufactered faster than we can update the 'Dialog Machine', we have decided to abandon above scheme to export well defined constants for all the computer systems. To identify a particular system you can still use the procedure function ComputerSystem. However, the constant it returns is no longer exported. HINT: If you only want to learn about the computer platform on which you are running the 'Dialog Machine', use the new routines RunsOnAMac, RunsOnAnIBMPC, RunsOnAUnixMachine. They are the only safe method to reliably know on which computer platform your 'Dialog Machine' program is executing. To learn about a particular model or hardware on any platform, use routine GetComputerName, GetCPUName, and FPUPresent. However, note, the information returned may not always be complete (not even for these high-level routines). On the Macintosh platform, the Gestalt manager is used to retrieve the needed information, hence all values returned by all routines is accurate. ============================================================== *) SUN = 101; SUN3 = 102; SUNSparc = 103; IBMPC = 201; IBMAT = 202; IBMPS2 = 203; IBMRisc6000 = 300; PROCEDURE ComputerSystem(): INTEGER; (* For meaning of returned values see above constants. If you can't find the value listed, consult for a Macintosh implementation of the 'Dialog Machine' e.g. "Inside Macintosh Volume VI", Addison Wesley, 1991, the Gestalt Manager or a Windows Programmers Documentation by Microsoft. See also above, IMPORTANT COMMENT. *) (*---------------------------------------*) (*===== Central Processing Unit =====*) (*---------------------------------------*) CONST CPU68000 = 1; CPU68010 = 2; CPU68020 = 3; CPU68030 = 4; (* PMMU integrated *) CPU68040 = 5; (* FPU and MMU integrated *) CPU68050 = 6; CPU8088 = 201; CPU8086 = 202; CPU80186 = 203; CPU80286 = 204; CPU80386 = 205; CPU80486 = 206; PROCEDURE CPUType(): INTEGER; (* See also above, IMPORTANT COMMENT. *) (*-----------------------------------*) (*===== Floating Point Unit =====*) (*-----------------------------------*) (* It is recommended to refrain from the use of the following procedures, since a DM program using these routines may not get meaningful values while calling these routines on other machines than a Macintosh: *) CONST FPU68881 = 1; FPU68882 = 2; FPU68040 = 3; PROCEDURE FPUType(): INTEGER; (* See also above, IMPORTANT COMMENT. *) (*------------------------*) (*===== Keyboard =====*) (*------------------------*) (* It is recommended to refrain from the use of the following procedures, since a DM program using these routines may not get meaningful values while calling these routines on other machines than a Macintosh: *) CONST MacKeyboard = 1; (* 128K or 512K (Fat) Mac keyboard *) MacKbdAndPad = 2; (* 128K or 512K (Fat) Mac keyboard plus numeric keypad *) MacPlusKbd = 3; (* Mac Plus keyboard *) AExtendKbd = 4; (* Apple Extended keyboard *) ADBKeyboard = 5; (* standard Apple Dektop Bus (ADB) keyboard *) PortableKbd = 6; (* Standard Portable Keyboard *) PortableISOKbd = 7; (* Standard Portable Keyboard (ISO) *) EastwoodISOKbd = 8; (* Apple Standard Keyboard (ISO) (Eastwood) *) SaratogaISOKbd = 9; (* Apple Extended Keyboard (ISO) (Saratoga) *) ADBKbdII =10; (* Apple Keyboard II (Mac Classic & Mac LC) *) ADBISOKbdII =11; (* Apple Keyboard II, 81 Keys (ISO) Mac Classic & Mac LC) *) PwrBkADBKbd =12; (* Powerbook Keyboard *) PwrBkISOKbd =13; (* Powerbook Keyboard (ISO) *) PROCEDURE Keyboard(): INTEGER; (* See also above, IMPORTANT COMMENT. *) (*-------------------*) (*===== ROM =====*) (*-------------------*) (* It is recommended to refrain from the use of the following procedures, since a DM program using these routines is likely to get no meaningful values while calling these routines on other machines than a Macintosh *) CONST ROM64k = 1; ROM128k = 2; ROM256k = 3; ROM512k = 4; ROM1024k = 5; PROCEDURE ROMType(): INTEGER; (* See also above, IMPORTANT COMMENT. *) (*-----------------------------------------*) (*===== Operating-System Software =====*) (*-----------------------------------------*) PROCEDURE SystemVersion(): REAL; (* Returns version of the currently running operating system : ( e.g. 6.07 ). See also above, IMPORTANT COMMENT. *) (*-----------------------------------*) (*===== Mac Version Numbers =====*) (*-----------------------------------*) (* It is recommended to refrain from the use of the following procedures, since a DM program using these routines will not get meaningful values while calling these routines on other machines than a Macintosh *) PROCEDURE QuickDrawVersion(): REAL; (* Returns current version of QuickDraw: ( e.g. 2.02 ) Numbers >= 1 mean there is Color QuickDraw available. See also above, IMPORTANT COMMENT. *) PROCEDURE ROMVersionNr(): INTEGER; (* Returns Apple's internal ROM version number (see also the Gestalt Manager Inside Macintosh Vol. VI, p. 3-42). See also above, IMPORTANT COMMENT. *) END DMSystem.
|
||
|
|
|