TweetFollow Us on Twitter

Anchored Variables
Volume Number:1
Issue Number:8
Column Tag:Programmer's Forum

"Modula-2 and Anchored Variables"

By Tom Taylor, Software Engineer, Modula-2 Corp., Provo, Ut.

"Modula-2 and Anchored Variables"

The programming language Modula-2 supports a little known but extremely powerful feature called "anchored variables." Anchored variables allow one to specify in the variable's declaration the absolute address of the variable and override the compiler's allocation method. This feature was intended to allow access to device registers on computers with memory mapped I/O (like on a PDP-11 where the original Modula-2 compiler was developed). It also allows the Modula-2 programmer on the Macintosh to access the Mac's operating system global variables very conveniently and cleanly.

In this article, we will look at two examples of anchored variable usage. In the first, we will try a small example to show that anchored variables really do work. In the second example, we'll actually develop a useful module based on anchored variables. These examples have been programed using MacModula-2 by Modula Corporation. However, with minor changes to the programs (probably the import statements), these programs should run using any Modula-2 system.

Anchored variables are "anchored" to a specific address by specifying that address in brackets immediately following the variable name in a variable declaration and before specifying the variable's type. For example:

     FinderName [2E0h]
     : ARRAY [0..16] OF CHAR;

This statement tells the compiler to allocate the variable FinderName starting at hex location 2E0h. Location 2E0h just happens to contain a Mac style string with the name of the current finder. The following program, will print out the name of the currently installed finder:

MODULE PrintFinder;
    FROM Terminal IMPORT
             ClearScreen, Write,
             Read, WriteLn, WriteString;

    FinderName [2e0h] :
             ARRAY [0..16] OF CHAR;
    i : CARDINAL;
    ch : CHAR;

    WriteString("Current finder is: ");
    FOR i := 1 TO ORD(FinderName[0]) DO
END PrintFinder.

Volume Control Block Queue

This next example is slightly more useful. It demonstrates the use of anchored variables in traversing the Volume Control Block queue and returning information about any disk (or volume) visible on the desktop (inserted in a drive or ejected) at the time your program was launched. This technique is used, for example, in the MacModula-2 compiler and linker when they search for imported files. This feature allows users of single drive Macs to build programs that are spred out over a number of disks by having those disks visible on the desktop at the time the compiler or linker is launched. The compiler or linker will search each disk found on the desktop by traversing the VCB queue until the desired import file is found or the end of the queue is reached.

The following example actually consists of three modules:

1) a Definition Module that defines the records, types, global variables, and procedures that are available for use by any program.

2) An Implementation Module that contains the code for the procedures defined in the Definition Module.

3) A simple Program Module that uses the procedures we have written and demonstrates some of the information available from the Volume Control Blocks.


FROM MacSystemTypes IMPORT LongCard, Ptr;

EXPORT QUALIFIED VCB, VolumesOnLine,                                 

        QElemPtr = POINTER TO VCB;

                          qLink: QElemPtr;
                                         (* next queue entry *)
                         qType:  INTEGER;
                                         (* not used *)
                        vcbFlags: INTEGER;
                                        (* bit 15=1 if dirty *)
                        vcbSigWord: INTEGER;
                                       (* always $D2D7 *)
                       vcbCrDate: LongCard;
                                      (* date volume initialized *)
                       vcbLsBkUp: LongCard;
                                     (* date of last backup *)
                      vcbAtrb: INTEGER;
                                    (* volume attributes *)
                      vcbNmFls: INTEGER;
                                    (* # of files in directory *)
                      vcbDirSt: INTEGER;
                                   (* directory's first block *)
                      vcbBlLn: INTEGER;
                                  (* length of file directory *)
                     vcbNmBlks: INTEGER;
                                  (* # of allocation blocks *)
                    vcbAlBlkSiz: LongCard;
                                  (* size of allocation blocks *)
                    vcbClpSiz: LongCard;
                                 (* # of bytes to allocate *)
                   vcbAlBlSt: INTEGER;
                                (* first block in block map *)
                   vcbNxtFNum: LongCard;
                                (* next unused file number *)
                   vcbFreeBks: INTEGER;
                                (* number of unused blocks *)
                   vcbVN: ARRAY [0..27] OF CHAR;
                               (* vol name Str255 format *)
                   vcbDrvNum: INTEGER;
                               (* drive number *)
                   vcbDRefNum: INTEGER;
                              (* driver reference number *)
                  vcbFSID: INTEGER;
                              (* file system identifier *)
                  vcbVRefNum: INTEGER;
                             (* volume reference number *)
                 vcbMAdr: Ptr;
                            (* location of block map *)
                 vcbBufAdr: Ptr;
                           (* location of volume buffer *)
                vcbMLen: INTEGER;
                           (* # of bytes in block map *)
               vcbDirIndex: INTEGER;
                          (* used internally *)
              vcbDirBlk: INTEGER;
                          (* used internally *)

                     (* Returns the maximum number of
                         volumes currently recognized by the
                         Mac operating system. *)

PROCEDURE GetVolumeInfo(VAR volume :
                  VCB; whichVol : CARDINAL);
                              (* Returns the current VCB block for
                                 volume "whichVol"  The variable
                               "whichVol" must be between 1 and
                                 the result of the procedure of
                                "VolumesOnLine()".  Otherwise,
                                  the "volume" info is undefined. *)

END VolumeTracer.

        QHdrPtr   = POINTER TO QHdr;
        QHdr        = RECORD
        qFlags : INTEGER;
                          (* queue flags *)
        qHead  : QElemPtr;
                          (* first queue entry *)
        qTail   : QElemPtr;
                          (* last  queue entry *)

        VCBQHdr  [0356h] : QHdr;
                                           (* VCB queue header *)

       ptr : QElemPtr;
       count : CARDINAL;
       ptr := VCBQHdr.qHead;
       count := 0;
       WHILE ptr # NIL DO
               ptr := ptr^.qLink;
       RETURN count;
END VolumesOnLine;

PROCEDURE GetVolumeInfo(VAR volume :
           VCB; whichVol : CARDINAL);
        ptr : QElemPtr;
        count : CARDINAL;
        ptr := VCBQHdr.qHead;
        count := 0;
        WHILE (ptr # NIL) AND
               (count # whichVol) DO
        IF count = whichVol THEN
                  volume := ptr^;
        ptr := ptr^.qLink;
END GetVolumeInfo;

END VolumeTracer.

MODULE ListVolumes;
FROM VolumeTracer IMPORT
           VCB, VolumesOnLine, GetVolumeInfo;
FROM InOut IMPORT WriteString, ClearScreen,  WriteLn, WriteCard, WriteInt, 
Write, Read;
        i, maxVols : CARDINAL;
       vcb : VCB;
       ch : CHAR;
       i : CARDINAL;
       FOR i := 1 TO ORD(vcb.vcbVN[0]) DO
END PrintVolName;

                     ("Number of volumes on-line: ");
       maxVols := VolumesOnLine();
       WriteLn; WriteLn;
       FOR i := 1 TO maxVols DO
              WriteString('Volume Name: ');
                        ('Number of files in volume: ');
             WriteString('Drive Number: ');
END ListVolumes.

Figure 1. Typical VCB Queue

This is only one simple example of a typical use of anchored variables. Many times, Inside Macintosh will mention some variable that can be accessed from assembly language. The Window Manager, for example, mentions that putting a WindowPtr in the variable GhostWindow, will cause that window to never be the front window. In order to find the addresses of such variables, such as GhostWindow, one need simply paw through ToolEqu.TXT or SysEqu.TXT. Both of these source files are included with the MDS system by Apple. Not only have I used GhostWindow as an anchored variable in my applications, I have also used anchored variables to access the information set by the Finder when a program is launched.

By taking advantage of the power of anchored variables, you will be able to create very readable programs that use some of the Mac's low-level features.


Community Search:
MacTech Search:

Software Updates via MacUpdate

OmniPlan 3.0 - Robust project management...
With OmniPlan, you can create logical, manageable project plans with Gantt charts, schedules, summaries, milestones, and critical paths. Break down the tasks needed to make your project a success,... Read more
Yummy FTP 1.11 - FTP/SFTP/FTPS client fo...
Yummy FTP is an FTP + SFTP + FTPS file transfer client which focuses on speed, reliability and productivity. Whether you need to transfer a few files or a few thousand, schedule automatic backups, or... Read more
Tweetbot 2.1 - Popular Twitter client. (...
Tweetbot is a full-featured OS X Twitter client with a lot of personality. Whether it's the meticulously-crafted interface, sounds and animation, or features like multiple timelines and column views... Read more
MacPilot 8.0 - Enable over 1,200 hidden...
MacPilot gives you the power of UNIX and the simplicity of Macintosh, which means a phenomenal amount of untapped power in your hands! Use MacPilot to unlock over 1,200 features, and access them all... Read more
Typinator 6.7 - Speedy and reliable text...
Typinator turbo-charges your typing productivity. Type a little. Typinator does the rest. We've all faced projects that require repetitive typing tasks. With Typinator, you can store commonly used... Read more
Adobe Lightroom 6.2 - Import, develop, a...
Adobe Lightroom is available as part of Adobe Creative Cloud for as little as $9.99/month bundled with Photoshop CC as part of the photography package. Lightroom 6 is also available for purchase as a... Read more
ForeverSave 2.1.4 - Universal auto-save...
ForeverSave auto-saves all documents you're working on while simultaneously doing backup versioning in the background. Lost data can be quickly restored at any time. Losing data, caused by... Read more
VueScan 9.5.27 - Scanner software with a...
VueScan is a scanning program that works with most high-quality flatbed and film scanners to produce scans that have excellent color fidelity and color balance. VueScan is easy to use, and has... Read more
AirPort Utility 6.3.6 - Set up and manag...
Note: Most recent release available only within OS X 10.11 El Capitan update. Use AirPort Utility to set up and manage your Wi-Fi network and AirPort base stations, including AirPort Express, AirPort... Read more
Quicksilver 1.3.1 - Application launcher...
Quicksilver is a light, fast and free Mac application that gives you the power to control your Mac with keystrokes alone. Quicksilver allows you to find what you need quickly and easily, then act... Read more

Super Sharp (Games)
Super Sharp 1.1 Device: iOS Universal Category: Games Price: $1.99, Version: 1.1 (iTunes) Description: Your finger has never been so sharp! Cut with skill to complete the 120 ingenious physics levels of Super Sharp and become a cut... | Read more »
Assembly - Graphic design for everyone...
Assembly - Graphic design for everyone 1.0 Device: iOS Universal Category: Photography Price: $2.99, Version: 1.0 (iTunes) Description: Assembly is the easiest most powerful design tool on the App Store. Create anything you can... | Read more »
YAMGUN (Games)
YAMGUN 1.0 Device: iOS Universal Category: Games Price: $2.99, Version: 1.0 (iTunes) Description: The invasion has begun! Protect the walls of the citadel against waves of enemies! But watch out, you will soon run out of ammo...... | Read more »
Royal Bounty HD (Games)
Royal Bounty HD 1.0 Device: iOS Universal Category: Games Price: $4.99, Version: 1.0 (iTunes) Description: New World Computing Approved "Hi Guys! looks good so far! keep up the good work. I worked on HoMM 3 and 4 creating all of the... | Read more »
Swords & Crossbones: An Epic Pirate...
Swords & Crossbones: An Epic Pirate Story 1.0 Device: iOS Universal Category: Games Price: $4.99, Version: 1.0 (iTunes) Description: | Read more »
Camel Up (Games)
Camel Up 1.0.0 Device: iOS Universal Category: Games Price: $4.99, Version: 1.0.0 (iTunes) Description: | Read more »
The Martian: Bring Him Home (Games)
The Martian: Bring Him Home 1.0 Device: iOS Universal Category: Games Price: $2.99, Version: 1.0 (iTunes) Description: Based on the best selling novel and critically acclaimed film, THE MARTIAN tells the story of Astronaut Mark... | Read more »
This Week at 148Apps: September 21-30, 2...
Leap Into Fall With 148Apps How do you know what apps are worth your time and money? Just look to the review team at 148Apps. We sort through the chaos and find the apps you're looking for. The ones we love become Editor’s Choice, standing out above... | Read more »
Tweetbot 4 for Twitter (Social Networki...
Tweetbot 4 for Twitter 4.0 Device: iOS Universal Category: Social Networking Price: $4.99, Version: 4.0 (iTunes) Description: *** 50% off for a limited time. *** | Read more »
Mori (Games)
Mori 1.0 Device: iOS Universal Category: Games Price: $2.99, Version: 1.0 (iTunes) Description: Stop, rewind and unwind with Mori. Time is always running, take a moment to take control. Mori is an action puzzle game about infinitely... | Read more »

Price Scanner via

Save up to $350 with Apple refurbished iMacs
Apple has Certified Refurbished iMacs available for up to $350 off the cost of new models. Apple’s one-year warranty is standard, and shipping is free: - 27″ 3.5GHz 5K iMac – $1949 $350 off MSRP - 27... Read more
Mac Pros on sale for up to $300 off MSRP
B&H Photo has Mac Pros on sale for up to $300 off MSRP. Shipping is free, and B&H charges sales tax in NY only: - 3.7GHz 4-core Mac Pro: $2818.99, $181 off MSRP - 3.5GHz 6-core Mac Pro: $3699... Read more
5K iMacs on sale for up to $150 off MSRP, fre...
B&H Photo has the 27″ 3.3GHz 5K iMac on sale for $1899.99 including free shipping plus NY tax only. Their price is $100 off MSRP. They have the 27″ 3.5GHz 5K iMac on sale for $2149, $150 off MSRP... Read more
Twelve South Redesigns BookArc For Today’s Sm...
Twelve South has announced a redesigned version of their very first product, BookArc for MacBook. Tailored specifically for the newest generation of MacBooks, BookArc holds the new, smaller Apple... Read more
Phone 6s Tips & Tricks – Tips Book For iP...
Poole, United Kingdom based Tap Guides Ltd. has announced the release and immediate availability of iPhone 6s Tips & Tricks, an in-depth eBook available in the iBookstore that’s priced just $2.99... Read more
13-inch 2.5GHz MacBook Pro on sale for $994,...
Best Buy has the 13″ 2.5GHz MacBook Pro available for $994.99 on their online store. Choose free shipping or free instant local store pickup (if available). Their price is $105 off MSRP. Price valid... Read more
Is The iPad Pro Really A Serious Laptop Repla...
Probably not, at least for productive professionals and other power users. Steve Jobs declared that we’d entered the “post-PC Era” with the advent of the original iPad in 2010, a phrase we don’t hear... Read more
Wednesday Deal: 13-inch Retina MacBook Pros f...
Adorama has 13″ Retina MacBook Pros on sale for up to $130 off MSRP. Shipping is free, and Adorama charges sales tax for NY & NJ residents only: - 13″ 2.7GHz/128GB Retina MacBook Pro: $1199.99 $... Read more
uBar 3.0 for Mac OS X – Custom Dock Replaceme...
Brawer Software has announced the release of uBar 3.0, an important update to their popular app and window manager for Mac OS X. uBar allows users to position it whichever side of the screen they... Read more
13-inch 2.5GHz MacBook Pro (refurbished) avai...
Apple has Certified Refurbished 13″ 2.5GHz MacBook Pros available for $829, or $270 off the cost of new models. Apple’s one-year warranty is standard, and shipping is free: - 13″ 2.5GHz MacBook Pros... Read more

Jobs Board

*Apple* Retail - Multiple Customer Support P...
Job Description:Customer SupportSpecialist - Retail Customer Service and SalesTransform Apple Store visitors into loyal Apple customers. When customers enter the Read more
Software Engineer, *Apple* Watch - Apple (U...
…the team that is revolutionizing the watch! As a software engineer on the Apple Watch team, you will be responsible for building world-class applications and frameworks Read more
*Apple* Online Store UAT Lead - Apple (Unite...
**Job Summary** The Apple Online Store is a fast paced and ever evolving business environment. The User Acceptance Testing (UAT) lead in this organization is able to Read more
Hardware Systems Integration Engineer - *App...
**Job Summary** We are seeking an enthusiastic electrical engineer for the Apple Watch team. This is a design engineering position that entails working with Read more
Touch Validation Design (EE) - *Apple* Watc...
**Job Summary** Help launch next-generation Touch Technologies in Apple products. The Touch Technology team develops cutting-edge Touch solutions and technologies that Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.