Mesa System DocumentationVersion 6.0October 1980This document describes configurations of the Alto/Mesa system software and the individualcomponents which comprise them. These components include runtime support for the language,routines for manipulating the Alto display, keyboard, and file system, facilities for loading clientprograms and building new systems, and a number of useful common software packages.XEROXOFFICE PRODUCTS DIVISIONSystems Development Department3333 Coyote Hill Road / Palo Alto / California 94304ÿî ‚ïW;pôžî ‚ïP4qôX î ‚ïNF î ‚ïGbôïð7ôðð#î ‚ïEtô°ð1ô±ð*î ‚ïC†ô¶ðFô·î ‚ïA˜ôðSî-Áï#Grî-Áï ©sôXî-ÁïÞtî-Áï7uôFð4 ‚=ç<8K ·^Ïi Table of ContentsPrefacev 1. Overview1 2. Definitions and Interfaces2 3. System Organization5 4. Mesa Executive7 5. System Facilities8 Directory Package (DirectoryDefs)9Disk Streams Package (StreamDefs, StreamScan)12Display Package (AltoDisplay, DisplayDefs, FontDefs, StreamDefs)18File Package (AltoDefs, AltoFileDefs, SegmentDefs)22Image Files (ImageDefs)27Keyboard Package (KeyDefs, StreamDefs)32Miscellaneous (InlineDefs, MiscDefs)36Modules (FrameDefs)41Processes and Monitors (Process, ProcessDefs)45Segment Package (AllocDefs, SegmentDefs)51Storage Management (FSPDefs, Storage, SystemDefs)62StreamIO Package (Ascii, CharIO, IODefs)70Streams (StreamDefs)74String Package (AltoDefs, String, StringDefs)76Time Package (TimeDefs)79Traps (TrapDefs)81Appendix. Symbol Listing83Index107iiiî%­ï\ápôiî ‚ïWëqîHÃôî ‚ïSÉô€ îHÃôî ‚ïO§ô€îHÃôî ‚ïK„ô€îHÃôî ‚ïGbô€îHÃôî ‚ïC@ô€îHÃôîxï@~ô€rst sîHÃqîxï=¼rstsîHÃqîxï:ûst st stst sîHÃqîxï89 rstst st sîHÃqîxï5x rstsîHÃqîxï2¶rstst sîHÃqîxï/õ rst stsîHÃqîxï-3rstsîHÃqîxï*rrstsîHÃqîxï'°rstst sîHÃqîxï$îrststsîHÃqîxï"-rstsîHÃqîxïkrst sîHÃqîxïª rststuîHÃqîxïè rstsîHÃqîxï'rstsîHÃqî ‚ïîHÃî ‚ïâîGïî, ï¯uÿ" ‚h= UÚ  ·^Ïi PrefaceOctober 1980This document describes configurations of the Alto/Mesa system software and the individualcomponents which comprise them. These components include runtime support for the language,routines for manipulating the Alto display, keyboard, and file system, facilities for loading clientprograms and building new systems, and a number of useful common software packages.Suggestions as to the form, correctness, and understandability of this material should be funneledthrough your support group. All of us involved in the development of Mesa welcome feedback andsuggestions on the language, the system, and the debugging environment.vî*ÝïI pî)�ïFqôX î ‚ïA ôïð7ôðð#î ‚ï?dô°ð1ô±ð*î ‚ï=¼ô¶ðFô·î ‚ï<ôðSî ‚ï8Æô§ ô¨ðTî ‚ï7ôƒð_î ‚ï5xôðGî,„ï¯ÿˆ ‚h=çBI ·^Ïi 11. OverviewThe Alto/Mesa environment contains all of the facilities described in this document. Section 2contains an enumeration of the definitions modules available in the Alto/Mesa system; it includes abrief description of the facilities provided by each interface. Complete documentation can be foundin Section 5.Section 3 describes the various configurations and optional packages that comprise the Alto/Mesasystem. A single configuration of the system is available which includes most of the facilitiesdescribed here. Operations are described that destroy the display and keyboard software. Anumber of optional packages are available so that the Mesa system can be tailored to eachapplication.The Mesa Executive (Section 4) is a simple (and small) optional user interface supporting only afew commands. It allows program loading and debugger communication; more complicatedoperations must be provided by the user or by one of the standard packages that is availableseparately. The Mesa Executive also supports interactive input. The standard system only supportscommand line input; this allows the user interface to be completely controlled by the application.Finally, the bulk of this manual (Section 5) contains detailed descriptions of each of the packagessummarized in Section 2.Further details are available elsewhere on the language (Mesa Language Manual) and the Debugger(Mesa Debugger Documentation). Information on obtaining and running the system is contained inthe Mesa User's Handbook.îIºïfñpî'ãï\áqôi î ‚ïWërôºð&ô»ð0pî ‚ïVDrô‰ðaôŠî ‚ïT�ô„ð?ô…ð%î ‚ïRõôprî ‚ïNÓpô¤rð%ô¥ð2î ‚ïM,ôÍôÎðAî ‚ïK„ôØð.ôÙð.î ‚ïIÝôêðEôëî ‚ïH6 î ‚ïDô«s rprðAô¬î ‚ïBlôöô÷ð5î ‚ï@ÅôÍðJôÎî ‚ï?ôŒs rð6ô� î ‚ï=vô£ðUô¤ î ‚ï9TôŸð"prô ð7î ‚ï7¬ô prî ‚ï3Šôˆð9srî ‚ï1ãsô�rð,ô�î ‚ï0;ôsrÿè ‚/ô=ç8¯22. Definitions and InterfacesThe following list enumerates the public system modules of interest to Alto/Mesa programmers.The interface name is followed by the title of the section of this document (or other referencematerial) which describes the facilities the interface provides. The parenthesized names followingthe DEFINITIONS module identify the programs which implement that interface -- the ultimatedocumentation, after all.AllocDefs (Swapper) Segment PackageLow level memory allocation functions are defined here. Complete control of segment allocationand swapping can be obtained using this interface. Many of the functions of this interface are alsoavailable through the interface SegmentDefs.AltoDefs (Hardware) Mesa Language ManualContains a number of machine dependent constants describing physical characteristics of the Altoand its basic data types (bits per character, characters per word, etc.).AltoDisplay (Hardware) Alto: A Personal Computer System; Hardware ManualProvides a Mesa definition of the properties of the Alto display: its dimensions, Resolution,Background, the DCB chain, and the DCB format.AltoFileDefs (BCPL) Alto Operating System Reference ManualDefines the data structures (but not the operations) used in manipulating the Alto file system. Notethat these structures are shared by several software systems running on the Alto.AltoHardware (Hardware) Alto: A Personal Computer System; Hardware ManualDefines most structures of the Alto hardware, including the processor, display, keyboard, mouse,keyset, printer interface, disk, and Ethernet.Ascii (ANSI) Mesa Language ManualProvides names for common character codes, such as SP, CR, ESC, etc. Also contains names forvarious control characters, ControlA, etc. These declarations are also contained in the olderinterface IODefs.BitBltDefs (Hardware) Alto: A Personal Computer System; Hardware ManualProvides a Mesa definition of the hardware BitBlt (bit boundary block transfer) operation.CharIO (CharIOPack) StreamIO PackageA simple Teletype style I/O interface is provided by these procedures. Minimal editing and inputand output conversion routines are included. Similar to IODefs except that an explicit handlemust be supplied to each operation.DirectoryDefs (Directory) Directory PackageCommon operations on the Alto's file directory are defined here; they are all based on a singleprimitive which enumerates entries in a directory.ÿî ìïfñpîxï\áqôiî ìïWërô»ð/ô¼ð.î ìïVDôÀôÁðJî ìïT�ôªðYô« î ìïRõôÛs rð?ôÜ î ìïQNôî ìïMÿtuvtvpî ìïK„rô¨ô©ðOî ìïIÝôŽð2urð+ô�î ìïH6ôt rî ìïDçtu wî ìïBlrô¨ðWô©î ìï@ÅôðIî ìï=vt u wð2î ìï:ûrôÄðSt rî ìï9Tt rôtrtrî ìï6t uwð'î ìï3ŠrôƒðIô„î ìï1ãôðQî ìï.”t u wð2î ìï,rôµô¶ðIî ìï*rôð.î ìï'#tuwî ìï$¨rô–ð3trtrô—trî ìï#ôÙôÚ trð:î ìï!Yô trî ìï t u wð2î ìï�rðZî ìïAtuvt vpî ìïÆrô—ð4ô˜ð-î ìïô½ð9trî ìïwôð#î ìï)t uvtvpî ìï ®rô´ð@ôµî ìï ôð2ÿ € ì ¿>ç]LDefinitions and Interfaces3DisplayDefs (SystemDisplay, DisplayControl) Display PackageProvides device-dependent operations for the display. Simple operations are implemented using thestandard stream interface (see StreamDefs).FontDefs (AlFont) Display PackageDefines a uniform interface for all font formats. It includes facilities for dynamically swapping fontfiles.Format (FormatImpl) Tajo Functional SpecificationDefines a set of operations for converting numeric values to strings. It is not exported byMesa.image, but does contain the definition of NumberFormat that is copied into CharIO andIODefs.FrameDefs (Miscellaneous, Modules, Swapper, UnNewConfig) ModulesProvides low level operations on modules and their runtime representation (global frames). Itincludes facilities for controlling residency of a module's code segment and for loading andunloading configurations.FSPDefs (FSP) Storage ManagementThis memory allocation package provides temporary storage for small, transient data structureswhose size is not known at compile time.ImageDefs (CheckPoint, MakeImage) Image FilesImage files are used to save the state of a computation so that it can be restarted later (perhaps in adifferent environment). Different types of image files can be created using the procedures definedin this interface; each type makes different assumptions about the state of the environment when itis restarted.InlineDefs (InlineDefs) MiscellaneousDefines a set of instructions not accessible at the language level. Logical operations and someextended precision arithmetic is included.IODefs (StreamIO) StreamIO PackageA simple Teletype style I/O interface is provided by these procedures. Minimal editing and inputand output conversion routines are included.KeyDefs (Keyboard, KeyStreams) Keyboard PackageProvides device-dependent operations for the keyboard, keyset, and mouse. Simple operations areimplemented using the standard stream interface (see StreamDefs).MiscDefs (Miscellaneous) MiscellaneousA set of miscellaneous but useful procedures that don't obviously belong in any of the otherinterfaces.î$bïfñpôXîIºî ‚ïbt uôvt vtvpî ‚ï_£rô‡ðLôˆî ‚ï]ûôt rî ‚ïZ­tuvtvpî ‚ïX2rôˆðgî ‚ïVŠî ‚ïS�rôÖð9ô×ð%î ‚ï<éôð(î ‚ï9štuvtvp î ‚ï7rô…ô†ðXî ‚ï5xô•ð+ô–ð8î ‚ï3Ðô�ðHô�î ‚ï2)ô î ‚ï.Út uvt vp î ‚ï,_rôÃð<ôÄð$î ‚ï*¸ôð*î ‚ï'ituvtvpî ‚ï$îrô—ð4ô˜ð-î ‚ï#Gôð,î ‚ïøtuvtvt vpî ‚ï}rôžðQôŸî ‚ïÖôð5t rî ‚ï‡tuvt vp î ‚ï rôÕð\î ‚ïe ÿ: ‚=çSíDefinitions and Interfaces4OsStaticDefs (BCPL) Alto Operating System Reference ManualDefines information available through the Alto Operating System Swat resident.ProcessDefs (OurProcess) Processes and MonitorsIncludes a number of extensions to the language facilities for processes, monitors, and conditionvariables. Priorities and timeouts can be adjusted, and processes can be detached and aborted.SegmentDefs (SegmentsA, SegmentsB, Files, Swapper) Segment and File PackagesOperations on data and file segments are contained here; this includes virtual memory managementand swapping. Basic operations on files and their attributes are also included.Storage (FSP, SegmentsB) Storage ManagementProvides a simplified interface to the segment and free storage package for allocating and releasingtemporary storage.StreamDefs (KeyStreams, StreamsA, StreamsB) Disk, Display, Keyboard, and StreamsPackagesDefines the operations common to all streams. It also includes some device-dependent operationsunique to the disk, keyboard, and display.StreamScan (StreamsC) Disk Streams PackageDefines operations for reading a stream at full disk speed.StringDefs (StringsA, StringsB) String PackageA utility package for copying, comparing, and converting strings and substrings.SystemDefs (FSP, SegmentsB) Storage ManagementProvides a simplified interface to the segment and free storage package for allocating and releasingtemporary storage. Most of the same functions are available through the newer interface Storage.TimeDefs (TimeConvert) Time PackageIncludes a number of procedures for converting between internal (32 bit GMT), intermediate(unpacked record) and external (string) time formats.TrapDefs (Resident, Faults) TrapsDefines the runtime implementation of traps generated by the hardware and software.The Alto Mesa System also implements a number of other interfaces for compatibility with othersoftware systems. These include Inline, Process, Runtime, String, System, and Time.ÿî ÌïfñpôXî ìî ìïbt uôwð'î ìï_£rðNî ìï\Tt uvt vpî ìïYÙrô¸ðaî ìïX2ôÂð*ôÃð5î ìïTãt uôûvtvtvtvpôüî ìïRhrôŒð`î ìïPÁôðPî ìïMrtuvtvtvpî ìïJ÷rô•ð&ô–ð>î ìïIPôî ìïFt uôßvt vtvtvpôàî ìïDZî ìïAßrô ð6ô¡ð*î ìï@7ôð*î ìï<ét uvtvpî ìï:nrð;î ìï7t uvtvtvpî ìï4¤rðPî ìï1Ut uvtvtvpî ìï.Úrô•ð&ô–ð>î ìï-3ô‹urôŒð5trî ìï)ätuôvt vp î ìï'irôßðGôàî ìï%Âôð5î ìï"stuvtvtvpî ìïørðSî ìïÖô¦ô§ðVî ìï/ôéôêtrtrtrtrtrtrÿÀ ìè=çN# 53. System OrganizationThe Mesa system is available in a standard configuration. It is intended for the day to dayoperation of most program developers, who do not want to provide a large amount of software inorder to perform simple tasks. On the other hand, some clients are building complete applicationsfrom the ground up, and wish to replace many of the standard facilities with their own versions.Operations are provided for these clients to delete standard display and keyboard facilities; reducingthe standard configuration to a basic configuration. Several optional packages are available foraugmenting the capabilities of the system in various directions.Except for the optional packages listed below, the standard Mesa system (Mesa.image) includes allthe facilities described in this document.Extended Memory OperationMesa uses the extended memory of Alto II XMs as additional swapping space for code. This meansthat code and data need not co-exist in the MDS, the primary 64K of memory. Mesa takesadvantage of any available extra space automatically; standard Alto programs do not need to bemodified to run. Support is provided for up to one million words of memory in blocks of 64Kwords. Because Mesa uses extended memory for code segments, it includes a page-level storage allocatorfor the additional banks. Client programs may request storage in the additional banks by usingstandard procedures described in the Segment Package section of this document. Additionally,there are procedures described in the Miscellaneous section that provide primitive mechanisms toread and write words in extended memory and to copy blocks of data between banks of memory.The Alto/Mesa system gives no other assistance in accessing information in the extended memory.In particular, arbitrary use of LONG POINTERs is not supported on the Alto.When running on a machine with more than 64K of memory, the Mesa system will allocate spacein the second 64K for a debugger bitmap. This improves the performance of the debuggerdramatically. It is possible to inhibit the allocation of this bitmap; see the Mesa Users' Handbookor the Mesa Debugger Documentation for details.Optional PackagesTo assist in tailoring applications, some facilities are optional and packaged separately. Theconfiguration marked as standard is included in Mesa.image; the others must be included in theuser's configuration (or otherwise loaded) if they are needed. The descriptions below show (inparentheses) the section of this document that describes each package.CharIOPackImplements string and character I/O (StreamIO).ÿîIºïfñpî#¿ï\áqôiî ‚ïWërôØôÙsrð2î ‚ïVDôœð@ô�î ‚ïT�ô“ô”ðKî ‚ïRõôªðLô«î ‚ïQNô…ðHô†î ‚ïO§ôÅsrôÆð<î ‚ïMÿôð@î ‚ïJ±ô�ð2ô‚t r î ‚ïI ôð*î ‚ïDçpî ‚ïA˜rô�ðTô‚ î ‚ï?ñôÏ ôÐðJî ‚ï>Jôµô¶ðNî ‚ï<¢ô«ðAô¬î ‚ï:ûôî ‚ï7¬ô©ð%ôªð:î ‚ï6ô´ðYôµî ‚ï4^ôÅð$ôÆprð)î ‚ï2¶ô©ð&p rôª î ‚ï1ô�ôžðGî ‚ï/hô›ðGôœî ‚ï-Àôu rsrî ‚ï*rô™ð,ôšð/î ‚ï(ÊôßôàðQî ‚ï'#ôš ô›ðBsî ‚ï%|rôsr î ‚ï †pî ‚ï7rôëð$ôìð;î ‚ï�ô™ð0t rôšî ‚ïèôÐð-ôÑð1î ‚ïAôðFî ‚ïòv î ‚ïwrð%pr & ‚0>çUÛ System Organization6CheckPointImplements check files (Image Files).DisplayPackage (STANDARD)Implements the display and font procedures. An instance of StreamIO is also included (DisplayPackage).ImageMakerImplements image files (Image Files).ImageRunnerImplements image file loading (Image Files).MesaExecImplements an interactive user interface (Section 4).UnNewConfigImplements unloading of configurations (Modules).Basic ConfigurationClients who wish to provide their own keyboard and display packages may call the followingprocedure (defined in NubOps) to delete the standard packages:ConvertToBasic: PROCEDURE;Multiple calls to this procedure have no additional effect.î"6ïfñpôXî ìî ìïbv î ìï_£rôp rî ìï\Tv w î ìïYÙrôŸðJôður prð&ôñtîxï<¢rô¯ð?ô° urî ‚ï9Ttôîxï6ÙrôÊð#urôËð!îxï51ô²ð1u r ô³ î ‚ï1ãtô îxï/hrôßð2ôàð#îxï-Àô£u rð/ô¤îxï,ôs rî ‚ï(Êtîxï&OrðNî ‚ï#ôˆsô‰ rðOî ‚ï!Yôtrð/î ‚ï ô‹ðYôŒî ‚ïcsôrÿ, ‚>çKïú85. System FacilitiesThe material which follows is divided into several subsections, each of which describes a more orless logically disjoint subset of the system. The subsections are listed below, and follow this sectionin alphabetical order. The relevant DEFINITIONS modules, which clients will want to reference, arenamed in parentheses below, as well as in the subsections which follow.Directory Package (DirectoryDefs)Disk Streams Package (StreamDefs, StreamScan)Display Package (AltoDisplay, DisplayDefs, FontDefs, StreamDefs)File Package (AltoDefs, AltoFileDefs, SegmentDefs)Image Files (ImageDefs)Keyboard Package (KeyDefs, StreamDefs)Miscellaneous (InlineDefs, MiscDefs)Modules (FrameDefs)Processes and Monitors (ProcessDefs)Segment Package (AllocDefs, SegmentDefs)Storage Management (FSPDefs, Storage, SystemDefs)StreamIO Package (Ascii, CharIO, Format, IODefs)Streams (StreamDefs)String Package (AltoDefs, StringDefs)Time Package (TimeDefs)Traps (TrapDefs)ÿî ìïfñpî!Žï\áqôiî ìïX¿rô¤ð*ô¥ð7î ìïWô‹ðPôŒî ìïUpô—ô˜ s rð3î ìïSÉôðGîâïNFpôXsôFtu tîâïLpôXsôFtu ôX tîâïIÝpsôFtu tu tutu tîâïG¨pôX sôFtutu tu tîâïEtpôX sôFtutîâïC@pôXsôFtutu tîâïA p stu tutîâï>×pstutîâï<¢pôXsôFtu tîâï:npôXsôFtutu tîâï89pôXsôFtuôXtôFu tîâï6pôXsôFtuôXtîâï3ÐpsôFtu tîâï1œpôX sôFtutu tîâï/hpôX sôFtutîâï-3pstutÿÊ ì,ì=ç;õ9Alto/Mesa Directory PackageOctober 1980The Mesa directory package provides a number of procedures to manipulate the standard Altodirectory (SysDir) or any file which follows the format of the Alto directory (seeDirectoryDefs). These routines also support sub-directories. This section depends heavily onthe section on Files, and that section should be read before this. (See the Alto Operating SystemReference Manual for file structure details.)Most of the operations described below come in pairs. The operation containing the wordDirectory operates on the standard Alto directory (SysDir). The other operation of the pairoperates on the directory specified by the disk stream handle dir. (Note that a NIL DiskHandledoes not imply the system directory).The simplest operation provided is to enumerate all of the file entries in the directory:EnumerateDirectory: PROCEDURE [proc: PROCEDURE [POINTER TO FP, STRING]RETURNS [BOOLEAN]];Enumerate: PROCEDURE [dir: DiskHandle, proc: PROCEDURE [POINTER TO FP, STRING] RETURNS [BOOLEAN]];Calls proc once for each filename in the directory, passing it pointers to the file's FP andname. Processing terminates when proc returns TRUE or the end of the directory isreached.Fine point: these parameters are local to the enumeration procedure and must be copied if they are to beretained after the enumeration completes.A faster way to read a directory is to use the StreamScan facilities described in the Streamssection of this document.EnumerateEntries: PROCEDURE [ dir: DiskHandle, proc: PROCEDURE [CARDINAL, StreamScan.Handle, DEptr] RETURNS [BOOLEAN], inspectFree: POINTER TO READONLY BOOLEAN, lengthFilter: CARDINAL _ 0] RETURNS [index: CARDINAL];The procedure proc is called for each directory entry; free entries are passed only ifinspectFree^ is TRUE. If the lengthFilter is non-zero, only entries with a filename length equalto lengthFilter characters will be passed to proc.The following procedures may be of use to programmers implementing features beyond thoseprovided by NewFile and DestroyFile.ÿîIºïfñpî!Lï\áqôiî(ïYÙrôX î ‚ïS<ôÈðUôÉî ‚ïQ”ôC srð=ôDî ‚ïOít uô­rðLô®î ‚ïNFô¡prð!ô¢vî ‚ïLžôrî ‚ïIPôïð:ôðî ‚ïG¨trôºð*srô»î ‚ïFô�ð/ôžtrwrt î ‚ïDZrôvrî ‚ïA ðYî ‚ï=¼twtwtwtwtwtîüï<wtwtî ‚ï8Æ wtîüï7ôôôõwtwtwtwtwtwtîxï3Ðrô’trð1ô“trîxï2)ôØð"trwrôÙîxï0‚îxï.*xô¡ð.ô¢ð;îxï,Éôð)î ‚ï)žrô»ð/t rô¼pî ‚ï'÷rôîxï%|tôXwtîxï#Ôîxï"-wtwtwtwtîxï †wôFtîxïÞôXwtwtwtî ‚ïcrô. trðAô/î ‚ï¼t rôˆur t rô‰ð%î ‚ïôt rtrî ‚ïÆôØôÙð<î ‚ïô trt rÿ ‚Ø=çT31Alto/Mesa Directory Package10DirectoryLookup: PROCEDURE [fp: POINTER TO FP, name: STRING, create: BOOLEAN]RETURNS [old: BOOLEAN];Lookup: PROCEDURE [dir: DiskHandle, fp: POINTER TO FP, name: STRING, create: BOOLEAN]RETURNS [old: BOOLEAN];Looks up name in the directory. If an entry already exists, its file pointer is copied intofp and TRUE is returned, otherwise FALSE is returned. In addition, if create is TRUE, thefile will be created (with one empty data page), and the new file pointer will be copied intofp.BadFileName: ERROR [name: STRING];Raised if one tries to insert a directory entry for name, using one of several procedures inthe interface, and the name is too long or contains invalid characters.DirectoryLookupFP: PROCEDURE [fp: POINTER TO FP, name: STRING]RETURNS [old: BOOLEAN];LookupFP: PROCEDURE [dir: DiskHandle, fp: POINTER TO FP, name: STRING]RETURNS [old: BOOLEAN];Similar to DirectoryLookup, except that the directory is searched for a matching FP. Itreturns TRUE if the file pointer was found. In addition it will supply the filename if nameis not NIL.DirectoryPurge: PROCEDURE [fp: POINTER TO FP, name: STRING]RETURNS [found: BOOLEAN];Purge: PROCEDURE [dir: DiskHandle, fp: POINTER TO FP, name: STRING]RETURNS [found: BOOLEAN];Removes the entry corresponding to name from the directory (it does not disturb the filepages pointed to by the FP, however). If the file is found, its file pointer is copied into fpand TRUE is returned, otherwise FALSE is returned.DirectoryPurgeFP: PROCEDURE [fp: POINTER TO FP] RETURNS [found: BOOLEAN];PurgeFP: PROCEDURE [dir: DiskHandle, fp: POINTER TO FP] RETURNS [found: BOOLEAN];Similar to DirectoryPurge, except that the directory is searched for a matching FP. Itreturns TRUE if the file pointer was found, deleting the entry in the process.Insert: PROCEDURE [dir: DiskHandle, fp: POINTER TO AltoFileDefs.FP, name: STRING]RETURNS [old: BOOLEAN];Inserts a directory entry with the specified name and fp; unlike Lookup, it does notcreate a file. If an entry with the same name is encounter it returns TRUE and the entry isunchanged, otherwise it returns FALSE.îzïfñpôXî ìî ìïbtôwtwtwt wt wtî fï`vwtwtî ìï](wtî fï[€wtwt wt wtî fïYÙwtwtîâïVŠrôœtrðOîâïTãtrô�wrwrtrô‘wrîâïS<ô…ô†ðTîâïQ”trî ìïNFtô wtwtîâïJ÷rôŽð4trô�îâïIPôðGî ìïFtwtwtwt wtî fïDZwtwtî ìïA wtwtwt wtî fï?dwtwtîâï<rô‘ trð'ô’trîâï:nôˆwrðHô‰tîâï8Ærôwrî ìï5xtwtwtwt wtî fï3Ðwtwtî ìï0‚wtwtwt wtî fï.Úwtwtîâï+Œrô™ð#trôšvrîâï)äôˆtrð=ô‰tîâï(=rôwrwr î ìï$îtwtwtwtwtwtî ìï! ô·wtwtwtwtwtîâïQrô£ t rô¤trîâïªôwrðBî ìï[twtî fï´w twtî fï wtwtîâï¾rô¶ð,ô·trtr tr îâïô�ô�ð5wrîâïoôwrP ì(=QXãkAlto/Mesa Directory Package11ParseFileName: PROCEDURE [name, filename: STRING, dirAccess: SegmentDefs.AccessOptions]RETURNS [StreamDefs.DiskHandle];Strips the leading directory information from name, puts the result in filename(appending a period if necessary), and returns a stream (with access dirAccess) open onthe directory in which the file should be looked up.The following procedures set and return the directory used for looking up files which do not specifya directory name (initially set to "t rô�î ‚ï#GôÝð2t rôÞî ‚ï! t rôî ‚ïQtôXvtvtîüïªvtî ‚ï[rôð*î ‚ï tôX vtð-î ‚ï¾rô° ô±ð9tprî ‚ïot rôt rð,ÿ ‚(=çXã Alto/Mesa Disk Streams Package16IndexToPosition: PROCEDURE [index: StreamIndex] RETURNS [StreamPosition];PositionToIndex: PROCEDURE [pos: StreamPosition] RETURNS [index: StreamIndex];If a physical disk location is required along with the stream index, a file address (FA) will proveuseful (see AltoFileDefs); it is similar to a StreamIndex with a disk address (DA) tacked on thefront, except that the page field is one origin (in the Alto file system, page zero is the leader page).FA: TYPE = MACHINE DEPENDENT RECORD [da: DA,page: PageNumber,byte: CARDINAL];You may record the current stream index and re-establish it later, in a fashion similar to GetIndexand SetIndex, by calling the proceduresGetFA: PROCEDURE [stream: StreamHandle, fa: POINTER TO FA];JumpToFA: PROCEDURE [stream: StreamHandle, fa: POINTER TO FA];The special thing about JumpToFA is that the disk address in the fa is taken as a hint; if itdoesn't work out (the page number or file serial number doesn't match the stream's version ofthem), JumpToFA will attempt to find the requested page via the shortest route and correct the faaccordingly. This may involve starting over at the beginning of the file. If that fails,InvalidFP: SIGNAL [fp: POINTER TO FP];will result, probably indicating that the file has been moved (or worse, deleted!) since the streamwas attached to it. A call on some directory searching procedure may prove useful in this situation,to determine if retrying the operation (with a new fp) is appropriate.StreamScanThis interface allows allows overlapped disk I/O when reading from a stream. It is a transliteration ofthe same code from the Alto Operating System (version 17 or newer). The following are defined inStreamScan:Descriptor: TYPE = RECORD [ da: AltoFileDefs.vDA, pageNumber: CARDINAL, numChars: CARDINAL, -- private fields];Handle: TYPE = POINTER TO READONLY Descriptor;Init: PROCEDURE [ stream: StreamDefs.StreamHandle, bufTable: POINTER, nBufs: CARDINAL] RETURNS [Handle];GetBuffer: PUBLIC PROCEDURE [ssd: Handle] RETURNS [POINTER];Finish: PROCEDURE [ssd: Handle];Init sets up a scan stream from a disk stream. In addition to the stream, the client supplies a vectorof pointers to 256 word blocks useable as disk buffers (bufTable). The number of bufferssupplied is nBufs. In other words, you should think of the type of bufTable asÿîWïfñpôXî ìî ìïbtvtvtî ìï^Ïvtvtî ìï[€rô¥ðFô¦tr î ìïYÙô… st rt rtrî ìïX2ô‚trðMî ìïTãtôXvtvtvtvtî fïS<î fïQ”î fïOívtî ìïLžrô‡ðZôˆtî ìïJ÷rôtrî ìïG¨tôXvtvtvtî ìïDZ vtvtvtî ìïA rôºtrô»trî ìï?dôÁðIôÂî ìï=¼ô‚trð?ôƒtî ìï<rôðZî ìï8ÆtôX vtvtvtî ìï5xrô¨ðHô©î ìï3Ðô‡ôˆðGî ìï2)ôð3trî$ï-Àq î ìï+Erô“ðNsô”î ìï)žôôð,ôõrî ìï'÷t rî ìï%|tôX vtvtî ìï#Ôî ìï"- vtî ìï † vtî ìïÞwtî ìïcvtvôFtôX î ìïèvtî ìïAð-vtvtî ìïšvt î ìï vôFtôXvtvtî ìï¤vtî ìï)rô�ðcî ìï �ôÙð&ôÚtrî ìï Úô trð3tr 0 ì “=ç\xGAlto/Mesa Disk Streams Package17bufTable: POINTER TO ARRAY [0..nBufs) OF Buffer,whereBuffer: TYPE = ARRAY [0..256) OF WORD;At least one buffer must be supplied (the normal stream buffer is also used). Each call toGetBuffer will return a pointer to the next sequential page of the file and returns the previousbuffer page to the buffer pool (first call returns data page 0, file page 1). The public fields of theHandle are correct for the page returned by the most recent call to GetBuffer. GetBufferreturns NIL when there are no more pages to be read. A call to Finish terminates the scan. Noother stream operations should be performed between Init and Finish. î!íïfñpôXîI îxïbt vôFt ôXvôFtî ‚ï_£rîxï](tôXvtvtvôFtî ‚ïYrôÞôßðSî ‚ïW^trô«ð-ô¬ð*î ‚ïU·ô”ðNô•î ‚ïTtrôÁð:ôÂtrtî ‚ïRhrôœvrð1ô�trî ‚ïPÁôð4trtrÿš ‚Pz=ç‘m18Alto/Mesa Display PackageOctober 1980The Mesa Display Package provides a simple, teletype style interface to the Alto display (seeAltoDisplay). There is provision for using any available font; however the display is restricted toa single font for any particular incarnation. The font operations (described at the end of thisdocument) are independent of the display implementation and may be used by any other displaypackage. The package will optionally maintain a typescript of displayed output.Display StreamNormal access to the display is through a stream interface (see the section on Streams). There is noprovision for multiple display streams. The module SystemDisplay implements the followingprocedures defined in StreamDefs:GetDefaultDisplayStream: PROCEDURE RETURNS [DisplayHandle];The interpretation of the basic stream operations is:reset clears the display and resets the typescript.put displays the character at the next sequential location.get, putback and destroy SIGNAL StreamError[StreamAccess].endof returns FALSE.In addition, the following operations are defined for display streams:clearCurrentLine: PROCEDURE [stream: StreamHandle]This procedure clears the current line of the display. The next character will be displayedat the left margin. The typescript is repositioned to the beginning of the line.clearLine: PROCEDURE [stream: StreamHandle, line: CARDINAL]Clears line on the the display. The next character will be displayed at the left margin ofthat line. The typescript is repositioned to the beginning of the line. In the currentAlto/Mesa implementation, clearLine is a no-op.clearDisplayChar: PROCEDURE [stream: StreamHandle, char: CHARACTER]Erases the last character written on the display. The character must be supplied since thestream retains no knowledge of what characters are displayed (the typescript is optional).DisplayDefs defines some additional interface procedures:ÿî ìïfñpîoï\áqôiî$qïYÙrôX î ìïTãôØðDôÙî ìïSîâï ôsr î ìï¼ststsîâïmrô�ð[îâïÆô±ðZî ìï›s rôð.‚ ìT=çU·ÜAlto/Mesa Display Package19InitDisplay: PROCEDURE [dummySize, textLines, nPages: CARDINAL, f: FontDefs.FontHandle];This procedure initializes the display with dummySize blank scan lines at the top androom for at most textLines lines of text using nPages pages of memory for datastructures and bitmap. The number of text lines and the display width are reduced ifnecessary to make everything fit in nPages.The amount of memory necessary to guarantee that n full width lines of text can be displayed is n*(4+h*w)words, where h is the height of the font in scan lines (rounded up to an even number) and w is the width ofthe display in words.SetSystemDisplaySize: PROCEDURE [nTextLines, nPages: CARDINAL];Clears the display and reinitializes it with the new parameters.SetSystemDisplayWidth: PROCEDURE [indent, width: CARDINAL];Clears the display and reinitializes it with the new width parameters. indent is the numberof bits from the left edge of the screen to the first display position and width is the widthof a display line in bits. (The actual width will be the nearest multiple of 32 bits.).Indenting by multiples of 16 bits is very efficient.SetDummyDisplaySize: PROCEDURE [nScanLines: CARDINAL];Changes the size of the blank space at the top of the display. The space will be roundedup to an even number of scan lines and may be zero.Background: TYPE = {white, black};DisplayOff: PROCEDURE [color: Background];DisplayOn: PROCEDURE;DisplayOff releases all of the space allocated to the display and swaps out the font. All ofthe parameters of the display are saved so that DisplayOn can restore the previous state(but not the contents) of the display.StartCursor: PROCEDURE;StopCursor: PROCEDURE;StartCursor forks a process in DisplayControl that blinks the cursor. If the cursorprocess is already running, it is a no op. StopCursor stops it.BlinkCursor: PROCEDURE RETURNS [BOOLEAN];Blinks a "cursor" at the position where the next character will be displayed. Each callchanges the state of the cursor from "on" to "off" or vice versa. BlinkCursor returnsTRUE if the last call changed the cursor state to on. The cursor is always turned off beforea character is displayed or erased.ÿî#ªïfñpôXîI î ‚ïbs tsîüï`vtsîxï](rô¸ð,srô¹îxï[€ôãsrsrôäîxïYÙôÄð%ôÅð0îxïX2ôð$srîxïUÚuô• ô–ð_îxïTyô„ðIô…ð#îxïRõôî ‚ïO§sôXtstsîxïLXrôð@î ‚ïI sôXtstsîxïE»rô�ðHsrô‚ îxïDô�ðKsrôŽ îxïBlôÕðPôÖîxï?ñuôð4î ‚ï<¢sôXts tsîxï9Trô›ð?ôœîxï7¬ôð3î ‚ï4^sôX tsî ‚ï1 tsî ‚ï-À tsîxï*r rô�ð3ô‚îxï(Êô¡ô¢srîxï'#ôð&î ‚ï#ÔsôX tsî ‚ï † tsîxï7 rôºsrô» îxï�ôð,s r î ‚ïAsôX tôFsôXtsîxïòrô¾ô¿ð@îxïKô²ð:ô³s rîxï¤trôŽðYîxïüôð#– ‚µ8ñXVAlto/Mesa Display Package20SetTypeScript: PROCEDURE [StreamDefs.DiskHandle];This procedure establishes a disk stream as a typescript for the display. Passing NIL willdisable the typescript. Characters sent to the display stream while the display is off willappear in the typescript. The typescript must be an open byte stream withReadWriteAppend access.GetTypeScript: PROCEDURE RETURNS [StreamDefs.DiskHandle];This procedure returns the disk stream that is behind the typescript for the display. DisplayControl: PROGRAM;This is the control module used in Mesa.image. It will initialize the display, font andtypescript (using either MesaFont.al or SysFont.al and Mesa.Typescript) andstart a process to call BlinkCursor at half second intervals. It will also reestablish thedisplay (including font and typescript) after a MakeImage or MakeCheckPoint.DestroyDisplay: PROCEDURE;This procedure deletes the display package; it turns off the display, deallocates the bitmap,destroys the font and UNNEWs all the display modules.FontsA FontObject provides a simple object style interface to character fonts. Operations are providedfor painting or erasing characters from the font in a bitmap. FontDefs defines the followingTYPEs and PROCEDUREs:BitmapState: TYPE = RECORD [origin: POINTER,wordsPerLine, x, y: [0..77777B)];A BitmapState describes where a character will be placed within a bitmap. origin is aPOINTER to the beginning of the bitmap. wordsPerLine is the horizontal width of thebitmap (it must be even if the bitmap is to be displayed). x and y are measured from theupper left corner in bits right and scan lines down respectively.FontHandle: TYPE = POINTER TO FontObject;FontObject: TYPE = RECORD [paintChar: PROCEDURE [FontHandle, CHARACTER, POINTER TO BitmapState],clearChar: PROCEDURE [FontHandle, CHARACTER, POINTER TO BitmapState],charWidth: PROCEDURE [FontHandle, CHARACTER] RETURNS [CARDINAL],charHeight: PROCEDURE [FontHandle, CHARACTER] RETURNS [CARDINAL],close: PROCEDURE [FontHandle],destroy: PROCEDURE [FontHandle],lock: PROCEDURE [FontHandle] RETURNS [POINTER],unlock: PROCEDURE [FontHandle]];A FontObject implements the following operations:ÿî ïfñpôXî ìî ìïbstsîâï^Ïrô­ô®ð9trîâï](ô¯ð\îâï[€ôP ôQð=îâïYÙsrôî ìïVŠsôXtstsîâïSôŠî ìï5›ôÃð3ôÄ srî ìï4trôtrî ìï0ÈsôX tstsî fï/!tsî fï-zð!îâï*+rô›s rð$ôœsrîâï(„trô©ð"s rôªîâï&Üô�ð&sôX tstststsîxï:Ørô srî ‚ï7‰sôX tstststsîxï4:rô srî ‚ï0ìsôX tsð!ts îxï-�rôŸð-s rô  îxï+öôð%î ‚ï(ÊôÎs rð!ôÏî ‚ï'Fô î ‚ï#øsôXtsts îxï ©rô s rî ‚ï}ôÀ sr s rôÁð+î ‚ïùô±ðSô² î ‚ïÎv rô“s rsrs rô”î ‚ïJô¨ð+ô©s rð$î ‚ïÆsrÿ ‚=çRŒ222Alto/Mesa File PackageOctober 1980Logically, the Mesa file package is a sub-module of the segmentation machinery, but it is describedseparately because other objects (e.g. disk streams) also use this interface. Internally, the filemachinery maintains a set of items called FileObjects: these contain, among other things, the file'sdisk address and serial number, as well as its access rights, several reference counts, and an optionalfile length hint.The Mesa system follows most conventions of the Alto file system; see the Alto Operating SystemReference Manual for a description of the file system. A description of the various procedures usedto manipulate the Alto's directory appears in the section on Directories.FilesA file is an integral number of pages which logically appear to be contiguous, irrespective of theirphysical location. The pages of a file are numbered from zero up to some maximum (seeAltoDefs):MaxFilePage: CARDINAL; -- maximum file page numberPageNumber: TYPE = [0..MaxFilePage];In the Alto file system, page zero of the file (the leader page) is special; it contains file statusinformation. Thus the data actually begins at page one.Externally, a file is known by its name, which is just a string. Internally, Mesa retains only a file'sFP, which is an abbreviated form of the Alto file system's file pointer (see AltoFileDefs):FP: TYPE = RECORD [serial: SN, -- internal file serial numberleaderDA: vDA]; -- first virtual disk addressThe correspondence between file names and FPs is maintained in the file system's directory(SysDir). After the file is initially looked up, the name is discarded; the Mesa world deals only inFPs thereafter. A directory search is required if the name must be recovered.File ObjectsA FileHandle is used to refer to a file in the Mesa environment, and can be obtained by a call onNewFile (described below); it is simply a pointer to a record called a FileObject (seeSegmentDefs or the Appendix).î ìïfñpî¹ï\áqôiî$qïYÙrôX î ìïTãô�ðVôŽ î ìïS<ôØð+ôÙð8î ìïQ”ôƒð"ô„s rð0î ìïOíô‡ôˆðHî ìïNFôî ìïJ÷ôŸð4ô tî ìïIPô‡rð'ôˆð-î ìïG¨ôð=p rî&­ïBlqî ìï?rôšð?ô›ð%î ìï=vôèôéð9î ìï;Ïsrî ìï8€sô usvtî ìï51s usî ìï1ãrô¿ð)ôÀð;î ìï0;ôð8î ìï,íô‘ðaô’î ìï+Esrôäð=ôå s rî ìï'÷sôususî fï&Oô€ wîItôî fï$¨sô€vîItôî ìï!Yrôæð*srôçð-î ìï²xrô„ô…ðLî ìï srô prð=î$ïÎqôi î ìïrô‡s rôˆð7î ìïØsrô ô ð*s rî ìï1s rôpr ª ìê=çV!Alto/Mesa File Package23FileHandle: TYPE = POINTER TO FileObject;FileObject: -- actually one variant of Object; the type FileObject = file Object.. . .open: BOOLEAN,-- if the file is openread, write, append: BOOLEAN,-- access rightslock: FileLockCount, -- reference countsegcount: SegCount, -- attached segmentsswapcount: RefCount, -- swapped in segments . . . ];-- plus other private fieldsThe following options are used when creating new file objects:AccessOptions: TYPE = [0..7];DefaultAccess: AccessOptions = 0;Read: AccessOptions = 1;Write: AccessOptions = 2;Append: AccessOptions = 4;ReadWrite: AccessOptions = 3;WriteAppend: AccessOptions = 6;ReadWriteAppend: AccessOptions = 7;VersionOptions: TYPE = [0..3];DefaultVersion: AccessOptions = 0;NewFileOnly: VersionOptions = 1;OldFileOnly: VersionOptions = 2;Read access allows existing pages of the file to be read; Write means that existing pages can bewritten (or deleted; perhaps a separate Delete option should be included). Append allows newpages to be added to the end of the file (files do not have holes in them).Fine point: Append does not imply Write access. Append means that new pages may be added to the file butexisting pages may not be modified.Disallowed combinations are {NewFileOnly, OldFileOnly} and {NewFileOnly, ~Append}. IfAppend access is not specified, OldFileOnly is assumed. If you like, you may specifyDefaultAccess, which is equivalent to Read. (Note that Append access must be specified inorder to create the file.)Fine point: if DefaultVersion is specified, the file is created if it did not previously exist.SignalsSignals associated with FileObjects are as follows:FileNameError: SIGNAL [name: STRING];The file name is invalid, or the file does not exist (OldFileOnly), or the file already doesexist (NewFileOnly).ÿî$½ïfñpôXîI î ‚ïbsô ususus î ‚ï^Ï wyuy urîüï](uîüï[€sô€usî&PtôîüïYÙsô€usî&Ptô îüïX2sô€î&PtôîüïVŠsô€î&PtôîüïTãsô€î&PtôîüïSî ‚ïLžsus î ïJ#ð!î ïH|î ïFÕî ïE-î ïC†î ïAßî ï@7ð#î ‚ï<éus î ï:nð"î ï8Æî ï7î ‚ï3ÐrôŸð/ô srð!î ‚ï2)ô¡ð(srsr î ‚ï0‚ôðKî ‚ï.yô­ uyzyuyrpuyð.ô®î ‚ï,_ôð#î ‚ï)rô‚s rs rs rsrôƒî ‚ï'isrô ôs rð*î ‚ï%Âs rô¢ô£sr srî ‚ï$ôî ‚ï! yu yðBî)cïcqî ‚ïrs rî ‚ïÆsususîxïwrô• ô–ð)s rîxïÐôs r  ‚‰=çW‚,Alto/Mesa File Package24FileAccessError: SIGNAL [file: FileHandle];An attempt to perform some operation not allowed by the current access, or the requestedaccess and version options are inconsistent (see the disallowed combinations above).InvalidFP: SIGNAL [fp: POINTER TO FP];A file positioning operation has determined that the file serial number in the FP of the fileobject does not match the disk label. Most likely, the FileHandle references a file whichhas been moved or destroyed (or clobbered) since it was last referencedFileError: SIGNAL [file: FileHandle]; -- all other file errorsFile Creation/DeletionA FileObject is created using the following procedures:NewFile: PROCEDURE [name: STRING,access: AccessOptions _ DefaultAccess,version: VersionOptions _ DefaultVersion]RETURNS [FileHandle];Given a file name and access rights, this procedure creates a new file object and returns apointer to it. A check is made that the file exists in the directory, creating it if necessary,but the file is not opened as a result of this call. Objects attached to the file (segments andstreams, for example) ensure that the file is open before attempting a transfer. If there isalready a file object for the file specified, its access is updated (by Oring; this is not aprotection system), and a pointer to the existing object is returned.InsertFile: PROCEDURE [fp: POINTER TO FP, access: AccessOptions _ DefaultAccess]RETURNS [FileHandle];Creates a file object directly from fp, without searching the directory. If there is already afile object with a matching fp, its access is updated (by or'ing; this is not a protectionsystem), and a pointer to the existing object is returned.Internally, Mesa keeps track of the number of segments attached to each file (segcount) and ofthose the number which are currently swapped in (swapcount). When the swapcount goes tozero, the file may be closed, and when the segcount goes to zero, the file object is released (onlythe latter operation happens automatically). Since a file may have other objects attached to it(streams, for example), it may be necessary to prevent the file object from being released even whenthere are no more segments attached to it. The lock field serves this purpose, and is manipulatedby the proceduresLockFile, UnlockFile: PROCEDURE [file: FileHandle];A maximum of MaxFileLocks locks may be performed on each file object. Note that a file objectis not automatically released when its lock count goes to zero.î!'ïfñpôXî ìî ìïbsôusîâï^Ïrô– ô—ðKîâï](ôðTî ìïYÙs usususîâïVŠrôˆô‰ð3sr îâïTãô”ð8s r ô• îâïS<ôðGî ìïOís wuswtî KïJ±qôiî ìïGbrôs rð+î ìïDsusî fïBlusî fï@Åð&î fï?ð)î fï=vus îâï:'rô™ðAôšîâï8€ô™ð-ôšð3îâï6Ùô†ô‡ðYîâï51ôœô�ðAîâï3Šô¼ô½ð?wrîâï1ãôðEî ìï.”s usî fï,íususð+î fï+Eus îâï'÷rô�ô�srð9îâï&Oô¿ôÀ srð<îâï$¨ôð:î ìï!Yô£ðNsrô¤î ìï²ô”ô•ð(sr srî ìï ôŽð+srð*ô�î ìïcôÇôÈðLî ìï¼ô‚ðKôƒî ìïô’ð*ô“srð.î ìïmôî ìïsusî ìïÐrô€ s rð2ô�î ìï)ôtrð9 ¶ ìâ=çY))Alto/Mesa File Package25A FileObject is released byReleaseFile: PROCEDURE [file: FileHandle];The file is first closed if it is open; then its file object is released. A FileError will begenerated if there are segments associated with the file at the time of this call. Except forthis error check, releasing a file that is locked is a no-op.A file is physically destroyed by callingDestroyFile: PROCEDURE [file: FileHandle];In addition to releasing the file object, the file's pages are deleted and its entry is removedfrom the directory. The file object must not have any segments currently attached to it, normay it be locked; either condition results in a FileError.To be on the safe side, destroying a file is somewhat complicated if it currently has segmentsattached to it. The file must first be locked, then all of its segments deleted and all streamsattached to it destroyed, then the file should be unlocked and finally DestroyFile should becalled. This sequence assumes that no other client has a lock on the file.File PropertiesCharacteristics of the disk file associated with a FileObject are obtained and changed using thefollowing procedures:FindFile: PROCEDURE [fp: POINTER TO FP] RETURNS [FileHandle];Searches all existing file objects for one whose serial number and disk address match thosecontained in fp. Returns NIL if no match can be found.GetFileFP: PROCEDURE [file: FileHandle, fp: POINTER TO FP];Copies the file pointer from file into fp.GetFileAccess: PROCEDURE [file: FileHandle] RETURNS [access: AccessOptions];Converts the read, write, and append bits of a file object into a form that can be passedto NewFile.SetFileAccess: PROCEDURE [file: FileHandle, access: AccessOptions];Or's access into the file object (this is not a protection system).File lengths are not contained in every FileObject. A separate object contains the length for afile. This separate length object is not required and is allocated only when operations on filelengths are invoked (see SegmentDefs). Operations on file lengths are:GetEndOfFile: PROCEDURE [file: FileHandle]RETURNS [page: PageNumber, byte: CARDINAL];Returns the page number of the last page in the file that contains data, together with thenumber of bytes in that page (the number of the first non-existent byte in the page,î$½ïfñpôXîI î ‚ïbrôs rî ‚ï^Ïs usîxï[€rô©ôªðçXV Alto/Mesa Image Files28Check FilesCheck files differ from normal image files in that they do not contain all the code and datanecessary to start the execution of the image file. Check files only contain the data of the Mesasystem, and all code and other segments remain in their original files. As a result, check files aremade and restarted very quickly. However, care must be taken not to destroy files that are pointedto by the check file. Check files are useful for making check points in the execution of a Mesasystem. The procedures and signals that make check files are:MakeCheckPoint: PROCEDURE [name: STRING] RETURNS [restart: BOOLEAN];Makes a check file on file name. Returns to the caller when finished as if nothinghappened with restart set FALSE. If the check file is being restarted, it returns to thecaller with TRUE.NoRoomInCheckMap: SIGNAL;In MakeCheckPoint, the map in the ImageHeader has filled up. This usually meansthat there are too many segments in memory at the time the check file is made. The ability to make check files is not included in the basic system. Clients should include theCheckPoint module in their configuration. Running Image FilesMesa programs may run another image file without returning to the Alto Executive. Theprocedures and signals that implement this are:RunImage: PROCEDURE [file: SegmentDefs.FileSegmentHandle];Runs the image file specified by file where file is a segment handle for the header of theimage file. The current state of the present image file is lost, and the new image file isloaded and started.Fine point: currently the header of an image file is page one (this may change in the future, and may not beconstant). Communication between the two image files must be done via disk files (like Com.cm). See theAlto Operating System Reference Manual.InvalidImage: SIGNAL;In RunImage, file specifies an invalid image file. NoRoomForLoader: SIGNAL;In RunImage, there is no room for the bootstrap loader that loads and starts the imagefile. Clients should include the configuration ImageRunner in their configuration.ÿî!�ïfñpôXî ìî$Aïa×qôi î ìï^‰rôÓðJôÔî ìï\áô§ðVô¨ î ìï[:ô›ð1ôœð4î ìïY“ôŠðWô‹ î ìïWëô©ôªð[î ìïVDôð>î ìïRõstststs tsîâïO§rôÓsrð)ôÔ îâïMÿô´ srtrð(ôµîâïLXô trî ìïI stsîâïE»rô’s rsrs rô“îâïDôðMuî ìï@Årôºð\ô»î ìï?s rôî!ï9áqôiî ìï6’rôûðRôüî ìï4ëôð/î ìï1œs t sð&îâï.Mrô“ð!srsrô”ð*îâï,¦ô¬ð;ô­îâï*ÿôîâï(§uô�ðiôŽîâï'Fô�ðWôžîâï%Âwôð&rî ìï"ss tsîâï%rsrsruî ìïÖstsîâï‡rô§srô¨ðJîâïàuôî ìï‘rð)s r ( ìJ=çTÁ Alto/Mesa Image Files29MiscellaneousThe version stamp of the currently running image file may be obtained by calling the procedure:ImageVersion: PROCEDURE RETURNS [BcdDefs.VersionStamp];The time that the currently running image file was created may be obtained by calling theprocedure:ImageTime: PROCEDURE RETURNS [TimeDefs.PackedTime];The same information can be obtained about the caller's BCD from the procedures:BcdVersion: PROCEDURE RETURNS [BcdDefs.VersionStamp];BcdTime: PROCEDURE RETURNS [TimeDefs.PackedTime];A client may stop execution of a Mesa system and return to the Alto Executive by calling:StopMesa: PROCEDURE;A client may terminate execution of a Mesa system as if shift-swat had been typed and return to theAlto Executive by calling:AbortMesa: PROCEDURE;Cleanup ProceduresClient programs sometimes need to be notified when certain events occur so they can performvarious cleanup functions. Cleanup procedures provide a facility to notify client programs whenimage files are made or restarted, and when stopping the execution of Mesa programs. The typesand data structures involved with Cleanup procedures are:CleanupProcedure: TYPE = PROCEDURE [why: CleanupReason];CleanupItem: TYPE = RECORD [link: POINTER TO CleanupItem,mask: CARDINAL,proc: CleanupProcedure];CleanupReason: TYPE = BcplOps.CleanupReason;BcplOps.CleanupReason: TYPE = {Finish, . . . Save, Restore, CheckPoint, Restart, Continue, . . .};CleanupReasons are copied from BcplOps. Valid ones are:Finish:StopMesa was called.Save:MakeImage was called.Restore:returning from MakeImage.Checkpoint:Checkpoint was called.Restart:returning from Checkpoint restarted by the Alto Executive.Continue:returning from Checkpoint.î%&ïfñpôXîI î&äïa×q î ‚ï^‰rô¤ð*ô¥ð5î ‚ï[¤sô tstsî ‚ïXUrôëðYî ‚ïV® î ‚ïSÉsô tstsî ‚ïPzrôXð8trî ‚ïM•sô tstsî ‚ïJ±tstsî ‚ïGbrôáôâðHî ‚ïD}sô tsî ‚ïA.rô�ðQô‚î ‚ï?‡ôî ‚ï<¢s tsî$îï7fqôiî ‚ï4rôÆðAôÇî ‚ï2pô²ðRô³ î ‚ï0Èô›ðYôœî ‚ï/!ôð9î ‚ï+Òststsî ‚ï(„ tstsîüï&Üt s îüï%5tsîüï#Žî ‚ï ?tsî ‚ïðtsîüïIðCî ‚ïú rsrîxï¬sîér îxïsîé r îxï]sîérsrîxï¶s îd r îxïsîérs rð!îxï gsîérs rÿ ¤ ‚ =ç[ëýAlto/Mesa Image Files30The following procedures is used to add or remove cleanup procedures. The list of CleanupItemsis processed in the opposite order when returning from an image file than when making one.AddCleanupProcedure: PROCEDURE [POINTER TO CleanupItem];RemoveCleanupProcedure: PROCEDURE [POINTER TO CleanupItem];Warning: these procedures may not be invoked from inside Cleanup procedures.CleanupMask: ARRAY CleanupReason OF CARDINAL =[1, 2, 4, 10B, 20B, 40B, 100B, 200B, 400B, 1000B];When the Cleanup procedure mechanism is invoked, each item is examined. If the bitcorresponding to the reason is set in item.mask, item.proc is called. Clients must set the maskfield so that their procedure is invoked only for the reasons they expect. For example, if a clientneeds to be notified when a normal image file is being made or started, the mask is set to:CleanupMask[Save] + CleanupMask[Restore].Warning: if the item.mask is improperly set, item.proc may be invoked at sensitive times,probably resulting in erroneous behavior.RestrictionsMakeImage1.The name of the new image file may not be the same as the name of the image file runningat the time MakeImage is called. An image file can be renamed any time it is not running. 2.The user program should not have handles on any files or disk streams. Any file segmentsallocated by a user program will be made a part of the new image file.3.This list of restrictions may not be exhaustive. In general you should avoid doing anythingother than loading modules and initializing data structures before making an image file.4.MakeImage cannot preserve the contents of extended memory in the image file itconstructs. If MakeImage is invoked when useXM is TRUE, it will swap out all unlocked filesegments in extended memory. (It will also move any locked code segments to the MDS.) If anysegments then remain in extended memory, MakeImage will refuse to build the image file.Analogous comments apply to CheckPoint.MakeCheckPoint1.The name of the new image file may be the same as the name of the image file running atthe time MakeCheckPoint is called, only if the current image file is a check file. A check fileshould not be renamed. 2.The files that are pointed to by the check files should not be moved or altered. Care must betaken with open disk streams that the pages of the current position of the stream are not moved ordestroyed.3.This list of restrictions may not be exhaustive and care must be taken with all files that areopen at the time the check file was make.ÿî!�ïfñpôXî ìî ìïbrô‚ ôƒðEs rî ìï`vôÍôÎð>î ìï](sôtst s î ìïYÙtst s î ìïVŠrðLî ìïSç\xAlto/Mesa Image Files31CleanupProcedures1.CleanupProcedures are called with interrupts and timeouts turned off. 2.This list of restrictions may not be exhaustive and care must be taken when usingCleanupProcedures.î%&ïfñpôXîI î ‚ïbxî ‚ï^Ïrsrôð7î ‚ï[€ô ðJô î ‚ïYÙsr Ú ‚Y’=çy,32Alto/Mesa Keyboard PackageOctober 1980The Keyboard package consists of the modules KeyStreams and Keyboard; it provides aTeletype style interface to the undecoded keyboard through a device independent stream interface.Multiple, independent keyboard streams are supported. A default keyboard stream is created atinitialization time. (See the section on StreamIO for higher level operations.) The KeyboardPackage also optionally causes the hardware cursor to track the mouse. A single keyboard processruns at interrupt level approximately 60 times per second to sample the keyboard hardware.The following procedures and types are defined in StreamDefs.KeyboardHandle: TYPE = POINTER TO Keyboard StreamObject;The standard operations on a keyboard stream are:reset[s]Clears the buffer associated with s; any characters in the buffer are lost.get[s]Returns the next character in the buffer; if endof[s] is TRUE, WAITs until it is FALSE.putback[s, i]Modifies the stream so that the next get[s] will return i, independent of any type-ahead.If the buffer is full, putback is a no-op (sorry about that). put[s, i]Produces a StreamAccess error.endof[s]TRUE if there are no characters in the buffer.destroy[s]Destroys s in an orderly way, freeing the space it occupies. Any characters in the buffer atthe time of the destroy are lost. If s is the current keystream, the StreamOperationerror results.î ìïfñpî¼ï\áqôiî$qïYÙrôX î ìïTãôÝð-s rsrôÞ î ìïS<ô™ð)ôšð8î ìïQ”ô¶ð@ô·î ìïOíôÎôÏprð,î ìïNFô˜ðIô™î ìïLžôéðGôêî ìïIPôð2s rî ìïFsôXtstôFsôXî ìïB²rôð1î ìï?dsîâï<rð"srð(î ìï8Æsîâï5xrôºð)pô»rsprtrtr trî ìï2)sô îâï.Úrôžð%sr srîâï-3ôsrî ìï)äsîâï&–r s prî ìï#Gsîâïøtrð*î ìïªs îâï[rô‡srôˆðPîâï´ô srô¡ srsîâï rô t ìÅ>çRFÕAlto/Mesa Keyboard Package33Other keyboard-related operations include:CreateKeyStream: PROCEDURE RETURNS [KeyboardHandle];Creates a new keyboard stream. Any number of streams may be created. Each stream hasits own buffer for type ahead. (Space for the StreamObject is allocated from the systemheap.)GetDefaultKey: PROCEDURE RETURNS [KeyboardHandle];Returns the default stream (created at initialization time).GetCurrentKey: PROCEDURE RETURNS [KeyboardHandle];Returns the current stream. Initially the default keyboard stream is current.OpenKeyStream: PROCEDURE [stream: StreamHandle];Makes stream the current keyboard stream. The stream which was current before the callis undisturbed, except that input characters are no longer directed to it by the keyboardprocess, but to stream instead.CloseKeyStream: PROCEDURE [stream: StreamHandle];Makes the default keyboard stream current. Characters already typed remain in stream'sbuffer. The StreamOperation error results if stream is not the current stream.trackCursor: BOOLEAN;Setting the variable to TRUE enables cursor tracking; FALSE disables it. When tracking isenabled, the mouse coordinates are copied to the cursor coordinates each time the keyboardprocess runs.CursorTrack: PROCEDURE [b: BOOLEAN] = INLINE {trackCursor _ b};Provided for compatibility.Low Level AccessThe basic system does not provide access to the keyset or mouse through the stream. Definitionsare provided for clients wishing to access the bits of the keyboard directly or to change theinterpretation of any of the keys. The module KeyDefs defines types and procedures for lowerlevel access to the keyboard hardware.updown: TYPE = {down, up};KeyBits: TYPE = MACHINE DEPENDENT RECORD [blank: [0..377B],-- not usedKeyset1, Keyset2, Keyset3, Keyset4, Keyset5: updown,Red, Blue, Yellow: updown,Five, Four, Six, E, Seven, D, U, V,Zero, K, Dash, P, Slash, BackSlash, LF, BS: updown,ÿî#ïfñpôXîI î ‚ïbrð*î ‚ï^Ïststsîxï[€rô‹ôŒð7îxïYÙôˆð&ô‰s rîxïX2î ‚ïTãsôXtstsîxïQ”rôð<î ‚ïNFsôXtstsîxïJ÷rôðNî ‚ïG¨sôXtsîxïDZrô‡srð;ôˆîxïB²ô´ð!ôµð8îxïA ôsrî ‚ï=¼sôXtsîxï:nrô–ð6ô—srîxï8Æôõ ôösrsrî ‚ï5xsôX tîxï2)rô¤trô¥ trîxï0‚ô…ð"ô†ð8îxï.Úô î ‚ï+ŒsôX tststs tôFsîxï(=rôî%ºï#qôiî ‚ï rôŸðSô  î ‚ïcôÝð#ôÞð:î ‚ï¼ô¥ð/srô¦ð'î ‚ïôð&î ‚ïÆsôXts î ‚ïwtstôFsôXîüïÐî!Zu îüï)sð4îüï �îüï Úð#îüï 3ð3 x ‚ ì=ç^Alto/Mesa Keyboard Package34Three, Two, W, Q, S, A, Nine, I,X, O, L, Comma, Quote, RightBracket, Spare2, Spare1: updown,One, ESC, TAB, F, Ctrl, C, J, B,Z, LeftShift, Period, SemiColon, Return, Arrow, DEL, FL3: updown,R, T, G, Y, H, Eight, N, M,Lock, Space, LeftBracket, Equal, RightShift, Spare3, FL4, FR5: updown];Keys: POINTER TO KeyBits = -- magic memory location -- ;MouseButton: TYPE = {RedYellowBlue, RedBlue, RedYellow, Red, BlueYellow, Blue,Yellow, None};MouseBits: TYPE = MACHINE DEPENDENT RECORD [blank: [0..377B],-- Diablo, Versatec, etc.keyset: [0..37B],-- 0 => down, i.e. normal state is 37Bbuttons: MouseButton];Mouse: POINTER TO MouseBits = -- magic memory location -- ;KeyName: TYPE = {. . . ,-- unused valuesKeyset1, Keyset2, Keyset3, Keyset4, Keyset5,Red, Blue, Yellow,Five, Four, Six, E, Seven, D, U, V,Zero, K, Dash, P, Slash, BackSlash, LF, BS,Three, Two, W, Q, S, A, Nine, I,X, O, L, Comma, Quote, RightBracket, Spare2, Spare1,One, ESC, TAB, F, Ctrl, C, J, B,Z, LeftShift, Period, SemiColon, Return, Arrow, DEL, FL3,R, T, G, Y, H, Eight, N, M,Lock, Space, LeftBracket, Equal, RightShift, Spare3, FL4, FR5};Alto II names for some keys are different.FL1: KeyName = DEL;FL2: KeyName = LF;BW: KeyName = Spare1;FR1: KeyName = Spare3;FR2: KeyName = BackSlash;FR3: KeyName = Arrow;FR4: KeyName = Spare2;KeyItem: TYPE = RECORD [Letter: BOOLEAN,ShiftCode: [0..177B],NormalCode: [0..377B]];There is a KeyItem for every key (including mouse and keyset keys). A NormalCode =0 causes the key to be ignored; a ShiftCode = 0 puts in a zero for the key when the shiftkey is down; Letter means that the ShiftCode is selected by the shift lock key. Notethat the ShiftCode is 7 bits and the NormalCode is 8 bits.ÿîïfñpôXî ìî fïbsî fï`vð<î fï^Ïî fï](ðAî fï[€î fïYÙðGî ìïVŠtôF sôX usî ìïS< tsð=î fïQ” î ìïNF tstôFsôXî fïLžî ?uî fïJ÷sîÄuð&î fïIPsî ìïFtôF sôX usî ìïB²tsî fïA îØuî fï?dsð,î fï=¼î fï<ð#î fï:nð+î fï8Æî fï7ð4î fï5xî fï3Ðð9î fï2)î fï0‚ð?î ìï-3rð*î gï)äsî gï(=î gï&–î gï$îî gï#Gî gï! î gïøî ìïªtstsî fïtsî fï[î fï´îâïerô‚ sr ôƒð's rîâï¾ô‚ ôƒsrð.îâïô« srsrð)îâïoôsrs r ¶ ì(;™XãðAlto/Mesa Keyboard Package35ChangeKey: PROCEDURE [key: KeyName, action: KeyItem]RETURNS [oldAction: KeyItem];This procedure changes the meaning of a key and returns the old value.DestructionClients of Mesa who wish to provide their own keyboard procedures may delete the standardkeyboard handler by calling:DestroyKeyHandler: PROCEDURE;It destroys the keyboard PROCESS and UNNEWs all the keyboard modules.ÿî#ïfñpôXîI î ‚ïbs tsîüï`vtsîxï](rôðFî'ÊïWëq î ‚ïT�rôÑð6ôÒð#î ‚ïRõôî ‚ïO§sôXtsî ‚ïLXrôvrvr – ‚L=çúG36Alto/Mesa MiscellaneousOctober 1980This section describes some miscellaneous facilities in Alto/Mesa.MiscDefsZero: PROCEDURE [p: POINTER, l: CARDINAL];FOR i IN [0..l) DO (p+i)^ _ 0.SetBlock: PROCEDURE [p: POINTER, v: UNSPECIFIED, l: CARDINAL];FOR i IN [0..l) DO (p+i)^ _ v.ByteBlt: PROCEDURE [to, from: POINTER, toByte, fromByte, nBytes: CARDINAL];Moves nBytes bytes from from[fromByte] to to[toByte]. It uses COPY if the bytesare aligned and BITBLT if they aren't.Warning: ByteBlt will not work in the case of overlap.DAYTIME: PROCEDURE RETURNS [AltoFileDefs.TIME];Returns the current time in the format maintained by the Alto Operating System andrecorded in Alto files. This is not the same format as a TimeDefs.PackedTime.CurrentTime: PROCEDURE RETURNS [LONG CARDINAL];Returns the current time. This is the same format as a TimeDefs.PackedTime.GetNetworkNumber: PROCEDURE RETURNS [CARDINAL];Returns the number of the network to which the Alto is connected or zero if there is nonetwork or no response from a gateway.Fine point: this procedure is used by the Compiler and others to generate unique identifiers for output files.CommandLineCFA: PROCEDURE RETURNS [POINTER TO AltoFileDefs.CFA];Returns a pointer to the CFA for the point at which the Mesa executive stopped readingthe command line (Com.cm). This is valid only when a configuration is started from thecommand line using Mesa.image. The caller can use the CFA to quickly open a stream onthe command line and read any additional commands. The CFA should be updated beforereturning to the Mesa executive. See the sections on Files and Streams for moreinformation.î ìïfñpî5ï\áqôiî$qïYÙrôX î ìïTãôðBî$ùïPzqî ìïM,sôXtststsîâïIÝtsôtsts rî ìïFŽsôX tstst stsîâïC@tsôtsts rî ìï?ñsôXtôFsôXtstsîâï<¢rô–sr s ô—rs r sr îâï:ûôsrîâï7¬ srð&î ìï4^sôXtstôFsîâï1rôÓð&ôÔð,îâï/hôëð!ursrî ìï,sôX tstôFst sîâï(Êrôúurôûsrî ìï%|sôXtstôFstsîâï"-rô¤ð@ô¥îâï †ôð&îâï vô™ðIôšð%î ìï¼sôXtstôFst sôXîâïmrô¢srð2ô£îâïÆô¡ ô¢wrð?îâïô‰ð*ôŠ srîâïwô„ð8srô…îâïÐôýð6prprôþîâï) b ìâ8ñY)Alto/Mesa Miscellaneous37CallDebugger: PROCEDURE [STRING];WorryCallDebugger: PROCEDURE [STRING];These procedures invoke the Debugger without the overhead of raising an uncaught signal.The Debugger will display the parameter if it is not NIL. The worry call will invoke theDebugger in worry mode.SystemDefsEven: PROCEDURE [u: UNSPECIFIED] RETURNS [UNSPECIFIED];Rounds u up to a multiple of two. Can be used to align pointers on even wordboundaries.Quad: PROCEDURE [u: UNSPECIFIED] RETURNS [UNSPECIFIED];Rounds u up to a multiple of four. Can be used to align pointers on quad wordboundaries.InlineDefsThe following procedures and types are defined in InlineDefs. Most are also available from theinterface Inline.COPY: PROCEDURE [from: POINTER, nwords: CARDINAL, to: POINTER];FOR i IN [0..nwords) DO (to+i)^ _ (from+i)^.LongCOPY: PROCEDURE [from: LONG POINTER, nwords: CARDINAL, to: LONG POINTER];FOR i IN [0..nwords) DO (to+i)^ _ (from+i)^.This may be used only if memConfig.xmMicrocode is TRUE. See Segment Package(Extended Memory Operations) in this document for details.DIVMOD: PROCEDURE [num, den: CARDINAL] RETURNS [quotient, remainder: CARDINAL];Returns both the quotient and remainder of the unsigned division of num by den.LDIVMOD: PROCEDURE [numlow: WORD, numhigh: CARDINAL, den: CARDINAL]RETURNS [quotient, remainder: CARDINAL];Like DIVMOD except that the numerator is the double length unsigned numbernumhigh*216 + numlow. Results are undefined if the quotient is greater than 216-1.LongNumber: TYPE = MACHINE DEPENDENT RECORD [SELECT OVERLAID * FROMlc => [lc: LONG CARDINAL],li => [li: LONG INTEGER],lu => [lu: LONG UNSPECIFIED],num => [lowbits, highbits: CARDINAL],ENDCASE];î$PïfñpôXîI î ‚ïbs tstsî ‚ï^Ïtstsîxï[€rô‘ô’ð=îxïYÙô¨ð5tr ô©îxïX2ôî'ÉïSÉq î ‚ïPzsôXtst stst sîxïM,rôîsrôïð?îxïK„ î ‚ïH6sôXtst stst sîxïDçrôæsrð"ôçð$îxïC@ î(Nï>×q î ‚ï;ˆrô�ð2s rôžî ‚ï9áô srî ‚ï6’sôXtsts tstsîxï3Ctsôts tsrî ‚ï/õsôX tstôFsôXtstôFsîxï,¦tsôts tsrîxï*ÿô·ô¸srtrpîxï)Wrôð:î ‚ï& sôXts tststsîxï"ºrô½srsrur srô¾srî ‚ïkstôF sôX ts tstsîüïÄtstsîxïurô-srð!ô.urîxï«sï8tï«sô¤rô¥ð"ï8vï«rî ‚ï\sôX tstôFsôXîüïµtôFî«ï sôX tôFsî«ïfôX tôFsî«ï¿ôX tôF sî«ï ôXtsî«ï pts œ ‚ )=ç\âaAlto/Mesa Miscellaneous38The LongNumber structure permits access to the high and low words of LONG CARDINALs andLONG INTEGERs. Alternately, the following procedures may be used:LowHalf: PROCEDURE [LONG UNSPECIFIED] RETURNS [UNSPECIFIED];HighHalf: PROCEDURE [LONG UNSPECIFIED] RETURNS [UNSPECIFIED];LowHalf and HighHalf allow access to the machine dependent components of LONGCARDINALs, LONG INTEGERs and LONG POINTERs. LowHalf returns the least significant word,while HighHalf returns the most significant word.BytePair: TYPE = RECORD [high, low: [0..256)];LowByte: PROCEDURE [UNSPECIFIED] RETURNS [UNSPECIFIED];HighByte: PROCEDURE [UNSPECIFIED] RETURNS [UNSPECIFIED];LowByte and HighByte return the least significant and most significant byte of a wordrespectively.LongMult: PROCEDURE [CARDINAL, CARDINAL] RETURNS [product: LONG CARDINAL];Returns the double precision result of the unsigned multiplication of the two singleprecision arguments.LongDiv: PROCEDURE [num: LONG CARDINAL, den: CARDINAL] RETURNS [CARDINAL];Returns the result of the unsigned division of num by den. The result is undefined if thequotient is greater than 216-1.LongDivMod: PROCEDURE [num: LONG CARDINAL, den: CARDINAL]RETURNS [quotient, remainder: CARDINAL];Like LongDiv except both quotient and remainder are returned.BITAND, BITOR, BITXOR: PROCEDURE [UNSPECIFIED, UNSPECIFIED] RETURNS [UNSPECIFIED];These functions compute the bitwise AND, OR, or XOR of their arguments.BITNOT: PROCEDURE [UNSPECIFIED] RETURNS [UNSPECIFIED];Returns the ones complement of the input.BITSHIFT: PROCEDURE [value: UNSPECIFIED, count: INTEGER] RETURNS [UNSPECIFIED];Returns value shifted by ABS[count] bits. The shift is left if count > 0, right if count< 0.ÿî ºïfñpôXî ìî ìïbrô­s rð7tô®rî ìï`vtô rð6î ìï](sôXtstst stst sî ìïYÙ tstst stst sîâïVŠrsrð5tîâïTãrtôF rôXtôFrôXsrð$îâïS<srð#î ìïOís tstôFsôXî ìïLžtst stst sî ìïIP tst stst sîâïFrô£srð2ô¤îâïDZ î ìïA sôX tstôFsôXts tôFsîâï=¼rôúð&ôûurð!îâï<ôî ìï8ÆsôXtstôFsôXtststsîâï5xrô�ur srsrôŽîâï3­ôï4:vï3­rî ìï0_sôX tstôFsôXtsî fï.·tstsîâï+irôsr srsr î ìï(sôXtst st stst sîâï$Ërôð$xrxrxrî ìï!}sôXtst stst sîâï.rôð)î ìïßsôX tst ststst sîâï‘rôŒsr tsrô�sr sîâïéôr ¸ ì¢=çRiXAlto/Mesa Miscellaneous39Floating PointIt is possible to use floating point arithmetic on machines without microcode support for floatingpoint. With the proper compile-time switch, the Compiler generates calls to client suppliedprocedures via the system data vector (SD). The definitions of SD and all indexes into SD are inSDDefs. In the following description the notationSD[index]: PROCEDURE . . .means that the client should declare a procedure P of the correct type and assign its descriptor tothe appropriate element of SD (SD[index] _ P). In this case, the Compiler makes noassumptions about the representation of REALs except that they occupy two words.SD[sFADD]: PROCEDURE [a, b: REAL] RETURNS [REAL];Called to perform addition.SD[sFSUB]: PROCEDURE [a, b: REAL] RETURNS [REAL];Called to perform subtraction.SD[sFMUL]: PROCEDURE [a, b: REAL] RETURNS [REAL];Performs multiplication.SD[sFDIV]: PROCEDURE [a, b: REAL] RETURNS [REAL];Performs division (a/b).SD[sFCOMP]: PROCEDURE [a, b: REAL] RETURNS [INTEGER];Called to compare REALs. Returns -1 if ab.SD[sFLOAT]: PROCEDURE [LONG INTEGER] RETURNS [REAL];Converts fixed point to floating point.SD[sFIX]: PROCEDURE [REAL] RETURNS [LONG INTEGER];The Compiler does not generate calls to this procedure. It is included for completeness.BitBltThe Alto has microcode for moving arbitrary rectangles of bits around in memory. The operation iscalled BitBlt. BitBlt operations are specified via a table of parameters. One should read the AltoHardware Manual for a detailed description of the BitBlt operation. Mesa provides the followingdefinitions, in BitBltDefs for using BitBlt:BBTable: TYPE = MACHINE DEPENDENT RECORD [ptrs: {short, long} _ short,pad: [0..777B] _ 0,sourcealt, destalt: BOOLEAN _ FALSE, -- TRUE to use alternate memory banksourcetype: BBsourcetype _ block,ÿî$PïfñpôXîI î&Þïa×qôi î ‚ï^‰rô©ðCôªî ‚ï\áôìð,ôíð0î ‚ï[:ô‘ð'srsrô’srî ‚ïY“srôð,îxïVDs tsî ‚ïRõrô›ð0ôœsrð1î ‚ïQNôsrs r ôî ‚ïO§ôð(trð$î ‚ïLXsôX tstststsîxïI rôî ‚ïE»sôX tstststsîxïBlrôî ‚ï?sôX tstststsîxï;Ïrôî ‚ï8€sôX tstststsîxï51rôsrî ‚ï1ãsôX tstststsîxï.”rôtrsrsrsrî ‚ï+EsôX tstôFsôXtstsîxï'÷rôð'î ‚ï$¨sôX tstststôFsîxï!Yrô­ô®ðDî)Ìïðqî ‚ï¢rô€ô�ðZî ‚ïúô�ð5ôžð+uî ‚ïSô¤rð)ô¥ð(î ‚ï¬ôs rî ‚ï€sôXtstststsîýïüsîýïxsîýï ôststsytyuîýï psð! < ‚ )=ç\âDAlto/Mesa Miscellaneous40function: BBoperation _ replace,unused: CARDINAL _ 0, -- used to set emulator bank register during operationdbca: POINTER _ NULL, -- destination BaseCoreAddressdbmr: CARDINAL _ NULL, -- destination raster width(in words)dlx: CARDINAL _ NULL, -- destination left xdty: CARDINAL _ NULL, -- destination top ydw: CARDINAL _ NULL,dh: CARDINAL _ NULL,sbca: POINTER _ NULL, -- source BaseCoreAddresssbmr: CARDINAL _ NULL, -- source raster width(in words)slx: CARDINAL _ NULL, -- source left xsty: CARDINAL _ NULL, -- source top ygray0: CARDINAL _ NULL, -- four words of "gray"gray1: CARDINAL _ NULL,gray2: CARDINAL _ NULL,gray3: CARDINAL _ NULL, -- Below here is not used by nonXM, nonXMesa Altosslbca: LONG POINTER _ NULL, -- source long BaseCoreAddressdlbca: LONG POINTER _ NULL]; -- destination long BaseCoreAddressBBptr: TYPE = POINTER TO BBTable;BBoperation: TYPE = {replace, paint, invert, erase};BBsourcetype: TYPE = {block, complement, andgray, gray};The hardware/microcode requires that BBTable be at an even memory address. Mesa thereforeprovides a type and transfer procedure so that one can allocate one word too many and be assuredof an even address.BBTableSpace: TYPE = ARRAY [0..SIZE[BBTable]] OF UNSPECIFIED;AlignedBBTable: PROCEDURE [p: POINTER TO BBTableSpace] RETURNS [BBptr];Finally, there is the operation itself:BITBLT: PROCEDURE [ptr: BBptr];These declarations are used in the following way:bbBits: BBTableSpace;bbP: BBptr = AlignedBBTable[@bbBits];. . .bbP^ _ [ desired values for a given operation ];BITBLT[bbP];. . .Mesa provides support for the BitBlt operation in conjunction with extended memory.Thesourcealt and destalt fields of the BitBlt record (BitBltDefs.BBTable) are used (do not usethe long pointer options). If the unused word in the BBTable is nonzero, the microcode sets theemulator bank register to that value for the duration of the BitBlt. In effect, BitBlt can only beused to move data within a single bank or between the MDS (bank zero) and some other bank.ÿî ºïfñpôXî ìî gïbsî gï`šstsyuð3î gï_ststsyuî gï]’ststsyuð"î gï\ststsyuî gïZŠststsyuî gïYststsî gïW�ststsî gïUýststsyuî gïTyststsyuî gïRõststsyu î gïQqststsyu î gïOíststsyuî gïNiststsî gïLåststsî gïKaststsyuð/î gïIÝstststsyuî gïHYstststsyuî ìïFstststsî ìïC© tsð#î ìïAR tsð&î ìï>rô£ô¤srð.î ìï<\ô� ô�ðVî ìï:´ôî ìï7‰sôX tststs tst sî ìï4^tstststsî ìï1rôð'î ìï-äsôXts î ìï*•rôð1îâï'Fsîâï%Ÿð%îâï#øîâï"Pð0îâï © îâïî ìï³rôð$ôð2î ìï srô¨srsrô© u î ìïdô�rôŽsr srð#î ìï½ôªô«ðJî ìïô¬ð5ô­ð%ÿ è ìÏ=çS<a41Alto/Mesa ModulesOctober 1980This section documents the operations required to manipulate modules at a more detailed level thanprovided by the language. It is intended for experienced programmers who have a genuine need tomanipulate low level system structures. See FrameDefs for further details.Global FramesA GlobalFrame is the implementation of the PROGRAM language construct. All manipulation ofGlobalFrames is done using GlobalFrameHandles.GlobalFrameHandle: TYPE = POINTER TO GlobalFrame;GlobalFrame: TYPE = RECORD [. . .];The procedures which manipulate global frames are:GlobalFrame: PROCEDURE [link: UNSPECIFIED] RETURNS [GlobalFrameHandle];Returns the GlobalFrameHandle corresponding to link, which is interpreted as a controllink; it should be either a PROCEDURE, POINTER TO FRAME or PROGRAM. If link is not avalid control link, then either the signal InvalidGlobalFrame or UnboundProcedurewill be raised (see the section on Traps for a description of UnboundProcedure).ValidateGlobalFrame: PROCEDURE [UNSPECIFIED];Checks to see that the parameter points to a valid global frame; InvalidGlobalFrame israised if not. Used to check the validity of GlobalFrameHandle parameters by systemprocedures such as GlobalFrame.InvalidGlobalFrame: SIGNAL [frame: UNSPECIFIED];Indicates that frame does not point to a valid global frame.EnumerateGlobalFrames: PROCEDURE [proc: PROCEDURE [GlobalFrameHandle] RETURNS [BOOLEAN]]RETURNS [GlobalFrameHandle];Calls proc once for each global frame that currently exists. If proc returns TRUE,EnumerateGlobalFrames returns the GlobalFrameHandle of the last frameprocessed. If all global frames have been processed, NullGlobalFrame is returned.Warning: If new modules are created while EnumerateGlobalFrames is in control, it isnot guaranteed that they will be included in the sequence of GlobalFrameHandlespassed to proc.îI ïfñpî$Íï\áqôiî(ïYÙrôX î ‚ïTãô„ðGô…î ‚ïS<ô‡ðXôˆî ‚ïQ”ôð-srî&ÉïLXqôi î ‚ïI rô—s rtrô˜î ‚ïGbs rôsrî ‚ïDstststs î ‚ï@Å tstsî ‚ï=vrð2î ‚ï:'s tst stsîxï6Ùrô† srsrô‡îxï51ô”trtrtrsrô•îxï3Šô¢ô£srsîxï1ãrôçð#prôèsrî ‚ï.”sôtst sîxï+Erô�ô‘ð"srîxï)žô¢ô£srîxï'÷ôs rî ‚ï$¨sutst suîxï!Yrsrð(î ‚ï stsîüïctststsîüï¼tsîxïmrôæsrôçsrtrîxïÆsrô] srô^îxïôèð5ôésr îxïÐprô�ð"ô�srîxï)ôâð<ôãsrîxï �ô srÿ N ‚ :=çZÑ!Alto/Mesa Modules42FramesA Frame is the implementation of the PROCEDURE language construct. All manipulation ofFrames is done using FrameHandles.FrameHandle: TYPE = POINTER TO Frame;Frame: TYPE = RECORD [. . .];Frames may be validated by calling:ValidateFrame: PROCEDURE [UNSPECIFIED];Checks to see that the parameter points to a valid frame; InvalidFrame is raised if not.InvalidFrame: SIGNAL [frame: UNSPECIFIED];Indicates that frame does not point to a valid frame.Module Creation / DeletionThe following procedures allow the programmer explicit control over the creation and deletion ofmodules. NewConfig and RunConfig provide an interface for loading configurations. Thelanguage construct NEW should be used for making copies of modules. UnNew andUnNewConfig allow the deletion of previously loaded modules and configurations.SelfDestruct allows a module to UnNew itself and return to its caller. These operations aredefined in FrameDefs. NewConfig: PROCEDURE [name: STRING];Loads the Bcd contained in the file name. A configuration loaded in this way can bestarted only by start traps or binding to and starting a frame or PROGRAM which it exports.LoadConfig: PROCEDURE [name: STRING] RETURNS [PROGRAM];Loads the Bcd contained in the file name but does not start it. It returns theconfigurations control module (or NIL if there is none). Note that this will not handleconfigurations whose control modules take parameters.RunConfig: PROCEDURE [name: STRING];Like NewConfig, except that the control modules of the configuration will be started ifthere are any.Warning: a StackError will result if a control module requires parameters.UnNewConfig: PROCEDURE [frame: GlobalFrameHandle];Deletes all global frames that are a part of the configuration containing frame, as well asall copies of those frames. Frees the storage for the global frames (to the segmentationmachinery if it was obtained from there, or to the frame heap), and frees all the codesegments.ÿî"fïfñpôXî ìî%Æïa×qî ìï^‰rôÚsrôÛt rð)î ìï\ásrôs rî ìïY“s tststsî ìïVDtstsî ìïRõrð#î ìïO§stst sîâïLXrô˜ô™s rî ìïI s uôtst suîâïE»rsrð!î„ï@~qôiî ìï=/rô¦ðPô§î ìï;ˆôÑ srsrôÒð.î ìï9áô;trð/srî ìï89s rô’ ô“ð:î ìï6’s rôµsr ô¶ð,î ìï4ëô srî ìï1œs tstsîâï.Mrô² ur ô³ srð,îâï,¦ôŠð6ô‹ trî ìï)Wsô tstststsîâï& rô ursrôîâï$aôÂð"trð(ôà îâï"ºôð5î ìïks tstsîâïrô«sr ô¬ð<îâïuô îâïúv t vð4rî ìï¬s tsîâï]rôšð"ô›ð(sr îâï¶ôµðDô¶îâïôÃðCôÄîâï gÿ ¶ ì >ç[ë+Alto/Mesa Modules43UnNew: PROCEDURE [frame: GlobalFrameHandle];Deletes the global frame pointed to by frame. Returns the global frame to the frame heap(if the frame was allocated from that heap). Deletes the code segment of the frame if noother global frames share it.Warning: there is no check for references that are bound to the module being deleted.The language construct NEW and the operation UnNew should be used for creating and destroyingcopies of modules. They are relatively inexpensive operations, and provide facilities for usingmodule instances as objects. NewConfig and UnNewConfig on the other hand, are relativelyexpensive operations, and should only be used to add or remove configurations which are relativelystatic.SelfDestruct: PROCEDURE;UnNews the module of the caller, and returns to its caller's caller.NoGlobalFrameSlots: SIGNAL;Indicates that there is no room in the Global Frame Table when either NewConfig orRunConfig have been called or the language construct NEW has been invoked.Fine point: global frames for single modules (and copies) are allocated from the frame heap. Other configurationsallocate their global frames as a single (data) segment, and are subject to some wasted space due to breakage.Other signals may be raised when Newing modules; these signals indicate that the Bcd beingloaded is invalid, versions of interfaces don't match, or code files cannot be found or were compiledin non-Alto mode. In addition, when a module is started, the signal StartFault may be raised (seethe section on Traps for more information).Code ManipulationThe following procedures enable the user to control code swapping.MakeCodeResident: PROCEDURE [f: GlobalFrameHandle];Swaps in the code for f as low as possible in memory by pushing unlocked read-onlysegments out of the way. It will first swap out the code if it is swapped in.LockCode: PROCEDURE [link: UNSPECIFIED];Swaps in and locks the code segment associated with link (which may be either aPROCEDURE, POINTER TO FRAME or PROGRAM). The procedure GlobalFrame is used tofind the global frame of link (and may raise the signals InvalidGlobalFrame andUnboundProcedure).Warning: calling LockCode on a global frame that has not been started will disable starttraps on that module.î%üïfñpôXîI î ‚ïbsôtsîxï^Ïrô� ô‚srð-îxï](ô�ðIôžîxï[€ôîxïX2prôÂð4ôÃî ‚ïTãô�trôŽsrð+î ‚ïS<ôÒðCôÓî ‚ïQ”ô­srs rô® î ‚ïOíôŒðMô�î ‚ïNFî ‚ïJ÷sô tsîxïG¨rð?î ‚ïDZsutuîxïA rô´ôµð,srîxï?dsrôð,trî ‚ï<8vô·ð]ô¸î ‚ï:´ôØôÙðYî ‚ï7frôÊð!srð#ôË urî ‚ï5¾ô„ðKô…î ‚ï4ô�ðEs rô‚ î ‚ï2pôprî%*ï-3qôiî ‚ï)ärôðBî ‚ï&–stsîxï#GrôÉsrôÊð;îxï! ôðNî ‚ïQs tst sîxïrôõôöð,srîxï[trô™trtrs rôšîxï´ôêôësrsrîxï srîxï¾prôš srð1ô› îxïô Ú ‚Ï=çW<Alto/Mesa Modules44UnlockCode: PROCEDURE [link: UNSPECIFIED];Unlocks the code segment associated with link (which may be either a PROCEDURE,POINTER TO FRAME or PROGRAM). The procedure GlobalFrame is used to find theglobal frame of link (and may raise the signals InvalidGlobalFrame andUnboundProcedure).SwapOutCode: PROCEDURE [f: GlobalFrameHandle];Swaps out the code for f. If the code is locked, the ERROR SegmentDefs.SwapError israised for the code segment associated with f.Fine point: when a frame's code is swapped out, all the global frames that have the same code segment will beupdated to reflect the fact that the code is swapped out. These other frames either have their code segmentspacked with that frame or they are copies of that frame. Code may be swapped out by clients callingSwapOutCode or by the system.SwapInCode: PROCEDURE [f: GlobalFrameHandle];Swaps in and locks the code for f.Warning: calling SwapInCode on a global frame that has not been started will disablestart traps on that module.Miscellaneous OperationsThe following procedures are useful for debugging and determining what has been loaded.GetCaller: PROCEDURE RETURNS [PROGRAM];Returns the module containing its caller's caller.IsBound: PROCEDURE [link: UNSPECIFIED] RETURNS [BOOLEAN];In cases where configurations are conditionally loaded, IsBound can be used to determinethe presence of a module or procedure. The UNSPECIFIED argument should be an importedprocedure or program, or pointer to an imported variable.ÿî"fïfñpôXî ìî ìïbsô tst sîâï^Ïrôêð#ôësrtrîâï](tôÏrtrs rôÐîâï[€ô†srô‡srîâïYÙsrî ìïVŠsô tsîâïSç]¶%Alto/Mesa Processes and Monitors46The lock and/or condition variables reside in storage that is allocated from an UNCOUNTEDZONE or MdsZone by means of the NEW operation. The compiler will initialize them evenif no other initialization is given in the NEW expression.The lock and/or condition variables reside in records allocated by other means.Initialization is the responsibility of the client.Using uninitialized monitor locks or condition variables or reinitializing monitor locks or condition variablesafter they have have begun to be used will lead to totally unpredictable behavior.The following operations are provided for initializing monitor locks and condition variables inclient-created data structures by means other than someZone.NEW.InitializeMonitor: PROCEDURE [monitor: POINTER TO MONITORLOCK];InitializeMonitor leaves the monitor unlocked and sets the queue of waiting processes toempty. It may be called before or after the monitor data is initialized, but must be calledbefore any entry procedure is invoked. Once use of the monitor has begun,InitializeMonitor must never be called again.InitializeCondition: PROCEDURE [condition: POINTER TO CONDITION, ticks: Ticks];InitializeCondition sets the queue of waiting processes to empty and sets the timeoutinterval of the condition variable to ticks (measured in units of "ticks" of an internalclock). It may be called before or after the other monitor data is initialized, but must becalled before any WAIT or NOTIFY operations are performed on the condition variable.Once use of the condition variable has begun, InitializeCondition must never be calledagain.Clients may convert clock ticks, milliseconds and seconds using the following operations:Ticks: TYPE = CARDINAL;Milliseconds: TYPE = CARDINAL;Seconds: TYPE = CARDINAL;MsecToTicks: PROCEDURE [Milliseconds] RETURNS [Ticks];TicksToMsec: PROCEDURE [Ticks] RETURNS [Milliseconds];SecondsToTicks: PROCEDURE [Seconds] RETURNS [Ticks];TimeoutsCondition variables which are initialized automatically are assigned a default timeout of a fewseconds. The timeout of any condition variable may be changed by the following operation.SetTimeout: PROCEDURE [condition: POINTER TO CONDITION, ticks: Ticks];ÿîïïfñpôXî ìîâïbrô�ô‘ðHuîâï`vrôƒtr ô„urð3îâï^Ïôð+ur îâï[€ô9ðHô:îâïYÙôð3îâïV®vô¯ðRô°îâïUMôðRî ìïRErôÖð_î ìïPÁôð3turî ìïMrtôXut uôFtîâïJ#rô“ô”ð'îâïH|ô™ðNsrôš îâïFÕôAð&ôBð$îâïE-trôsî ìïAßtôXut uôFtôXîâï>�rô»ô¼ð=îâï<éôÆôÇ trð-îâï;Aô  ô¡ðJsrîâï9šôÐurur ôÑð)îâï7óô­ð&ô®trsîâï6Krî ìï1yôðYî ìï.*tôXutuî ìï*Ût utuî ìï'�tutuî ìï$>t uôF t utôXuî ìï ït utuôFtî ìï¡ôXut uôFtî% ï½qî ìï‘rôÒðVôÓî ìï ôÚðEôÛî ìï¿tôX ut uôFtôX® ìx=çY“'Alto/Mesa Processes and Monitors47DisableTimeout: PROCEDURE [POINTER TO CONDITION];SetTimeout adjusts the timeout interval for all subsequent WAIT operations applied to thatcondition variable. DisableTimeout disables timeouts for all subsequent WAIT operationsapplied to that condition variable. However, neither operation has any effect on processesthat are already WAITing.SetTimeout and DisableTimeout are the only available operations to adjust a conditionvariable once it has been used. In particular, InitializeCondition must not be used forthis purpose, especially for condition variables which are automatically initialized.Pause: PROCEDURE [ticks: Ticks];Pause delays execution of its caller by the specified number of ticks.Detaching ProcessesA process which will never be joined is detached using the following operation.Detach: PROCEDURE [PROCESS];This operation sets the state of the process so that when it returns from its root procedure,it will be deleted immediately and its results, if any, will be discarded. If the process isinvalid (e.g., if the process has already been deleted), the signal InvalidProcess may begenerated.Priorities of ProcessesWhen a process is created with FORK, it inherits the priority of the FORKing process. If this provesunsatisfactory, the FORKed process may change its own priority with the following operation.SetPriority: PROCEDURE [Priority];Priority: TYPE = [0..7];A process may determine its own priority by calling:GetPriority: PROCEDURE RETURNS [Priority];There is no way for a process to alter the priority of another process.CAUTION: Use of multiple priorities in the current implementation is severely restricted. Anyprocess running at other than the default priority (currently, 1) is forbidden to use many of thestandard runtime support features of the Mesa environment. In practice, this means that non-standard priorities should be used only for interrupt handling, while all "normal" processing takesplace concurrently at the default priority level. In addition, all interrupt level code must be lockedin memory and should perform only a minimal amount of processing.î!…ïfñpôXîI î ‚ïbtutuôFtîxï^Ï rô€ð1urô�îxï](ô‰t rôŠð&ur îxï[€ô™ðNôš îxïYÙôurîxïVŠt rô‡t rð.ôˆ îxïTãô¡ ô¢ð#trîxïS<ôðUî ‚ïOítôXutîxïLžrôðAî$­ïE»qôiî ‚ïB�rôðOî ‚ï?AtuôF tutîxï;òrô’ð4ô“ð)îxï:Kô¬ðNô­îxï8£ôŸðCô t rîxï6ü î$ï0qôiî ‚ï,írô‰urð"urôŠî ‚ï+iôåurð9ôæ î ‚ï(tôX ut î ‚ï$Ë ut î ‚ï! rôð4î ‚ïQtôX uôFtôX î ‚ï&rôðGî ‚ïúprôÛsôÜðIrî ‚ïvô´ðAôµî ‚ïòôÆð;ôÇð"î ‚ïnôŸð5ô ð.î ‚ïêô�ð`ô‘î ‚ïfôðAZ ‚=çWì Alto/Mesa Processes and Monitors48Aborting a processA process can be aborted by calling the following operation.Abort: PROCEDURE [PROCESS];The effect of this operation is to generate the signal ABORTED the next time the processexecutes a WAIT statement on any condition variable. If the process is already WAITing, animplicit NOTIFY is issued at the time this procedure is called.The argument to Abort is actually of type UNSPECIFIED, and is validated as a PROCESS at run-time.This is necessary since there is no generic type which includes all PROCESS types, regardless of result types.ABORTED: ERROR;-- Predeclared Mesa SymbolAborted: ERROR;The catch phrase for this signal may be attached to the WAIT statement, or it may beenabled in some scope according to the scope rules of Mesa. The catch phrase is executedwith the corresponding monitor locked. Mesa has a predefined error ABORTED, which forcompatibility reasons is also declared in ProcessDefs (i.e., Aborted = ABORTED).Programmers should use the predefined one in new code.The intended use of Abort is to provide a means whereby one process may hint to another that the lattershould go away, after first cleaning up. An Abort signal may occur on any condition variable, and thus everymonitor should be protected by some catch phrase for it.DisableAborts: PROCEDURE [POINTER TO CONDITION];This procedure prevents a process from aborting when it waits on the specified conditionvariable. It is currently not implemented.Control of schedulingThe Mesa process mechanism does not attempt to allocate processor time fairly among processes ofequal priority. Because of this, it may be desirable for a process which does not execute WAITstatements very frequently in the normal course of its computation to occasionally yield control ofthe processor by calling the following operation.Yield: PROCEDURE;This is a hint to the scheduler to run other processes of the same priority. However, thereis no guarantee that any other process will execute before the calling process resumesexecution, even if there are processes able to execute.In no case must the logical correctness of client programs depend on the presence or absence of calls to Yield;priorities and yielding are not intended as a process-synchronization mechanism. They are only hints to assistclients in meeting performance requirements.îïïfñpôXî ìî!Ýïa×qôiî ìï^¬rôð<î ìï[]tôXututîâïXrô°ð7urô±îâïVgôŽ urô� srð0urîâïTÀôurð0îâïQ”vô­uvu vô®uv îâïP4ô�ð0ô�uvð#î ìïMuôFîÎsôXî ìïKatutîâïHrôÈôÉurîâïFkô�ô�ð:îâïDÄô›ðDurôœ îâïCôèôét rt urîâïAuôð6îâï>Jvô¢uvð>ô£îâï<éô‡ôˆuvwvwîâï;ˆvôð8î ìï8]tôXutuôF tîâï5rô¨ð7ô©ð!îâï3gôð+î Üï,ƒqôiî ìï)Wrô�srô‘ð5î ìï'Óô¸ðRô¹uî ìï&Orô�ð2ôžð1î ìï$Ëôð1î ìï!}tôXutîâï.rô“ srðIsîâï‡ôïð&ôðð0îâïßôð6rîâï´vô‚ð_ôƒ uvîâïSô”wvð7ô•îâïòôð, 8 ìÏ=çS<.Alto/Mesa Processes and Monitors49Interrupt Level ProcessesThis section should be of interest only to programmers of interrupt level code.The Mesa monitor mechanism includes an extension to cover the case of communication betweensoftware processes and Input/Output controllers (hardware and/or firmware). This is done usingthe artifact of naked condition variables; that is, condition variables which are not effectivelyprotected by a monitor lock. The need for this arises from the fact that communication with I/Ocontrollers, while similar to normal interprocess communication, suffers from the problem that thecontrollers are intrinsically unable to enter monitors. This means that two important atomicityproperties provided by monitor locks are lost:Atomicity of wakeups: Monitor locks eliminate the need for a traditional "wakeup waiting"(or "interrupt pending") flag. Lack of the monitor lock requires the provision of such aflag if lost interrupts are not to result.Atomicity of data manipulations: The monitor lock avoids the problems of critical races onshared data; traditionally, I/O architectures take an ad hoc approach to this problem, ratherthan providing any general mechanism.The approach taken is to solve the first problem in a general way, and leave the second problem forcase-by-case resolution by the designers of specific controller/software interfaces. (This closelymirrors the approach normally taken in more traditional I/O-interrupt architectures.)A software process that deals with an I/O controller does so from within what appears to be anormal monitor. The monitor data includes the status and control blocks of the device and acondition variable which the device notifies to raise an "interrupt". Since the controller can accessthe shared data at any time, however, special care must be taken by the software to avoid conflicts.Similarly, if the controller tried to notify the software between the time the software decided to waiton the condition variable, and the time that it actually performed the WAIT operation, the NOTIFYwould be lost. To prevent this, the controller does a special form of NOTIFY (a naked notify), whichsets a wakeup-waiting flag in the condition variable. This difference is invisible to the software,which does a normal WAIT operation on the condition variable.Fine Point:The compiler generates procedure calls to system functions for long division, block equal, etc. There is acompilation switch which flags all such calls; this is useful for writers of interrupt routines. See the MesaUser's Handbook, Appendix A, for more details.The traditional operations EnableInterrupts and DisableInterrupts are provided for those rarecircumstances in which seizing the entire machine is the only form of mutual exclusion whichproves sufficient. Doing a WAIT while interrupts are disabled is not recommended.InterruptLevel: TYPE = [0..15];InterruptLevels correspond to the interrupt channels described in the Alto HardwareManual (except that the numbering is different). Interrupt level 0 corresponds to Altointerrupt channel 15, the memory parity interrupt channel. Several levels are used by theMesa system. Programmers of interrupt level code should see the definitions inProcessDefs.ÿî!…ïfñpôXîI î#ïa×qôiî ‚ï^¬sôðOî ‚ï[€rô¤ð0ô¥ð+î ‚ïYüô¬ô­ðIî ‚ïXxôçôèsrð)sr î ‚ïVôôœð?ô�ð!î ‚ïUpôŸô ðPî ‚ïSìôÉð`î ‚ïRhôð.îxïOpô‰rðCîxïMrô«ð$ô¬ð5îxïKËôð*îxïH|pô–ð!rô—ð6îxïFÕô‰ôŠsrð!îxïE-ôð%î ‚ïBô‚ð5ôƒð.î ‚ï@~ôÔð+ôÕð8î ‚ï>úôðUî ‚ï;Ïô¹ðAôºî ‚ï:KôÅð!ôÆð;î ‚ï8Æô“ô”ðJî ‚ï7BôŽô�ðHî ‚ï5¾ô„ðJô…î ‚ï4:ôžðFôŸuruî ‚ï2¶rô„ô…ð-urs rî ‚ï12ô±ðVô² î ‚ï/®ôurð%î ‚ï,¦v îxï)Áô²ðkîxï(„ô«ð=ô¬ð-wîxï'Fôvî ‚ï$>rô�trô‚trî ‚ï"ºôÍð8ôÎð$î ‚ï!6ôvuvð2î ‚ïçtôXut îxï™ rôÕð7ôÖs îxïñrôÅ ôÆðDîxïJôžðZîxï£ô"ô#ð3îxïût rÿ ¶ ‚´>çTWCAlto/Mesa Processes and Monitors50ConditionVector: TYPE = ARRAY InterruptLevel OF POINTER TO CONDITION;CV: POINTER TO ConditionVector = -- magic constant --;CV points to an array of pointers to the naked condition variables described above. Toassociate a CONDITION with an interrupt level, assign a pointer to the CONDITION to thecorresponding element of CV (CV[level] _ @cVar). To disable the naked NOTIFYs,assign NIL.DisableInterrupts, EnableInterrupts: PROCEDURE;These are MACHINE CODE procedures which disable and enable the handling of interrupts atthe lowest level. They should be used only in matching pairs and only when no otherexclusion mechanism will suffice. A count is maintained of the number of unmatchedDisableInterrupts so that nested pairs will work correctly.îïïfñpôXî ìî ìïbtututuôFtî ìï^ÏôXuôFtôXxtîâï[€rô¯ð6ô°îâïYÙô¹ urôºurîâïX2ôÆtrtrôÇurîâïVŠôurî ìïS [type: DataSegmentType _ UnknownDS,-- type of data segmentpages: [1..PagesPerMDS],-- number of pages. . .],file => [swappedin: BOOLEAN, -- TRUE iff segment is inÿîI ïfñpî!›ï\áqôiî(ïYÙrôX î ‚ïTãô‰ð5ôŠsrî ‚ïS<ô“srô”ðIî ‚ïQ”ô¨ð\ô©î ‚ïOíô‚ ôƒtrtrtrð&î ‚ïNFô‡ð)trôˆð2î ‚ïLžôð:î ‚ïIPôÊôËs urî ‚ïG¨s urôîs rôïî ‚ïFô�ô‚ð"s urî ‚ïDZôð^î ‚ïA ôÙð+surôÚsî ‚ï?d urô�ôžðMî ‚ï=¼ô¹ôºðLî ‚ï<ô“ô”s urð8î ‚ï:nôŒô�ðEî ‚ï8ÆôËð+ôÌð/î ‚ï7ôî ‚ï3Ðô¿ðEôÀî ‚ï2)ô¡ð_î ‚ï0‚ô—ð.ô˜sursî ‚ï.Ú urô–ô—ð7s rî ‚ï-3ôî(�ï'÷qî ‚ï$¨rô‘ð+ô’ð5î ‚ï#ôð7î ‚ï²svsv sî ‚ïc vsî ‚ïwvw vwîüïmsîüïÆô€î(ËtîüïsôvsvîxïwsîóïÐô€ð"î2·tôîóï)sô€î(Ëtôîóï �sîxï Úîóï 3 uô€vsrî(Ëtôvt   ‚ ì=ç^GAlto/Mesa Segment Package52write: BOOLEAN,-- access optionsclass: FileSegmentClass,-- {code, other}inuse: BOOLEAN,-- software LRU bitlock: SegLockCount,-- locking reference countpages: [1..PagesPerMDS],-- number of pages, beginning with basefile: FileHandle,-- see the file packagebase: PageNumber,-- first page of the file to include . . .],ENDCASE]; The procedures which manipulate undiscriminated segments are:VMtoSegment: PROCEDURE [a: POINTER] RETURNS [SegmentHandle];The handle for the segment containing the specified address (as currently laid out inmemory) is returned. NIL is returned if no segment contains the segment; this does notimply that the page containing the address is free, however, since it may be reserved forsome operation currently in progress.SegmentAddress: PROCEDURE [seg: SegmentHandle] RETURNS [POINTER];The address of the beginning of the segment is returned; NIL is returned if the segment is afile segment and not currently swapped in. To guarantee the validity of the address thesegment should be locked when this procedure is called (see below), since the system mayswap out file segments that are not locked. Beware of dangling references!Data SegmentsData segments are associated only with virtual memory (there is no swapping file) and are nevermoved or swapped out.DataSegmentHandle: TYPE = POINTER TO DataSegmentObject;DataSegmentObject: TYPE = data SegmentObject;The procedures which manipulate data segments are:NewDataSegment: PROCEDURE [base: PageNumber, pages: PageCount]RETURNS [DataSegmentHandle];Creates a new data segment and returns a handle for it. If base is DefaultBase then thesegment is allowed to begin on any free page in memory. If base is an actual pagenumber (in [0..MaxVMPage]), an attempt is made to place the segment at that location.Note that pages should not be defaulted.DataSegmentAddress: PROCEDURE [seg: DataSegmentHandle] RETURNS [POINTER];Returns a pointer to the base of the segment in virtual memory. In the currentimplementation, segments always begin on a page boundary.î½ïfñpôXî ìî]ïbsuô€vsî%5tôî]ï`vsuô€sî%5tô î]ï^Ïsô€vsî%5tôî]ï](suô€s î%5tôî]ï[€suô€sî%5tôð%î]ïYÙsuô€s î%5tôî]ïX2suô€s î%5tôð"î]ïVŠsîâïTãvsxî ìïQ”rôXð=î ìïNFsô vsvsvsîâïJ÷rôßð;ôàîâïIPô²vrð'ô³îâïG¨ô¬ðBô­îâïFôð%î ìïB²svsvsvsuîâï?drô‡ð9vrôˆîâï=¼ô®ð*ô¯ð.îâï<ôšðItr îâï:nôð-tî#ï51qôi î ìï1ãrô«ô¬ðNî ìï0;ôî ìï,ísvsv sî ìï)žvsuî ìï&OrôXð2î ìï#sôvsð%î fï!Yvsîâï rô�ð/ô‚ srs rîâïcôÅð/ôÆ srîâï¼ô— s rô˜ð'îâïô srî ìïÆsvsvsvsîâïwrôð/ôîâïÐôð9 ì‰=çW‚@Alto/Mesa Segment Package53VMtoDataSegment: PROCEDURE [a: POINTER] RETURNS [DataSegmentHandle];The handle for the segment containing the specified address (as currently laid out inmemory) is returned. NIL is returned if no data segment contains it; this does not implythat the page containing the address is free, however, since it may be assigned to a filesegment, or reserved for some operation currently in progress.DeleteDataSegment: PROCEDURE [seg: DataSegmentHandle];The specified data segment is deleted and its segment object freed. When a segment issuccessfully deleted, any VM that it occupied becomes free.EnumerateDataSegments: PROCEDURE [proc: PROCEDURE [DataSegmentHandle] RETURNS [BOOLEAN]]RETURNS [DataSegmentHandle];Calls proc once for each data segment currently defined. If proc returns TRUE,EnumerateDataSegments returns the handle of the last segment processed. If the endof the set of data segments is reached, NIL is returned.As a debugging aid, data segments now have types.DataSegmentType: TYPE = CARDINAL[0..377B];The Debugger's COremap command will now display the type of the data segment. Defined typesare:UnknownDS: DataSegmentType = 0;FrameDS: DataSegmentType = 1;TableDS: DataSegmentType = 2;HeapDS: DataSegmentType = 3;SystemDS: DataSegmentType = 4;BitmapDS: DataSegmentType = 5;StreamBufferDS: DataSegmentType = 6;Clients can supply their own type which will be printed numerically. Clients should use type valuesgreater than 20B to allow room for more common types to be printed symbolically by theDebugger.File SegmentsUnlike data segments, file segments are associated with a contiguous group of pages in a file andare therefore swappable. Pointers into a file segment are valid only while it is swapped in (andlocked so that it will not be swapped out). A file segment that is swapped out occupies no space invirtual memory other than the segment object which describes it. If the LRU bit (inuse) is set, theswapper will ignore this segment on its first search for free pages. The swapper resets this bit, sothe segment will be considered for swapping if a second pass is necessary.FileSegmentHandle: TYPE = POINTER TO FileSegmentObject;ÿî#SïfñpôXîI î ‚ïbsôvsvsvsîxï^Ïrôßð;ôàîxï](ô§vrð6ô¨ îxï[€ô¸ðFô¹îxïYÙôð>î ‚ïVŠsvsîxïSsr î ‚ïÆôœô�ðEî ‚ïôðJî ‚ïÐsvsv sÿŠ �‰=èW‚Alto/Mesa Segment Package54FileSegmentObject: TYPE = file SegmentObject;To create new file segments, useNewFileSegment: PROCEDURE [file: FileHandle, base: PageNumber, pages: PageCount, access: AccessOptions]RETURNS [FileSegmentHandle];Creates a new segment and returns a handle for it. The segment is associated with thecorresponding file pages, but the file is not opened and the segment is not swapped in. Ifbase is DefaultBase, the segment will begin with the first data page of the file, and ifpages is DefaultPages, it will include the last page of the file. Although it is generallynot done, a segment can begin with the leader page (page zero) of a file. Finally, ifaccess is DefaultAccess, read access is assumed.If the access specifies that changing the data is permitted, then whenever it is necessary to swap thissegment out and remove its pages from memory, pages will be written to the file (the Alto has nohardware to detect if the pages have actually been changed). It is possible to change the segment'saccess (by setting the write bit, for example), provided the file to which it is attached has theappropriate access rights.FileSegmentAddress: PROCEDURE [seg: FileSegmentHandle] RETURNS [POINTER];The address of the beginning of the segment is returned. The signal SwapError is raisedif the segment is not currently swapped in. To guarantee the validity of the address, thesegment should be locked when this procedure is called (see below), since the system mayswap out file segments which are not locked. Beware of dangling references!VMtoFileSegment: PROCEDURE [a: POINTER] RETURNS [FileSegmentHandle];The handle of the file segment containing the specified address (as currently laid out inmemory) is returned. NIL is returned if no file segment contains it. This does not implythat the page containing the address is free, however; it may be assigned to a data segment,or reserved for a segment currently being swapped in.DeleteFileSegment: PROCEDURE [seg: FileSegmentHandle];The specified file segment is deleted and its segment object is released. If the segment isswapped in, it is first swapped out (it should not be locked). If there are no other segmentsassociated with this segment's file (the file's segcount is zero), then ReleaseFile is calledto release the FileObject. When a segment is successfully deleted, any VM which it mayhave occupied becomes free.EnumerateFileSegments: PROCEDURE [proc: PROCEDURE [FileSegmentHandle] RETURNS [BOOLEAN]]RETURNS [FileSegmentHandle];Calls proc once for each data segment currently defined. If proc returns TRUE,EnumerateFileSegments returns the handle of the last segment processed. If the endof the set of data segments is reached, NIL is returned.If file segments are created while EnumerateFileSegments is in control, it is not guaranteedthat they will be included in the sequence of FileSegmentHandles passed to proc.ÿî½ïfñpôXî ìî ìïbsô€vsî ìï^ÏrôXî ìï[€sôvsî fïYÙô—ô˜ð;î fïX2vsôîâïTãrô¶ð?ô·îâïS<ô“ð-ô”ð.îâïQ”srôžs rôŸðDîâïOísrô�s rð<ô� îâïNFôË ôÌðKîâïLžsrôs rî ëïIPô†ðMô‡î ëïG¨ô–ð%ô—ð;î ëïFôŽô�ðKî ëïDZô»srð(ô¼î ëïB²ôî ìï?dsvsvsvsîâï<rôŽð+ô�sr îâï:nô¥ô¦ðEîâï8ÆôšðItr îâï7ôð.tî ìï3Ðsvsvsvsîâï0‚rô¶ðCô·îâï.Úô¡vrð-ô¢îâï-3ôˆðNô‰ îâï+Œôð5î ìï(=svsîâï$îrôžôŸðJîâï#Gô‚ôƒðMîâï! ô�ð0srô‚s r îâïøôŽs rð!ô�îâïQôî ìïsvsî fï[vsvsvsî fï´vsîâïerôsrôð3srvuîâï¾srôŸ ô ð2îâïôð(vr î ëï Èô´ôµsrð$î ëï ôð.sur sr \ ë Ù=è\2YAlto/Mesa Segment Package55Window SegmentsA window segment is similar to a file segment, except that the base and pages fields of thesegment may be altered (using the procedures described below) after it is created, in order to slidethe window around in a file or to vary the window's size. In reality, all file segments are in factwindow segments, and may be moved with the following procedure:MoveFileSegment: PROCEDURE [seg: FileSegmentHandle, base: PageNumber, pages: PageCount];If the segment is swapped in, it is first swapped out (it should not be locked). The segmentis then moved to the new location in the segment's file, but it is not swapped in. Thebase and pages are defaulted as in NewFileSegment.Fine point: in the current implementation, the disk address of the original segment is retained as a hint aboutthe new location, thus improving performance considerably when a one page segment is slid forward orbackward in a file.If the original and final position of the segment overlap, there is no guarantee that the overlappingpages are actually written, nor is it guaranteed that a minimum number of pages are transferred.Swapping SegmentsA segment can be swapped into and out of VM. The procedures and signals which implement thisare described in this section:SwapIn: PROCEDURE [seg: FileSegmentHandle];Swaps in the specified segment (if it is swapped out), opening the associated file ifnecessary; locks it so it won't be moved or swapped out. A SwapError will result if thesegment already has MaxSegLocks locks on it, or if the segment's file has MaxRefssegments currently attached to it and swapped in.To unlock a segment (allow it to be swapped), use the procedureUnlock: PROCEDURE [seg: FileSegmentHandle];Unlocks the specifed segment so that it can be swapped out. Note that locking behaves likereference counting, so that locks (performed by SwapIn) must be properly paired withUnlocks.A segment is swapped out usingSwapOut: PROCEDURE [seg: FileSegmentHandle];Swaps out the specified segment, writing the pages back to the file if the segment's accessmakes this necessary, and free the segment's VM pages. If the segment is locked, aSwapError will be generated.A program may explicitly request that the file pages corresponding to a segment be updated bycalling:î#SïfñpôXîI î%xïa×qôiî ‚ï^‰rô»ð>ô¼srsr î ‚ï\áô”ô•ðNî ‚ï[:ô¡ð9wô¢rð)î ‚ïY“ôð?î ‚ïVDsvsîüïT�ð<îxïQNrô‚ôƒðLîxïO§ô¶ðNô·îxïMÿsrôsrs rîxïK¨wô†ð?ô‡ð1îxïJGôÉð9ôÊð+îxïHæôî ‚ïE»rô�ð"ô‘ðCî ‚ïDô¬ð`î$ûï>×qôiî ‚ï;ˆrô‹ð,ôŒð1î ‚ï9áôî ‚ï6’svsîxï3CrôîðRôïîxï1œô–ð9ô—srîxï/õô¾s rô¿sîxï.Mrôð1î ‚ï*ÿð?î ‚ï'°svsîxï$arô�ðVô‚îxï"ºô¼ô½srîxï!surî ‚ïÄôî ‚ïusvsîxï'rôœô�ðRîxïôÛð:ôÜîxïØsrôî ‚ï‰ôµð4ô¶ð)î ‚ïâö ‚›=çYp Alto/Mesa Segment Package56SwapUp: PROCEDURE [seg: FileSegmentHandle];Write the pages of the segment back to the file if the access requires it. This operationdoes not unlock the segment or free the segment's VM pages.Note that neither SwapIn, SwapOut, or SwapUp are capable of extending a file (physicallyadding pages or bytes to it) based on the size of a segment. Segments may be attached only topages of a file that are already allocated on the disk (and chained together). Extending (orcontracting) a file must be done using other mechanisms (for example, see SetEndOfFile in thefile package).SignalsThe following signals may be generated by the segment package:InvalidSegmentSize: SIGNAL [pages: PageCount];In NewDataSegment or NewFileSegment a zero length segment has been requested,or the length exceeds the size of virtual memory.InsufficientVM: SIGNAL [needed: PageCount];In NewDataSegment or SwapIn there is not enough contiguous memory to accomodatea segment; needed is the number of pages that are actually required. If resumed, theallocation will be retryed; this gives the catcher of this signal a chance to free up some VM.Users can free VM pages by deleting data segments and by allowing locked segments tobecome swappable (see also the section below on swapping strategies).VMnotFree: SIGNAL [base: PageNumber, pages: PageCount];In NewDataSegment the base was not DefaultBase and the specified memory pageswere not free.SwapError: SIGNAL [seg: FileSegmentHandle];An invalid swapping operation was attempted with seg.SegmentFault: SIGNAL [seg: FileSegmentHandle, pages: PageCount];End of file was encountered while attempting to swap the segment in or out; pages is theactual number of pages in the segment. If pages is greater than zero then the signal maybe resumed; the segment will be truncated accordingly (of course, this will not alter the filelength).Low Level Memory AllocationOperations are provided for users that have a need to control memory allocation at a lower levelthan provided above. Allocation is controlled by the information in an AllocInfo (which is passedalong with each operation).ÿî½ïfñpôXî ìî ìïbsôvsîâï^Ïrô®ðKô¯îâï](ôð;î ëïYÙô¼srsrsrð,î ëïX2ô«ô¬ðBî ëïVŠôÝðOôÞ î ëïTãô¥ô¦ð*s rî ëïS<ô î%ÍïMÿqî ìïJ±rð>î ìïGbsuvsîâïDrôšs rs rð*îâïBlôð1î ìï?s uvsuîâï;Ïrô‚s rsrð4îâï:'ôµ srð4ô¶îâï8€ô„ð&ô…ð8îâï6Ùô°ô±ðCîâï51ôðEî ìï1ãsuvsð%uîâï.”rô¦s rs rîâï,íô î ìï)žs vsîâï&Orð1srî ìï#s vsð,îâï²rôŒðFô�srîâï ôŽð+srð)îâïcô‰ðUôŠîâï¼î°ïqôiî ìï1rô§ð=ô¨ð#î ìï‰ôŠðGô‹srî ìïâôÿR ë›=èYpAlto/Mesa Segment Package57AllocInfo: TYPE = RECORD [effort: {hard, easy},direction: {topdown, bottomup},. . . ];If the effort field is hard, unlocked read-only file segments will be pushed out of the way. Thedirection field specifies the direction of the search for a hole. In the above procedures, datasegments are allocated topdown, and file segments are allocated bottomup. The followingconstants have been defined:EasyUp: AllocInfo = [effort: easy, direction: bottomup];EasyDown: AllocInfo = [effort: easy, direction: topdown];HardUp: AllocInfo = [effort: hard, direction: bottomup];HardDown: AllocInfo = [effort: hard, direction: topdown];The operations which perform low-level memory allocation are:MakeDataSegment: PROCEDURE [base: PageNumber, pages: PageCount, info: AllocInfo _ EasyDown]RETURNS [DataSegmentHandle];Acts like NewDataSegment, except info is passed as an additional parameter; the samerestrictions apply and the same signals may be generated.MakeSwappedIn: PROCEDURE [seg: FileSegmentHandle, base: PageNumber, info: AllocInfo _ EasyUp];Acts like SwapIn, except info and base are passed as additional parameters; the samerestrictions apply and the same signals may be generated. If base is DefaultBase thenthe segment is allowed to begin on any free page in memory. If base is an actual pagenumber (in [0..MaxVMPage]), an attempt is made to place the segment at that location(VMnotFree will be raised if the specified pages are not available).Swapping StrategiesA mechanism is provided for informing the segmentation package of emergency measures which canbe taken when the signal InsufficientVM is (about to be) generated. These measures take theform of SwappingProcedures which, when called by the swapping manager, attempt to makemore room in virtual memory and return a BOOLEAN indicating their success or failure to do so.The swapping manager invokes each procedure in turn, retrying the allocation after each procedurewhich has indicated success, until sufficient memory is obtained. If all such procedures indicatefailure, the signal InsufficientVM is raised (the swapping manager is not crying wolf!).The swapping strategies are maintained as a linked list of SwapStrategy nodes whose proceduresare invoked from head to tail.SwappingProcedure: TYPE = PROCEDURE [needed: PageCount, info: AllocInfo, seg: SegmentHandle]RETURNS [BOOLEAN];The parameters supplied to swapping procedures allow them to make intelligent decisions aboutmaking room: needed is the number of pages requested, info the AllocInfo supplied to theallocator, and seg the file segment that will use the allocated memory (NIL if unknown). î#SïfñpôXîI î ‚ïbsô vsvsîüï`vîüï^Ïîüï](î ‚ïYÙrô˜sr srð"ô™ð$î ‚ïX2srô½ð2ô¾ð%î ‚ïVŠôÛsrôÜsrî ‚ïTãôî ‚ïQ”sð8î ‚ïOíð9î ‚ïNFð8î ‚ïLžð9î ‚ïIPrð=î ‚ïFsvsîüïDZð?îüïB²vsîxï?drô• s rsr ô–ð"îxï=¼ôð9î ‚ï:nsvsîüï8ÆðDîxï5xrô« srô¬srsrð.îxï3Ðôšô›ð,srs rîxï2)ô ð@srô¡îxï0‚ôž s rð*ôŸîxï.Úsrôð:î$Ôï)žqôiî ‚ï&Orô€ðTô� î ‚ï$¨ô¯s rô°ð5î ‚ï#ô©surð7ôªî ‚ï!Yô©ôª vrð.î ‚ï²ô�ðLô‘î ‚ï ô³ð4ô´ð.î ‚ïcôs rð6î ‚ïôŠð:ô‹s rî ‚ïmôî ‚ïsvsvsîüïwð7îüïÐvsvsî ‚ï �rô»ð9ô¼ð$î ‚ï Úôµ srô¶ srsrî ‚ï 3ôsrð6vr ÿ T ‚ ì>ç^CAlto/Mesa Segment Package58SwapStrategy: TYPE = RECORD [link: POINTER TO SwapStrategy,proc: SwappingProcedure];The swapping manager initializes the list with a single node which invokes code swapping as a lastresort.StrategyList: POINTER TO SwapStrategy _ @LastResort;LastResort: SwapStrategy = SwapStrategy[NIL, TryCodeSwapping].Swapping procedures are added to and removed from the list by the procedures:AddSwapStrategy: PROCEDURE [strategy: POINTER TO SwapStrategy];The specified strategy node strategy is added to the head of the list of swappingprocedures. If strategy is already on the list, its position and content are not disturbed.RemoveSwapStrategy: PROCEDURE [strategy: POINTER TO SwapStrategy];The specified strategy node is removed from the list of swapping procedures.Currently, TryCodeSwapping uses an (approximately) LRU (least-recently-used) algorithm tochoose a code segment to swap out. Only code segments which are not locked are considered.Unlocked read-only file segments are also swapped out by TryCodeSwapping.Since it is unattractive to require that the code for swapping strategies (other thanTryCodeSwapping) be locked, swapping procedures should observe the following conventions:If such a procedure obtains a state in which it has nothing to swap, it should either remove thenode containing itself from the strategy list or change the procedure in the node to beCantSwap: SwappingProcedure;Because CantSwap is part of the swapping manager (and therefore locked), this will avoidswapping in a strategy procedure which knows it has nothing to do.Miscellaneous ProceduresThe following procedures implement conversion between memory addresses and virtual memorypage numbers.PageFromAddress: PROCEDURE [a: POINTER] RETURNS [PageNumber];AddressFromPage: PROCEDURE [p: PageNumber] RETURNS [POINTER];PagePointer: PROCEDURE [a: POINTER] RETURNS [POINTER];PagePointer returns the address of the beginning of the page which contains itsargument.ÿî½ïfñpôXî ìî ìïbsô vsvsî fï`vv s î fï^Ïî ìï[€rô”ð[ô•î ìïYÙî ìïVŠsô v sî ìïS<ð(vsî ìïOírðMî ìïLžsvs v sîâïIPrôîôïsrð-îâïG¨ô�srð9ôž î ìïDZsôvs v sîâïA rðLî ìï=¼ôÑ srôÒð7î ìï<ôºðOô» î ìï:nôð9srî ìï7ô`ð1ôað$î ìï5xsrô°ô±ð*î ìï3Ðô®ð3ô¯ð-î ìï2)ôðWî ìï.Úsî ìï+Œrôåsr ôæð=î ìï)äôðBî)ï$¨qôiî ìï!YrôÂðRôÃî ìï²ô î ìïcsvsvsvs î ìïvsvsvsî ìïÆ vsvsvsvsîâïw rôð7ô îâïа ì‰>çW‚õAlto/Mesa Segment Package59The following procedures implement conversion between FileSegments and DataSegments.Note that both segments must exist at the time of the call, and neither is destroyed. They must beof the same length (a SwapError will result otherwise).CopyDataToFileSegment: PROCEDURE [dataseg: DataSegmentHandle, fileseg: FileSegmentHandle];Initializes a file segment to have the contents of a data segment.CopyFileToDataSegment: PROCEDURE [fileseg: FileSegmentHandle, dataseg: DataSegmentHandle];Initializes a data segment to have the contents of the file segment.Extended Memory OperationsConfiguration InformationThe Mesa runtime system has an internal data structure that contains information about thehardware configuration of the machine on which it is running. Clients may obtain a copy of thisdata structure by calling GetMemoryConfig and should normally test for the existence ofextended memory by examining the useXM field. The extant banks of memory are indicated byMemoryConfig.banks, which is a bit mask (e.g., MemoryConfig.banks=140000B impliesthat banks zero and one exist).BankIndex: TYPE = [0..17B];ControlStoreType: TYPE = {Ram0, RamandRom, Ram3k, unknown};MachineType: TYPE = {unknown0, AltoI, AltoII, AltoIIXM, . . . };MemoryConfig: TYPE = MACHINE DEPENDENT RECORD [reserved: [0..37B],AltoType: MachineType,xmMicroCode: BOOLEAN,useXM: BOOLEAN,mdsBank: BankIndex,controlStore: ControlStoreType,banks: [0..177777B],mesaMicrocodeVersion: [0..177777B]];memConfig: PUBILC READONLY MemoryConfig;GetMemoryConfig: PROCEDURE RETURNS [MemoryConfig] = INLINEBEGIN RETURN[memConfig] END;The field memConfig.useXM is true if and only if the following conditions hold:1)the machine is an Alto II with XM modifications (AltoType = AltoIIXM),2)the Alto has more than one memory bank installed (banks ~= 100000B),î#SïfñpôXîI î ‚ïbrôØð"ôÙs rs rî ‚ï`vô�ð?ôŽð$î ‚ï^Ïôsrî ‚ï[€svsîüïYÙð8îxïVŠrðBî ‚ïSJôósrôôî ‚ï<¢ô›ôœsrð4î ‚ï:ûs psrô² ô³ trs psvsrî ‚ï9Tôî ‚ï6svôFsôXvsî ‚ï2¶vôFsôXð%î ‚ï/h vôFsôX vsvsvsî ‚ï, vôFsôXvôFsôXîýï*rsîýï(Êsîýï'#s vsîýï%|svsîýï#Ôsîýï"-sîýï †sîýïÞsð$î ‚ï�vôFs vî ‚ïAsvsôXvîýïšvôF s vî ‚ïKrô srð6îëïüî«ð1srvrsrîëïUî«ð2srvrsrÿ( ‚>çYýAlto/Mesa Segment Package603)the Alto has a 3K RAM, or it has a second ROM containing an appropriate version ofthe XMesa microcode.The microcode version field tells only the microcode version, not the Mesa release number. (See theMesa User's Handbook, Appendix G, for a discussion of microcode versions)Extended Memory ManagementThe facilities described in this section can be used regardless of the state of useXM.Segments in extended memory are created with the usual primitives in SegmentDefs. However,additional "default" parameter values for those procedures that expect a VM base page numberhave been provided. DefaultMDSBase requests allocation anywhere in the MDS.DefaultXMBase requests allocation anywhere in the extended memory banks but not in theMDS. DefaultBase0, DefaultBase1, DefaultBase2 and DefaultBase3 request allocationin particular banks. DefaultANYBase requests allocation anywhere in the extended memorybanks or the MDS. DefaultBase is equivalent to DefaultANYBase if the segment is a codesegment, otherwise, it is equivalent to DefaultMDSBase.The following procedures convert between segment handles and long pointers, and work forsegments anywhere in the 20-bit address space.LongVMtoSegment: PROCEDURE [a: LONG POINTER] RETURNS [SegmentHandle];LongSegmentAddress: PROCEDURE [seg: SegmentHandle] RETURNS [LONG POINTER];LongVMtoDataSegment: PROCEDURE [a: LONG POINTER] RETURNS [DataSegmentHandle];LongDataSegmentAddress: PROCEDURE [seg: DataSegmentHandle]RETURNS [LONG POINTER];LongVMtoFileSegment: PROCEDURE [a: LONG POINTER] RETURNS [FileSegmentHandle];LongFileSegmentAddress: PROCEDURE [seg: FileSegmentHandle]RETURNS [LONG POINTER];The following definitions are in AltoDefs; they define parameters of the extended memory system.MaxVMPage: CARDINAL = 7777B;MaxMDSPage: CARDINAL = 377B;PagesPerMDS: CARDINAL = MaxMDSPage+1;The following procedures convert between page numbers and long pointers, and are analogous toAddressFromPage and PageFromAddress.LongAddressFromPage: PROCEDURE [page: AltoDefs.PageNumber]RETURNS [lp: LONG POINTER];ÿî½ïfñpôXî ìî Uïbrîô¢ ô£ðFîï`vôî ìï](ô�ð+tr trô‚ î ìï[€tôrp rð)î ìïW^tôXî ìïTrôðPsrî ìïPÁô•ðAô–s r î ìïOô¼ðKô½î ìïMrô{s vrð(î ìïKËs vôÔrðAôÕî ìïJ#ô­ô®s rs rs rs rî ìïH|ôÎs vrôÏð+î ìïFÕô± ô²s rs rtî ìïE-rôð!s rî ìïAßôíôîð@î ìï@7ôð.î ìï<ésvsôXvsvsvôFsôXvsvî ìï9šsvsvsvsvsvôF svî ìï6KsvsôXvsvsvôFsôXvsvî ìï2ýsvsvsvsî gï1UvsvôF svî ìï.svsôXvsvsvôFsôXvsvî ìï*¸svsvsvsî gï)vsvôF svî ìï%Ârô…ð!srô†î ìï"ssvsôXvsvsvî ìïøs vsvsvsvî ìï}s vsvsvs vî ìï/rô¦ðLô§î ìï‡srôsrî ìï9svôF sôXî gï‘vsvôF svÿ ìJ>çTÁhAlto/Mesa Segment Package61PageFromLongAddress: PROCEDURE [lp: LONG POINTER]RETURNS [page: AltoDefs.PageNumber];The following procedures check the validity of long pointers and page numbers and raise theindicated errors.ValidateVMPage: PROCEDURE [page: UNSPECIFIED];InvalidVMPage: ERROR [page: UNSPECIFIED];ValidateLongPointer: PROCEDURE [a: LONG UNSPECIFIED];InvalidLongPointer: ERROR [lp: LONG UNSPECIFIED];Restrictions, Limitations, and "Features"Bank Registers. Mesa assumes it has exclusive control of the emulator bank register on AltoIIXMs.Client programs must not attempt to alter the bank register, but rather must use the publicinterfaces for moving data to and from extended memory (see LongCOPY and BitBlt, above).Segment Alignment. Segments may not cross bank boundaries. The first page of each non-MDSbank is reserved for internal allocation tables.Swapper Algorithms. The swapper loads a segment into extended memory by first swapping it intoprimary memory, then copying it to extended memory and releasing the MDS memory space.Thus, if the MDS is so full that the requested segment cannot be swapped in, InsufficientVM willbe raised, even though sufficient space for the segment may exist in other banks. (Analogouscomments apply when swapping out segments that must be written to disk.)î#SïfñpôXîI î ‚ïbsvôF sôXvôF sîýï`vvsôXvsvî ‚ï](rôÓð"ôÔð9î ‚ï[€ôî ‚ïX2s vôF svsôXv svî ‚ïU·s vôFsvsôXv svî ‚ïSç13Å62Alto/Mesa Storage Management FacilitiesOctober 1980Two collections of Mesa procedures are available for acquiring and managing storage areas. Thesegmentation machinery, which is described in detail elsewhere, provides contiguous groups of pages(256 word blocks) in the virtual memory. A simplified interface with that machinery is describedbelow. There is also a Mesa free storage package for managing arbitrarily sized nodes within freestorage zones. Since all state information is recorded within the zones themselves, the system-provided instantiation of the latter package can manage an arbitrary number of zones. There is onesystem-defined zone, called the free storage heap, available for general use; special procedures existfor creating and destroying nodes within it. The salient characteristics of these packages aresummarized below.The segmentation machinery is most suitable for obtaining large blocks of storage. All bookkeepinginformation associated with such blocks is recorded in auxiliary tables that are managed by thesegmentation system, not in the blocks themselves. Allocating or releasing a segment involvessearching and updating a number of those tables. On the other hand, any freed page becomesavailable for general use by the system (loading, buffering, etc.) and any two adjacent free pages canbe coalesced to become part of a new segment.The free storage package is a transliteration of a BCPL program by Ed McCreight that was itselfbased upon a suggestion by Don Knuth (The Art of Computer Programming, Volume 1, p. 453,#19). Within a zone, free nodes are kept as a linked list. One hidden word containingbookkeeping information is stored with each allocated node, and additional bookkeepinginformation is kept in the header of each zone. Allocation and release of nodes are usually veryfast. Adjacent free nodes are always able to be coalesced. It is also possible to add new areas ofstorage to enlarge a zone. These new areas are linked together so that they may be deleted if allthe nodes in an area are free; in addition, an entire zone may be deleted.The free storage package performs best when the sizes of nodes are small compared to the sizes ofthe block(s) making up the zone. In particular, the system's heap is intended to be used for small,transient data structures, such as the nodes of a temporary list structure or the bodies of (short)strings when the maximum length must be computed dynamically or the structure must outlive theframe that creates it. Use of the heap for large (i.e., multipage) nodes decreases flexibility instorage management, since the additional pages may become a permanent part of the zone.The allocators in both packages return absolute pointers; allocated nodes are not relocatable andthere is no garbage collection or automatic deallocation of any sort. Also, the values returned bythe allocators are free pointers (type POINTER TO UNSPECIFIED) which must be cast appropriately(usually by assignment) before they can be used.î ìïfñpî<ï\áqôið'î$qïYÙrôX î ìïTãô©ðBôªî ìïSôµîwïO§ôî ‚ïLXð+î ‚ïI u tutuvî ‚ïE»rô”ð'ô•ð;î ‚ïBluôtu tututuîwï?ñrðQî ‚ï= utu tutu tuî ‚ï:' tutuî ‚ï7B tutututuîwï4Çrtrð'î ‚ï1yurð+î ‚ï.*ôð8ôî ‚ï,ƒu rô´ôµu rî ‚ï*Ûî ‚ï'�uôtu tututuîwï$>rôˆu rðFîwï"—î ‚ïHuôêtu tututuîwïùrô u rî ‚ï«u tututu tuîwï\rð=î ‚ï u tutuvîkï¿r urÿ^ ‚x=çY“Alto/Mesa Storage Management Facilities64AllocatePages: PROCEDURE [npages: CARDINAL] RETURNS [base: POINTER];Like Storage.Pages, except that it doesn't try to move unlocked file segments out of theway.AllocateResidentPages: PROCEDURE [npages: CARDINAL] RETURNS [base: POINTER];The same as Storage.Pages.PagesForWords: PROCEDURE [nwords: CARDINAL] RETURNS [npages: CARDINAL];The same as Storage.PagesForWords.FreePages: PROCEDURE [base: POINTER];The same as Storage.FreePages.Free Storage PackageThe following definitions are available in FSPDefs. A zone is a block of storage containingembedded nodes. The length of either a zone or a node is a value of typeBlockSize: TYPE = INTEGER [0..VMLimit/2]; -- 15 bits.Each zone is headed by a ZoneHeader, which is a monitored record with the following publicfields:. . .threshold: BlockSize,-- minimum node size in zonechecking: BOOLEAN,-- zone checking (see below). . .Zones are identified by pointers of typeZonePointer: TYPE = POINTER TO ZoneHeader; Associated with each zone is a procedure of typeDeallocator: TYPE = PROCEDURE [POINTER]; which is used to deallocate the storage used by the zone. The following Deallocator may besupplied when nothing is to be done to the storage being freed:DoNothingDeallocate: Deallocator; Zone OperationsAn arbitrary block of (uninterpreted) storage is converted to a zone by the procedureMakeNewZone: PROCEDURE [base: POINTER, length: BlockSize, deallocate: Deallocator]RETURNS [z: ZonePointer];Such a block can alternatively be made an extension of an existing zone by callingÿî¾ïfñpôXð'î ìî ìïbuôtu tututuîáï^ÏrôŒu rô�ð6îáï](î ìïZCuôtu tututuîáïVôr u rî ìïTutu tutu tuîÕïPÁr urî ìïMÜu tutuîÕïJ�r urî ŸïEQqôiî ìïBrôÎð+ursrôÏî ìï@[ôsrð;î ìï= u tutups î ìï9½rô® ô¯ u rð7î ìï8îáï51pôîáï3Šuô€î ?sôîáï1ãuô€ tuîÄsôîáï0;pî ìï,írð(î ìï*u tututu rî ìï&¹ð0î ìï#Ôu tutrî ìï †ô¸ð'ô¹ð"u rî ìïÞôð?î ìïùutrî#iï×pôXî ìïˆrôðUî ìï¤u tuî fïütuð-î fïUtuî ìï rðRÿ ì ¿=ç]LAlto/Mesa Storage Management Facilities65AddToNewZone: PROCEDURE [z: ZonePointer, base: POINTER, length: BlockSize, deallocate: Deallocator];The following procedures default DoNothingDeallocate as the Deallocator:MakeZone: PROCEDURE [base: POINTER, length: BlockSize] RETURNS [z: ZonePointer];AddToZone: PROCEDURE [z: ZonePointer, base: POINTER, length: BlockSize];The following errors can be raised if the space provided is not a reasonable size.ZoneTooSmall: ERROR [POINTER];The storage provided is not large enough for a ZoneHeader plus one free node and oneallocated node.ZoneTooLarge: ERROR [POINTER];The storage provided is too large to be represented by a BlockSize (15 bits)PruneZone: PROCEDURE [z: ZonePointer] RETURNS [BOOLEAN];TRUE is returned if any areas were freed, otherwise FALSE.A zone may be destroyed and all its storage freed by callingDestroyZone: PROCEDURE [z: ZonePointer];No check is made for any nodes that are in use.Warning: This operation cannot be protected by the monitor, and can therefore result insevere errors if another process is inside the zone.Node OperationsThe largest node that can be allocated in a virgin block of size length is length-ZoneOverhead.A node is allocated byMakeNode: PROCEDURE [z: ZonePointer, n: BlockSize] RETURNS [POINTER];The value returned points to a block of n words; there is an additional hidden word ofoverhead (at offset-1) which must be preserved by users of the node. Nodes are sometimessplit to satisfy allocation requests. Splitting within a zone z never generates fragments withsize less than z.threshold, which is initialized to the minimum size of a free node. Arequest for a node of size n will produce a node with size in the range [n . .n+z.threshold). The actual size of an allocated node is returned byNodeSize: PROCEDURE [p: POINTER] RETURNS [BlockSize];îTïfñpôXð'îI î ‚ïbuô tuîüï`vtuð.î ‚ï](rð!uru rî ‚ïZCuôà tututuî ‚ïW^ô tutuî ‚ïTrðRî ‚ïQ+u tutuîxïMÜrô—ð/u rô˜îxïL5ôî ‚ïIPu tutuîxïFrð9ur î ‚ïCu tututuîxï@7trð0trî ‚ï<éð<î ‚ï:u tuîxï7rð/îxï4:prô®ð+ô¯ð%îxï2“ôð4î&ôï.qpôXî ‚ï*Nrôƒô„ð%ururî ‚ï'ôî ‚ï$u tututuîxï Ìrô´ð(prôµîxï%ôˆ ô‰ðMîxï}ô‹ôŒð7urîxïÖô°u rô±ð6îxï/ô ô urð,uîxï‡ rôî ‚ï9ð3î ‚ïêu tututu . ‚£=QVhûAlto/Mesa Storage Management Facilities66If after coalescing all free nodes, a node of the requested size cannot be found,NoRoomInZone: SIGNAL [z: ZonePointer];is raised. This signal can be resumed (after, e.g., adding to the zone), and another attempt toallocate and return a suitable node will be made. An allocated node is returned to the zone byFreeNode: PROCEDURE [z: ZonePointer, p: POINTER];Alternatively, an existing node can be split by callingSplitNode: PROCEDURE [z: ZonePointer, p: POINTER, n: BlockSize];the first n words of the node p remain allocated, and the remainder of the node is freed.When a zone z is created, the variable z.checking is initialized to FALSE. If that variable is set toTRUE, the zone is checked for consistency prior to each transaction involving that zone. A failureraises one of the following signals:InvalidZone, InvalidNode: ERROR [POINTER];Allocation From The HeapClients who use heap storage extensively are encouraged to create their own heap from the aboveoperations. The following procedures provide an example of a simple interface to the free storagepackage.myHeap: FSPDefs.ZonePointer _ NIL;GetSpace: PROCEDURE [nwords: CARDINAL] RETURNS [p: POINTER] =BEGIN OPEN Storage, FSPDefs;np: CARDINAL;p _ MakeNode[myHeap, nwords !NoRoomInZone =>BEGINnp _ PagesForWords[nwords + ZoneOverhead + NodeOverhead];AddToNewZone[myHeap,Storage.Pages[np],np*AltoDefs.PageSize,Storage.FreePages];RESUMEEND];END;FreeSpace: PROCEDURE [p: POINTER] ={FSPDefs.FreeNode[myHeap, p]};GetString: PROCEDURE [nchars: CARDINAL] RETURNS [s: STRING] =BEGINs _ GetSpace[StringDefs.WordsForString[nchars]];s^ _ [length: 0, maxlength: nchars, text:];END;ÿî¾ïfñpôXð'î ìî ìïbrôðQî ìï^Ïu tuî ìï[€rôÁ ôÂðVî ìïYÙô­ðGô®î ìïVŠuô tutuî ìïSçZŠRAlto/Mesa StreamIO Package72String OutputWriteString: PROCEDURE [s: STRING];The string s is written on the OutputStream.WriteLine: PROCEDURE [s: STRING];The string s is written on the OutputStream followed by a carriage return.WriteSubString: PROCEDURE [ss: StringDefs.SubString];The substring ss is written on the OutputStream.Number InputThese procedures use the StringToNumber conversion procedures from the Strings package.ReadNumber: PROCEDURE [default: UNSPECIFIED, radix: CARDINAL]RETURNS [UNSPECIFIED];ReadID followed by StringToNumber. The value default will be displayed if ESC istyped. radix is a default value, (use the "B" or "D" notation to force octal or decimal).radix values other than 8 or 10 cause unpredictable results.ReadDecimal: PROCEDURE RETURNS [INTEGER];ReadID followed by StringToDecimal.ReadOctal: PROCEDURE RETURNS [UNSPECIFIED];ReadID followed by StringToOctal.Number OutputNumberFormat: TYPE = RECORD [base: [2..36], zerofill, unsigned: BOOLEAN, columns: [0..255]];A NumberFormat, say f, refers to a number whose base is f.base; the field isf.columns wide; if f.zerofill, the extra columns are filled with zeros, otherwise spacesare used; if f.unsigned, the number is treated as unsigned.OutNumber: PROCEDURE [StreamHandle, UNSPECIFIED, NumberFormat];Converts the value to a character string of digits as specified by the NumberFormat andoutputs them to the StreamHandle.ÿîYïfñpôXî ìî#tïa×quôiqî ìï^‰sô tstsîâï[:r srs rî ìïWës tstsîâïT�r srs rî ìïQNstsîâïMÿr srs rî#uïHÃquôiqî ìïEtrô¿s rsrî ìïB%sô ts t stsî fï@~tst sîâï=/rô¡ s rô¢ srtrîâï;ˆô srô¡srsrð&îâï9ásrôð7î ìï6’s tststsîâï3Cr srî ìï/õs tstst sîâï,¦r s rî"Ïï'iquôiqî ìï$sô tstsî fï"sð#tsîâï%rôés rsrð"ôêsrîâï}srô¨ s rô©ð$îâïÖô s rð$î ìï‡s tst sîâï9rô”ð(ô•s rîâï‘ôs r€ ìJ<çTÁAlto/Mesa StreamIO Package73WriteNumber: PROCEDURE [UNSPECIFIED, NumberFormat];Equivalent to OutNumber with OutputStream as the StreamHandle.WriteDecimal: PROCEDURE [n: INTEGER];The value of n is converted to a character string of digits in base ten and output to theOutputStream. Negative numbers are written with a preceeding minus sign (').WriteOctal: PROCEDURE [n: UNSPECIFIED];The value of n is converted to a character string of digits in base eight and output to theOutputStream. The numbers are unsigned, i.e., 2 is written as 177776B. The "B"is appended to any number more than one digit long.InitializationThe Mesa system provides an instance of StreamIO which will obtain input from the keyboardand write output to the display. Client programs may create new instances of StreamIO to dealwith other streams by writing:StreamIO: FROM "streamio"; . . .IMPORTS . . . systemio: StreamIO . . . ; . . .f: POINTER TO FRAME [StreamIO]; . . .f _ NEW systemio;START f;The streams used for input and output can then be set by calling SetInputStream orSetOutputStream. The desired stream procedures may be accessed by OPENing f or writingf.procedurename.CharIOThe interface CharIO provides an alternative set of procedures for character and string facilities inMesa. While not identical to the procedures in IODefs, there is a direct correspondence betweenthe procedures in CharIO and those in IODefs. The primary difference is that the procedures inCharIO has an explicit stream parameter. The module CharIOPack implements the interface; itis not part of the standard configuration.ÿî"ïïfñpôXîI î ‚ïbsô tst sîxï^Ïr srs rs rî ‚ï[€s tstsîxïX2rô¬ srð0ô­îxïVŠs rôò ôóð4srî ‚ïS . . . Display => . . . Disk => . . . Other => [type: UNSPECIFIED, data: POINTER], ENDCASE];The procedures which create streams return discriminated pointers (a DiskHandle, for example),which can be assigned to variables of type StreamHandle without any loopholes. Most streamprocedures (and all of the standard operations) expect StreamHandles (which can be matched byany discriminated pointer); they check at runtime for the appropriate stream type.Error conditions are reported in a fashion independent of the particular stream type, using thefollowing definitions (not all error codes are applicable to all stream types):ÿî ìïfñpî!eï\áqôiî$qïYÙrôX î ìïTãô«ðGô¬î ìïS<ô¦ð%ô§ð?î ìïQ”ôˆð(ô‰ð>î ìïOíôóð6ôôð$î ìïNFôî ìïJ÷ô¢ð:ô£srî ìïIPsrôÇôÈðRî ìïG¨ô–ð(ô—ð7î ìïFôˆðHô‰ srî ìïDZôð0srî ìïA ô­t rð0î ìï?dôžð!ôŸ t rð$î ìï=¼ôt rt r î ìï:nt ststst î ìï7stststî ìï5stststî ìï2ý stststî ìï/® ststî fï.stî fï,_ststs tî fï*¸sts tî fï)sts tî fï'istststî fï%Âstî fï$î fï"sstsî fï Ìtî fï%î fï}î fïÖs tstî fï/stî ìïàrô¦ð8ô§ t rî ìï9ô¨ð+t rð$î ìï‘ôŒô�ð$t prî ìïêôðRî ìï›ôÅð*ôÆð5î ìï ôôðOü ì ­=ç[^2Alto/Mesa Streams75StreamError: SIGNAL [stream: StreamHandle, error: StreamErrorCode];StreamErrorCode: TYPE = {StreamType, StreamAccess, StreamOperation,StreamPosition, StreamEnd, StreamBug};As the definition implies, each stream object contains procedures that implement the standardstream operations, as described below (s is a StreamHandle, i is an item of the appropriate type,and "code error" means that SIGNAL StreamError[s, code] is raised). For each StreamType,there is a create procedure which returns a StreamHandle. Then, for example, to invoke get fora StreamHandle s, simply say s.get[s].reset[s]Restores the stream to some initial state, generally as close as possible to the state it is injust after it is created.get[s]Returns the next item; StreamAccess error if s cannot be read or if endof[s] is truebefore the call.putback[s, i]Modifies the stream so that the next get[s] will return i and leave s in the state it was inbefore the putback.put[s, i]Writes i into the stream as the next item; StreamAccess error if the stream cannot bewritten; StreamEnd error if there is no more space in the stream.endof[s]TRUE if there are no more items to be gotten from s. For output streams, endof is device-dependent.destroy[s]Destroys s in an orderly way, freeing the space it occupies. Note that this has nothing todo with deleting any underlying data structures or processes associated with the stream (likea disk file, for example, or the keyboard process).Each of these operations is defined more precisely in the descriptions of the individual stream typeswhich appear in separate sections. All of the stream routines produce the StreamType errorwhen the variant of the StreamObject they are passed is not what they are expecting. See theDisk Streams, Display, and Keyboard sections for details of specific stream types.The Other variant of a StreamObject is provided so that clients can easily provide other typesof streams using the same standard set of operations. The data field of an Other StreamObjectshould point to any additional data required by the particular stream. Clients with more than onetype of Other stream should include a type code in the type field.î&#ïfñpôXîI î ‚ïbtô stð0î ‚ï^Ïstîüï](ð*îüï[€ð&î ‚ïX2rô×ôØðLî ‚ïVŠô‹ð'trt rtr ôŒî ‚ïTãô‚trôƒsptrt rî ‚ïS<ô‡ð,t urtrôˆî ‚ïQ”ôt r trî ‚ïNFtîxïJ÷rô¡ðYô¢îxïIPôî ‚ïFtîxïB²rôžpt r tr ôŸ tprîxïA ôî ‚ï=¼t îxï:nrô�ð%tr tr tr ô‘ îxï8Æô trî ‚ï5xtîxï2)rô¢trô£t prîxï0‚ôtrð/î ‚ï-3tîxï)äsrô‚ð.trôƒtpr îxï(= î ‚ï$ît îxï! rô™trðFôš îxïøô‡ð<ôˆð!îxïQôð3î ‚ïôˆô‰ðJî ‚ï[ôÂð*ôÃð!t rî ‚ï´ôžôŸt rð9î ‚ï prôprprprð/î ‚ï¾ô›tr t rð/ôœ î ‚ïô€ð;trô� tî ‚ïorô–ðOô—î ‚ï Èôtrð5� ‚ �=çZŠ;76Alto/Mesa String PackageOctober 1980This section describes procedures that implement various string operations. The necessary TYPE andPROCEDURE declarations appear in StringDefs. The interface String is approximately the sameas StringDefs, and is also exported by the system. (Constants defining word size, character size,etc. are in AltoDefs.) Specific language features concerning STRINGs are described in more detailin the Mesa Language Manual (see the index).SubStringDescriptor: TYPE = RECORD [base: STRING,offset, length: CARDINAL];SubString: POINTER TO SubStringDescriptor;A SubStringDescriptor describes a region within a string. The first character isbase[offset] and the last character is base[offset+length-1].WordsForString: PROCEDURE [nchars: CARDINAL] RETURNS [CARDINAL];Calculates the number of words of storage needed to hold a string of length nchars. Thevalue returned includes any system overhead for string storage.LowerCase: PROCEDURE [CHARACTER] RETURNS [CHARACTER];Changes upper case characters into lower case ones. This is a noop if the character is not aletter.UpperCase: PROCEDURE [CHARACTER] RETURNS [CHARACTER];Changes lower case characters into upper case ones. This is a noop if the character is not aletter.String ConstructionAppendChar: PROCEDURE [s: STRING, c: CHARACTER];Appends the character c to the end of the string s; s.length is updated; s.maxlength isunchanged.AppendString: PROCEDURE [to, from: STRING];Appends the string from to the end of the string to; to.length is updated;to.maxlength is unchanged.î ìïfñpîæï\áqôiî$qïYÙrôX î ìïTãô‚ð&ôƒð5srî ìïStrtr îâïÐt rô ÿ ì‰=çW‚Alto/Mesa String Package77AppendSubString: PROCEDURE [to: STRING, from: SubString];Appends the substring in from to the end of the string in to; to.length is updated;to.maxlength is unchanged.StringBoundsFault: SIGNAL [s: STRING] RETURNS [ns: STRING];An attempt was made to increase the length of s to be larger than s.maxlength. Thecatch phrase should return a string ns with more room.DeleteSubString: PROCEDURE [s: SubString];Deletes the substring described by s from the string s.base; s.base.length is updated;s.base.maxlength is unchanged.String ComparisonEqualString, EqualStrings: PROCEDURE [s1, s2: STRING] RETURNS [BOOLEAN];Returns TRUE if s1 and s2 contain exactly the same characters.EquivalentString, EquivalentStrings: PROCEDURE [s1, s2: STRING] RETURNS [BOOLEAN];Returns TRUE if s1 and s2 contain the same characters except for case shifts. Note: stringscontaining control characters may not be compared correctly.EqualSubString, EqualSubStrings: PROCEDURE [s1, s2: SubString] RETURNS [BOOLEAN];Analogous to EqualString and EqualStrings.EquivalentSubString, EquivalentSubStrings: PROCEDURE [s1, s2: SubString]RETURNS [BOOLEAN];Analogous to EquivalentString and EquivalentStrings.CompareStrings: PROCEDURE [s1, s2: STRING, ignoreCase: BOOLEAN _ TRUE]RETURNS [INTEGER];Lexically compares two strings and returns -1, 0, 1 if the first is less than, equal to, orgreater than the second; an optional parameter may be supplied to ignore case differences.String to Binary ConversionStringToNumber: PROCEDURE [s: STRING, radix: CARDINAL] RETURNS [UNSPECIFIED];The characters of s are interpreted as a number whose value is returned. radix is used inthe conversion unless the "B" ("b") or "D" ("d") notation is used to force octal or decimal.Values of radix other than 8 or 10 are not supported.î$ïfñpôXîI î ‚ïbtststîxï^ÏrôÈtrtrôÉtr îxï](t rô î ‚ïYÙtôXststststîxïVŠrô¬ð#ô­ trt rîxïTãôð$trî ‚ïQ”tôXstîxïNFrô˜ð#trtrô™t r îxïLžtrô î%XïGbqôiî ‚ïDt rôXt st stststîxï@Årôsrtrtrð%î ‚ï=vtrôXtst stststîxï:'rô‚srtrtrôƒu îxï8€ôð<î ‚ï51t rôXtsôF tôXststîxï1ãrô t rt rî ‚ï.”trôXtsôF tôXîüï,íststîxï)žrô trtrî ‚ï&OtsôF tôX st sôFtîüï$¨stôXstîxï!Yrô¼ô½ðIîxï²ô•ô–ðJî"'ïuqôiî ‚ï'tôXststststs tîxïØrô�trôŽð3tr îxï1ô€trtrô�trtrð.îxï‰ô trð& ‚B;iWÉGAlto/Mesa String Package78StringToDecimal: PROCEDURE [s: STRING] RETURNS [INTEGER];Calls StringToNumber[s, 10].StringToOctal: PROCEDURE [s: STRING] RETURNS [UNSPECIFIED];Calls StringToNumber[s, 8].StringToLongNumber: PROCEDURE [s: STRING, radix: CARDINAL] RETURNS [LONG INTEGER];The characters of s are interpreted as a LONG INTEGER whose value is returned. radix isused in the conversion unless the "B" or "D" notation is used to force octal or decimal.Values of radix other than 8 or 10 are not supported.InvalidNumber: SIGNAL;A string is not a valid number if it is empty or contains characters other than digits (aleading '- and trailing 'B or 'D with scale factor are allowed).Binary to String ConversionAppendNumber: PROCEDURE [s: STRING, n, radix: CARDINAL];The value of n is converted to text using radix and appended to s; radix should be inthe interval [2..36].AppendDecimal: PROCEDURE [s: STRING, n: INTEGER];IF n < 0 THEN AppendChar[s, '-]; AppendNumber[s, ABS[n], 10].AppendOctal: PROCEDURE [s: STRING, n: UNSPECIFIED];AppendNumber[s, n, 8]; AppendChar[s, 'B].AppendLongDecimal: PROCEDURE [s: STRING, n: LONG INTEGER];IF n < 0 THEN AppendChar[s, '-]; AppendLongNumber[s, ABS[n], 10].Fine Point:AppendDecimal and AppendLongDecimal deal properly with FIRST[INTEGER] andFIRST[LONG INTEGER], even though their descriptions would imply otherwise.AppendLongNumber: PROCEDURE [s: STRING, n: LONG UNSPECIFIED, radix: CARDINAL];The value of n is converted to text using radix and appended to s; radix should be inthe interval [2..36].ÿî xïfñpôXî ìî ìïbtststststîâï^Ïrôtrî ìï[€tôXstststs tîâïX2rôtvî ìïTãtôXststststsôFtîâïQ”rô›trs rôœtrîâïOíô«ð#trtrô¬îâïNFô trð&î ìïJ÷tôXstîâïG¨rô¹ôºðBîâïFôtr trtrî‘ï@Åqôiî ìï=vtôX stst stîâï:'rô› trtrtrôœtr îâï8€ô trî ìï51tôXstststîâï1ãstôstð$strî ìï.”tôX stsôFts tîâï+Eôð(vî ìï'÷tôXststsôFtîâï$¨stôstð(strî ìï!}w îâïøt wô;tw ô<ststwîâïQstsô twð7î ìïtôXststsôF tôXstîâï´rô› trtrtrôœtr îâï ô trÿ ìÅ:ÏRF;79Alto/Mesa Time PackageOctober 1980This section describes procedures that implement various operations on dates and times. Thenecessary TYPE and PROCEDURE declarations appear in TimeDefs and are described below.PackedTime: TYPE = LONG CARDINAL;A PackedTime is the number of seconds since midnight January 1, 1901 GMT.DefaultTime: PackedTime;UnpackedTime: TYPE = RECORD [year: [0..2050],-- years less than 1901 are not possiblemonth: [0..12),-- January = 0day: [0..31],-- first day of month = 1hour: [0..24),minute: [0..60),second: [0..60),weekday: [0..6],-- Monday = 0zone: [-12..12],-- Pacific = 8dst: BOOLEAN];CurrentDayTime: PROCEDURE RETURNS [time: PackedTime];Returns the current date and time in packed format.UnpackDT: PROCEDURE [PackedTime] RETURNS [time: UnpackedTime];Converts a packed format time to a more convenient unpacked format. If the argument isDefaultTime, the current time is used.PackDT: PROCEDURE [unp: UnpackedTime, computeDST: BOOLEAN _ TRUE]RETURNS [time: PackedTime];Converts unp into packed format. If computeDST is TRUE, the time zone and daylightsavings time are computed according to local conventions rather than taken from unp. Ifany of the fields of unp contain illegal values, PackDT will signal InvalidTime.InvalidTime: ERROR;PackDT has discovered illegal values in the unpacked time.AppendDayTime: PROCEDURE [s: STRING, u: UnpackedTime, zone: BOOLEAN _ FALSE];Converts u to a text string of the form 12-Jan-78 14:56:13 and appends it to s. If zone isTRUE then the time zone is included, e.g. 1-May-78 14:56:13 PDT.ÿîI ïfñpî"×ï\áqôiî(ïYÙrôX î ‚ïTãôÕð&ôÖð6î ‚ïS<ôò srsrôótrî ‚ïOítôX stsôFtîxïLžrôt rð=î ‚ïIPtôXî ‚ïF ststîüïDZîduð(îüïB²tîdu îüïA t îduîüï?dt îüï=¼îüï<îüï:nîdu îüï8Ætîdu îüï7tstî ‚ï3Ðststîxï0‚rôð3î ‚ï-3tôX st stîxï)ärô’ô“ð:îxï(=t rôî ‚ï$îtôXstð!sôFtîüï#GstôXîxïørô›trt rsrôœîxïQôšô›ð@trîxïªôtrtr t rî ‚ï[tôX stîxï rôð4î ‚ï¾tôXststsôFtîxïorôˆtrðCtrtrô‰îxï Èsrôð!vrÿ ‚ �=çZŠAlto/Mesa Time Package80AppendFullDayTime: PROCEDURE [s: STRING, u: UnpackedTime] = INLINE{AppendDayTime[s: s, u: u, zone: TRUE]};RealTimeClock: POINTER TO CARDINAL = -- magic location --;Defines the location of the Alto Real Time Clock. See Alto: A Personal Computer System;Hardware Manual.ReadClock: PROCEDURE RETURNS [LONG UNSPECIFIED];Returns the high resolution clock. The format of the result is machine dependent.î ÄïfñpôXî ìî ìïbtststsî fï`vtstî ìï](sôFtôXvtîâïYÙrôŒð%ô�vð!îâïX2ôî ìïTãtôX sôFtstîâïQ”rôõð'ôöð+¦ ìQM8ñ¾P81Alto/Mesa TrapsOctober 1980All traps generated by Mesa are converted into signals or errors of the same name. Except for theparity error and stack error traps, all of the signals described below are related to specific languagefeatures and are described in more detail in the Mesa Language Manual (see the index). They aredefined in TrapDefs.StartFault: SIGNAL [dest: GlobalFrameHandle];An attempt was made to start or restart the frame dest, but it is not a valid global frame.Usually this means that a module or program was not bound, a program being restarteddoes not STOP, or a module that has parameters is being started as a result of a start trap.ControlFault: SIGNAL [source: FrameHandle] RETURNS [ControlLink];An attempt was made to transfer to a null control link while executing in the framesource. Usually this means some external links have been clobbered. This signal can beresumed with a control link that will be used to retry the transfer.UnboundProcedure: SIGNAL [dest: UNSPECIFIED] RETURNS [ControlLink];An attempt was made to transfer to dest but it had an unbound tag. Usually this meanssome external links have not been bound or the GFT entry of dest is null (probably adeleted module). This signal can be resumed with a control link that will be used to retrythe transfer.BoundsFault: SIGNAL;An attempt has been made to exceed the bounds of a STRING, ARRAY or SubRange (notethat this includes assigning a negative INTEGER to a CARDINAL.) in a module that wascompiled with the /b switch.PointerFault: SIGNAL;An attempt has been made to dereference NIL in a module that was compiled with the /nswitch.LinkageFault: ERROR;A transfer has been attempted through a port that has not been connected to some otherport or procedure (the link field of the port was null).PortFault: ERROR;A transfer has been attempted to a port which is not pending (the frame field of thedestination port is null). This error is used to handle the startup transients common in aconfiguration of coroutines.îI ïfñpî%Ôï\áqôiî(ïYÙrôX î ‚ïTãô�ð6ô‘ð,î ‚ïS<ô’ð^ô“î ‚ïQ”ô‘ð0ô’srî ‚ïOíô trî ‚ïLžt utîxïIPrô’ô“trð%îxïG¨ô°ðTîxïFô”ô•urðOî ‚ïB²tô ututîxï?drôÙôÚð@îxï=¼trô’ðOô“îxï<ôðDî ‚ï8Ætutu tutîxï5xrô—ð#trô˜ð(îxï3Ðô»ð*ô¼vr trîxï2)ô’ô“ðKîxï0‚ô î ‚ï-3t utîxï)ärô…ð"ô†ururtrîxï(=ôÏôÐ ururîxï&–ôî ‚ï#Gt utîxïørôšô› urð*îxïQî ‚ïtô utîxï´rô¥ðVîxï ôð8î ‚ï¾t utîxïorôÌ ôÍðFîxï Èô£ð[îxï ôÿÜ ‚ Ù=ç\2 Alto/Mesa Traps82ParityError: SIGNAL [address: POINTER];A parity error has occured in the word pointed to by address.PhantomParityError: SIGNAL;The parity error process was started, but a sweep through memory found no errors.ResumeError: ERROR;A catchphrase has attempted to RESUME either an ERROR or a SIGNAL that has been raisedby the ERROR construct.StackError: SIGNAL;The stack has either overflowed or underflowed. Usually this means that either some codehas been smashed or some external link is incorrect.Fine point: external links may be incorrect because the user forgot to rebind after a recompilation, orprocedure variables were incorrectly LOOPHOLEd.Not all of the following signals are generated by Alto/Mesa.ZeroDivisor: SIGNAL;An attempt was made to divide by zero.DivideCheck: SIGNAL;The result of a dividing a 32-bit quantity by a 16-bit quantity did not fit in 16 bits.UnimplementedInst: SIGNAL;An attempt was made to execute an unimplemented instruction.WakeupError: SIGNAL;Too many enable or disable interrupt instructions were performed.HardwareError: SIGNAL;Some undefined hardware error occured.PageFault: SIGNAL [page: CARDINAL];An attempt was make to reference a nonexistent page.WriteProtectFault: SIGNAL [page: CARDINAL];An attempt was make to write in a protected page.î#BïfñpôXî ìî ìïbtô ut utîâï^Ïrð5trî ìï[€tutîâïX2rôëð9ôìî ìïTãtô utîâïQ”rô�ô‘ur ururîâïOíôur î ìïLžt utîâïIPrô�ð"ô‘ð7îâïG¨ôð4îâïEQwôÓðdôÔîâïCÍôð%vwrî ìï@~ð<î ìï=/t utîâï9árð&î ìï6’t utîâï3CrôÔðCôÕî ìï/õtôutîâï,¦rð<î ìï)Wt utîâï& rðAî ìï"ºtutîâïkrð&î ìït ututîâïÎrð4î ìïtututîâï1rð1ÿ ìê8ñV!É83Appendix: Symbol Listing for Public InterfacesOctober 1980This appendix contains an alphabetical listing of all public symbols in the set of interfaces listed below.For each symbol, there is a comment showing in which interface or interfaces the symbol is declared. Anumber of symbols are declared in multiple interfaces for historical reasons, such as the character namesin IODefs and Ascii.AllocDefs AltoDefs AltoDisplay AltoFileDefs AltoHardware Ascii BitBltDefs CharIODirectoryDefs DisplayDefs FontDefs Format FrameDefs FSPDefs Inline ImageDefsInlineDefs IODefs KeyDefs MiscDefs OsStaticDefs Process ProcessDefsSegmentDefs Storage StreamDefs StreamScan String StringDefs SystemDefs TimeTimeDefs TrapDefsAbort: --ProcessDefs, Process--PROCEDURE [UNSPECIFIED];Aborted: --ProcessDefs--SIGNAL;Aborted: --Process--ERROR;AbortMesa: --ImageDefs--PROCEDURE;AccessOptions: --SegmentDefs--TYPE = [0..7];AccessOptions: --StreamDefs--TYPE = AccessOptions;AddCleanupProcedure: --ImageDefs--PROCEDURE [POINTER TO CleanupItem];AddFileRequest: --ImageDefs--PROCEDURE [POINTER TO FileRequest];Address: --AltoDefs--TYPE = [0..177777B];AddressFromPage: --SegmentDefs--PROCEDURE [p: PageNumber] RETURNS [POINTER];AddSwapStrategy: --AllocDefs--PROCEDURE [strategy: POINTER TO SwapStrategy];AddToNewZone: --FSPDefs--PROCEDURE [z: ZonePointer, base: POINTER, length: BlockSize, deallocate: Deallocator];AddToZone: --FSPDefs--PROCEDURE [z: ZonePointer, base: POINTER, length: BlockSize];AlignedBBTable: --BitBltDefs--PROCEDURE [p: POINTER TO BBTableSpace]RETURNS [BBptr];AllocateHeapNode: --SystemDefs--PROCEDURE [nwords: CARDINAL]RETURNS [p: POINTER];AllocateHeapString: --SystemDefs--PROCEDURE [nchars: CARDINAL] RETURNS [STRING];AllocatePages: --SystemDefs--PROCEDURE [npages: CARDINAL]RETURNS [base: POINTER];AllocateResidentPages: --SystemDefs--PROCEDURE [npages: CARDINAL]RETURNS [base: POINTER];AllocateResidentSegment: --SystemDefs--PROCEDURE [nwords: CARDINAL]RETURNS [base: POINTER];AllocateSegment: --SystemDefs--PROCEDURE [nwords: CARDINAL]RETURNS [base: POINTER];AllocInfo: --AllocDefs--TYPE = AllocInfo;AllocInfo: --SegmentDefs--TYPE = RECORD [effort: {hard, easy}, direction: {topdown, bottomup}, class: SegmentClass];AllReasons: --ImageDefs--CARDINAL = 177777B;AltoVersionNumber: --OsStaticDefs--TYPE = MACHINE DEPENDENT RECORD [engineeringnumber: [0..15], buildnumber: [0..15], microcodeversion: [0..255]];Append: --SegmentDefs, StreamDefs--AccessOptions = 4;Append: --Time--PROCEDURE [s: STRING, unpacked: Unpacked, zone: BOOLEAN];AppendChar: --StringDefs, String--PROCEDURE [s: STRING, c: CHARACTER];AppendCurrent: --Time--PROCEDURE [s: STRING, zone: BOOLEAN];AppendDayTime: --TimeDefs--PROCEDURE [s: STRING, unp: UnpackedTime, zone: BOOLEAN];AppendDecimal: --StringDefs, String--PROCEDURE [s: STRING, n: INTEGER];ÿîI ïfñpîŠïa×qôið.î(ï^ÏrôX î ‚ï[¤ðkî ‚ïZ ðgî ‚ïXœðiî ‚ïWsrsrî ‚ïSìsô’ð9ô“î ‚ïRhô¯ðBô° î ‚ïPäôæôçð*î ‚ïO`ô–ðKî ‚ïMÜôîãïHstôXuvtv tîãïFŽuvtîãïE u vtîãïC†stu vtîãïBuvt îãï@~u vtîãï>ústu vtvtvt îãï=vs tu vtvtvt îãï;òu vtîãï:nstuvtvtvtîãï8êstu vt vtvtîãï7fs tu vtîDï5âvtð.îãï4^stu vtîDï2Úvtîãï1Us tu vtvtvt îDï/Ñvtîãï.Mstu vt vtîDï,Évtvtîãï+Estu vt vtvtvtîãï)Ás tu vt vtîDï(=vtvtîãï&¹stu vt vtîDï%5vtvtîãï#±stu vt vtîDï"-vtvtîãï ©stu vt vtîDï%vtvtîãï¡ u vt îãï uvtvtîDï™ðKîãï u vt îãï‘uvtvtvtvtîDï ðNîãïˆutîãïstuvtvtvtîãï€s tuvtvtvtîãïüs tuvtvtvtîãïxs tu vtîDï ôvtvtîãï ps tuvtvtvt  ‚ )=ç\â³Appendix: Symbol Listing for Public Interfaces 84AppendFullDayTime: --TimeDefs--PROCEDURE [s: STRING, unp: UnpackedTime];AppendLongDecimal: --StringDefs, String--PROCEDURE [s: STRING, n: LONG INTEGER];AppendLongNumber: --StringDefs, String--PROCEDURE [s: STRING, n: LONG UNSPECIFIED, radix: CARDINAL];AppendNumber: --StringDefs, String--PROCEDURE [s: STRING, n: CARDINAL, radix: CARDINAL];AppendOctal: --StringDefs, String--PROCEDURE [s: STRING, n: UNSPECIFIED];AppendString: --StringDefs, String--PROCEDURE [to: STRING, from: STRING];AppendSubString: --StringDefs, String--PROCEDURE [to: STRING, from: SubString];Background: --AltoDisplay, AltoHardware--TYPE = {white, black};Background: --DisplayDefs--TYPE = Background;BadDirectory: --DirectoryDefs--ERROR;BadFilename: --DirectoryDefs--ERROR [name: STRING];BankIndex: --SegmentDefs--TYPE = [0..15];BankNumber: --AltoHardware--TYPE = CARDINAL [0..3];BankRegister: --AltoHardware--TYPE = MACHINE DEPENDENT RECORD [undefined: [0..7777B], normal: BankNumber, alternate: BankNumber];BankRegisters: --AltoHardware--POINTER TO ARRAY Task OF BankRegister;Banks: --SegmentDefs--TYPE = PACKED ARRAY BankIndex OF BOOLEAN;BBoperation: --BitBltDefs--TYPE = {replace, paint, invert, erase};BBptr: --BitBltDefs--TYPE = POINTER TO BBTable;BBsourcetype: --BitBltDefs--TYPE = {block, complement, andgray, gray};BBTable: --BitBltDefs--TYPE = MACHINE DEPENDENT RECORD [ptrs: {short, long},pad: [0..511],sourcealt: BOOLEAN,destalt: BOOLEAN,sourcetype: BBsourcetype,function: BBoperation,unused: CARDINAL,dbca: POINTER,dbmr: CARDINAL,dlx: CARDINAL,dty: CARDINAL,dw: CARDINAL,dh: CARDINAL,sbca: POINTER,sbmr: CARDINAL,slx: CARDINAL,sty: CARDINAL,gray0: CARDINAL,gray1: CARDINAL,gray2: CARDINAL,gray3: CARDINAL,slbca: LONG POINTER,dlbca: LONG POINTER];BBTableSpace: --BitBltDefs--TYPE = ARRAY [0..20] OF UNSPECIFIED;BcdTime: --ImageDefs--PROCEDURE RETURNS [PackedTime];BcdVersion: --ImageDefs--PROCEDURE RETURNS [Stamp];BcplLongNumber: --InlineDefs--TYPE = MACHINE DEPENDENT RECORD [highbits: CARDINAL, lowbits: CARDINAL];BcplMaxLength: --StringDefs--CARDINAL = 255;BcplOpcode: --ImageDefs--TYPE = BcplOpcode;BcplSTRING: --StringDefs--TYPE = MACHINE DEPENDENT RECORD [SELECT OVERLAID * FROMlength => [length: [0..255], body: CHARACTER],characters => [char: PACKED ARRAY [177777B..254] OF CHARACTER]ENDCASE];BcplStringHeaderSize: --StringDefs--CARDINAL = 1;ÿî¬ïfñpôXð.rî ìpî Mïbstu vtvtî Mï`šstuvtvtvtvtî Mï_stuvtî ®ï]’vtvtv tvtî Mï\s tuvtî ®ïZŠvtvtvtî MïYs tuvtvtv tî MïW�s tuvtvtvtî MïUýstuvtvtî MïTy uvtî MïRõ uvt î MïQq uvtî MïOí uvtvtî MïNi uvt î MïLå uvtvtî MïKa uvtvtvtvtî ®ïIÝðBî MïHYuvtvtvtvt î MïFÕuvtvtvt vtvtî MïEQ u vtð#î MïCÍu vtvtvtî MïBI u vtð&î Mï@Åu vtvtvtvtî ®ï?Aî ®ï=¼ î ®ï<8 vtî ®ï:´vtî ®ï90î ®ï7¬î ®ï6(vtî ®ï4¤vtî ®ï3 vtî ®ï1œvtî ®ï0vtî ®ï.”vtî ®ï-vtî ®ï+Œvtî ®ï*vtî ®ï(„vtî ®ï'vtî ®ï%|vtî ®ï#øvtî ®ï"svtî ®ï ïvtî ®ïkvtvtî ®ïçvtvtî Mïc u vtvtvtv tî Mïßstu vtvt î Mï[s tu vtvtî Mï×u vtvtvtvtî ®ïS vt vtî MïÏu vtî MïK u vt î MïÇ u vtvtvtvtî ®ïCvtvtvîï¿tð#vtîï ;vtvtvtvtîï ·vtî Mï 3u vt R ì ì6ö^ÞAppendix: Symbol Listing for Public Interfaces 85BcplStringOverflow: --StringDefs--SIGNAL;BcplToMesaLongNumber: --InlineDefs--PROCEDURE [BcplLongNumber]RETURNS [LONG UNSPECIFIED];BcplToMesaString: --StringDefs--PROCEDURE [t: POINTER TO BcplSTRING, s: STRING];BEL: --Ascii, IODefs--CHARACTER = 7C;BITAND: --InlineDefs, Inline--BitOp;BITBLT: --BitBltDefs--PROCEDURE [ptr: BBptr];BitmapDS: --SegmentDefs--DataSegmentType = 5;BitmapState: --FontDefs--TYPE = RECORD [origin: POINTER, wordsPerLine: [0..77777B], x: [0..77777B], y: [0..77777B]];BITNOT: --InlineDefs, Inline--PROCEDURE [u: UNSPECIFIED] RETURNS [UNSPECIFIED];BitOp: --InlineDefs, Inline--TYPE = PROCEDURE [UNSPECIFIED, UNSPECIFIED]RETURNS [UNSPECIFIED];BITOR: --InlineDefs, Inline--BitOp;BITSHIFT: --InlineDefs, Inline--PROCEDURE [value: UNSPECIFIED, count: INTEGER]RETURNS [UNSPECIFIED];BITXOR: --InlineDefs, Inline--BitOp;BlinkCursor: --DisplayDefs--PROCEDURE RETURNS [BOOLEAN];BlockSize: --FSPDefs--TYPE = CARDINAL [0..77777B];BoundsFault: --TrapDefs--SIGNAL;BS: --Ascii, CharIO, IODefs--CHARACTER = 10C;BW: --KeyDefs--KeyName = Spare1;BYTE: --AltoDefs--TYPE = [0..255];ByteBlt: --MiscDefs--PROCEDURE [to: POINTER, from: POINTER, toByte: CARDINAL, fromByte: CARDINAL,nBytes: CARDINAL];BytePair: --InlineDefs, Inline--TYPE = MACHINE DEPENDENT RECORD [high: [0..255], low: [0..255]];BytesPerPage: --AltoDefs--CARDINAL = 512;BytesPerWord: --AltoDefs--CARDINAL = 2;CallDebugger: --MiscDefs--PROCEDURE [STRING];CantSwap: --AllocDefs--SwappingProcedure;CFA: --AltoFileDefs--TYPE = RECORD [fp: FP, fa: FA];CFP: --AltoFileDefs--TYPE = MACHINE DEPENDENT RECORD [serial: SN, version: CARDINAL, blank: UNSPECIFIED, leaderDA: vDA];CFP: --OsStaticDefs--TYPE = CFP;ChangeDataToFileSegment: --SegmentDefs--PROCEDURE [dataseg: DataSegmentHandle, fileseg: FileSegmentHandle];ChangeKey: --KeyDefs--PROCEDURE [key: KeyName, action: KeyItem]RETURNS [oldAction: KeyItem];Char: --Format--PROCEDURE [c: CHARACTER, proc: StringProc];CharHeight: --FontDefs--PROCEDURE [font: FontHandle, char: CHARACTER]RETURNS [CARDINAL];CharLength: --AltoHardware--CARDINAL = 8;charlength: --AltoDefs, StringDefs, String--CARDINAL = 8;CharsPerPage: --AltoDefs, StringDefs, String--CARDINAL = 512;CharsPerWord: --AltoDefs, StringDefs, String--CARDINAL = 2;CharWidth: --FontDefs--PROCEDURE [font: FontHandle, char: CHARACTER]RETURNS [CARDINAL];CleanupDiskStream: --StreamDefs--PROCEDURE [stream: StreamHandle];CleanupItem: --ImageDefs--TYPE = RECORD [link: POINTER TO CleanupItem, mask: CARDINAL, proc: CleanupProcedure];CleanupMask: --ImageDefs--ARRAY CleanupReason OF CARDINAL;CleanupProcedure: --ImageDefs--TYPE = PROCEDURE [why: CleanupReason];CleanupReason: --ImageDefs--TYPE = CleanupReason;CloseDiskStream: --StreamDefs--PROCEDURE [stream: StreamHandle];CloseFile: --SegmentDefs--PROCEDURE [file: FileHandle];CloseKeyStream: --StreamDefs--PROCEDURE [stream: StreamHandle];CommandLineCFA: --MiscDefs--PROCEDURE RETURNS [POINTER TO CFA];ÿîBïfñpôXð.rîI pîãïbtu vtîãï`šstu vtîDï_vtvtv tîãï]’stu vtvtvtvtîãï\uvtîãïZŠutîãïYstu vt îãïW� utîãïUý u vtvtîDïTyvtð=îãïRõstuvtv tvtv tîãïQquvtvtv tv tîDïOívtv tîãïNistutîãïLåstuvtv tvtîDïKavtv tîãïIÝutîãïHYs tuvtvtvtîãïFÕ u vtvt îãïEQ u vtîãïCÍuvtîãïBIu tîãï@Åu vt îãï?Astu vtîDï=¼vtvt vt vtîDï<8vtîãï:´ uvtvtvtvtîDï90îãï7¬ u vtîãï6( u vtîãï4¤s tu vtvtîãï3 u tîãï1œuvtvtîãï0uvtvtvtvtîDï.”vtv tîãï-uvtîãï+ŒstuvtîDï*ð8îãï(„stu vtîDï'vtîãï%|stu vtvtîãï#øs tu vtvtîDï"svtvtîãï ï uvtîãïk uvtîãïç uvtîãïc uvtîãïßstu vtvtîDï[vtvtîãï×stu vtîãïS u vtvtîDïÏvtvtvtîãïK u vtvtvtîãïÇu vtvtîãïCu vtîãï¿stu vtîãï ;stuvtîãï ·s tu vtîãï 3s tu vtvtvtvt ’ ‚ ì7'^óAppendix: Symbol Listing for Public Interfaces 86CompareStrings: --StringDefs, String--PROCEDURE [s1: STRING, s2: STRING, ignoreCase: BOOLEAN] RETURNS [INTEGER];ConditionVector: --ProcessDefs--TYPE = ARRAY InterruptLevel OF POINTER TOCONDITION;ControlA: --Ascii, IODefs--CHARACTER = 1C;ControlB: --Ascii, IODefs--CHARACTER = 2C;ControlC: --Ascii, IODefs--CHARACTER = 3C;ControlD: --Ascii, IODefs--CHARACTER = 4C;ControlDELtyped: --StreamDefs--PROCEDURE RETURNS [BOOLEAN];ControlE: --Ascii, IODefs--CHARACTER = 5C;ControlF: --Ascii, IODefs--CHARACTER = 6C;ControlFault: --TrapDefs--SIGNAL [source: FrameHandle] RETURNS [ControlLink];ControlG: --Ascii, IODefs--CHARACTER = 7C;ControlH: --Ascii, IODefs--CHARACTER = 10C;ControlI: --Ascii, IODefs--CHARACTER = 11C;ControlJ: --Ascii, IODefs--CHARACTER = 12C;ControlK: --Ascii, IODefs--CHARACTER = 13C;ControlL: --Ascii, IODefs--CHARACTER = 14C;ControlM: --Ascii, IODefs--CHARACTER = 15C;ControlN: --Ascii, IODefs--CHARACTER = 16C;ControlO: --Ascii, IODefs--CHARACTER = 17C;ControlP: --Ascii, IODefs--CHARACTER = 20C;ControlQ: --Ascii, IODefs--CHARACTER = 21C;ControlR: --Ascii, IODefs--CHARACTER = 22C;ControlS: --Ascii, IODefs--CHARACTER = 23C;ControlStoreType: --SegmentDefs--TYPE = {Ram0, RamandRom, Ram3k, unknown};ControlT: --Ascii, IODefs--CHARACTER = 24C;ControlU: --Ascii, IODefs--CHARACTER = 25C;ControlV: --Ascii, IODefs--CHARACTER = 26C;ControlW: --Ascii, IODefs--CHARACTER = 27C;ControlX: --Ascii, IODefs--CHARACTER = 30C;ControlY: --Ascii, IODefs--CHARACTER = 31C;ControlZ: --Ascii, CharIO, IODefs--CHARACTER = 32C;Coordinate: --AltoDisplay, AltoHardware--TYPE = MACHINE DEPENDENT RECORD [x: INTEGER, y: INTEGER];COPY: --InlineDefs, Inline--PROCEDURE [from: POINTER, nwords: CARDINAL, to: POINTER];CopyDataToFileSegment: --SegmentDefs--PROCEDURE [dataseg: DataSegmentHandle, fileseg: FileSegmentHandle];CopyFileToDataSegment: --SegmentDefs--PROCEDURE [fileseg: FileSegmentHandle, dataseg: DataSegmentHandle];CopyString: --Storage--PROCEDURE [s: STRING, longer: CARDINAL]RETURNS [newS: STRING];CopyString: --SystemDefs--PROCEDURE [s: STRING, longer: CARDINAL]RETURNS [STRING];CR: --Ascii, CharIO, IODefs--CHARACTER = 15C;CreateByteStream: --StreamDefs--PROCEDURE [file: FileHandle, access: AccessOptions] RETURNS [DiskHandle];CreateDisplayData: --DisplayDefs--PROCEDURE;CreateFont: --FontDefs--PROCEDURE [FileSegmentHandle] RETURNS [FontHandle];CreateKeyStream: --StreamDefs--PROCEDURE RETURNS [KeyboardHandle];CreateWordStream: --StreamDefs--PROCEDURE [file: FileHandle, access: AccessOptions] RETURNS [DiskHandle];Current: --Time--PROCEDURE RETURNS [time: LONG CARDINAL];CurrentDayTime: --TimeDefs--PROCEDURE RETURNS [time: PackedTime];currentParameters: --TimeDefs--POINTER TO LocalTimeParameters;CurrentTime: --MiscDefs--PROCEDURE RETURNS [LONG CARDINAL];currentTime: --TimeDefs--POINTER TO BcplLongNumber;Cursor: --AltoDisplay, AltoHardware--CursorHandle;ÿî¬ïfñpôXð.rî ìpî Mïbs tuvtî ®ï`švtvt vtvtvtî Mï_uvtvtvtvtvî ®ï]’vtî Mï\ uvtî MïZŠ uvtî MïY uvtî MïW� uvtî MïUýstu vtvtvtî MïTy uvtî MïRõ uvtî MïQq u vtvtî MïOí uvtî MïNi uvtî MïLå uvtî MïKa uvtî MïIÝ uvtî MïHY uvtî MïFÕ uvtî MïEQ uvtî MïCÍ uvtî MïBI uvtî Mï@Å uvtî Mï?A uvtî Mï=¼ uvtî Mï<8uvtð%î Mï:´ uvtî Mï90 uvtî Mï7¬ uvtî Mï6( uvtî Mï4¤ uvtî Mï3 uvtî Mï1œ uvtî Mï0 uvtvtvtvtî ®ï.”vtvtî Mï-stuvtî ®ï+Œvt vtvtî Mï*stuvtî ®ï(„ð8î Mï'stuvtî ®ï%|ð8î Mï#øs tu vtvt vtî ®ï"svtvtî Mï ïs tu vtvt vtî ®ïkvtvtî Mïçuvtî Mïcstu vtî ®ïßð)vt î Mï[stuvtî Mï×s tu vtvt î MïSstu vtvtî MïÏstu vtî ®ïKð)vt î MïÇstuvtvtvtvtî MïCs tu vtvtî Mï¿u vtvtî Mï ;s tu vtvtvtvtî Mï · u vtvtî Mï 3ut ÿ f ì ì7^áAppendix: Symbol Listing for Public Interfaces 87CursorBits: --AltoDisplay, AltoHardware--TYPE = ARRAY [0..15] OF WORD;CursorHandle: --AltoDisplay, AltoHardware--TYPE = POINTER TO CursorBits;CursorTrack: --StreamDefs--PROCEDURE [b: BOOLEAN];CursorXY: --AltoDisplay, AltoHardware--POINTER TO Coordinate;CV: --ProcessDefs--POINTER TO ConditionVector;DA: --AltoHardware--TYPE = MACHINE DEPENDENT RECORD [sector: [0..15],track: [0..511],head: [0..1],disk: [0..1],restore: [0..1]];DataSegmentAddress: --SegmentDefs--PROCEDURE [seg: DataSegmentHandle]RETURNS [POINTER];DataSegmentHandle: --SegmentDefs--TYPE = POINTER TO DataSegmentObjectDataSegmentObject: --SegmentDefs--TYPE = data segment ObjectDataSegmentType: --SegmentDefs--TYPE = CARDINAL [0..255];Date: --Format--PROCEDURE [pt: Packed, format: DateFormat, proc: StringProc];DateFormat: --Format--TYPE = {dateOnly, noSeconds, dateTime, full};DAYTIME: --MiscDefs--PROCEDURE RETURNS [TIME];DC: --AltoHardware--TYPE = MACHINE DEPENDENT RECORD [seal: [0..255],header: DSC,label: DSC,data: DSC,seek: [0..1],exchange: [0..1]];DCB: --AltoDisplay, AltoHardware--TYPE = MACHINE DEPENDENT RECORD [next: DCBHandle,resolution: Resolution,background: Background,indenting: [0..63],width: [0..255],bitmap: POINTER,height: CARDINAL];DCBchainHead: --AltoDisplay, AltoHardware--POINTER TO DCBHandle;DCBHandle: --AltoDisplay, AltoHardware--TYPE = POINTER TO DCB;DCBnil: --AltoDisplay--DCBHandle;DE: --DirectoryDefs--TYPE = MACHINE DEPENDENT RECORD [dv: DV, name: BcplSTRING];Deallocator: --FSPDefs--TYPE = PROCEDURE [POINTER];Decimal: --Format--PROCEDURE [n: INTEGER, proc: StringProc];DecimalFormat: --Format--NumberFormat;DefaultAccess: --SegmentDefs, StreamDefs--AccessOptions = 0;DefaultANYBase: --SegmentDefs--PageNumber = 77774B;DefaultBase0: --SegmentDefs--PageNumber = 77773B;DefaultBase1: --SegmentDefs--PageNumber = 77772B;DefaultBase2: --SegmentDefs--PageNumber = 77771B;DefaultBase3: --SegmentDefs--PageNumber = 77770B;DefaultBase: --SegmentDefs--PageNumber = 77777B;DefaultDataSegmentInfo: --AllocDefs--AllocInfo;DefaultFileSegmentInfo: --AllocDefs--AllocInfo;DefaultMDSBase: --SegmentDefs--PageNumber = 77776B;DefaultPages: --SegmentDefs--PageCount = 0;DefaultPriority: --ProcessDefs--Priority = 1;DefaultSNBits: --AltoFileDefs--SNBits;DefaultTime: --TimeDefs--PackedTime;DefaultTimeout: --ProcessDefs--Ticks = 100;DefaultVersion: --SegmentDefs--VersionOptions = 0;DefaultXMBase: --SegmentDefs--PageNumber = 77775B;DEfile: --AltoFileDefs--INTEGER = 1;îBïfñpôXð.rîI pîãïbt uvtvtvtvtîãï`š uvtvtvt îãï_s tu vtvtîãï]’ uvtvt îãï\uvtvtîãïZŠuvtvtvtvtîDïYîDïW�îDïUý îDïTy îDïRõîãïQqstuvtîDïOívtvtîãïNiuvtvtvtîãïLåuvtîãïKauvtvt îãïIÝstu vtð4îãïHY u vtð)îãïFÕstu vtvtîãïEQuvtvtvtvtîDïCÍîDïBI îDï@Å îDï?A îDï=¼ îDï<8îãï:´uvtvtvtvtîDï90îDï7¬îDï6(îDï4¤îDï3 îDï1œvtîDï0vtîãï.” uvtvt îãï- uvtvtvtîãï+Œut îãï*uvtvtvtvtîãï(„ u vtvtvtîãï'stu vtvtîãï%|u t îãï#øutîãï"sutîãï ï utîãïk utîãïç utîãïc utîãïß utîãï[u t îãï×u t îãïSutîãïÏ ut îãïKut îãïÇutîãïC u t îãï¿ut îãï ;utîãï ·utîãï 3uvtÿ  ‚ ì7¬^–Appendix: Symbol Listing for Public Interfaces 88DEfree: --AltoFileDefs--INTEGER = 0;DEL: --Ascii, CharIO, IODefs--CHARACTER = 177C;DElast: --AltoFileDefs--INTEGER = 63;DeleteDataSegment: --SegmentDefs--PROCEDURE [seg: DataSegmentHandle];DeletedFrame: --FrameDefs--PROCEDURE [gfi: GFTIndex] RETURNS [BOOLEAN];DeleteDisplayData: --DisplayDefs--PROCEDURE;DeleteFileSegment: --SegmentDefs--PROCEDURE [seg: FileSegmentHandle];DeleteSubString: --StringDefs, String--PROCEDURE [s: SubString];DEptr: --DirectoryDefs--TYPE = POINTER TO DE;Descriptor: --StreamScan--TYPE = RECORD [da: vDA,pageNumber: CARDINAL,numChars: CARDINAL,bd: PRIVATE BDHandle,nextPage: PRIVATE CARDINAL,thisCB: PRIVATE CBptr,nextCB: PRIVATE CBptr,ks: PRIVATE DiskHandle,hintLastFA: PRIVATE FA,cbz: PRIVATE CBZptr,nCB: PRIVATE CARDINAL];DestroyDisplay: --DisplayDefs--PROCEDURE;DestroyFakeModule: --MiscDefs--PROCEDURE [f: GlobalFrameHandle]RETURNS [seg: FileSegmentHandle, offset: CARDINAL];DestroyFile: --SegmentDefs--PROCEDURE [file: FileHandle];DestroyKeyHandler: --StreamDefs--PROCEDURE;DestroyZone: --FSPDefs--PROCEDURE [z: ZonePointer];Detach: --ProcessDefs, Process--PROCEDURE [PROCESS];DFS: --AltoHardware--TYPE = {CommandComplete, HardwareError, CheckError, IllegalSector};DH: --AltoHardware--TYPE = MACHINE DEPENDENT RECORD [packID: CARDINAL, diskAddress: DA];DirDA: --AltoFileDefs--vDA;DirectoryLookup: --DirectoryDefs--PROCEDURE [fp: POINTER TO FP, name: STRING, create: BOOLEAN] RETURNS [old: BOOLEAN];DirectoryLookupFP: --DirectoryDefs--PROCEDURE [fp: POINTER TO FP, name: STRING]RETURNS [old: BOOLEAN];DirectoryPurge: --DirectoryDefs--PROCEDURE [fp: POINTER TO FP, name: STRING]RETURNS [found: BOOLEAN];DirectoryPurgeFP: --DirectoryDefs--PROCEDURE [fp: POINTER TO FP]RETURNS [found: BOOLEAN];DirFP: --AltoFileDefs--FP;DirSN: --AltoFileDefs--CARDINAL = 100;DirSNBits: --AltoFileDefs--SNBits;DisableAborts: --ProcessDefs--PROCEDURE [POINTER TO CONDITION];DisableAborts: --Process--PROCEDURE [LONG POINTER TO CONDITION];DisableInterrupts: --ProcessDefs--PROCEDURE;DisableTimeout: --ProcessDefs, Process--PROCEDURE [POINTER TO CONDITION];DISK: --AltoFileDefs--TYPE = MACHINE DEPENDENT RECORD [disks: CARDINAL, tracks: CARDINAL, heads: CARDINAL, sectors: CARDINAL];DiskHandle: --StreamDefs--TYPE = POINTER TO Disk StreamObject;DiskShape: --AltoFileDefs--FilePropertyType = 1;DiskStatus: --AltoHardware--POINTER TO DS;DisplayControl: --DisplayDefs--PROGRAM;DisplayHandle: --StreamDefs--TYPE = POINTER TO Display StreamObject;DisplayOff: --DisplayDefs--PROCEDURE [color: Background];DisplayOn: --DisplayDefs--PROCEDURE;DivideCheck: --TrapDefs--SIGNAL;DIVMOD: --InlineDefs, Inline--PROCEDURE [num: CARDINAL, den: CARDINAL]î¬ïfñpôXð.rî ìpî Mïbtuvtî Mï`šuvtî Mï_uvtî Mï]’stuvtî Mï\s tu vtvtvtî MïZŠstuvtî MïYstuvtî MïW�stuvtî MïUýuvtvtvtî MïTy u vtvtî ®ïRõî ®ïQq vtî ®ïOí vtî ®ïNivt î ®ïLå vtvtî ®ïKavtî ®ïIÝvtî ®ïHYvt î ®ïFÕ vtî ®ïEQvtî ®ïCÍvtvtî MïBIs tuvtî Mï@Åstu vtî ®ï?Avtð"vtî Mï=¼s tuvtî Mï<8stu vtî Mï:´s tu vtî Mï90stuvtvtî Mï7¬uvtî ®ï6(ð;î Mï4¤uvtvtvtvtî ®ï3 vtî Mï1œutî Mï0stuvtî ®ï.”vtvt vt vtvtvtî Mï-stuvtvtvt vtî ®ï+Œvtvtî Mï*s tuvtvtvt vtî ®ï(„vtvtî Mï'stuvtvtvtî ®ï%|vtvtî Mï#øutî Mï"suvtî Mï ï utî Mïks tuvtvtvtvtî Mïçs tu vtvtvtvtvtî Mïcstuvtî Mïßs tuvtvtvtvtî Mï[uvtvtvtvtî ®ï×vt vtvt vtî MïS u vtvtvtî MïÏ utî MïK uvtvtî MïÇuvtî MïCu vtvtvtî Mï¿s tuvtî Mï ;stuvtî Mï · u vtî Mï 3stuvtvtvtÿ † ì ì6Ú^Appendix: Symbol Listing for Public Interfaces 89RETURNS [quotient: CARDINAL, remainder: CARDINAL];DIW: --AltoDisplay, AltoHardware, ProcessDefs--POINTER TO WORD;DL: --AltoHardware--TYPE = MACHINE DEPENDENT RECORD [next: DA,prev: DA,blank: UNSPECIFIED,bytes: CARDINAL,page: CARDINAL,fileID: FID];DoNothingDeallocate: --FSPDefs--Deallocator;DS: --AltoHardware--TYPE = MACHINE DEPENDENT RECORD [sector: [0..15],done: [0..15],seekFailed: [0..1],seekInProgress: [0..1],notReady: [0..1],dataLate: [0..1],noTransfer: [0..1],checksumError: [0..1],finalStatus: DFS];DSC: --AltoHardware--TYPE = {DiskRead, DiskCheck, DiskWrite, DiskWriteAlso};DV: --AltoFileDefs--TYPE = MACHINE DEPENDENT RECORD [type: [0..63], length: [0..1777B], fp: CFP];EasyDown: --SegmentDefs--AllocInfo;EasyUp: --SegmentDefs--AllocInfo;EmptyString: --Storage--PROCEDURE [s: STRING] RETURNS [BOOLEAN];EnableInterrupts: --ProcessDefs--PROCEDURE;EnterGlobalFrame: --FrameDefs--PROCEDURE [frame: GlobalFrameHandle, nslots: CARDINAL] RETURNS [gfi: GFTIndex];Enumerate: --DirectoryDefs--PROCEDURE [dir: DiskHandle, proc: PROCEDURE [POINTER TO FP, STRING] RETURNS [BOOLEAN]];EnumerateDataSegments: --SegmentDefs--PROCEDURE [proc: PROCEDURE [DataSegmentHandle] RETURNS [BOOLEAN]]RETURNS [DataSegmentHandle];EnumerateDirectory: --DirectoryDefs--PROCEDURE [proc: PROCEDURE [POINTER TO FP, STRING] RETURNS [BOOLEAN]];EnumerateEntries: --DirectoryDefs--PROCEDURE [dir: DiskHandle, proc: PROCEDURE [CARDINAL, Handle, DEptr] RETURNS [BOOLEAN],inspectFree: POINTER TO READONLY BOOLEAN, lengthFilter: CARDINAL]RETURNS [index: CARDINAL];EnumerateFiles: --SegmentDefs--PROCEDURE [proc: PROCEDURE [FileHandle] RETURNS [BOOLEAN]] RETURNS [file: FileHandle];EnumerateFileSegments: --SegmentDefs--PROCEDURE [proc: PROCEDURE [FileSegmentHandle] RETURNS [BOOLEAN]]RETURNS [FileSegmentHandle];EnumerateGlobalFrames: --FrameDefs--PROCEDURE [proc: PROCEDURE [GlobalFrameHandle] RETURNS [BOOLEAN]]RETURNS [GlobalFrameHandle];eofDA: --AltoFileDefs--vDA;EPLoc: --AltoHardware--POINTER TO EthernetDeviceBlock;EqualIndex: --StreamDefs--PROCEDURE [i1: StreamIndex, i2: StreamIndex]RETURNS [BOOLEAN];EqualString: --StringDefs, String--PROCEDURE [s1: STRING, s2: STRING]RETURNS [BOOLEAN];EqualStrings: --StringDefs, String--PROCEDURE [s1: STRING, s2: STRING]RETURNS [BOOLEAN];EqualSubString: --StringDefs, String--PROCEDURE [s1: SubString, s2: SubString]RETURNS [BOOLEAN];EqualSubStrings: --StringDefs, String--PROCEDURE [s1: SubString, s2: SubString]ÿîBïfñpôXð.rîI pîDïbvt vt vtîãï`šuð*vtvtvtîãï_uvtvtvtvtîDï]’îDï\îDïZŠv tîDïYvtîDïW�vtîDïUý îãïTyu t îãïRõuvtvtvtvtîDïQqîDïOí îDïNiîDïLåîDïKaîDïIÝîDïHYîDïFÕîDïEQîãïCÍuvtð3îãïBIuvtvtvtvtîDï@Åð,îãï?A ut îãï=¼ut îãï<8s tu vtvtvtvtîãï:´stuvtîãï90stu vtîDï7¬ð"vtvtîãï6(stuvtîDï4¤vtvtvtvtvtvtîãï3 stuvtîDï1œvtvtvtîDï0vtîãï.”stuvtîDï-vtvtvtvtvtvtîãï+ŒstuvtîDï*vtvtvtvtîDï(„ vtvtvtvtvtîDï'vtvtîãï%|s tuvtîDï#øvt vtvtvtîãï"sstuvtîDï ïvtvtvtîDïkvtîãïçstu vtîDïcvtvtvtîDïßvtîãï[utîãï×uvtvtîãïSs tu vtð#îDïÏvtvtîãïKs tuvtvtvtîDïÇvtvtîãïCs tuvtvtvtîDï¿vtvtîãï ;s tuvtîDï ·vtvtîãï 3stuvtÿ ° ‚ ì5]^ÔAppendix: Symbol Listing for Public Interfaces 90RETURNS [BOOLEAN];EquivalentString: --StringDefs, String--PROCEDURE [s1: STRING, s2: STRING]RETURNS [BOOLEAN];EquivalentStrings: --StringDefs, String--PROCEDURE [s1: STRING, s2: STRING]RETURNS [BOOLEAN];EquivalentSubString: --StringDefs, String--PROCEDURE [s1: SubString, s2: SubString] RETURNS [BOOLEAN];EquivalentSubStrings: --StringDefs, String--PROCEDURE [s1: SubString, s2: SubString] RETURNS [BOOLEAN];ESC: --Ascii, CharIO, IODefs--CHARACTER = 33C;EthernetDeviceBlock: --AltoHardware--TYPE = MACHINE DEPENDENT RECORD [postData: EthernetPost,interruptBit: WORD,wordsLeft: CARDINAL,retransmissionMask: WORD,inputBuffer: WordBlockDescriptor,outputBuffer: WordBlockDescriptor,hostNumber: WORD];EthernetHardwareStatus: --AltoHardware--TYPE = MACHINE DEPENDENT RECORD [unused: [0..2],inputDataLate: [0..1],collision: [0..1],badInputCRC: [0..1],inputCommandIssued: [0..1],outputCommandIssued: [0..1],incompleteTransmission: [0..1]];EthernetMicrocodeStatus: --AltoHardware--TYPE = RECORD [[0..255]];EthernetPost: --AltoHardware--TYPE = MACHINE DEPENDENT RECORD [microcodeStatus: EthernetMicrocodeStatus,hardwareStatus: EthernetHardwareStatus];Even: --SystemDefs--PROCEDURE [u: UNSPECIFIED] RETURNS [UNSPECIFIED];Expand: --Storage--PROCEDURE [pages: CARDINAL];ExpandString: --Storage, SystemDefs--PROCEDURE [s: POINTER TO STRING, longer: CARDINAL];FA: --AltoFileDefs--TYPE = MACHINE DEPENDENT RECORD [da: vDA, page: CARDINAL, byte: CARDINAL];FF: --Ascii, CharIO, IODefs--CHARACTER = 14C;FH: --AltoFileDefs--TYPE = RECORD [da: vDA, page: PageNumber];FI: --AltoFileDefs--TYPE = RECORD [page: PageNumber, byte: CARDINAL];FID: --AltoHardware--TYPE = MACHINE DEPENDENT RECORD [version: CARDINAL, serial: LONG UNSPECIFIED];FileAccessError: --SegmentDefs--SIGNAL [file: FileHandle];FileError: --SegmentDefs--SIGNAL [file: FileHandle];FileHandle: --SegmentDefs--TYPE = POINTER TO FileObject;FileHint: --SegmentDefs--TYPE = FH;FileIndex: --SegmentDefs--TYPE = FI;FileLength: --StreamDefs--PROCEDURE [stream: StreamHandle]RETURNS [StreamIndex];FileLockCount: --SegmentDefs--TYPE = [0..255];FilenameChars: --AltoFileDefs--INTEGER = 39;FileNameError: --SegmentDefs, StreamDefs--SIGNAL [name: STRING];FilenameWords: --AltoFileDefs--INTEGER = 20;FileObject: --SegmentDefs--TYPE = file Object;FilePropertyType: --AltoFileDefs--TYPE = BYTE;FileRequest: --ImageDefs--TYPE = RECORD [link: POINTER TO FileRequest,file: FileHandle,access: AccessOptions,name: STRING];ÿî¬ïfñpôXð.rî ìpî ®ïbvtvtî Mï`šstuvtvtvtî ®ï_vtvtî Mï]’stuvtvtvtî ®ï\vtvtî MïZŠstuvtî ®ïYvtvtî MïW�stuvtî ®ïUývtvtî MïTyuvtî MïRõuvtvtvtvtî ®ïQqî ®ïOí vtî ®ïNi vtî ®ïLåvtî ®ïKað!î ®ïIÝð"î ®ïHY vtî MïFÕuvtvtvtvtî ®ïEQî ®ïCÍî ®ïBIî ®ï@Åî ®ï?Aî ®ï=¼î ®ï<8î Mï:´uvtvt î Mï90 uvtvtvtvtî ®ï7¬ð)î ®ï6(ð(î Mï4¤stu vtv tvtv tî Mï3 stu vtvtî Mï1œs tuvtî ®ï0vtvtvt vtî Mï.”uvtvtvtvtî ®ï-vtvtî Mï+Œuvtî Mï*uvtvtî Mï(„uvtvtvtî Mï'uvtvtvtvtî ®ï%|vt vtv tî Mï#øuvtî Mï"s uvtî Mï ï uvtvtvt î Mïk uvtî Mïç uvtî Mïcs tu vtî ®ïßvtî Mï[uvt î Mï×uvtî MïSuvtvtî MïÏuvtî MïK uvtî MïÇuvtî MïC u vtvtî ®ï¿vtvt î ®ï ;î ®ï ·î ®ï 3vt ¾ ì ì3`^¾Appendix: Symbol Listing for Public Interfaces 91FileSegmentAddress: --SegmentDefs--PROCEDURE [seg: FileSegmentHandle]RETURNS [POINTER];FileSegmentClass: --SegmentDefs--TYPE = {code, other};FileSegmentHandle: --SegmentDefs--TYPE = POINTER TO FileSegmentObject FileSegmentObject: --SegmentDefs--TYPE = file segment ObjectfillinDA: --AltoFileDefs--vDA;FindFile: --SegmentDefs--PROCEDURE [fp: POINTER TO FP] RETURNS [FileHandle];Finish: --StreamScan--PROCEDURE [ssd: Handle];FIP: --AltoFileDefs--TYPE = MACHINE DEPENDENT RECORD [type: BYTE, length: BYTE];FL1: --KeyDefs--KeyName = DEL;FL2: --KeyDefs--KeyName = LF;FontHandle: --FontDefs--TYPE = POINTER TO FontObject;FontObject: --FontDefs--TYPE = RECORD [paintChar: PROCEDURE [FontHandle, CHARACTER, POINTER TO BitmapState],clearChar: PROCEDURE [FontHandle, CHARACTER, POINTER TO BitmapState],charWidth: PROCEDURE [FontHandle, CHARACTER] RETURNS [CARDINAL],charHeight: PROCEDURE [FontHandle, CHARACTER] RETURNS [CARDINAL],close: PROCEDURE [FontHandle],destroy: PROCEDURE [FontHandle],lock: PROCEDURE [FontHandle] RETURNS [POINTER],unlock: PROCEDURE [FontHandle]];FP: --AltoFileDefs--TYPE = RECORD [serial: SN, leaderDA: vDA];FR1: --KeyDefs--KeyName = Spare3;FR2: --KeyDefs--KeyName = BackSlash;FR3: --KeyDefs--KeyName = Arrow;FR4: --KeyDefs--KeyName = Spare2;FrameDS: --SegmentDefs--DataSegmentType = 1;Free: --Storage--PROCEDURE [p: POINTER];FreeHeapNode: --SystemDefs--PROCEDURE [p: POINTER];FreeHeapString: --SystemDefs--PROCEDURE [s: STRING];FreeNode: --FSPDefs--PROCEDURE [z: ZonePointer, p: POINTER];FreeNodeNil: --Storage--PROCEDURE [p: POINTER] RETURNS [nil: POINTER];FreeNodePointer: --FSPDefs--TYPE = POINTER TO free NodeHeader;FreePages: --Storage, SystemDefs--PROCEDURE [base: POINTER];FreePagesNil: --Storage--PROCEDURE [base: POINTER] RETURNS [nil: POINTER];FreeSegment: --SystemDefs--PROCEDURE [base: POINTER];FreeString: --Storage--PROCEDURE [s: STRING];FreeStringNil: --Storage--PROCEDURE [s: STRING] RETURNS [nil: STRING];FreeWords: --Storage--PROCEDURE [base: POINTER];Frob: --SegmentDefs--TYPE = free Object;FrobHandle: --SegmentDefs--TYPE = POINTER TO Frob;FrobLink: --SegmentDefs--TYPE = ORDERED POINTER [0..255] TO Frob;FrobNull: --SegmentDefs--FrobLink;FrobSize: --SegmentDefs--TYPE = [0..255];GetBuffer: --StreamScan--PROCEDURE [ssd: Handle] RETURNS [POINTER];GetCaller: --FrameDefs--PROCEDURE RETURNS [PROGRAM];GetChar: --CharIO--PROCEDURE [in: Handle] RETURNS [CHARACTER];GetCurrent: --ProcessDefs, Process--PROCEDURE RETURNS [PROCESS];GetCurrentKey: --StreamDefs--PROCEDURE RETURNS [KeyboardHandle];GetDecimal: --CharIO--PROCEDURE [in: Handle] RETURNS [INTEGER];GetDefaultDisplayStream: --StreamDefs--PROCEDURE RETURNS [DisplayHandle];GetDefaultKey: --StreamDefs--PROCEDURE RETURNS [KeyboardHandle];GetDiskStreamList: --StreamDefs--PROCEDURE RETURNS [DiskHandle];GetEndOfFile: --SegmentDefs--PROCEDURE [file: FileHandle]RETURNS [page: PageNumber, byte: CARDINAL];GetFA: --StreamDefs--PROCEDURE [stream: StreamHandle, fa: POINTER TO FA];GetFileAccess: --SegmentDefs--PROCEDURE [file: FileHandle]RETURNS [access: AccessOptions];GetFileFP: --SegmentDefs--PROCEDURE [file: FileHandle, fp: POINTER TO FP];îBïfñpôXð.qîI pîãïbsrturîDï`šururîãï_turîãï]’turururîãï\turîãïZŠ trîãïYsrturururur îãïW�srt urîãïUýtururururîãïTyt r îãïRõt r îãïQq t ururur îãïOí t ururîDïNi ur ururur îDïLå ur ururur îDïKa ur urururîDïIÝ ur urururîDïHYur îDïFÕur îDïEQur ururîDïCÍurîãïBItururîãï@Åsrt rîãï?At rîãï=¼t rîãï<8t rîãï:´trîãï90srt ururîãï7¬s rt ururîãï6(s rt ururîãï4¤srt ururîãï3 s rt ururururîãï1œt urururîãï0srtururîãï.”s rt ururururîãï-s rt ururîãï+Œs rt ururîãï*s rt ururururîãï(„srt ururîãï'turîãï%| turururîãï#ø tururur urîãï"s trîãï ï tur îãïksrt urururîãïçsrt urururîãïcsrt ur ururîãïßs rturururîãï[s rt ururîãï×s rt ur ururîãïSsrt ururîãïÏs rt ururîãïKsrt urur îãïÇs rturîDïCururîãï¿srt urururîãï ;s rturîDï ·urîãï 3srturururÿ h ‚ ì5È^6Appendix: Symbol Listing for Public Interfaces 92GetFileLength: --SegmentDefs--PROCEDURE [file: FileHandle, fa: POINTER TO FA];GetFileSegmentDA: --SegmentDefs--PROCEDURE [seg: FileSegmentHandle]RETURNS [vDA];GetFileTimes: --SegmentDefs--PROCEDURE [file: FileHandle]RETURNS [read: LONG CARDINAL, write: LONG CARDINAL, create: LONG CARDINAL];GetFont: --DisplayDefs--PROCEDURE RETURNS [FontHandle];GetID: --CharIO--PROCEDURE [Handle, STRING];GetIndex: --StreamDefs--PROCEDURE [stream: StreamHandle] RETURNS [StreamIndex];GetInputStream: --IODefs--PROCEDURE RETURNS [StreamHandle];GetLine: --CharIO--PROCEDURE [Handle, STRING];GetMemoryConfig: --SegmentDefs--PROCEDURE RETURNS [MemoryConfig];GetNetworkNumber: --MiscDefs--PROCEDURE RETURNS [CARDINAL];GetNumber: --CharIO--PROCEDURE [in: Handle, radix: CARDINAL]RETURNS [UNSPECIFIED];GetOctal: --CharIO--PROCEDURE [in: Handle] RETURNS [UNSPECIFIED];GetOutputStream: --IODefs--PROCEDURE RETURNS [StreamHandle];GetPosition: --StreamDefs--PROCEDURE [stream: StreamHandle]RETURNS [StreamPosition];GetPriority: --ProcessDefs, Process--PROCEDURE RETURNS [Priority];GetString: --CharIO--PROCEDURE [Handle, STRING, PROCEDURE [CHARACTER] RETURNS [BOOLEAN]];GetTypeScript: --DisplayDefs--PROCEDURE RETURNS [DiskHandle];GetWorkingDir: --DirectoryDefs--PROCEDURE RETURNS [dir: FileHandle];GlobalFrame: --FrameDefs--PROCEDURE [link: UNSPECIFIED]RETURNS [GlobalFrameHandle];GrEqualIndex: --StreamDefs--PROCEDURE [i1: StreamIndex, i2: StreamIndex]RETURNS [BOOLEAN];GrIndex: --StreamDefs--PROCEDURE [i1: StreamIndex, i2: StreamIndex]RETURNS [BOOLEAN];Handle: --CharIO--TYPE = StreamHandle;Handle: --StreamScan--TYPE = POINTER TO READONLY Descriptor;HardDown: --SegmentDefs--AllocInfo;HardUp: --SegmentDefs--AllocInfo;HardwareError: --TrapDefs--SIGNAL;hardwareReset: --AltoHardware--EthernetMicrocodeStatus;HeapDS: --SegmentDefs--DataSegmentType = 3;HeapZone: --Storage--PROCEDURE RETURNS [POINTER];HeapZone: --SystemDefs--PROCEDURE RETURNS [ZonePointer];HighByte: --InlineDefs, Inline--PROCEDURE [u: UNSPECIFIED]RETURNS [UNSPECIFIED];HighHalf: --InlineDefs, Inline--PROCEDURE [u: LONG UNSPECIFIED]RETURNS [UNSPECIFIED];ImageTime: --ImageDefs--PROCEDURE RETURNS [PackedTime];ImageVersion: --ImageDefs--PROCEDURE RETURNS [Stamp];ImmovableSegmentInXM: --SegmentDefs--SIGNAL [seg: SegmentHandle];IndexToPosition: --StreamDefs--PROCEDURE [index: StreamIndex]RETURNS [StreamPosition];Init: --StreamScan--PROCEDURE [stream: StreamHandle, bufTable: POINTER, nBufs: CARDINAL] RETURNS [Handle];InitDisplay: --DisplayDefs--PROCEDURE [dummySize: CARDINAL, textLines: CARDINAL, nPages: CARDINAL, f: FontHandle];InitializeCondition: --ProcessDefs, Process--PROCEDURE [condition: POINTER TO CONDITION, ticks: Ticks];InitializeMonitor: --ProcessDefs, Process--PROCEDURE [monitor: POINTER TO MONITORLOCK];inputBufferOverflow: --AltoHardware--EthernetMicrocodeStatus;inputDone: --AltoHardware--EthernetMicrocodeStatus;Insert: --DirectoryDefs--PROCEDURE [dir: DiskHandle, fp: POINTER TO FP, name: STRING] RETURNS [old: BOOLEAN];î¬ïfñpôXð.qî ìpî Mïbs rturururî Mï`šsrturî ®ï_urî Mï]’s rturî ®ï\ururururur ururî MïZŠsrturur î MïYsrt ur urî MïW�srt ururî MïUýs rt ururî MïTysrt ur urî MïRõsrtururî MïQqsrt urururî MïOísrt ururî ®ïNiuru rî MïLåsrt ur uru rî MïKasrt ururî MïIÝs rt urî ®ïHYurî MïFÕs rturur î MïEQsrt urî ®ïCÍurururururî MïBIs rturur î Mï@Ås rtururî Mï?As rt uru rî ®ï=¼urî Mï<8s rt urð#î ®ï:´ururî Mï90srt urð#î ®ï7¬ururî Mï6(t urî Mï4¤t urururur î Mï3 tr î Mï1œtr î Mï0t urî Mï.”trî Mï-trî Mï+Œsrt urururî Mï*srt ururî Mï(„srturu rî ®ï'uru rî Mï%|srtururu rî ®ï#øuru rî Mï"ssrt urur î Mï ïs rt ururî Mïkturî Mïçsrt urî ®ïcurî Mïßsrt urî ®ï[ururur î Mï×s rturî ®ïS ur ur urî MïÏsrturî ®ïK urururî MïÇsrturî ®ïCururu rî Mï¿trî Mï ; trî Mï ·srturî ®ï 3urur urururÿ Þ ì ì7´^Appendix: Symbol Listing for Public Interfaces 93InsertFile: --SegmentDefs--PROCEDURE [fp: POINTER TO FP, access: AccessOptions]RETURNS [FileHandle];InsertFileLength: --SegmentDefs--PROCEDURE [file: FileHandle, fa: POINTER TO FA];InsufficientVM: --SegmentDefs--SIGNAL [needed: PageCount];interfaceBroken: --AltoHardware--EthernetMicrocodeStatus;InterruptLevel: --ProcessDefs--TYPE = [0..15];Invalid: --Time--ERROR;InvalidDA: --AltoHardware--DA;InvalidFP: --SegmentDefs--SIGNAL [fp: POINTER TO FP];InvalidFrame: --FrameDefs--SIGNAL [frame: UNSPECIFIED];InvalidGlobalFrame: --FrameDefs--SIGNAL [frame: UNSPECIFIED];InvalidImage: --ImageDefs--SIGNAL;InvalidImageName: --ImageDefs--SIGNAL;InvalidLongPointer: --SegmentDefs--ERROR [lp: LONG UNSPECIFIED];InvalidNode: --FSPDefs, Storage--ERROR [POINTER];InvalidNumber: --StringDefs, String--SIGNAL;InvalidProcess: --ProcessDefs--SIGNAL [process: UNSPECIFIED];InvalidProcess: --Process--ERROR [process: UNSPECIFIED];InvalidSegmentSize: --SegmentDefs--SIGNAL [pages: PageCount];InvalidTime: --TimeDefs--ERROR;InvalidVMPage: --SegmentDefs--ERROR [page: UNSPECIFIED];InvalidZone: --FSPDefs--ERROR [POINTER];IsBound: --FrameDefs--PROCEDURE [UNSPECIFIED] RETURNS [BOOLEAN];JumpToFA: --StreamDefs--PROCEDURE [stream: StreamHandle, fa: POINTER TO FA];JumpToPage: --SegmentDefs--PROCEDURE [cfa: POINTER TO CFA, page: PageNumber, buf: POINTER]RETURNS [prev: vDA, next: vDA];KBDAD: --AltoHardware--POINTER TO KeyboardBits;KCB: --AltoHardware--TYPE = MACHINE DEPENDENT RECORD [nextCB: KCBHandle,status: DS,command: DC,headerAddress: POINTER,labelAddress: POINTER,dataAddress: POINTER,normalWakeups: WORD,errorWakeups: WORD,unused: UNSPECIFIED,diskAddress: DA];KCBHandle: --AltoHardware--TYPE = POINTER TO KCB;KD: --AltoFileDefs--TYPE = MACHINE DEPENDENT RECORD [disk: DISK,lastSN: SN,changed: WORD,size: CARDINAL,versions: CARDINAL,freePages: CARDINAL,blank: ARRAY [0..5] OF UNSPECIFIED,table: ARRAY [0..0] OF WORD];KeyArray: --KeyDefs--TYPE = ARRAY [0..4] OF WORD;KeyBits: --KeyDefs--TYPE = MACHINE DEPENDENT RECORD [blank: [0..255],Keyset1: updown, Keyset2: updown, Keyset3: updown, Keyset4: updown,Keyset5: updown, Red: updown, Blue: updown, Yellow: updown,Five: updown, Four: updown, Six: updown, E: updown,Seven: updown, D: updown, U: updown, V: updown,Zero: updown, K: updown, Dash: updown, P: updown,Slash: updown, BackSlash: updown, LF: updown, BS: updown,îBïfñpôXð.qîI pîãïbs rturururîDï`šur îãï_srturîDï]’ururîãï\turîãïZŠtrîãïYtur îãïW�turîãïUý trîãïTy turururîãïRõ t uru rîãïQqt uru rîãïOí t urîãïNit urîãïLåtururu rîãïKa tururîãïIÝturîãïHYtur u rîãïFÕt ur u rîãïEQturîãïCÍ t urîãïBIturu rîãï@Å t ururîãï?Asrt uru rururîãï=¼srt urururîãï<8s rturîDï:´urururîDï90urîãï7¬turur îãï6(tururururîDï4¤îDï3 îDï1œ îDï0urîDï.” urîDï- urîDï+ŒurîDï* urîDï(„u rîDï'îãï%| turururîãï#øtururururîDï"s îDï ï îDïkurîDïçurîDïc urîDïß urîDï[ururu rîDï×urururîãïS t ururururîãïÏt ururururîDïKîDïÇðCîDïCð;îDï¿ð3îDï ;ð/îDï ·ð1îDï 3ð9ÿ \ ‚ ì6^¶Appendix: Symbol Listing for Public Interfaces 94Three: updown, Two: updown, W: updown, Q: updown,S: updown, A: updown, Nine: updown, I: updown,X: updown, O: updown, L: updown, Comma: updown,Quote: updown, RightBracket: updown, Spare2: updown, Spare1: updown,One: updown, ESC: updown, TAB: updown, F: updown,Ctrl: updown, C: updown, J: updown, B: updown,Z: updown, LeftShift: updown, Period: updown, SemiColon: updown,Return: updown, Arrow: updown, DEL: updown, FL3: updown,R: updown, T: updown, G: updown, Y: updown,H: updown, Eight: updown, N: updown, M: updown,Lock: updown, Space: updown, LeftBracket: updown, Equal: updown,RightShift: updown, Spare3: updown, FL4: updown, FR5: updown];Keyboard: --KeyDefs--PROGRAM;KeyboardBits: --AltoHardware--TYPE = MACHINE DEPENDENT RECORD [Five: updown, Four: updown, Six: updown, E: updown,Seven: updown, D: updown, U: updown, V: updown,Zero: updown, K: updown, Dash: updown, P: updown,Slash: updown, BackSlash: updown, LF: updown, BS: updown,Three: updown, Two: updown, W: updown, Q: updown,S: updown, A: updown, Nine: updown, I: updown,X: updown, O: updown, L: updown, Comma: updown,Quote: updown, RightBracket: updown, Spare2: updown, Spare1: updown,One: updown, ESC: updown, TAB: updown, F: updown,Ctrl: updown, C: updown, J: updown, B: updown,Z: updown, LeftShift: updown, Period: updown, SemiColon: updown,Return: updown, Arrow: updown, DEL: updown, FL3: updown,R: updown, T: updown, G: updown, Y: updown,H: updown, Eight: updown, N: updown, M: updown,Lock: updown, Space: updown, LeftBracket: updown, Equal: updown,RightShift: updown, Spare3: updown, FL4: updown, FR5: updown];KeyboardHandle: --StreamDefs--TYPE = POINTER TO Keyboard StreamObject;KeyItem: --KeyDefs--TYPE = RECORD [Letter: BOOLEAN, ShiftCode: [0..127], NormalCode: [0..255]];KeyName: --KeyDefs--TYPE = {x0, x1, x2, x3, x4, x5, x6, x7, Keyset1, Keyset2, Keyset3, Keyset4, Keyset5,Red, Blue, Yellow, Five, Four, Six, E, Seven, D, U, V, Zero, K, Dash, P,Slash, BackSlash, LF, BS, Three, Two, W, Q, S, A, Nine, I, X, O, L, Comma,Quote, RightBracket, Spare2, Spare1, One, ESC, TAB, F, Ctrl, C, J, B, Z,LeftShift, Period, SemiColon, Return, Arrow, DEL, FL3, R, T, G, Y, H, Eight,N, M, Lock, Space, LeftBracket, Equal, RightShift, Spare3, FL4, FR5};Keys: --KeyDefs--POINTER TO KeyBits;KeyStreams: --KeyDefs--PROGRAM;LargestHole: --SegmentDefs--PROCEDURERETURNS [base: PageNumber, pages: PageCount];LargestMDSHole: --SegmentDefs--PROCEDURERETURNS [base: PageNumber, pages: PageCount];LastDiskAddress: --AltoHardware--POINTER TO DA;LD: --AltoFileDefs--TYPE = MACHINE DEPENDENT RECORD [created: TIME,written: TIME,read: TIME,name: ARRAY [0..19] OF UNSPECIFIED,props: ARRAY [0..209] OF UNSPECIFIED,spare: ARRAY [0..9] OF UNSPECIFIED,propBegin: BYTE,propLength: BYTE,consecutive: BOOLEAN,blank: [0..127],newSN: BYTE,ÿî¬ïfñpôXð.qî ìpî ®ïbrð1î ®ï`šð.î ®ï_ð/î ®ï]’ðDî ®ï\ð1î ®ïZŠð.î ®ïYð@î ®ïW�ð8î ®ïUýð+î ®ïTyð/î ®ïRõð@î ®ïQqð>î MïOí t urî MïNi tururururî ®ïLåð3î ®ïKað/î ®ïIÝð1î ®ïHYð9î ®ïFÕð1î ®ïEQð.î ®ïCÍð/î ®ïBIðDî ®ï@Åð1î ®ï?Að.î ®ï=¼ð@î ®ï<8ð8î ®ï:´ð+î ®ï90ð/î ®ï7¬ð@î ®ï6(ð>î Mï4¤t urururî Mï3 t ururî ®ï1œurð-î Mï0t urî ®ï.”ðLî ®ï-ðHî ®ï+ŒðJî ®ï*ðHî ®ï(„ðLî ®ï'ðEî Mï%|t ururî Mï#ø t urî Mï"ss rtuî ®ï ïurð&î Mïks rtuî ®ïçurð&î Mïctururî Mïßtururururî ®ï[ î ®ï× î ®ïS î ®ïÏururu rî ®ïKur uru rî ®ïÇururu rî ®ïCî ®ï¿î ®ï ; urî ®ï ·î ®ï 3   ì ì2^HAppendix: Symbol Listing for Public Interfaces 95dirFP: CFP,eofFA: FA];LDIVMOD: --InlineDefs, Inline--PROCEDURE [numlow: WORD, numhigh: CARDINAL, den: CARDINAL]RETURNS [quotient: CARDINAL, remainder: CARDINAL];LengthHandle: --SegmentDefs--TYPE = POINTER TO LengthObject;LengthObject: --SegmentDefs--TYPE = length Object;LF: --Ascii, CharIO, IODefs--CHARACTER = 12C;LineOverflow: --IODefs--SIGNAL [s: STRING] RETURNS [ns: STRING];LinkageFault: --TrapDefs--ERROR;LoadConfig: --FrameDefs--PROCEDURE [name: STRING] RETURNS [PROGRAM];LocalTimeParameters: --TimeDefs--TYPE = MACHINE DEPENDENT RECORD [direction: WestEast,zone: [0..12],unused1: [0..3],beginDST: [0..366],unused2: [0..1],zoneminutes: [0..59],endDST: [0..366]];LockCode: --FrameDefs--PROCEDURE [link: UNSPECIFIED];LockFile: --SegmentDefs--PROCEDURE [file: FileHandle];LogBytesPerPage: --AltoDefs--CARDINAL = 9;LogBytesPerWord: --AltoDefs--CARDINAL = 1;LogCharsPerPage: --AltoDefs, StringDefs, String--CARDINAL = 9;LogCharsPerWord: --AltoDefs--CARDINAL = 1;LogPageSize: --AltoDefs--CARDINAL = 8;LongAddressFromPage: --SegmentDefs--PROCEDURE [p: PageNumber]RETURNS [LONG POINTER];LongCARDINAL: --InlineDefs, Inline--TYPE = LONG CARDINAL;LongCOPY: --InlineDefs, Inline--PROCEDURE [from: LONG POINTER, nwords: CARDINAL, to: LONG POINTER];LongDataSegmentAddress: --SegmentDefs--PROCEDURE [seg: DataSegmentHandle]RETURNS [LONG POINTER];LongDCB: --AltoDisplay--TYPE = MACHINE DEPENDENT RECORD [next: DCBHandle,resolution: Resolution,background: Background,indenting: [0..63],width: [0..255],bitmap: POINTER,tag: {short, long},height: [0..77777B],longBitmap: LONG POINTER];LongDCBSeal: --AltoDisplay--POINTER;LongDecimal: --Format--PROCEDURE [n: LONG INTEGER, proc: StringProc];LongDiv: --InlineDefs, Inline--PROCEDURE [num: LONG CARDINAL, den: CARDINAL]RETURNS [CARDINAL];LongDivMod: --InlineDefs, Inline--PROCEDURE [num: LONG CARDINAL, den: CARDINAL]RETURNS [quotient: CARDINAL, remainder: CARDINAL];LongFileSegmentAddress: --SegmentDefs--PROCEDURE [seg: FileSegmentHandle]RETURNS [LONG POINTER];LongMult: --InlineDefs, Inline--PROCEDURE [CARDINAL, CARDINAL]RETURNS [product: LONG CARDINAL];LongNumber: --Format--PROCEDURE [n: LONG UNSPECIFIED, format: NumberFormat, proc: StringProc];LongNumber: --InlineDefs, Inline--TYPE = MACHINE DEPENDENT RECORD [SELECT OVERLAID * FROMlc => [lc: LONG CARDINAL],li => [li: LONG INTEGER],ÿîBïfñpôXð.qîI pîDïbr îDï`š îãï_srturîDï]’ur ururîDï\ur ur urîãïZŠ tururur îãïY turîãïW�turîãïUý t ururururîãïTy t urîãïRõs rt ururururîãïQqt ururururîDïOíîDïNi îDïLåîDïKaîDïIÝîDïHYîDïFÕîãïEQsrt uru rîãïCÍsrturîãïBIt urîãï@Åt urîãï?Aturîãï=¼t urîãï<8 t urîãï:´srturîDï90urururîãï7¬ turururîãï6(srturîDï4¤urur urururîãï3 srturîDï1œurururîãï0tururururîDï.”îDï-îDï+ŒîDï*îDï(„îDï'urîDï%|îDï#øîDï"s ururîãï ï turîãïks rt urururîãïçsrtururururîDïcururîãïßs rtururururîDï[ur ur urîãï×srturîDïSurururîãïÏsrturururîDïKur ururîãïÇs rt urîDïCuru rð*îãï¿ tururururîDï ;ururuî¥ï ·r ururî¥ï 3 urur J ‚ ì8-^ÔAppendix: Symbol Listing for Public Interfaces 96lu => [lu: LONG UNSPECIFIED],num => [lowbits: CARDINAL, highbits: CARDINAL]ENDCASE];LongOctal: --Format--PROCEDURE [n: LONG UNSPECIFIED, proc: StringProc];LongSegmentAddress: --SegmentDefs--PROCEDURE [seg: SegmentHandle]RETURNS [LONG POINTER];LongString: --Format--PROCEDURE [s: LONG STRING, proc: StringProc];LongSubString: --Format--TYPE = POINTER TO LongSubStringDescriptor;LongSubStringDescriptor: --Format--TYPE = RECORD [base: LONG STRING, offset: CARDINAL, length: CARDINAL];LongSubStringItem: --Format--PROCEDURE [ss: LongSubString, proc: StringProc];LongVMtoDataSegment: --SegmentDefs--PROCEDURE [a: LONG POINTER]RETURNS [DataSegmentHandle];LongVMtoFileSegment: --SegmentDefs--PROCEDURE [a: LONG POINTER]RETURNS [FileSegmentHandle];LongVMtoSegment: --SegmentDefs--PROCEDURE [a: LONG POINTER]RETURNS [SegmentHandle];Lookup: --DirectoryDefs--PROCEDURE [dir: DiskHandle, fp: POINTER TO FP, name: STRING, create: BOOLEAN]RETURNS [old: BOOLEAN];LookupFP: --DirectoryDefs--PROCEDURE [dir: DiskHandle, fp: POINTER TO FP, name: STRING] RETURNS [old: BOOLEAN];LowByte: --InlineDefs, Inline--PROCEDURE [u: UNSPECIFIED] RETURNS [UNSPECIFIED];LowerCase: --StringDefs, String--PROCEDURE [c: CHARACTER] RETURNS [CHARACTER];LowHalf: --InlineDefs, Inline--PROCEDURE [u: LONG UNSPECIFIED]RETURNS [UNSPECIFIED];MachineType: --SegmentDefs--TYPE = {unknown0, AltoI, AltoII, AltoIIXM, D0, Dorado, unknown6, unknown7};MakeCheckPoint: --ImageDefs--PROCEDURE [name: STRING]RETURNS [restart: BOOLEAN];MakeCodeResident: --FrameDefs--PROCEDURE [f: GlobalFrameHandle];MakeDataSegment: --AllocDefs, SegmentDefs--PROCEDURE [base: PageNumber, pages: PageCount, info: AllocInfo]RETURNS [seg: DataSegmentHandle];MakeImage: --ImageDefs--PROCEDURE [name: STRING, merge: BOOLEAN];MakeNewZone: --FSPDefs--PROCEDURE [base: POINTER, length: BlockSize, deallocate: Deallocator]RETURNS [z: ZonePointer];MakeNode: --FSPDefs--PROCEDURE [z: ZonePointer, n: BlockSize] RETURNS [POINTER];MakeSwappedIn: --AllocDefs, SegmentDefs--PROCEDURE [seg: FileSegmentHandle, base: PageNumber, info: AllocInfo];MakeUnMergedImage: --ImageDefs--PROCEDURE [name: STRING];MakeZone: --FSPDefs--PROCEDURE [base: POINTER, length: BlockSize]RETURNS [z: ZonePointer];MapFileSegment: --SegmentDefs--PROCEDURE [seg: FileSegmentHandle, file: FileHandle, base: PageNumber];MaxBitsPerLine: --AltoDisplay--CARDINAL = 608;Maxc2MemoryInterface: --AltoHardware--Task = Trident17;maxcharcode: --AltoDefs--CARDINAL = 255;MaxFileLocks: --SegmentDefs--CARDINAL = 255;MaxFilePage: --AltoDefs--CARDINAL = 77777B;maxinteger: --AltoDefs--INTEGER = 77777B;MaxMDSPage: --AltoDefs--CARDINAL = 255;MaxRefs: --SegmentDefs--CARDINAL = 255;MaxScanLines: --AltoDisplay--CARDINAL = 808;MaxSegLocks: --SegmentDefs--CARDINAL = 15;MaxSegs: --SegmentDefs--CARDINAL = 177777B;MaxVMPage: --AltoDefs--CARDINAL = 7777B;î¬ïfñpôXð.qî ìpîïbr uru rîï`šur urîï_urî Mï]’srt ururu rî Mï\srturî ®ïZŠurururî MïYs rt urururî MïW�t urururî MïUýt ururî ®ïTyurur ur urî MïRõsrt urð'î MïQqsrturururî ®ïOíurî MïNisrturururî ®ïLåurî MïKasrturururî ®ïIÝurî MïHYsrturî ®ïFÕurur ur urî ®ïEQururî MïCÍsrturî ®ïBIurur urururî Mï@Åsrturu ruru rî Mï?Asrtururururî Mï=¼srtururu rî ®ï<8uru rî Mï:´ turî ®ï90ðCî Mï7¬s rt ururî ®ï6(ur urî Mï4¤srt urî Mï3 srturî ®ï1œð4î ®ï0urî Mï.”srt urururî Mï-s rt urî ®ï+Œurð-î ®ï*urî Mï(„srt urururî Mï's rturî ®ï%|ð;î Mï#øsrt ururî Mï"ssrt ururî ®ï ïurî Mïks rturî ®ïçð<î Mïcturî Mïßtrî Mï[ t urî Mï× turî MïS t ur î MïÏ t ur î MïK t urî MïÇturî MïC turî Mï¿ turî Mï ;tur î Mï · t urÿ < ì p7A\›êAppendix: Symbol Listing for Public Interfaces 97maxword: --AltoDefs--CARDINAL = 177777B;MaxWordsPerLine: --AltoDisplay--CARDINAL = 38;memConfig: --SegmentDefs--MemoryConfig;MemoryConfig: --SegmentDefs--TYPE = MACHINE DEPENDENT RECORD [reserved: [0..31],AltoType: MachineType,xmMicroCode: BOOLEAN,useXM: BOOLEAN,mdsBank: BankIndex,controlStore: ControlStoreType,banks: [0..177777B],mesaMicrocodeVersion: [0..177777B]];MemoryErrorAddressRegister: --AltoHardware--POINTER TO POINTER;MemoryErrorControl: --AltoHardware--TYPE = MACHINE DEPENDENT RECORD [spare1: [0..15],testHammingCode: [0..127],testMode: [0..1],interruptSingleBitErrors: [0..1],interruptDoubleBitErrors: [0..1],noErrorCorrection: [0..1],spare2: [0..1]];MemoryErrorControlRegister: --AltoHardware--POINTER TO POINTER;MemoryErrorStatus: --AltoHardware--TYPE = MACHINE DEPENDENT RECORD [hammingCode: [0..63],parityError: [0..1],memoryParity: [0..1],syndrome: [0..63],bankNumber: BankNumber];MemoryErrorStatusRegister: --AltoHardware--POINTER TO POINTER;MesaStringOverflow: --StringDefs--SIGNAL;MesaToBcplLongNumber: --InlineDefs--PROCEDURE [LONG UNSPECIFIED]RETURNS [BcplLongNumber];MesaToBcplString: --StringDefs--PROCEDURE [s: STRING, t: POINTER TO BcplSTRING];Milliseconds: --ProcessDefs, Process--TYPE = CARDINAL;ModifyIndex: --StreamDefs--PROCEDURE [index: StreamIndex, change: INTEGER]RETURNS [StreamIndex];ModifyPosition: --StreamDefs--PROCEDURE [pos: StreamPosition, change: INTEGER]RETURNS [StreamPosition];Mouse: --KeyDefs--POINTER TO MouseBits;MouseBits: --KeyDefs--TYPE = MACHINE DEPENDENT RECORD [blank: [0..255], keyset: [0..31], buttons: MouseButton];MouseButton: --KeyDefs--TYPE = {RedYellowBlue, RedBlue, RedYellow, Red, BlueYellow, Blue, Yellow, None};MouseXY: --AltoDisplay--POINTER TO Coordinate;MoveFileSegment: --SegmentDefs--PROCEDURE [seg: FileSegmentHandle, base: PageNumber, pages: PageCount];MsecToTicks: --ProcessDefs, Process--PROCEDURE [Milliseconds] RETURNS [Ticks];NewByteStream: --StreamDefs--PROCEDURE [name: STRING, access: AccessOptions]RETURNS [DiskHandle];NewConfig: --FrameDefs--PROCEDURE [name: STRING];NewDataSegment: --SegmentDefs--PROCEDURE [base: PageNumber, pages: PageCount]RETURNS [DataSegmentHandle];NewFile: --SegmentDefs--PROCEDURE [name: STRING, access: AccessOptions, version: VersionOptions]RETURNS [FileHandle];NewFileOnly: --SegmentDefs--VersionOptions = 1;NewFileSegment: --SegmentDefs--PROCEDURE [file: FileHandle, base: PageNumber, pages: PageCount, access: AccessOptions]RETURNS [FileSegmentHandle];ÿîBïfñpôXð.qîI pîãïbrs tr îãï`šstrîãï_ sr îãï]’ strtrtrtrîDï\îDïZŠîDïY trîDïW�trîDïUýîDïTyîDïRõîDïQqð$îãïOístrtrtrîãïNistrtrtrtrîDïLåîDïKaîDïIÝîDïHYð!îDïFÕð!îDïEQîDïCÍîãïBIstrtrtrîãï@ÅstrtrtrtrîDï?AîDï=¼îDï<8îDï:´îDï90îãï7¬strtrtrîãï6(s trîãï4¤urs trtrt rîDï3 trîãï1œurs trtrtrtr îãï0 strtrîãï.”u rs trtrîDï-trîãï+Œu rs trtrîDï*trîãï(„s trtr îãï' s trtrtrtrîDï%|ð8îãï#ø s trîDï"sðHîãï ïstrtr îãïkurstrîDïçð<îãïcu rstrtrîãïßu rs trtrîDï[tr îãï×urs trtrîãïSu rstrð%îDïÏtrîãïKurstrîDïÇtrð1îDïCtr îãï¿ srîãï ;u rstrîDï ·ðLîDï 3tr Ø ‚ ì:=^—Appendix: Symbol Listing for Public Interfaces 98NewLine: --IODefs--PROCEDURE RETURNS [BOOLEAN];NewWordStream: --StreamDefs--PROCEDURE [name: STRING, access: AccessOptions]RETURNS [DiskHandle];NextDiskCommand: --AltoHardware--POINTER TO KCBHandle;Node: --Storage--PROCEDURE [nwords: CARDINAL] RETURNS [p: POINTER];NodeHeader: --FSPDefs--TYPE = RECORD [length: BlockSize,extension:SELECT state: * FROMinuse => NULL,free => [fwdp: FreeNodePointer, backp: FreeNodePointer]ENDCASE];NodeLoop: --FSPDefs--ERROR [ZonePointer];NodeOverhead: --FSPDefs--CARDINAL = 1;NodePointer: --FSPDefs--TYPE = POINTER TO NodeHeader;NodeSize: --FSPDefs--PROCEDURE [p: POINTER] RETURNS [BlockSize];NoGlobalFrameSlots: --FrameDefs--SIGNAL [CARDINAL];NormalizeIndex: --StreamDefs--PROCEDURE [index: StreamIndex]RETURNS [StreamIndex];NoRoomForLoader: --ImageDefs--SIGNAL;NoRoomInCheckMap: --ImageDefs--SIGNAL;NoRoomInImageMap: --ImageDefs--SIGNAL;NoRoomInZone: --FSPDefs--SIGNAL [z: ZonePointer];NotEnoughSpaceForDisplay: --DisplayDefs--ERROR;NUL: --Ascii, CharIO, IODefs--CHARACTER = 0C;NullFP: --AltoFileDefs--FP;NullSN: --AltoFileDefs--SN;Number: --Format--PROCEDURE [n: UNSPECIFIED, format: NumberFormat, proc: StringProc];NumberFormat: --CharIO, Format--TYPE = RECORD [base: [2..36], zerofill: BOOLEAN, unsigned: BOOLEAN, columns: [0..255]];NumberFormat: --IODefs--TYPE = NumberFormat;Object: --SegmentDefs--TYPE = RECORD [busy: PRIVATE BOOLEAN,body:SELECT tag: ObjectType FROMfree => [seal: PRIVATE [0..31],size: PRIVATE FrobSize,fwdp: PRIVATE FrobLink,backp: PRIVATE FrobLink],segment => [VMpage: [0..7777B],info:SELECT type: SegmentType FROMdata => [type: DataSegmentType, pages: [1..256]],file => [swappedin: BOOLEAN,write: BOOLEAN,class: FileSegmentClass,inuse: BOOLEAN,lock: SegLockCount,pages: [1..256],file: FileHandle,base: PageNumber,location:SELECT loc: SegmentLocation FROMdisk => [hint: FileHint],remote => [proc: RemoteSegProc, info: UNSPECIFIED]î¬ïfñpôXð.qî ìpî Mïburs trtrtrî Mï`šu rs trtrî ®ï_tr î Mï]’strtr î Mï\urs tr trtrtrî MïZŠ s trtrî ®ïYî ®ïW� îïUýtr tîpïTyrtrîpïRõð7îpïQqtrî MïOí s trî MïNi s trî MïLå s trtrtr î MïKaurs trtrtr î MïIÝs trtrî MïHYu rs trî ®ïFÕtrî MïEQs trî MïCÍs trî MïBIs trî Mï@Å s trî Mï?Astrî Mï=¼strî Mï<8srî Mï:´srî Mï90urs trî ®ï7¬t rð*î Mï6( strtrî ®ï4¤tr trî Mï3 s trî Mï1œstrtrî ®ï0trtrî ®ï.”îï-trtîpï+ŒrîÑï*trîÑï(„tr îÑï'tr îÑï%|tr îpï#ø îÑï"sîÑï ïî2ïktrtî“ïçrð1î“ïcîôïß trîôï[trîôï×îôïStrîôïÏîôïKîôïÇîôïCîôï¿îUï ;trtî¶ï ·rî¶ï 3ð&t rÿ’ ì ì7Ý^}Appendix: Symbol Listing for Public Interfaces 99ENDCASE]ENDCASE],file => [open: BOOLEAN,length: BOOLEAN,lengthvalid: BOOLEAN,read: BOOLEAN,write: BOOLEAN,append: BOOLEAN,lengthchanged: BOOLEAN,unused: [0..63],lock: FileLockCount,swapcount: RefCount,segcount: SegCount,fp: FP],length => [unused: [0..7],byte: [0..512],page: PageNumber,file: FileHandle,da: vDA]ENDCASE];Octal: --Format--PROCEDURE [n: UNSPECIFIED, proc: StringProc];OctalFormat: --Format--NumberFormat;OldFileOnly: --SegmentDefs--VersionOptions = 2;OpenDiskStream: --StreamDefs--PROCEDURE [stream: StreamHandle];OpenFile: --SegmentDefs--PROCEDURE [file: FileHandle];OpenKeyStream: --StreamDefs--PROCEDURE [stream: StreamHandle];OsStaticRecord: --OsStaticDefs--TYPE = MACHINE DEPENDENT RECORD [EnumerateFp: PRIVATE POINTER,fpSysDir: PRIVATE POINTER TO CFP,fpSysStat: PRIVATE POINTER TO CFP,fpDiskDescriptor: PRIVATE POINTER TO CFP,fpSysLog: PRIVATE POINTER TO CFP,fpSysTs: PRIVATE POINTER TO CFP,fpUserCm: PRIVATE POINTER TO CFP,fpComCm: PRIVATE POINTER TO CFP,fpRemCm: PRIVATE POINTER TO CFP,fpExecutive: PRIVATE POINTER TO CFP,fpSysFont: PRIVATE POINTER TO CFP,fpWorkingDir: PRIVATE POINTER TO CFP,nameWorkingDir: PRIVATE POINTER TO BcplSTRING,OsBuffer: PRIVATE POINTER TO WORD,EventVector: POINTER TO WORD,UserName: POINTER TO BcplSTRING,UserPassword: POINTER TO BcplSTRING,OsFinish: PRIVATE POINTER,OsFinishCode: CARDINAL,OsVersion: CARDINAL,OsVersionCompatible: CARDINAL,OsFinishSafeAdr: PRIVATE POINTER,SerialNumber: CARDINAL,lvUserFinishProc: PRIVATE POINTER,SysErr: PRIVATE POINTER,CounterJunta: PRIVATE POINTER,CallSwat: PRIVATE POINTER,lvAbortFlag: POINTER TO CARDINAL,lvSwatContextProc: PRIVATE POINTER,OutLd: PRIVATE POINTER,ÿîBïfñpôXð.qîI pîLïbtrî)ï`štrîï_îgï]’trîgï\trîgïZŠ trîgïYtrîgïW�trîgïUýtrîgïTytrîgïRõîgïQqîgïOíîgïNiîgïLåîïKa îgïIÝîgïHYîgïFÕîgïEQîgïCÍîïBItrîãï@Åurs trt rîãï?A s r îãï=¼ srîãï<8u rs trîãï:´urstrîãï90u rs trîãï7¬strtrtrtrîDï6( trtrîDï4¤ trtrtrîDï3 trtrtrîDï1œtrtrtrîDï0 trtrtrîDï.”trtrtrîDï- trtrtrîDï+ŒtrtrtrîDï*trtrtrîDï(„ trtrtrîDï' trtrtrîDï%| trtrtrîDï#øtrtrtr îDï"s trtrtrtrîDï ï trtrtrîDïk trtr îDïç trtr îDïc trtrîDïß trîDï[ trîDï×trîDïStrtrîDïÏ trîDïKtrtrîDïÇtrtrîDïC trtrîDï¿ trtrîDï ; trtrtrîDï ·trtrîDï 3trtrÿ¦ ‚ ì.l^¨Appendix: Symbol Listing for Public Interfaces 100InLd: PRIVATE POINTER,BootFrom: PRIVATE POINTER,DiskIOSetup: PRIVATE POINTER,DiskIOTransfer: PRIVATE POINTER,UpdateTime: PRIVATE POINTER,lvParitySweepCount: PRIVATE POINTER,LastLdCB: PRIVATE POINTER,juntaTable: PRIVATE POINTER,AltoVersion: AltoVersionNumber,ErrorLogAddress: WORD,lvParityPhantomEnable: PRIVATE POINTER,ClockSecond: POINTER TO BcplLongNumber];OsStatics: --OsStaticDefs--POINTER TO POINTER TO OsStaticRecord;OtherStreamHandle: --StreamDefs--TYPE = POINTER TO Other StreamObject;OutNumber: --IODefs--PROCEDURE [StreamHandle, UNSPECIFIED, NumberFormat];outputDone: --AltoHardware--EthernetMicrocodeStatus;outputLoadOverflow: --AltoHardware--EthernetMicrocodeStatus;Overflow: --StringDefs, String--SIGNAL;Pack: --Time--PROCEDURE [unpacked: Unpacked, computeDST: BOOLEAN]RETURNS [time: LONG CARDINAL];PackDT: --TimeDefs--PROCEDURE [unp: UnpackedTime, computeDST: BOOLEAN]RETURNS [time: PackedTime];Packed: --Time--TYPE = LONG CARDINAL;PackedTime: --TimeDefs--TYPE = LONG CARDINAL;PageAvailable: --SegmentDefs--PROCEDURE [page: PageNumber, info: AllocInfo]RETURNS [BOOLEAN];PageCount: --AltoDefs--TYPE = [0..10000B];PageCount: --SegmentDefs--TYPE = PageCount;PageFault: --TrapDefs--SIGNAL [page: CARDINAL];PageFromAddress: --SegmentDefs--PROCEDURE [a: POINTER] RETURNS [PageNumber];PageFromLongAddress: --SegmentDefs--PROCEDURE [a: LONG POINTER]RETURNS [PageNumber];PageNumber: --AltoDefs--TYPE = [0..77777B];PageNumber: --SegmentDefs--TYPE = PageNumber;PagePointer: --SegmentDefs--PROCEDURE [a: POINTER] RETURNS [POINTER];Pages: --Storage--PROCEDURE [npages: CARDINAL] RETURNS [base: POINTER];PagesAvailable: --SegmentDefs--PROCEDURE [base: PageNumber, pages: PageCount, info: AllocInfo] RETURNS [BOOLEAN];PagesForWords: --Storage--PROCEDURE [nWords: CARDINAL] RETURNS [CARDINAL];PagesForWords: --SystemDefs--PROCEDURE [nwords: CARDINAL] RETURNS [CARDINAL];PageSize: --AltoDefs, AltoHardware--CARDINAL = 256;PagesPerMDS: --AltoDefs--CARDINAL = 256;ParityError: --TrapDefs--SIGNAL [address: POINTER];ParityErrorData: --AltoHardware--TYPE = MACHINE DEPENDENT RECORD [DCBR: POINTER,KNMAR: POINTER,DWA: POINTER,CBA: POINTER,PC: POINTER,SAD: POINTER];ParityErrorDataLoc: --AltoHardware--POINTER TO ParityErrorData;ParityLevel: --ProcessDefs--InterruptLevel = 0;ParseFileName: --DirectoryDefs--PROCEDURE [name: STRING, filename: STRING, dirAccess: AccessOptions]RETURNS [DiskHandle];PartitionName: --AltoFileDefs--FilePropertyType = 2;Pause: --ProcessDefs, Process--PROCEDURE [ticks: Ticks];PhantomParityError: --TrapDefs--SIGNAL;PointerFault: --TrapDefs--SIGNAL;î¬ïfñpôXð.qî ìpî ®ïbrtrtrî ®ï`š trtrî ®ï_ trtrî ®ï]’trtrî ®ï\ trtrî ®ïZŠtrtrî ®ïY trtrî ®ïW� trtrî ®ïUýî ®ïTytrî ®ïRõtrtrî ®ïQq trtrî MïOí strtrtrtrî MïNis trtrtrî MïLåurs trt rî MïKa srî MïIÝsrî MïHY strî MïFÕurstrð"trî ®ïEQtrtrtrî MïCÍurs trð!trî ®ïBItrî Mï@Åstrtrtrî Mï?A s trtrtrî Mï=¼u rstrð$î ®ï<8trtrî Mï:´ s trî Mï90 str î Mï7¬ s trtrî Mï6(urstrtrtr î Mï4¤urstrtrtrî ®ï3 tr î Mï1œ s trî Mï0 str î Mï.”u rstrtrtrtrî Mï-urs tr trtrtrî Mï+Œu rstrî ®ï*ð5trtrî Mï(„u rs tr trtrtrî Mï'u rs tr trtrtrî Mï%| strî Mï#ø s trî Mï"s s tr trî Mï ïstrtrtrtrî ®ïktrî ®ïçtrî ®ïctrî ®ïßtrî ®ï[trî ®ï×trî MïSstrtrî MïÏ srî MïKu rstrî ®ïÇtr trî ®ïCtr î Mï¿srî Mï ;urstrî Mï ·s trî Mï 3 s trÿ : ì ì8)^ìAppendix: Symbol Listing for Public Interfaces 101PortFault: --TrapDefs--ERROR;PositionToIndex: --StreamDefs--PROCEDURE [pos: StreamPosition]RETURNS [index: StreamIndex];Priority: --ProcessDefs, Process--TYPE = [0..7];Prune: --Storage--PROCEDURE RETURNS [BOOLEAN];PruneHeap: --SystemDefs--PROCEDURE RETURNS [BOOLEAN];PruneZone: --FSPDefs--PROCEDURE [z: ZonePointer] RETURNS [BOOLEAN];PuntMesa: --ImageDefs--PROCEDURE;PupBufferDS: --SegmentDefs--DataSegmentType = 7;Purge: --DirectoryDefs--PROCEDURE [dir: DiskHandle, fp: POINTER TO FP, name: STRING] RETURNS [found: BOOLEAN];PurgeFP: --DirectoryDefs--PROCEDURE [dir: DiskHandle, fp: POINTER TO FP]RETURNS [found: BOOLEAN];PUSH: --InlineDefs, Inline--PROCEDURE RETURNS [WORD];PutChar: --CharIO--PROCEDURE [out: Handle, c: CHARACTER];PutDecimal: --CharIO--PROCEDURE [Handle, INTEGER];PutLine: --CharIO--PROCEDURE [out: Handle, s: STRING];PutNumber: --CharIO--PROCEDURE [Handle, UNSPECIFIED, NumberFormat];PutOctal: --CharIO--PROCEDURE [Handle, UNSPECIFIED];PutString: --CharIO--PROCEDURE [Handle, STRING];PutSubString: --CharIO--PROCEDURE [Handle, SubString];Quad: --SystemDefs--PROCEDURE [u: UNSPECIFIED] RETURNS [UNSPECIFIED];Read: --SegmentDefs, StreamDefs--AccessOptions = 1;ReadBlock: --StreamDefs--PROCEDURE [stream: StreamHandle, address: POINTER, words: CARDINAL] RETURNS [CARDINAL];ReadChar: --IODefs--PROCEDURE RETURNS [CHARACTER];ReadClock: --TimeDefs--PROCEDURE RETURNS [LONG UNSPECIFIED];ReadDecimal: --IODefs--PROCEDURE RETURNS [INTEGER];ReadEditedString: --IODefs--PROCEDURE [STRING, PROCEDURE [CHARACTER] RETURNS [BOOLEAN], BOOLEAN] RETURNS [CHARACTER];ReadID: --IODefs--PROCEDURE [STRING];ReadLine: --IODefs--PROCEDURE [STRING];ReadNumber: --IODefs--PROCEDURE [default: UNSPECIFIED, radix: CARDINAL]RETURNS [UNSPECIFIED];ReadOctal: --IODefs--PROCEDURE RETURNS [UNSPECIFIED];ReadString: --IODefs--PROCEDURE [STRING, PROCEDURE [CHARACTER] RETURNS [BOOLEAN]];ReadWrite: --SegmentDefs, StreamDefs--AccessOptions = 3;ReadWriteAppend: --SegmentDefs, StreamDefs--AccessOptions = 7;RealTimeClock: --AltoHardware, TimeDefs--POINTER TO CARDINAL;RefCount: --SegmentDefs--TYPE = [0..255];ReleaseFile: --SegmentDefs--PROCEDURE [file: FileHandle];RemoteSegCommand: --SegmentDefs--TYPE = UNSPECIFIED;RemoteSegProc: --SegmentDefs--TYPE = PROCEDURE [seg: FileSegmentHandle, command: RemoteSegCommand];RemoveCleanupProcedure: --ImageDefs--PROCEDURE [POINTER TO CleanupItem];RemoveGlobalFrame: --FrameDefs--PROCEDURE [frame: GlobalFrameHandle];RemoveSwapStrategy: --AllocDefs--PROCEDURE [strategy: POINTER TO SwapStrategy];ResetControlDEL: --StreamDefs--PROCEDURE;Resolution: --AltoDisplay, AltoHardware--TYPE = {high, low};ResumeError: --TrapDefs--SIGNAL;Rubout: --IODefs--SIGNAL;RunConfig: --FrameDefs--PROCEDURE [name: STRING];RunImage: --ImageDefs--PROCEDURE [file: FileSegmentHandle];Seconds: --ProcessDefs, Process--TYPE = CARDINAL;SecondsToTicks: --ProcessDefs, Process--PROCEDURE [Seconds] RETURNS [Ticks];SectorInterrupts: --AltoHardware--POINTER TO WORD;SegCount: --SegmentDefs--TYPE = [0..177777B];SegLockCount: --SegmentDefs--TYPE = [0..15];ÿîBïfñpôXð.qîHZpîãïbr s trîãï`šurs trîDï_trîãï]’ str îãï\urs trtrtrîãïZŠurs trtrtrîãïYurs trtrtrîãïW�urs trîãïUý srîãïTyurstrîDïRõtrtr trtrtrîãïQqurstrtrtrîDïOítrtrîãïNiurstrtrtrîãïLåurs trtrîãïKau rs tr trîãïIÝurs trtrîãïHYurs tr t rîãïFÕurs tr t rîãïEQurs tr trîãïCÍu rs trîãïBIurs trt rtrt rîãï@Åsrîãï?Aurs trîDï=¼trtrtrtrîãï<8urs trtrtrîãï:´urs trtrtrt rîãï90u rs trtrtrîãï7¬urs trîDï6(trtrtrtrtrtrtrtrîãï4¤urs trtrîãï3 urs trtrîãï1œu rs tr t rtrîDï0trt rîãï.”urs trtrt rîãï-u rs trîDï+Œtrtrtrtrtrîãï* srîãï(„srîãï'strtrtrîãï%| str îãï#øu rstrîãï"sstrt rîãï ïstrtrîDïkð3îãïçurs trtrtr îãïcurs trîãïßurs tr trtrîãï[urs trîãï× strîãïS s trîãïÏs trîãïKurs trtrîãïÇurs trîãïCstrtrîãï¿u rstr trîãï ;strtrtrîãï · strîãï 3 str ÿ  ‚ ì8i^;Appendix: Symbol Listing for Public Interfaces 102SegmentAddress: --SegmentDefs--PROCEDURE [seg: SegmentHandle] RETURNS [POINTER];SegmentClass: --SegmentDefs--TYPE = {frame, table, code, other};SegmentFault: --SegmentDefs--SIGNAL [seg: FileSegmentHandle, pages: PageCount];SegmentHandle: --SegmentDefs--TYPE = POINTER TO SegmentObject;SegmentLocation: --SegmentDefs--TYPE = {disk, remote};SegmentObject: --SegmentDefs--TYPE = segment Object;SegmentSize: --SystemDefs--PROCEDURE [base: POINTER] RETURNS [nwords: CARDINAL];SegmentType: --SegmentDefs--TYPE = {data, file};SelfDestruct: --FrameDefs--PROCEDURE;SendMsgSignal: --TrapDefs--SIGNALRETURNS [msg: UNSPECIFIED, signal: UNSPECIFIED];SetBlock: --MiscDefs--PROCEDURE [p: POINTER, v: UNSPECIFIED, l: CARDINAL];SetDummyDisplaySize: --DisplayDefs--PROCEDURE [nScanLines: CARDINAL];SetEcho: --IODefs--PROCEDURE [new: BOOLEAN] RETURNS [old: BOOLEAN];SetEndOfFile: --SegmentDefs--PROCEDURE [file: FileHandle, page: PageNumber, byte: CARDINAL];SetFileAccess: --SegmentDefs--PROCEDURE [file: FileHandle, access: AccessOptions];SetFileLength: --SegmentDefs--PROCEDURE [file: FileHandle, fa: POINTER TO FA];SetFileSegmentDA: --SegmentDefs--PROCEDURE [seg: FileSegmentHandle, da: vDA];SetFileTimes: --SegmentDefs--PROCEDURE [file: FileHandle, read: LONG CARDINAL, write: LONG CARDINAL,create: LONG CARDINAL];SetFont: --DisplayDefs--PROCEDURE [FontHandle];SetIndex: --StreamDefs--PROCEDURE [stream: StreamHandle, index: StreamIndex];SetInputStream: --IODefs--PROCEDURE [StreamHandle];SetOutputStream: --IODefs--PROCEDURE [StreamHandle];SetPosition: --StreamDefs--PROCEDURE [stream: StreamHandle, pos: StreamPosition];SetPriority: --ProcessDefs, Process--PROCEDURE [Priority];SetSystemDisplaySize: --DisplayDefs--PROCEDURE [nTextLines: CARDINAL, nPages: CARDINAL];SetSystemDisplayWidth: --DisplayDefs--PROCEDURE [indent: CARDINAL, width: CARDINAL];SetTimeout: --ProcessDefs, Process--PROCEDURE [condition: POINTER TO CONDITION, ticks: Ticks];SetTypeScript: --DisplayDefs--PROCEDURE [DiskHandle];SetWorkingDir: --DirectoryDefs--PROCEDURE [dir: FileHandle];SN: --AltoFileDefs--TYPE = MACHINE DEPENDENT RECORD [bits: SNBits, part1: [0..17777B], part2: CARDINAL];SNBits: --AltoFileDefs--TYPE = MACHINE DEPENDENT RECORD [directory: [0..1], random: [0..1], nolog: [0..1]];SP: --Ascii, CharIO, IODefs--CHARACTER = 40C;SplitNode: --FSPDefs--PROCEDURE [z: ZonePointer, p: POINTER, n: BlockSize];StackError: --TrapDefs--ERROR;StartCursor: --DisplayDefs--PROCEDURE;StartFault: --TrapDefs--SIGNAL [dest: GlobalFrameHandle];StartKeyHandler: --StreamDefs--PROCEDURE;StartTrace: --TrapDefs--PROCEDURE [loc: POINTER, val: UNSPECIFIED, mask: WORD, equal: BOOLEAN];StopCursor: --DisplayDefs--PROCEDURE;StopKeyHandler: --StreamDefs--PROCEDURE;StopMesa: --ImageDefs--PROCEDURE;StopTrace: --TrapDefs--PROCEDURE;StreamBufferDS: --SegmentDefs--DataSegmentType = 6;StreamError: --StreamDefs--SIGNAL [stream: StreamHandle, error: StreamErrorCode];StreamErrorCode: --StreamDefs--TYPE = {StreamType, StreamAccess, StreamOperation, StreamPosition, StreamEnd,ÿî¬ïfñpôXð.qî ìpî Mïbu rstrtrtrî Mï`š strî Mï_ strð,î Mï]’strtrtrî Mï\strî MïZŠstrî MïYu rs trtrtr trî MïW� strî MïUýu rs trî MïTys tî ®ïRõtrt r t rî MïQqurs trtrt rtrî MïOíurstr trî MïNiurs trtrtrtrî MïLåu rstrî ®ïKað*trî MïIÝu rstrî ®ïHYð)î MïFÕu rstrtrtrî MïEQurstrð#î MïCÍu rstrî ®ïBItrtrtrtrî ®ï@Åtrtrî Mï?Aurstr î Mï=¼urs trð,î Mï<8u rs trî Mï:´urs trî Mï90u rs trî ®ï7¬ð+î Mï6(u rstr î Mï4¤urstrî ®ï3 tr trî Mï1œurstrî ®ï0trtrî Mï.”u rstrî ®ï- trtrtrî Mï+Œu rstr î Mï*u rstrî Mï(„strtrtrtrî ®ï'ð)trî Mï%|strtrtrtrî ®ï#øð2î Mï"sstrî Mï ïurs trtrî Mïk s trî Mïçu rstrî Mïc s trî Mïßurs trî Mï[u rs trî ®ï×trt rtrtrî MïSu rstrî MïÏu rs trî MïKurs trî MïÇurs trî MïCsrî Mï¿ s trî ®ï ;ð.î Mï ·s trî ®ï 3ðEÿ þ ì ì:‘^õAppendix: Symbol Listing for Public Interfaces 103StreamBug};StreamHandle: --StreamDefs--TYPE = POINTER TO StreamObject;StreamIndex: --StreamDefs--TYPE = RECORD [page: PageNumber, byte: CARDINAL];StreamIO: --IODefs--PROGRAM;StreamObject: --StreamDefs--TYPE = RECORD [reset: PROCEDURE [StreamHandle],get: PROCEDURE [StreamHandle] RETURNS [UNSPECIFIED],putback: PROCEDURE [StreamHandle, UNSPECIFIED],put: PROCEDURE [StreamHandle, UNSPECIFIED],endof: PROCEDURE [StreamHandle] RETURNS [BOOLEAN],destroy: PROCEDURE [StreamHandle],link: StreamHandle,body:SELECT type: * FROMKeyboard => [in: CARDINAL, out: CARDINAL, buffer: PACKED ARRAY [0..79] OF CHARACTER],Display => [clearCurrentLine: PROCEDURE [stream: StreamHandle],clearLine: PROCEDURE [stream: StreamHandle, line: CARDINAL],clearChar: PROCEDURE [stream: StreamHandle, char: CHARACTER],type: UNSPECIFIED,data: POINTER],Disk => [eof: BOOLEAN,dirty: BOOLEAN,read: BOOLEAN,write: BOOLEAN,append: BOOLEAN,unit: [1..2],index: CARDINAL,size: CARDINAL,page: PageNumber,char: CARDINAL,buffer: RECORD [SELECT OVERLAID * FROMbyte => [byte: POINTER TO PACKED ARRAY [0..0] OF BYTE],word => [word: POINTER TO ARRAY [0..0] OF WORD]ENDCASE],file: FileHandle,das: ARRAY {last, current, next} OF vDA,getOverflow: PROCEDURE [StreamHandle],savedGet: PROCEDURE [StreamHandle] RETURNS [UNSPECIFIED],putOverflow: PROCEDURE [StreamHandle],savedPut: PROCEDURE [StreamHandle, UNSPECIFIED]],Other => [type: UNSPECIFIED, data: POINTER]ENDCASE];StreamPosition: --StreamDefs--TYPE = LONG CARDINAL;String: --Storage--PROCEDURE [nchars: CARDINAL] RETURNS [s: STRING];StringBoundsFault: --StringDefs, String--SIGNAL [s: STRING]RETURNS [ns: STRING];StringHeaderSize: --StringDefs, String--CARDINAL = 2;StringLength: --Storage--PROCEDURE [s: STRING] RETURNS [CARDINAL];StringProc: --Format--TYPE = PROCEDURE [s: STRING];StringToDecimal: --StringDefs, String--PROCEDURE [s: STRING] RETURNS [INTEGER];StringToLongNumber: --StringDefs, String--PROCEDURE [s: STRING, radix: CARDINAL]RETURNS [LONG UNSPECIFIED];StringToNumber: --StringDefs, String--PROCEDURE [s: STRING, radix: CARDINAL]RETURNS [UNSPECIFIED];StringToOctal: --StringDefs, String--PROCEDURE [s: STRING]ÿîBïfñpôXð.qîHZpîDïbr îãï`š s trtrtr îãï_ s trtrtrîãï]’ s trîãï\ s trtrîDïZŠtrîDïYtrtrt rîDïW�trt rîDïUýtrt rîDïTytrtrtrîDïRõtrîDïQqîDïOíî¥ïNitrtîïLår îgïKatrtr trtrtrtrîïIÝ îgïHYtrîgïFÕ trtrîgïEQ trtrîgïCÍt rîgïBItrîï@Åîgï?Atrîgï=¼trîgï<8trîgï:´trîgï90trîgï7¬ îgï6(trîgï4¤trîgï3 îgï1œtrîgï0trîÈï.”trtrtî)ï-rtrtrtrtrtrî)ï+Œtrtrtrtrtrî)ï*trîgï(„îgï'trtrîgï%| trîgï#ø trtrt rîgï"s trîgï ï trt rîïkt rtrîïçtrîãïcs trtrtrîãïßurs tr trtrtrîãï[strtrîDï×trtrîãïSstrîãïÏu rs trtrtrtrîãïK s trtrtrîãïÇurstrtrtrtrîãïCurstrtrtrîDï¿trtrt rîãï ;u rstrtrtrîDï ·trt rîãï 3u rstrtr„ ‚ ì6²^ÍAppendix: Symbol Listing for Public Interfaces 104RETURNS [UNSPECIFIED];SubString: --Format--PROCEDURE [ss: SubString, proc: StringProc];SubString: --StringDefs--TYPE = POINTER TO SubStringDescriptor;SubString: --String--TYPE = SubString;SubStringDescriptor: --StringDefs--TYPE = RECORD [base: STRING, offset: CARDINAL, length: CARDINAL];SubStringDescriptor: --String--TYPE = SubStringDescriptor;SwapError: --SegmentDefs--SIGNAL [seg: FileSegmentHandle];SwapErrorDuringMakeCheck: --ImageDefs--SIGNAL;SwapErrorDuringMakeImage: --ImageDefs--SIGNAL;SwapIn: --SegmentDefs--PROCEDURE [seg: FileSegmentHandle];SwapInCode: --FrameDefs--PROCEDURE [f: GlobalFrameHandle];SwapOut: --SegmentDefs--PROCEDURE [seg: FileSegmentHandle];SwapOutCode: --FrameDefs--PROCEDURE [f: GlobalFrameHandle];SwapOutDuringMakeCheck: --ImageDefs--SIGNAL;SwapOutDuringMakeImage: --ImageDefs--SIGNAL;SwappingProcedure: --AllocDefs--TYPE = PROCEDURE [needed: PageCount, info: AllocInfo, seg: SegmentHandle] RETURNS [BOOLEAN];SwapStrategy: --AllocDefs--TYPE = RECORD [link: POINTER TO SwapStrategy, proc: SwappingProcedure];SwapTrapDuringMakeCheck: --ImageDefs--SIGNAL;SwapTrapDuringMakeImage: --ImageDefs--SIGNAL;SwapUp: --SegmentDefs--PROCEDURE [seg: FileSegmentHandle];SwatLevel: --ProcessDefs--InterruptLevel = 3;SystemDS: --SegmentDefs--DataSegmentType = 4;TAB: --Ascii, CharIO, IODefs--CHARACTER = 11C;TableDS: --SegmentDefs--DataSegmentType = 2;Task: --AltoHardware--TYPE = {Emulator, OrbitSlot, unused2, Trident3, KSEC, Tape5, Tape6, ETHER, MRT, DWT,CURT, DHT, DVT, PART, KWD, Trident17};Ticks: --ProcessDefs, Process--TYPE = CARDINAL;TicksToMsec: --ProcessDefs, Process--PROCEDURE [Ticks] RETURNS [Milliseconds];TIME: --AltoFileDefs--TYPE = MACHINE DEPENDENT RECORD [high: CARDINAL, low: CARDINAL];TimeoutLevel: --ProcessDefs--InterruptLevel = 4;TooManyProcesses: --ProcessDefs, Process--ERROR;trackCursor: --StreamDefs--BOOLEAN;TruncateDiskStream: --StreamDefs--PROCEDURE [stream: StreamHandle];TryCodeSwapping: --AllocDefs--SwappingProcedure;UnboundProcedure: --TrapDefs--SIGNAL [dest: UNSPECIFIED] RETURNS [ControlLink];UnimplementedInst: --TrapDefs--SIGNAL;UnknownDS: --SegmentDefs--DataSegmentType = 0;Unlock: --SegmentDefs--PROCEDURE [seg: FileSegmentHandle];UnlockCode: --FrameDefs--PROCEDURE [link: UNSPECIFIED];UnlockFile: --SegmentDefs--PROCEDURE [file: FileHandle];UnNew: --FrameDefs--PROCEDURE [frame: GlobalFrameHandle];UnNewConfig: --FrameDefs--PROCEDURE [link: UNSPECIFIED];Unpack: --Time--PROCEDURE [time: LONG CARDINAL] RETURNS [unpacked: Unpacked];UnpackDT: --TimeDefs--PROCEDURE [p: PackedTime] RETURNS [time: UnpackedTime];Unpacked: --Time--TYPE = UnpackedTime;UnpackedTime: --TimeDefs--TYPE = RECORD [year: [0..4002B],month: [0..11],day: [0..31],hour: [0..23],minute: [0..59],second: [0..59],weekday: [0..6],zone: [177764B..12],î¬ïfñpôXð.qî ìpî ®ïbtrt rî Mï`šurs trð#î Mï_ s trtrtrî Mï]’ s tr î Mï\s trtrî ®ïZŠtr tr trî MïYs trî MïW� strî MïUýs trî MïTys trî MïRõurstrî MïQqu rs trî MïOíurstrî MïNiu rs trî MïLås trî MïKas trî MïIÝs trtrî ®ïHYð8trtrî MïFÕ s trtrî ®ïEQtrtrð(î MïCÍurs trî MïBIs trî Mï@Åurstrî Mï?A srî Mï=¼ srî Mï<8strî Mï:´srî Mï90strî ®ï7¬ðLî ®ï6(ð&î Mï4¤strtrî Mï3 u rstrtrî Mï1œstrtrtrtrî ®ï0trtrî Mï.” srî Mï-strî Mï+Œ s trî Mï*urs trî Mï(„s rî Mï's trt rtrî Mï%|s trî Mï#ø srî Mï"surstrî Mï ïu rs trt rî Mïku rstrî Mïçurs trî Mïcu rs trt rî Mïßurstrtrtrtrî Mï[urs trtrî Mï× strî MïS s trtrî ®ïÏî ®ïKî ®ïÇ î ®ïC î ®ï¿î ®ï ;î ®ï ·î ®ï 3  ì ì7‰^¸Appendix: Symbol Listing for Public Interfaces 105dst: BOOLEAN];UnusableLevel: --ProcessDefs--InterruptLevel = 15;UpdateFileLength: --SegmentDefs--PROCEDURE [file: FileHandle, fa: POINTER TO FA];UpDown: --AltoHardware--TYPE = {down, up};updown: --KeyDefs--TYPE = {down, up};UpperCase: --StringDefs, String--PROCEDURE [c: CHARACTER] RETURNS [CHARACTER];userAbort: --StreamDefs--BOOLEAN;UserCleanupProc: --ImageDefs--CleanupProcedure;UtilIn: --AltoHardware--POINTER TO UtilInBits;UtilInBits: --AltoHardware--TYPE = MACHINE DEPENDENT RECORD [util: [0..255],key0: UpDown,key1: UpDown,key2: UpDown,key3: UpDown,key4: UpDown,redMouse: UpDown,blueMouse: UpDown,yellowMouse: UpDown];UtilOut: --AltoHardware--POINTER TO WORD;ValidateFrame: --FrameDefs--PROCEDURE [UNSPECIFIED];ValidateGlobalFrame: --FrameDefs--PROCEDURE [UNSPECIFIED];ValidateLongPointer: --SegmentDefs--PROCEDURE [a: LONG UNSPECIFIED];ValidateProcess: --ProcessDefs, Process--PROCEDURE [UNSPECIFIED];ValidateVMPage: --SegmentDefs--PROCEDURE [page: UNSPECIFIED];vDA: --AltoFileDefs--TYPE = RECORD [CARDINAL];vDC: --AltoFileDefs--TYPE = {ReadHLD, ReadLD, ReadD, WriteHLD, WriteLD, WriteD, SeekOnly, DoNothing};VersionOptions: --SegmentDefs--TYPE = [0..3];VMLimit: --AltoDefs--CARDINAL = 177777B;VMnotFree: --SegmentDefs--SIGNAL [base: PageNumber, pages: PageCount];VMtoDataSegment: --SegmentDefs--PROCEDURE [a: POINTER]RETURNS [DataSegmentHandle];VMtoFileSegment: --SegmentDefs--PROCEDURE [a: POINTER]RETURNS [FileSegmentHandle];VMtoSegment: --SegmentDefs--PROCEDURE [a: POINTER] RETURNS [SegmentHandle];WakeupError: --TrapDefs--SIGNAL;WestEast: --TimeDefs--TYPE = {west, east};WordBlockDescriptor: --AltoHardware--TYPE = MACHINE DEPENDENT RECORD [count: CARDINAL, pointer: POINTER];wordlength: --AltoDefs--CARDINAL = 16;WordLength: --AltoHardware--CARDINAL = 16;Words: --Storage--PROCEDURE [nwords: CARDINAL] RETURNS [base: POINTER];WordsForBcplString: --StringDefs--PROCEDURE [nchars: CARDINAL]RETURNS [CARDINAL];WordsForString: --StringDefs, String--PROCEDURE [nchars: CARDINAL]RETURNS [CARDINAL];WorryCallDebugger: --MiscDefs--PROCEDURE [STRING];Write: --SegmentDefs, StreamDefs--AccessOptions = 2;WriteAppend: --SegmentDefs, StreamDefs--AccessOptions = 6;WriteBlock: --StreamDefs--PROCEDURE [stream: StreamHandle, address: POINTER, words: CARDINAL] RETURNS [CARDINAL];WriteChar: --IODefs--PROCEDURE [CHARACTER];WriteDecimal: --IODefs--PROCEDURE [INTEGER];WriteLine: --IODefs--PROCEDURE [STRING];WriteNumber: --IODefs--PROCEDURE [UNSPECIFIED, NumberFormat];WriteOctal: --IODefs--PROCEDURE [UNSPECIFIED];WriteProtectFault: --TrapDefs--SIGNAL [page: CARDINAL];ÿîBïfñpôXð.qîHZpîDïbrtrîãï`šsrîãï_urstrîDï]’trtrîãï\str îãïZŠs tr îãïYurstrtrtrtrîãïW� s trîãïUýs rîãïTystrtr îãïRõ strtrtrtrîDïQqîDïOí îDïNi îDïLå îDïKa îDïIÝ îDïHYîDïFÕîDïEQîãïCÍstrtrtrîãïBIu rs trt rîãï@Åurs trt rîãï?Aurstrtrt rîãï=¼urstrt rîãï<8u rstrt rîãï:´strtrtrîãï90strîDï7¬ðHîãï6(str îãï4¤s tr îãï3 strð&îãï1œurstrtrîDï0trîãï.”urstrtrîDï-trîãï+Œu rstrtrtrîãï* s trîãï(„ s trîãï'strtrtrtrîDï%|tr trîãï#ø s trîãï"s strîãï ïurs tr trtrtrîãïkurs tr trîDïçtrtrîãïcu rstr trîDïßtrtrîãï[urs trtrîãï×srîãïS srîãïÏu rs trîDïKtrtrtrtrîãïÇurs trtrîãïCu rs trtrîãï¿urs trtrîãï ;u rs trt rîãï ·u rs trt rîãï 3s trtrÿ < ‚ ì6³^ßAppendix: Symbol Listing for Public Interfaces 106WriteString: --IODefs--PROCEDURE [STRING];WriteSubString: --IODefs--PROCEDURE [SubString];Yield: --ProcessDefs, Process--PROCEDURE;Zero: --MiscDefs--PROCEDURE [p: POINTER, l: CARDINAL];ZeroDivisor: --TrapDefs--SIGNAL;zeroLengthBuffer: --AltoHardware--EthernetMicrocodeStatus;ZoneHeader: --FSPDefs--TYPE = RECORD [node: free NodeHeader,rover: FreeNodePointer,lock: MONITORLOCK,restOfZone: ZonePointer,length: BlockSize,deallocate: Deallocator,threshold: BlockSize,checking: BOOLEAN];ZoneOverhead: --FSPDefs--CARDINAL = 10;ZonePointer: --FSPDefs--TYPE = POINTER TO ZoneHeader;ZoneTooLarge: --FSPDefs--ERROR [POINTER];ZoneTooSmall: --FSPDefs, Storage--ERROR [POINTER];ÿî¬ïfñpôXð.qî ìpî Mïbu rs trtrî Mï`šu rs tr î Mï_urstrî Mï]’urs trtrtrî Mï\ s trî MïZŠsrî MïY s trtrî ®ïW�î ®ïUýî ®ïTyt rî ®ïRõî ®ïQqî ®ïOíî ®ïNiî ®ïLå trî MïKa s trî MïIÝ s trtrtr î MïHY s trtrî MïFÕ strtrÌ ìFŽ(…!}’107Index of Mesa SymbolsAbort, 48ABORTED, 48Aborted, 48AbortMesa, 29AccessOptions, 23AddCleanupProcedure, 30AddressFromPage, 58AddSwapStrategy, 58AddToNewZone, 65AddToZone, 65AlFont, 3, 21AlignedBBTable, 40AllocateHeapNode, 69AllocateHeapString, 69AllocatePages, 64AllocateResidentPages, 64AllocateResidentSegment, 63AllocateSegment, 63AllocDefs, 2AllocInfo, 57AltoDefs, 2AltoDisplay, 2, 18AltoFileDefs, 2, 22AltoHardware, 2Append, 12, 23AppendChar, 76AppendDayTime, 79AppendDecimal, 78AppendFullDayTime, 80AppendLongDecimal, 78AppendLongNumber, 78AppendNumber, 78AppendOctal, 78AppendString, 76AppendSubString, 77Ascii, 2, 70BadDirectory, 11BadFileName, 10BankIndex, 59BBoperation, 40BBptr, 40BBsourcetype, 40BBTable, 39BBTableSpace, 40BcdTime, 29BcdVersion, 29BITAND, 38BITBLT, 40BitBltDefs, 2, 39BitmapDS, 53BitmapState, 20BITNOT, 38BITOR, 38BITSHIFT, 38BITXOR, 38BlinkCursor, 19BlockSize, 64BoundsFault, 81BW, 34ByteBlt, 36BytePair, 38CallDebugger, 37CantSwap, 58ChangeKey, 35CharHeight, 21CharIO, 2, 73CharIOPack, 2, 5, 73CharWidth, 21CheckPoint, 3, 6, 28, 29CleanupDiskStream, 14CleanupItem, 29CleanupMask, 30CleanupProcedure, 29CleanupReason, 29clearCurrentLine, 18clearDisplayChar, 18clearLine, 18CloseKeyStream, 33CommandLineCFA, 36CompareStrings, 77ConditionVector, 50Continue, 29ControlFault, 81ControlStoreType, 59ConvertToBasic, 6COPY, 37CopyDataToFileSegment, 59CopyFileToDataSegment, 59CopyString, 68-9CreateByteStream, 12CreateFont, 21CreateKeyStream, 33CreateWordStream, 12CurrentDayTime, 79CurrentTime, 36CursorTrack, 33CV, 50DataSegmentAddress, 52DataSegmentHandle, 52DataSegmentObject, 52DataSegmentType, 53DAYTIME, 36Deallocator, 64DefaultAccess, 23DefaultTime, 79DefaultVersion, 23DeleteFileSegment, 54DeleteSubString, 77Descriptor, 16DestroyDisplay, 20ÿîHZïfñpî#¿ïa×qôiî ‚ï]rsôXî ‚ï[€tsî ‚ïYürsî ‚ïXxrsî ‚ïVôr sî ‚ïUprsî ‚ïSìrsî ‚ïRhrsî ‚ïPär sî ‚ïO`rsî ‚ïMÜrsî ‚ïLXr sî ‚ïJÔrsî ‚ïIPrsî ‚ïGÌr sî ‚ïFHrsî ‚ïDÄrsî ‚ïC@rsî ‚ïA¼rsî ‚ï@7rsî ‚ï>³rsî ‚ï=/r sî ‚ï;«r sî ‚ï:'r sî ‚ï8£rsî ‚ï7r sî ‚ï5›r sî ‚ï4r sî ‚ï2“rsî ‚ï1rsî ‚ï/‹rsî ‚ï.r sî ‚ï,ƒr sî ‚ï*ÿr sî ‚ï){rsî ‚ï'÷rsî ‚ï&sr sî ‚ï$îr sî ‚ï#jrsî ‚ï!ær sî ‚ï brsî ‚ïÞr sî ‚ïZrsî ‚ïÖr sî ‚ïRrsî ‚ïÎr sî ‚ïJrsî ‚ïÆrsî ‚ïBr sî ‚ï¾rsî ‚ï:r sî ‚ï¶rsî ‚ï2rsî ‚ï ®rsî ‚ï *rsî.rï](r sî.rï[¤rsî.rïZ r sî.rïXœrsî.rïWrsî.rïU”rsî.rïTr sî.rïR‹rsî.rïQrsî.rïOƒr sî.rïMÿrsî.rïL{r s î.rïJ÷rsî.rïIsr s î.rïGïrsî.rïFkr sî.rïDçr sî.rïCcrsî.rïAßr sî.rï@[rsî.rï>×rsî.rï=Srsî.rï;Ïr sî.rï:Kr sî.rï8Ær sî.rï7Brsî.rï5¾rsî.rï4:r sî.rï2¶rsî.rï12r sî.rï/®rsî.rï.*rsî.rï,¦rsî.rï+"r sî.rï)žrsî.rï(r sî.rï&–rsî.rï%rsî.rï#Žr sî.rï" r sî.rï †r sî.rïrsî.rï}rsî.rïùrsî.rïursî.rïñrsî.rïmrsî.rïér sî.rïer sî.rïár sî.rï]r sî.rïÙrsî.rïUrsî.rï Ñr sî.rï Mr sð ‚ ãª](=Index108DestroyFile, 25DestroyKeyHandler, 35DestroyZone, 65Detach, 47DirectoryDefs, 2, 9DirectoryLookup, 10DirectoryLookupFP, 10DirectoryPurge, 10DirectoryPurgeFP, 10DisableAborts, 48DisableInterrupts, 50DisableTimeout, 47DiskHandle, 74DisplayControl, 3, 20-1DisplayDefs, 3, 18DisplayHandle, 74DisplayOff, 19DisplayOn, 19DisplayPackage, 6, 21DivideCheck, 82DIVMOD, 37DoNothingDeallocate, 64EasyDown, 57EasyUp, 57EmptyString, 68EnableInterrupts, 50Enumerate, 9EnumerateDataSegments, 53EnumerateDirectory, 9EnumerateEntries, 9EnumerateFiles, 26EnumerateFileSegments, 54EnumerateGlobalFrames, 41EqualString, 77EqualStrings, 77EqualSubString, 77EqualSubStrings, 77EquivalentString, 77EquivalentStrings, 77EquivalentSubString, 77EquivalentSubStrings, 77Even, 37Expand, 68ExpandString, 68-9FA, 16Faults, 4FileAccessError, 24FileError, 24FileHandle, 23FileLength, 15FileNameError, 12, 23FileObject, 23Files, 4FileSegmentAddress, 54FileSegmentHandle, 53FileSegmentObject, 54FindFile, 25Finish, 16, 29FL1, 34FL2, 34fontcharHeight, 20charWidth, 20clearChar, 20close, 20destroy, 20lock, 20paintChar, 20unlock, 20FontDefs, 3, 20FontHandle, 20FontObject, 20Format, 3FormatImpl, 3FP, 22FR1, 34FR2, 34FR3, 34FR4, 34Frame, 42FrameDefs, 3, 41FrameDS, 53FrameHandle, 42Free, 67FreeHeapNode, 69FreeHeapString, 69FreeNode, 66FreeNodeNil, 68FreePages, 63-4FreePagesNil, 63FreeSegment, 63FreeString, 67FreeStringNil, 68FreeWords, 63FSP, 3-4FSPDefs, 3, 64GetBuffer, 16GetCaller, 44GetCurrent, 45GetCurrentKey, 33GetDefaultDisplayStream, 18GetDefaultKey, 33GetDiskStreamList, 12GetEndOfFile, 25GetFA, 16GetFileAccess, 25GetFileFP, 25GetFileTimes, 26GetFont, 21GetIndex, 14GetInputStream, 70GetMemoryConfig, 59GetNetworkNumber, 36GetOutputStream, 70GetPosition, 15GetPriority, 47GetTypeScript, 20GetWorkingDir, 11î&¹ïfñpî ìî ìïbr sôXî ìï`šrsî ìï_r sî ìï]’rsî ìï\r sî ìïZŠrsî ìïYrsî ìïW�r sî ìïUýrsî ìïTyr sî ìïRõrsî ìïQqr sî ìïOír sî ìïNir sî ìïLår sî ìïKar sî ìïIÝr sî ìïHYrsî ìïFÕr sî ìïEQr sî ìïCÍrsî ìïBIrsî ìï@Årsî ìï?Arsî ìï=¼r sî ìï<8rsî ìï:´rsî ìï90rsî ìï7¬rsî ìï6(rsî ìï4¤r sî ìï3 rsî ìï1œrsî ìï0r sî ìï.”r sî ìï-r sî ìï+Œrsî ìï*rsî ìï(„rsî ìï'rsî ìï%|rsî ìï#ørsî ìï"srsî ìï ïr sî ìïkrsî ìïçrsî ìïcrsî ìïßrsî ìï[r sî ìï×r sî ìïSr sî ìïÏr sî ìïKrsî ìïÇrsî ìïCrsî ìï¿rsî ìï ;rsî ìï ·rsî ìï 3rsî*Üïbrsî*Üï`šrî*Üï_sr sî*Üï]’ursî*Üï\ursî*ÜïZŠursî*ÜïYursî*ÜïW�ursî*ÜïUýursî*ÜïTyursî*ÜïRõrsî*ÜïQqr sî*ÜïOír sî*ÜïNirsî*ÜïLår sî*ÜïKarsî*ÜïIÝrsî*ÜïHYrsî*ÜïFÕrsî*ÜïEQrsî*ÜïCÍrsî*ÜïBIrsî*Üï@Årsî*Üï?Ar sî*Üï=¼rsî*Üï<8r sî*Üï:´r sî*Üï90rsî*Üï7¬r sî*Üï6(rsî*Üï4¤r sî*Üï3 r sî*Üï1œr sî*Üï0r sî*Üï.”rsî*Üï-rsî*Üï+Œrsî*Üï*rsî*Üï(„rsî*Üï'r sî*Üï%|r sî*Üï#ørsî*Üï"sr sî*Üï ïrsî*Üïkr sî*Üïçrsî*Üïcr sî*Üïßrsî*Üï[r sî*Üï×rsî*ÜïSrsî*ÜïÏr sî*ÜïKrsî*ÜïÇrsî*ÜïCrsî*Üï¿r sî*Üï ;r sî*Üï ·r sî*Üï 3r sÿ ì ì]^iIndex109GlobalFrame, 41GlobalFrameHandle, 41GrEqualIndex, 15GrIndex, 15Handle, 16HardDown, 57HardUp, 57HardwareError, 82HeapDS, 53HeapZone, 67-8HighByte, 38HighHalf, 38ImageDefs, 3, 27ImageMaker, 6ImageRunner, 6, 28ImageTime, 29ImageVersion, 29ImmovableSegmentInXM, 27IndexToPosition, 16Init, 16InitDisplay, 19InitializeCondition, 46InitializeMonitor, 46Inline, 4, 37InlineDefs, 3, 37Insert, 10InsertFile, 24InsufficientVM, 56InterruptLevel, 49InvalidFP, 16, 24InvalidFrame, 42InvalidGlobalFrame, 41InvalidImage, 27-8InvalidLongPointer, 61InvalidNode, 66InvalidNumber, 78InvalidProcess, 45InvalidSegmentSize, 56InvalidTime, 79InvalidVMPage, 61InvalidZone, 66IODefs, 3, 70, 73IsBound, 44JumpToFA, 16KeyBits, 33Keyboard, 3, 32KeyboardHandle, 32, 74KeyDefs, 3, 33KeyItem, 34KeyName, 34Keys, 34KeyStreams, 3-4, 32LastResort, 58LDIVMOD, 37LineOverflow, 70LinkageFault, 81LoadConfig, 42LockCode, 43LockFile, 24LongAddressFromPage, 60LongCOPY, 37LongDataSegmentAddress, 60LongDiv, 38LongDivMod, 38LongFileSegmentAddress, 60LongMult, 38LongNumber, 37LongSegmentAddress, 60LongVMtoDataSegment, 60LongVMtoFileSegment, 60LongVMtoSegment, 60Lookup, 10LookupFP, 10LowByte, 38LowerCase, 76LowHalf, 38MachineType, 59MakeCheckPoint, 28, 30MakeCodeResident, 43MakeDataSegment, 57MakeImage, 3, 27, 30MakeNewZone, 64MakeNode, 65MakeSwappedIn, 57MakeUnMergedImage, 27MakeZone, 65MaxFilePage, 22MaxMDSPage, 60MaxVMPage, 60memConfig, 59MemoryConfig, 59Mesa.image, 5MesaExec, 6-7Milliseconds, 46MiscDefs, 3, 36Miscellaneous, 3ModifyIndex, 15ModifyPosition, 15Modules, 3Mouse, 34MouseBits, 34MouseButton, 34MoveFileSegment, 55MsecToTicks, 46NewByteStream, 12NewConfig, 42NewDataSegment, 52NewFile, 24NewFileOnly, 23NewFileSegment, 54NewWordStream, 12Node, 67NodeSize, 65NoGlobalFrameSlots, 43NormalizeIndex, 15NoRoomForLoader, 28NoRoomInCheckMap, 28NoRoomInImageMap, 27ÿî*OïfñpîHZî ‚ïbr sôXî ‚ï`šrsî ‚ï_r sî ‚ï]’rsî ‚ï\rsî ‚ïZŠrsî ‚ïYrsî ‚ïW�r sî ‚ïUýrsî ‚ïTyrsî ‚ïRõrsî ‚ïQqrsî ‚ïOírsî ‚ïNir sî ‚ïLår sî ‚ïKarsî ‚ïIÝr sî ‚ïHYrsî ‚ïFÕrsî ‚ïEQrsî ‚ïCÍr sî ‚ïBIrsî ‚ï@Årsî ‚ï?Arsî ‚ï=¼r sî ‚ï<8rsî ‚ï:´r sî ‚ï90r sî ‚ï7¬r sî ‚ï6(rsî ‚ï4¤r sî ‚ï3 rsî ‚ï1œr sî ‚ï0rsî ‚ï.”r sî ‚ï-r sî ‚ï+Œr sî ‚ï*rsî ‚ï(„r sî ‚ï'r sî ‚ï%|r sî ‚ï#ørs î ‚ï"srsî ‚ï ïrsî ‚ïkrsî ‚ïçrsî ‚ïcr sî ‚ïßrsî ‚ï[rsî ‚ï×rsî ‚ïSrsî ‚ïÏr sî ‚ïKr sî ‚ïÇrsî ‚ïCr sî ‚ï¿r sî ‚ï ;r sî ‚ï ·rsî ‚ï 3rsî.rïbrsî.rï`šrsî.rï_rsî.rï]’rsî.rï\r sî.rïZŠrsî.rïYrsî.rïW�r sî.rïUýrsî.rïTyrsî.rïRõrsî.rïQqrsî.rïOírsî.rïNirsî.rïLårsî.rïKarsî.rïIÝrsî.rïHYr sî.rïFÕr sî.rïEQrsî.rïCÍrsî.rïBIrs î.rï@År sî.rï?Arsî.rï=¼r sî.rï<8rsî.rï:´rsî.rï90r sî.rï7¬r sî.rï6(rsî.rï4¤rsî.rï3 r sî.rï1œv sî.rï0rsî.rï.”r sî.rï-rsî.rï+Œr sî.rï*r sî.rï(„r sî.rï'rsî.rï%|rsî.rï#ørsî.rï"sr sî.rï ïrsî.rïkr sî.rïçr sî.rïcrsî.rïßr sî.rï[rsî.rï×r sî.rïSr sî.rïÏr sî.rïKrsî.rïÇrsî.rïCrsî.rï¿r sî.rï ;rsî.rï ·rsî.rï 3rsÿ6 ‚ ì9^bIndex110NoRoomInZone, 66NumberFormat, 72OldFileOnly, 23OpenKeyStream, 33OsStaticDefs, 4OurProcess, 4OutNumber, 72PackDT, 79PackedTime, 79PageFault, 82PageFromAddress, 58PageFromLongAddress, 61PageNumber, 22PagePointer, 58Pages, 63PagesForWords, 63-4PagesPerMDS, 60ParityError, 82ParseFileName, 11Pause, 47PhantomParityError, 82PointerFault, 81PortFault, 81PositionToIndex, 16Priority, 47Process, 4ProcessDefs, 4, 45ProcessHandle, 45Prune, 68PruneHeap, 69PruneZone, 65PSB, 45PSBDefs, 45Purge, 10PurgeFP, 10Quad, 37Read, 12, 23ReadBlock, 14ReadChar, 70ReadClock, 80ReadDecimal, 72ReadEditedString, 71ReadID, 71ReadLine, 71ReadNumber, 72ReadOctal, 72ReadString, 71ReadWrite, 12, 23ReadWriteAppend, 12, 23RealTimeClock, 80ReleaseFile, 25RemoveCleanupProcedure, 30RemoveSwapStrategy, 58Resident, 4Restart, 29Restore, 29ResumeError, 82Rubout, 71RunConfig, 42RunImage, 28Runtime, 4Save, 29SD, 39SDDefs, 39Seconds, 46SecondsToTicks, 46SegmentAddress, 52SegmentDefs, 4, 22, 51SegmentFault, 56SegmentHandle, 51SegmentObject, 51SegmentsA, 4SegmentsB, 4SegmentSize, 63SegmentType, 51SelfDestruct, 43SetBlock, 36SetDummyDisplaySize, 19SetEcho, 71SetEndOfFile, 26SetFileAccess, 25SetFileTimes, 26SetIndex, 15SetInputStream, 70SetOutputStream, 70SetPosition, 15SetPriority, 47SetSystemDisplaySize, 19SetSystemDisplayWidth, 19SetTimeout, 46SetTypeScript, 20SetWorkingDir, 11sFADD, 39sFCOMP, 39sFDIV, 39sFIX, 39sFLOAT, 39sFMUL, 39sFSUB, 39SplitNode, 66StackError, 42, 82StartCursor, 19StartFault, 81StopCursor, 19StopMesa, 29Storage, 4, 63, 67-8StrategyList, 58streamdestroy, 13, 32, 75endof, 13, 32, 75get, 13, 32, 75put, 13, 32, 75putback, 13, 32, 75reset, 13, 32, 75StreamBufferDS, 53StreamDefs, 4, 12, 18, 32, 74StreamError, 75StreamErrorCode, 75ÿî&¹ïfñpî ìî ìïbr sôXî ìï`šr sî ìï_r sî ìï]’r sî ìï\r sî ìïZŠr sî ìïYrsî ìïW�rsî ìïUýr sî ìïTyrsî ìïRõrsî ìïQqrsî ìïOír sî ìïNir sî ìïLårsî ìïKar sî ìïIÝr sî ìïHYr sî ìïFÕr sî ìïEQrsî ìïCÍrsî ìïBIr sî ìï@Årsî ìï?Arsî ìï=¼rsî ìï<8rsî ìï:´r sî ìï90r sî ìï7¬rsî ìï6(rsî ìï4¤rsî ìï3 rsî ìï1œrsî ìï0rsî ìï.”rsî ìï-rsî ìï+Œrsî ìï*rsî ìï(„rsî ìï'rsî ìï%|r sî ìï#ørsî ìï"srsî ìï ïrsî ìïkr sî ìïçrsî ìïcr sî ìïßrsî ìï[rsî ìï×r sî ìïSr sî ìïÏrsî ìïKrsî ìïÇrsî ìïCrsî ìï¿rsî ìï ;r sî ìï ·rsî ìï 3rsî*Üïbrsî*Üï`šrsî*Üï_rsî*Üï]’rsî*Üï\rsî*ÜïZŠrsî*ÜïYr sî*ÜïW�r sî*ÜïUýr s î*ÜïTyr sî*ÜïRõr sî*ÜïQqr sî*ÜïOírsî*ÜïNirsî*ÜïLår sî*ÜïKar sî*ÜïIÝr sî*ÜïHYrsî*ÜïFÕrsî*ÜïEQrsî*ÜïCÍr sî*ÜïBIr sî*Üï@År sî*Üï?Arsî*Üï=¼r sî*Üï<8rsî*Üï:´r sî*Üï90r sî*Üï7¬rsî*Üï6(rsî*Üï4¤r sî*Üï3 r sî*Üï1œr sî*Üï0rsî*Üï.”rsî*Üï-rsî*Üï+Œrsî*Üï*rsî*Üï(„rsî*Üï'rsî*Üï%|rsî*Üï#ør sî*Üï"sr sî*Üï ïr sî*Üïkr sî*Üïçrsî*Üïcrs î*Üïßr sî*Üï[rî*Üï×srs î*ÜïSurs î*ÜïÏurs î*ÜïKurs î*ÜïÇurs î*ÜïCurs î*Üï¿r sî*Üï ;r sî*Üï ·r sî*Üï 3rsÿÌ ì ì9^gIndex111StreamHandle, 74StreamIndex, 14StreamIO, 3, 5-6, 21, 32, 70, 73StreamObject, 74StreamPosition, 15StreamsA, 4StreamsB, 4StreamsC, 4StreamScan, 4, 9, 16String, 4, 67, 76StringBoundsFault, 77StringDefs, 4, 76StringLength, 68StringsA, 4StringsB, 4StringToDecimal, 78StringToLongNumber, 78StringToNumber, 77StringToOctal, 78SubString, 76SubStringDescriptor, 76SwapError, 56SwapIn, 55SwapInCode, 44SwapOut, 55SwapOutCode, 44Swapper, 3-4SwappingProcedure, 57SwapStrategy, 58SwapUp, 56System, 4SystemDefs, 4, 37, 63, 68SystemDisplay, 3, 18, 21SystemDS, 53TableDS, 53Ticks, 46TicksToMsec, 46Time, 4TimeConvert, 4TimeDefs, 4, 79TooManyProcesses, 45trackCursor, 33TrapDefs, 4, 81TruncateDiskStream, 13UnboundProcedure, 81UnimplementedInst, 82UnknownDS, 53Unlock, 55UnlockCode, 44UnlockFile, 24UnNew, 43UnNewConfig, 3, 6, 42UnpackDT, 79UnpackedTime, 79updown, 33UpperCase, 76ValidateFrame, 42ValidateGlobalFrame, 41ValidateLongPointer, 61ValidateVMPage, 61VersionOptions, 23VMnotFree, 56VMtoDataSegment, 53VMtoFileSegment, 54VMtoSegment, 52WakeupError, 82Words, 63WordsForString, 76WorryCallDebugger, 37Write, 12, 23WriteAppend, 12, 23WriteBlock, 14WriteChar, 70WriteDecimal, 73WriteLine, 72WriteNumber, 73WriteOctal, 73WriteProtectFaultt, 82WriteString, 72WriteSubString, 72Yield, 48Zero, 36ZeroDivisor, 82ZonePointer, 64ZoneTooLarge, 65ZoneTooSmall, 65î*OïfñpîHZî ‚ïbr sôXî ‚ï`šr sî ‚ï_rsî ‚ï]’r sî ‚ï\r sî ‚ïZŠrsî ‚ïYrsî ‚ïW�rsî ‚ïUýr s î ‚ïTyrs î ‚ïRõrsî ‚ïQqr sî ‚ïOír sî ‚ïNirsî ‚ïLårsî ‚ïKarsî ‚ïIÝrsî ‚ïHYr sî ‚ïFÕr sî ‚ïEQrsî ‚ïCÍrsî ‚ïBIrsî ‚ï@Årsî ‚ï?Ar sî ‚ï=¼rsî ‚ï<8r sî ‚ï:´rsî ‚ï90rsî ‚ï7¬r sî ‚ï6(rsî ‚ï4¤rsî ‚ï3 r sî ‚ï1œr s î ‚ï0rsî ‚ï.”rsî ‚ï-rsî ‚ï+Œr sî ‚ï*rsî ‚ï(„r sî ‚ï'rsî ‚ï%|rsî ‚ï#ør sî ‚ï"srsî ‚ï ïrsî ‚ïkrsî ‚ïçrsî ‚ïcrsî ‚ïßrsî ‚ï[r sî ‚ï×r sî ‚ïSrsî ‚ïÏr s î ‚ïKrsî ‚ïÇr sî ‚ïCrsî ‚ï¿rsî ‚ï ;r sî ‚ï ·rsî ‚ï 3rsî.rïbr sî.rï`šr sî.rï_rsî.rï]’rsî.rï\rsî.rïZŠr sî.rïYr sî.rïW�rsî.rïUýr sî.rïTyrsî.rïRõrsî.rïQqr sî.rïOír sî.rïNirsî.rïLår sî.rïKarsî.rïIÝr sî.rïHYr sî.rïFÕrsî.rïEQr sî.rïCÍr sî.rïBIrsî.rï@Årsî.rï?Ar sî.rï=¼r sî.rï<8r sî.rï:´r sÿF ‚ ìò^ HELVETICA TIMESROMAN LOGO HELVETICA  HELVETICA  TIMESROMAN TIMESROMAN  TIMESROMAN  HELVETICA HELVETICA HELVETICA  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN GACHA  HELVETICA HELVETICA  HELVETICA TIMESROMAN  TIMESROMAN  TIMESROMAN  HELVETICA HELVETICA  HELVETICA HELVETICA  TIMESROMAN GACHA  TIMESROMAN  TIMESROMAN  TIMESROMAN  HELVETICA HELVETICA HELVETICA  TIMESROMAN  TIMESROMAN  TIMESROMAN GACHA  HELVETICA  HELVETICA TIMESROMAN  HELVETICA TIMESROMAN TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN HELVETICA  TIMESROMAN  HELVETICA HELVETICA  TIMESROMAN  TIMESROMAN  TIMESROMAN  HELVETICA  HELVETICA TIMESROMANGACHA  HELVETICA HELVETICA   TIMESROMAN   TIMESROMAN   TIMESROMAN   HELVETICA   TIMESROMAN   HELVETICA  HELVETICA   HELVETICA  GACHA   TIMESROMAN  TIMESROMAN  TIMESROMAN   TIMESROMAN   TIMESROMAN   HELVETICA   HELVETICA  TIMESROMAN  HELVETICA   TIMESROMAN  TIMESROMAN   HELVETICA  TIMESROMAN   TIMESROMAN   TIMESROMAN   HELVETICA   HELVETICA  HELVETICA   HELVETICA  TIMESROMAN   TIMESROMAN   TIMESROMAN   HELVETICA   HELVETICA  TIMESROMAN   TIMESROMAN GACHA   HELVETICA  HELVETICA   TIMESROMAN   TIMESROMAN   TIMESROMAN   HELVETICA   HELVETICA  HELVETICA   TIMESROMAN TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  HELVETICA  HELVETICA TIMESROMAN TIMESROMAN HELVETICA  TIMESROMAN  TIMESROMAN  TIMESROMAN  HELVETICA  TIMESROMAN  HELVETICA  HELVETICA TIMESROMAN HELVETICA  GACHA  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  HELVETICA HELVETICA  HELVETICA  TIMESROMAN  TIMESROMAN  TIMESROMAN  HELVETICA  HELVETICA TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  HELVETICA HELVETICA  HELVETICA  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  HELVETICA HELVETICA  TIMESROMAN  HELVETICA  TIMESROMAN TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  HELVETICA  HELVETICA HELVETICA TIMESROMAN TIMESROMAN  TIMESROMAN  TIMESROMAN  HELVETICA  HELVETICA  HELVETICA  HELVETICA TIMESROMAN  TIMESROMAN  HELVETICA  HELVETICA  HELVETICA  HELVETICA TIMESROMAN  TIMESROMAN  HELVETICA  HELVETICA  HELVETICA HELVETICA  TIMESROMAN  TIMESROMAN  HELVETICA  TIMESROMAN  HELVETICA HELVETICA GACHA µóö ó ·óQéá"ô(õ0„38 ;ÏB•I“LÄSóYž`ôg¹n“q$vä}¯„΋þ‘Ô—מè¥û¬ö²ö¹¾áÅÔÇ+ËïÑÖ¹ØáÞŸä¨ê¼ðŸößüÕá ' ÛÙ÷"Ò) ½2�5¹<ÀCùJ§RõYû`½h mâs˜z;~æ†éŒû’—÷�¡Ý§rª®®µþº¿ÎÆÅÍòÓ¹ÙÅßòå°çöí7ñMù" j ÿ ,'B. Ê8 ãAJH¸P,W_ifƒlXrz Å„ Œ3“H›!£n¦Ã­—´ž»™Â>Ç ]‚:Z#:Z$9dZ"*ia:]_C)‰‹ öZ ø ÷")S ã9»îJ %O=Ož#€ iK" ó­j/ÖvÓÿÿ–'yœÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ System.pressSweet29-Oct-80 17:17:16 PSTÓ