TweetFollow Us on Twitter

World CDEV
Volume Number:5
Issue Number:9
Column Tag:System Sleuthing

Related Info: Script Manager

World CDEV Investigated

By Martin Minow, Mike Carleton, Arlington, MA

Note: Source code files accompanying article are located on MacTech CD-ROM or source code disks.

Sleuthing the Map Cdev

[Martin Minow is a Principal Engineer at Digital Equipment Corporation. Originally a speech major (later a linguist), he decided he might need a “real” job someday, so he took the last programming course given for the Illiac I computer in 1962. When his graduate study grant ran out, he joined Digital Equipment Corporation in 1972, where he has held positions in software support and speech research and development, eventually working on the DECtalk speech synthesizer. He is currently a Principal Engineer in the mid-range system’s advanced development group. In his spare time, he runs marathons (slowly), and orienteers (even more slowly).

Mike Carleton received his BSEE in 1981. He first worked on special purpose compiler systems used to test the black boxes in fighter aircraft. After joining Digital Equipment Corporation in 1984 he supported the TOPS-10/20 COBOL compiler. Later he joined up as the system engineer for the VAX Supercomputer Gateway product and worked hand in hand with Cray Research engineers to make their two systems talk to each other. Currently, he is a Senior Software Engineer at Digital Equipment Corporation.]

System 6.0 includes an unexpected gimmick--a control panel program that displays a world map and allows you to select your location and time zone. The system is distributed with about 80 large cities already defined, and it is very easy to add your own location. However, there doesn’t appear to be any published way to extract the information for your own applications.

With a little poking around, we were able to decipher the internal information and think that other MacTutor readers might find it useful. By using the code in the following program, your phase of the moon program (or program to determine sunrise and sunset times) need not ask the user to specify the system’s location.

The program has only been tested on Mac SE’s and Mac II’s under System 6.0. At its heart is a subroutine to read data from the clock parameter ram.

The data is returned in three longwords with the following format (the actual numbers locate a suburb of Boston) found in figure 1.

Figure 1.

Latitude and longitude are stored as a fraction of the circle. You can think of latitude and longitude either as signed quantities ranging from -.5 to +.5, or as unsigned quantities ranging from 0 to 1. The right method depends on your program’s needs. For example, since people don’t think of Boston (71°05' West) as 288°55' East, a program that displays the location would probably treat the numbers as signed, as shown in the example program.

Time is stored as the number of seconds offset from UTC (GMT) in the low three bytes of the third longword. The high byte is zero. When the 24-bit value is sign-extended, it will be positive for offsets East of UTC, and negative for Western offsets.

Sleuthing the Parameter RAM

The parameter RAM is a block of memory in the clock chip that is kept alive by a battery when the computer is turned off. It was included in the Macintosh to store a small amount of environmental information that should not change when the system is booted from a different floppy. The MAP CDEV data is stored here because Apple wanted your Mac to know that it is located in Boston even if it was booted from a disk created in Cupertino.

The classic Macintosh has 20 bytes of parameter memory. The contents are copied to low memory when the system is booted and you should access it by referencing the SysParam block as discussed in Inside Macintosh, volume II, chapter 13. When Apple introduced the Mac SE and Mac II, they used a clock chip with 256 bytes of memory. Since only the 20 bytes of the classic Mac are copied to system memory, we had to find a way to access the rest of the information.

The read_param_ram() function below is the C-language interface to the undocumented _ReadXPRam trap that we found tucked away in the 256 KByte ROM. This routine can read any part (or all) of the 256 byte parameter RAM. It takes three parameters: a pointer to a buffer, an offset from the start of the parameter ram, and a count of bytes to copy to your program’s buffer. It returns an OSErr code which read_param_ram() then returns to your program.

Finally, we would remind you that you shouldn’t assume that Apple will keep this information in the same place or format in future system releases.

In a recently-published document, Apple described ScriptManager 2.0 which contains support routines to allow reading and writing the Map information. As we show in the article, the information is stored in three longwords (Fract format) with the following format:

/* 1 */
 
struct MachineLocation {
 Fract latitude;
 Fract longitude;
 union {
 char dlsDelta; 
 /* Signed byte: daylight savings time delta */
 long gmtDelta;
 } gmtFlags;
 };
 

The ScriptManager defines two functions to read and write the Map data:

  pascal void ReadLocation(MachineLocation *loc);
  pascal void WriteLocation(const MachineLocation *loc);

(“const” is a keyword that was added to the Draft Ansi C Standard: it indicates that the parameter will not be changed by the function. You can omit it without harm.)

Latitude and longitude are stored as fractions of a great circle: see our code for details. The low-order three bytes of the third word (gmtFlags.gmtDelta & 0x00FFFFFF) contain the number of seconds the timezone is East of the prime meridian. Note that the high byte must be masked off and the high-bit propogated to get the timezone offset: this is shown in our program. The high byte is marked “reserved” but seems to be a repository for a Daylight Savings Time offset.

I don’t know when the ReadLocation (and WriteLocation) functions will be available: they are not present in the current release of Think C. Until that time, our sample program should be usable, but the cautious program will switch to an approved interface as soon as possible.

/*
 * This is a simple program to demonstrate
 * extracting information from the Macintosh
 * parameter RAM and displaying the current
 * latitude, longitude, and time-zone offset.
 * Note that the format and manner of storage
 * of this data have not been published by
 * Apple.
 * This program is copyright © 1988, 1989
 * by MacTutor magazine.  You may incorpor-
 * ate portions of this program in your
 * applications without restriction.
 * Compile using Think C, V3.0.
 *
 * Written by Martin Minow and Mike Carleton
 */

#include<stdio.h>

/*
 * Define the “Read parameter ram” trap and
 * the offset in the parameter ram where the
 * map is stored.  This information doesn’t
 * seem to be written down anywhere.
 */
#define _ReadXPRam 0xA051
#define Map_Offset 0xE4 /* Ram offset*/

/*
 * This structure defines the location
 * currently set by the Map Cdev.
 * Latitude and longitude are long integers
 * specifying the fraction of the circle:
 *      1 degree East == 0x000308B9
 *      1 degree West == 0xFFFCF747
 * All values are possible for longitude,
 * while latitude is constrained to ± 90°.
 * Only the low-order three bytes of timezone
 * are used.  The value is the number of
 * seconds offset from UTC, East is positive,
 * West negative.
 */
#ifdef Use_Script_Manager
#include <ScriptMgr.h>

typedef struct {
 Fract  latitude;
 Fract  longitude;
 union {
 char dlsDelta;
 long gmtDelta;
 } gmtFlags;
} MachineLocation;

MachineLocation  info;
pascal void ReadLocation(MachineLocation *);
#else
typedef struct {
 long latitude;
 long longitude;
 long timezone;
} MapDatum;
 
MapDatuminfo;  
#endif

void    main(void);
void    dms(long, char *, char *);
void    hms(long, char *);
OSErr   read_param_ram(void *, int, int);

void    printf(char *, ...);
intfgetc(FILE *);

void
main()
{
 OSErr  status;
 /*
  * This is a test for divide rounding.
  * It should yield 180°00’00" W.
  */
 dms(0x80000000L, “Test”, “EW”);
 /*
  * Loop through here until the user types ‘q’ -- this lets you run the 
Map Cdev at the same time to see how location and timezone changes affect 
the data.
  */
 do {

#ifdef Use_Script_Manager
 ReadLocation(&info);
 dms(info.latitude, “Latitude”, “NS”);
 dms(info.longitude,”Longitude”, “EW”);
 hms(info.gmtFlags.gmtDelta, “Zone”);
#else
 status = read_param_ram(&info,
 Map_Offset, sizeof (MapDatum));
 if (status != noErr)
 printf(“Error %d\n”, status);
 dms(info.latitude, “Latitude”, “NS”);
 dms(info.longitude,”Longitude”, “EW”);
 hms(info.timezone, “Zone”);
#endif
 } while (getchar() != ‘q’);
}

/*
 * Convert to degrees/minutes/seconds.
 */
void
dms(raw_value, what, zone)
long    raw_value;
char    *what;
char    *zone;
{
 register long value;
 register long degree, minute, second;
 int    west;

 static longone_degree = (0x80000000L / 180L);
 static longone_minute = (0x80000000L / (180L * 60L));
 static longone_second = (0x80000000L / (180L * 60L * 60L));

 value = raw_value;
 degree = value / one_degree;
 value -= (degree * one_degree);
 minute = value / one_minute;
 value -= (minute * one_minute);
 second = value / one_second;
 if ((west = (raw_value < 0))) {
 degree = (-degree);
 minute = (-minute);
 second = (-second);
 } 
 printf(“%08lx: %3ld°%02ld’%02ld\” %c %s\n”,
 raw_value, degree, minute, second, zone[west], what);
}

/*
 * Convert time to hours:minutes:seconds.
 */
void
hms(timezone, what)
long    timezone;
char    *what;
{
 register long value;
 register long hour, minute, second;
 int    west;

 static longone_hour = (60L * 60L);
 static longone_minute  = (60L);

 if (timezone & 0xFF000000) {
 printf(“timezone high byte %08lx\n”,
 timezone);
 timezone &= 0x00FFFFFF;
 }
 /*
  * Propogate sign bit from bit 23 to bit 31 if West of UTC.
  */
 if ((timezone & 0x00800000) != 0)
 timezone |= 0xFF000000;  
 value   = timezone;
 hour  = value / one_hour;
 value  -= (hour * one_hour);
 minute  = value / one_minute;
 value  -= (minute * one_minute);
 second  = value;
 if ((west = (timezone < 0))) {
 hour = (-hour);
 minute = (-minute);
 second = (-second);
 } 
 printf(“%08lx: %3ld.%02ld.%02ld  %c %s\n”,
 timezone, hour, minute, second, “EW”[west], what);
}

/*
 * Read data from the clock parameter ram.  The start parameter specifies 
the offset within the parameter ram where the read is to start. The count 
parameter specifies the number of bytes to read.
 */
OSErr
read_param_ram(address, start, count)
void    *address;/* Result loc*/
intstart; /* Ram start  */
intcount; /* Read size  */
{
 /*
  * Put the count into the high word of D0, the pRRAM start address into 
the low word of D0, the Macintosh memory address in A0, and trap to ROM. 
 _ReadXPRam returns noErr on success and prInitErr on failure.
  */
 asm {
 move.w count,D0
 swap   D0
 move.w start,D0
 movea.laddress,A0
 dc.w   _ReadXPRam
 return
 }
}

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

Affinity Designer 1.5.5 - Vector graphic...
Affinity Designer is an incredibly accurate vector illustrator that feels fast and at home in the hands of creative professionals. It intuitively combines rock solid and crisp vector art with... Read more
djay Pro 1.4.3 - Transform your Mac into...
djay Pro provides a complete toolkit for performing DJs. Its unique modern interface is built around a sophisticated integration with iTunes and Spotify, giving you instant access to millions of... Read more
Jamf Pro 9.98 - Powerful sysadmin/enterp...
Jamf Pro (formerly Casper Suite) is the EMM tool that delights IT pros and the users they support by delivering on the promise of unified endpoint management for Apple devices. At Jamf, connecting... Read more
Airmail 3.2.4 - Powerful, minimal email...
Airmail is an mail client with fast performance and intuitive interaction. Support for iCloud, MS Exchange, Gmail, Google Apps, IMAP, POP3, Yahoo!, AOL, Outlook.com, Live.com. Airmail was designed... Read more
RapidWeaver 7.3.1 - Create template-base...
RapidWeaver is a next-generation Web design application to help you easily create professional-looking Web sites in minutes. No knowledge of complex code is required, RapidWeaver will take care of... Read more
PopChar 7.7 - $16.99 (51% off)
PopChar helps you get the most out of your font collection. With its crystal-clear interface, PopChar provides a frustration-free way to access any font's special characters. Features Expanded... Read more
Apple iTunes 12.6 - Play Apple Music and...
Apple iTunes lets you organize and stream Apple Music, download and watch video and listen to Podcasts. It can automatically download new music, app, and book purchases across all your devices and... Read more
MacPilot 9.0.6 - Enable over 1,200 hidde...
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
Sparkle Pro 2.1.4 - $79.99
Sparkle Pro will change your mind if you thought building websites wasn't for you. Sparkle is the intuitive site builder that lets you create sites for your online portfolio, team or band pages, or... Read more
TextSoap 8.3.3 - Automate tedious text d...
TextSoap can automatically remove unwanted characters, fix up messed up carriage returns, and do pretty much anything else that we can think of to text. Save time and effort. Be more productive. Stop... Read more

Failbetter Games details changes coming...
Sunless Sea, Failbetter Games' dark and gloomy sea explorer, sets sail for the iPad tomorrow. Ahead of the game's launch, Failbetter took to Twitter to discuss what will be different in the mobile version of the game. Many of the changes make... | Read more »
Splish, splash! The Pokémon GO Water Fes...
Niantic is back with a new festival for dedicated Pokémon GO collectors. The Water Festival officially kicks off today at 1 P.M. PDT and runs through March 29. Magikarp, Squirtle, Totodile, and their assorted evolved forms will be appearing at... | Read more »
Death Road to Canada (Games)
Death Road to Canada 1.0 Device: iOS Universal Category: Games Price: $7.99, Version: 1.0 (iTunes) Description: Get it now at the low launch price! Price will go up a dollar every major update. Update news at the bottom of this... | Read more »
Bean's Quest Beginner's Guide:...
Bean's Quest is a new take on both the classic platformer and the endless runner, and it's free on the App Store for the time being. Instead of running constantly, you can't stop jumping. That adds a surprising new level of challenge to the game... | Read more »
How to rake in the cash in Bit City
Our last Bit City guide covered the basics. Now it's time to get into some of the more advanced techniques. In the later cities, cash flow becomes much more difficult, so you'll want to develop some strategies if you want to complete each level.... | Read more »
PixelTerra (Games)
PixelTerra 1.1.1 Device: iOS Universal Category: Games Price: $.99, Version: 1.1.1 (iTunes) Description: The world of PixelTerra is quite dangerous so you need to build a shelter, find some food supply and get ready to protect... | Read more »
Tokaido™ (Games)
Tokaido™ 1.0 Device: iOS Universal Category: Games Price: $6.99, Version: 1.0 (iTunes) Description: Discover the digital adaptation of Tokaido, the boardgame phenomenon that has already sold more than 250,000 copies worldwide, and... | Read more »
Card Thief (Games)
Card Thief 1.0 Device: iOS Universal Category: Games Price: $1.99, Version: 1.0 (iTunes) Description: Card Thief is a solitaire style stealth game played with a deck of cards. In Card Thief you move through a deck of cards as a... | Read more »
Smilegate’s crafting battler Super Tank...
Super Tank Rumbleputs you in the seat of your very own, handcrafted tank. You can choose from over 100 different parts to create your Super Tank before taking it out to wreak havoc on your opponents in glorious PVP combat. Now, Smilegate is upping... | Read more »
The best games to play while you wait fo...
Mass Effect: Andromeda arrives this coming Tuesday and people are getting understandably antsy. There's a whole weekend standing between us and a brand new Bioware adventure. What's a geek to do? Well, you could certainly give these fine mobile... | Read more »

Price Scanner via MacPrices.net

13-inch Touch Bar MacBook Pros on sale for up...
B&H Photo has the Apple 13″ Touch Bar MacBook Pros in stock today and on sale for up to $150 off MSRP. Shipping is free, and B&H charges NY sales tax only: - 13″ 2.9GHz/512GB Touch Bar... Read more
Today only! 15-inch 2.7GHz Space Gray Touch B...
B&H Photo has the new 2016 15″ 2.7GHz Space Gray Apple Touch Bar MacBook Pro in stock today and on sale for $300 off MSRP for today only. Shipping is free, and B&H charges NY sales tax only... Read more
New $329 iPad A Fabulous Value; 10.5-Inch iPa...
Part of the iPad upgrade/new model puzzle is now in place. Yesterday, as KGI Securities financial services group analyst Ming-Chi Kuo last summer predicted they would, Apple released a new low-cost 9... Read more
New 9.7-Inch iPad Features All Of The Fun...
Apple today updated its most popular-sized iPad, featuring a brighter 9.7-inch Retina display and best-in-class performance at its most affordable price ever, starting at $329 (US) with 32GB of... Read more
Apple Introduces iPhone 7 and iPhone 7 Plus (...
Apple today announced iPhone 7 and iPhone 7 Plus (PRODUCT)RED Special Edition in a vibrant red matte aluminum finish, in recognition of more than 10 years of partnership between Apple and (RED). This... Read more
Apple now offering Certified Refurbished 15-i...
Apple is now offering Certified Refurbished 2016 15″ Touch Bar MacBook Pros for $360-$420 off original MSRP. An Apple one-year warranty is included with each model, and shipping is free: - 15″ 2.6GHz... Read more
Apple Introduces Clips: A Free Innovative Way...
Apple today introduced Clips, a new app that makes it quick and fun for anyone to create expressive videos on iPhone and iPad. The app features a unique design for combining video clips, photos and... Read more
Urban Armor Gear Unveils Case For 4th Generat...
Orange County, California based Urban Armor Gear (UAG), designers of rugged, lightweight protective cases for phones, tablets and laptops, has released its latest drop-tested cases for Apple’s 4th... Read more
Most Users Continue To Prefer 5.0 to 5.3 Inch...
In the first half of 2016, US and UK smartphone users were most likely to be interested in purchasing a device with a 5.3″ or 5.0″ display. Findings in a new report from the User Experience... Read more
12-inch 1.2GHz Retina MacBooks on sale for up...
B&H has 12″ 1.2GHz Retina MacBooks on sale for up to $200 off MSRP. Shipping is free, and B&H charges NY sales tax only: - 12″ 1.2GHz Space Gray Retina MacBook: $1439.99 $160 off MSRP - 12″ 1... Read more

Jobs Board

*Apple* Retail - Multiple Positions - Apple,...
Job Description: Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
Fulltime aan de slag als shopmanager in een h...
Ben jij helemaal gek van Apple -producten en vind je het helemaal super om fulltime shopmanager te zijn in een jonge en hippe elektronicazaak? Wil jij werken in Read more
Starte Dein Karriere-Abenteuer in den Hauptst...
…mehrsprachigen Teams betreust Du Kunden von bekannten globale Marken wie Apple , Mercedes, Facebook, Expedia, und vielen anderen! Funktion Du wolltest schon Read more
Starte Dein Karriere-Abenteuer in den Hauptst...
…mehrsprachigen Teams betreust Du Kunden von bekannten globale Marken wie Apple , Mercedes, Facebook, Expedia, und vielen anderen! Funktion Du wolltest schon Read more
*Apple* Retail - Multiple Positions - Apple,...
Job Description: Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.