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

Tweetbot 2.5 - 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
Monolingual 1.7.8 - Remove unwanted OS X...
Monolingual is a program for removing unnecesary language resources from OS X, in order to reclaim several hundred megabytes of disk space. If you use your computer in only one (human) language, you... Read more
Dash 4.0.3 - Instant search and offline...
Dash is an API documentation browser and code snippet manager. Dash helps you store snippets of code, as well as instantly search and browse documentation for almost any API you might use (for a full... Read more
Posterino 3.3.6 - Create posters, collag...
Posterino offers enhanced customization and flexibility including a variety of new, stylish templates featuring grids of identical or odd-sized image boxes. You can customize the size and shape of... Read more
Apple Numbers 4.1.1 - Apple's sprea...
With Apple Numbers, sophisticated spreadsheets are just the start. The whole sheet is your canvas. Just add dramatic interactive charts, tables, and images that paint a revealing picture of your data... Read more
Apple Pages 6.1.1 - Apple's word pr...
Apple Pages is a powerful word processor that gives you everything you need to create documents that look beautiful. And read beautifully. It lets you work seamlessly between Mac and iOS devices, and... Read more
iClock Pro 3.4.9 - Customize your menuba...
iClock Pro is a menu bar replacement clock for Apple's default clock. iClock Pro is an update, total rewrite and improvement to the popular iClock. Have the day, date and time in different fonts and... Read more
Typinator 7.2 - 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
ExpanDrive 5.4.6 - $49.99
ExpanDrive builds cloud storage in every application, acts just like a USB drive plugged into your Mac. With ExpanDrive, you can securely access any remote file server directly from the Finder or... Read more
Espresso 5 - Powerful HTML, XML, CSS, an...
Espresso is back. For people who make delightful, innovative, and fast websites -- in an app to match. Espresso helps you write, code, design, build, and publish with flair and efficiency.... Read more

Latest Forum Discussions

See All

Minimalist puzzle game, Cuts, free on iO...
If you're looking for a gorgeous puzzle experience on iOS devices, developer Gamebra.in's aesthetically interesting puzzler, Cuts, is discounted to free on the iOS App Store right now. [Read more] | Read more »
Anime tactical RPG, War of Crown, comes...
If you're looking for another tactical RPG fix to go alongside your Fire Emblem Heroes campaigns check out Gamevil's newest, anime-inspired tactics RPG, War of Crown, which comes out tomorrow. [Read more] | Read more »
Fantasy MMORPG MU Origin adds new modes,...
MU Origin, Webzen’s highly popular fantasy MMORPG is getting ready to shake things up for the second time this year, as a new update makes its way to the Google Play and App Store from today. Introducing new systems, modes, and events, the land of... | Read more »
Blizzard is looking to hire a mobile dev...
A new thread on the popular video game rumor forum, NeoGAF, uncovered an interesting job listing over at Blizzard Entertainment. It appears the studio behindStarCraft, World of WarCraft, Hearthstone,andOverwatch is looking to bring on a new hire... | Read more »
Legend of Zelda meets Cooking Mama in ne...
Dungeon Chef is what happens when you mix the RPG elements (and style) of a Legend of Zelda game, with cooking elements. Although, now that The Legend of Zelda: Breath of the Wild also has cookingelements, so maybe the gameplay is not so novel.... | Read more »
ChordFlow (Music)
ChordFlow 1.0.0 Device: iOS Universal Category: Music Price: $6.99, Version: 1.0.0 (iTunes) Description: ChordFlow is a chord sequencer with a unique 4-track polyphonic arpeggiator, extensive chord library, MIDI out and Ableton Link... | Read more »
The Walking Dead: A New Frontier is out...
The newest season of Telltale Games'The Walking Dead is well underway. After the release of the third episode, "Above the Law" about a month ago, episode four, "Thicker Than Water" is hot and ready for more zombies and gut-wrenching emotional... | Read more »
Best games we played this week
Another week, another new wave of mobile games do dive into. We've dug through the list of apps that came out this week to tell you which apps are worth your sweet time. And while there weren't too many games this week, there were some big ones.... | Read more »
Vignettes (Games)
Vignettes 1.0.1 Device: iOS Universal Category: Games Price: $2.99, Version: 1.0.1 (iTunes) Description: Vignettes is a casual but unique exploration game without text or characters, where objects shapeshift as you spin them around... | Read more »
Get Me Outta Here is an 80s retro shoote...
Are you ready to fight some aliens? Because Crescent Moon Games has released the retro shooter Get Me Outta Here on iOS devices today. [Read more] | Read more »

Price Scanner via MacPrices.net

HyperX Ships Pulsefire FPS Gaming Mouse, Winn...
Your reporter is a longtime fan of gaming mice for general purpose coomnputing use, finding them typically superior in comfort and performance. HyperX, a division of Kingston Technology Company, Inc... Read more
Penske Truck Leasing Unveils “Penske Fleet” M...
Penske Truck Leasing has introduced a free mobile app called “Penske Fleet” to benefit its full-service truck leasing and contract maintenance customers. The mobile app enables Penske’s customers to... Read more
DEVONthink To Go 2.1.3 For iOS Adds New Declu...
DEVONtechnologies has updated DEVONthink To Go, its iOS companion to DEVONthink for Mac. Enhancements and bug fixes in Version 2.1.3 include DEVONtechnologies’ new decluttering service for clipping... Read more
Use Apple’s Education discount to save up to...
Purchase a new Mac or iPad using Apple’s Education Store and take up to $300 off MSRP. All teachers, students, and staff of any educational institution qualify for the discount. Shipping is free: -... Read more
Apple refurbished Apple Watches available sta...
Apple is now offering Certified Refurbished Series 1 and Series 2 Apple Watches for 14-16% off MSRP, starting at $229. An Apple one-year warranty is included with each watch. Shipping is free: Series... Read more
15-inch Touch Bar MacBook Pros, Apple refurbi...
Apple is offering Certified Refurbished 2016 15″ Touch Bar MacBook Pros for $360 to $420 off original MSRP. An Apple one-year warranty is included with each model, and shipping is free: - 15″ 2.6GHz... Read more
13-inch MacBook Airs on sale for up to $150 o...
Overstock.com has 13″ MacBook Airs on sale for up to $150 off MSRP including free shipping: - 13″ 1.6GHz/128GB MacBook Air (sku MMGF2LL/A): $869.99 $130 off MSRP - 13″ 1.6GHz/256GB MacBook Air (sku... Read more
15-inch Touch Bar MacBook Pros on sale for $1...
B&H Photo has the new 2016 15″ Apple Touch Bar MacBook Pros in stock today and on sale for up to $200 off MSRP. Shipping is free, and B&H charges NY sales tax only: - 15″ 2.7GHz Touch Bar... Read more
15-inch 2.7GHz Touch Bar MacBook Pros on sale...
Amazon has 2016 15″ 2.7GHz Apple Touch Bar MacBook Pros in stock today and on sale for $150-$200 off MSRP. Shipping is free: - 15″ 2.7GHz Touch Bar MacBook Pro Space Gray (sku MLH42LL/A): $2599 $200... Read more
Apple now offering Certified Refurbished 13-i...
Apple is now offering Certified Refurbished 2016 13″ Touch Bar MacBook Pros for $270-$300 off original MSRP. An Apple one-year warranty is included with each model, and shipping is free: - 13″ 2.9GHz... Read more

Jobs Board

*Apple* Engineering Specialist - CSRA (Unite...
Apple Engineering Specialist All times are in Eastern Daylight Time Requisition ID Job Locations US DC Washington DC Posted Date Category Engineering Sciences Read more
*Apple* Mac Computer Technician - GeekHampto...
…complex computer issues over the phone and in person? GeekHampton, Long Island's Apple Premium Service Provider, is looking for you! Come work with our crew 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
*Apple* Solutions Consultant - Apple (United...
# Apple Solutions Consultant Job Number: 56881986 Middletown, NY, New York, United States Posted: Apr. 17, 2017 Weekly Hours: 40.00 **Job Summary** As an Apple Read more
*Apple* Mobile Master - Best Buy (United Sta...
**489879BR** **Job Title:** Apple Mobile Master **Location Number:** 000402-Utica-Store **Job Description:** **What does a Best Buy Apple Mobile Master do?** At Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.