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

Tunnelblick 3.8.2a - GUI for OpenVPN.
Tunnelblick is a free, open source graphic user interface for OpenVPN on OS X. It provides easy control of OpenVPN client and/or server connections. It comes as a ready-to-use application with all... Read more
calibre 4.17.0 - Complete e-book library...
Calibre is a complete e-book library manager. Organize your collection, convert your books to multiple formats, and sync with all of your devices. Let Calibre be your multi-tasking digital librarian... Read more
MacPilot 11.1.4 - $15.96
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
Transmission 3.00 - Popular BitTorrent c...
Transmission is a fast, easy, and free multi-platform BitTorrent client. Transmission sets initial preferences so things "just work", while advanced features like watch directories, bad peer blocking... Read more
Doom 3 1.3.1 - First-person shooter acti...
A massive demonic invasion has overwhelmed the Union Aerospace Corporation's (UAC) Mars Research Facility, leaving only chaos and horror in its wake. As one of only a few survivors, you must fight... Read more
Box Sync 4.0.8004 - Online synchronizati...
Box Sync gives you a hard-drive in the Cloud for online storage. Note: You must first sign up to use Box. What if the files you need are on your laptop -- but you're on the road with your iPhone? No... Read more
LibreOffice 6.4.4.2 - Free, open-source...
LibreOffice is an office suite (word processor, spreadsheet, presentations, drawing tool) compatible with other major office suites. The Document Foundation is coordinating development and... Read more
Day One 4.14 - Maintain a daily journal.
Day One is an easy, great-looking way to use a journal / diary / text-logging application. Day One is well designed and extremely focused to encourage you to write more through quick Menu Bar entry,... Read more
MenuMeters 2.0.7 - CPU, memory, disk, an...
MenuMeters is a set of CPU, memory, disk, and network monitoring tools for Mac OS X. Although there are numerous other programs which do the same thing, none had quite the feature set I was looking... Read more
War Thunder 1.97.2.19 - Multiplayer war...
In War Thunder, aircraft, attack helicopters, ground forces and naval ships collaborate in realistic competitive battles. You can choose from over 1,500 vehicles and an extensive variety of combat... Read more

Latest Forum Discussions

See All

SINoALICE, Yoko Taro and Pokelabo's...
Yoko Taro and developer Pokelabo's SINoALICE has now opened for pre-registration over on the App Store. It's already amassed 1.5 million Android pre-registrations, and it's currently slated to launch on July 1st. [Read more] | Read more »
Masketeers: Idle Has Fallen's lates...
Masketeers: Idle Has Fallen is the latest endeavour from Appxplore, the folks behind Crab War, Thor: War of Tapnarok and Light A Way. It's an idle RPG that's currently available for Android in Early Access and will head to iOS at a later date. [... | Read more »
Evil Hunter Tycoon celebrates 2 million...
Evil Hunter Tycoon has proved to be quite the hit since launching back in March, with its most recent milestone being 2 million downloads. To celebrate the achievement, developer Super Planet has released a new updated called Darkness' Front Yard... | Read more »
Peak's Edge is an intriguing roguel...
Peak's Edge is an upcoming roguelike puzzle game from developer Kenny Sun that's heading for both iOS and Android on June 4th as a free-to-play title. It will see players rolling a pyramid shape through a variety of different levels. [Read more] | Read more »
Clash Royale: The Road to Legendary Aren...
Supercell recently celebrated its 10th anniversary and their best title, Clash Royale, is as good as it's ever been. Even for lapsed players, returning to the game is as easy as can be. If you want to join us in picking the game back up, we've put... | Read more »
The Magic Gladiator class arrives in MU...
The Magic Gladiator class is now available in MU Origin 2 following the most recent patch. It also marks the start of Abyss Season 11 and the introduction of Couple Skills and Couple Dungeons. [Read more] | Read more »
The 5 Best Racing Games
With KartRider Rush+ making a splash this past week, we figured it was high time we updated our list of the best mobile racing games out there. From realistic racing sims to futuristic arcade racers (and even racing management games!), check out... | Read more »
KartRider Rush+ Guide - Tips for new rac...
KartRider Rush+ continues to be a surprisingly refreshing and fun kart racer that's entirely free-to-play. The main reason for this is just how high its skill ceiling is. Check out the video above if you're curious to know what top level play looks... | Read more »
KartRider Rush+ might be good, actually?
It's hard to find good racing games on mobile. Most of them are free-to-play, and free-to-play racers generally suck. Even Nintendo couldn't put together a competent Mario Kart game, opting instead for a weird score chaser that resembles--but feels... | Read more »
LifeAfter, NetEase's popular surviv...
A new map will be making its way into NetEase's popular survival game LifeAfter. The map is set to arrive on May 28th and will introduce a volcano that's teetering on the verge of eruption, bringing a host of added challenges to the game. [Read... | Read more »

Price Scanner via MacPrices.net

Apple restocks 2019 MacBook Airs starting at...
Apple has clearance, Certified Refurbished, 2019 13″ MacBook Airs available again starting at $779. Each MacBook features a new outer case, comes with a standard Apple one-year warranty, and is... Read more
Apple restocks clearance Mac minis for only $...
Apple has restocked Certified Refurbished 2018 4-Core Mac minis for only $599. Each mini comes with a new outer case plus a standard Apple one-year warranty. Shipping is free: – 3.6GHz Quad-Core... Read more
Apple’s new 2020 13″ MacBook Airs on sale for...
B&H Photo has Apple’s new 2020 13″ 4-Core and 6-Core MacBook Airs on sale today for $50-$100 off Apple’s MSRP, starting at $949. Expedited shipping is free to many addresses in the US. The... Read more
B&H continues to offer clearance 2019 13″...
B&H Photo has clearance 2019 13″ 4-Core MacBook Pros available for up to $300 off Apple’s original MSRP, with prices starting at $1149. Expedited shipping is free to many addresses in the US. B... Read more
Memorial Day Weekend Sale: Take $300 off thes...
Apple resellers are offering $300 discounts on select 16″ MacBook Pros as part of their Memorial Day Weekend 2020 sales. Prices start at $2099: – 16″ 2.6GHz 6-Core Space Gray MacBook Pro: $2099 at... Read more
Best Memorial Day Weekend 2020 Apple AirPods...
Apple resellers are offering discounts ranging up to $50 off MSRP on AirPods as part of their Memorial Day Weekend 2020 sales. These are the best deals today on various AirPods models. See our... Read more
Memorial Day Weekend Sale: 10″ Apple iPads fo...
Amazon is offering new 10.2″ iPads for $80-$100 off Apple’s MSRP as part of their Memorial Day Weekend 2020 sale, with prices starting at only $249. These are the same iPads sold by Apple in their... Read more
Memorial Day Weekend Sale: 2020 Apple iPhone...
Sprint is offering Apple’s new 2020 64GB iPhone SE for $0 per month for 18 months as part of their Memorial Day Weekend 2020 sale. New line of service and trade-in required. Offer is valid from 5/22/... Read more
Amazon’s popular $100 Apple Watch Series 5 di...
Amazon has Apple Watch Series 5 GPS + Cellular models on sale for up to $100 off Apple’s MSRP today. Shipping is free. These are the same Apple Watch models sold by Apple in their retail and online... Read more
2020 13″ 4-Core MacBook Air on sale for $949,...
Apple reseller Adorama has the new 2020 13″ 1.1GHz 4-Core Space Gray MacBook Air on sale today for $949 shipped. Their price is $50 off Apple’s MSRP, and it’s the lowest price currently available for... Read more

Jobs Board

Essbase Developer - *Apple* - Theorem, LLC...
Job Summary Apple is seeking an experienced, detail-minded Essbase developer to join our worldwide business development and strategy team. If you are someone who Read more
Senior Software Engineer @ *Apple* - Theore...
Job Summary Apple is looking for a seasoned senior software engineer to join our worldwide business development and strategy team. This is an opportunity to lead a Read more
Cub Foods - *Apple* Valley - Now Hiring Par...
Cub Foods - Apple Valley - Now Hiring Part Time! United States of America, Minnesota, Apple Valley Retail Operations Post Date May 18, 2020 Requisition # 119230 Read more
Senior Practice Manager - *Apple* Hill Eye...
Senior Practice Manager - Apple Hill Eye Center Tracking Code 61713 Job Description Schedule & Location: Full Time Days Apple Hill Medical Center General Read more
Retail Sales Consultant - *Apple* Valley -...
Retail Sales Consultant - Apple Valley - $500 Hiring Bonus Apply Now...12-30-2019 Address : 7875 150th St W Location : Apple Valley, MN US Req # : 272753BR Job Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.