TweetFollow Us on Twitter

Pic to Clip
Volume Number:1
Issue Number:11
Column Tag:Pascal Procedures

The Amazing Pic to Clip Utility

By Alan Wootton, President, Top-Notch Productions, MacTutor ContributingEditor

Miscellaneous Month

This month there will not be a main topic, instead I have a collection of goodies that I have been saving up. We will talk a little about some books, about the compiler search I am conducting, revisit printing, and cover two more short topics.

Before I begin, I would like to talk a little philosophy. I wish to bare my soul on what Pascal means to me. There has been some talk about "fluff" in this publication, and this makes me wonder about Pascal. Is Pascal a Real Programmers language? Or is Pascal for Quiche Eaters (see Feirstein, B., "Real Men don't Eat Quiche", New York, Pocket Books, 1982.)? It was once thought that Real Programmers used Fortran. Today it would be C (and always assembly). In that perspective Pascal is indeed for Quiche Eaters, and there are undoubtedly millions of Quiche Eating Pascal programmers. Let us not forget however, that the ROM was originally in Pascal, MacPaint still is. These are not programs created by Quiche Eaters. It was a Real Programmer who, in a fit of rebellion, created LinlineF and Generic. It was a Real Programmer who mangled Niklaus Wirth's (the world renown Quiche Eater who created Pascal) specification by allowing for the beautiful expression ptr:=pointer(ord(ptr)+$100). There is hope for Pascal.

Let us review what a high level language is for. In the dawn of time there were only front panels with switches. Later, the Assembler was invented; the idea being to cater to the laziness of Real Programmers. This was acceptable because every conceivable possibility was still available. After that someone noticed that much of a programmers work was making sure that parameters were passed correctly between procedures, and that the stack was not messed up. The high level language was invented to ease the drudgery of these tasks. Now those who used Fortran ,the first HLL, weren't trying to get away from assembler so much as they were being lazy (one of the higher instincts of Real Programmers). And for those things not allowed in the HLL, assembly code could be linked in. All went well, except for the increasing numbers of Quiche Eaters who jumped straight into Fortran, bypassing knowledge of assembly language. Here is where the trouble begins.

By this time programming had become Real Big Business and certain managerial types were troubled over the fact that their Quiche Eating programmers couldn't decipher the strange things the Real Programmers were now doing in Fortran (list processing, records, pointers, string manipulation, etc.). The word was passed around that Fortran must be upgraded to allow for these strange new constructs. Along comes Wirth to save the day, and the Quiche Eaters gain new momentum. What we had now was a deluge of programmers, working in a toy operating system, who had little or no knowledge of how a computer really works. Real Programmers were in danger of becoming extinct. But, let us not forget that the true purpose of a HLL is as a shortcut to machine code for lazy Real Programmers. Eventually, as Pascal became popular extension were made to the language so that Real Programmers could use it. Still, Pascal was increasingly distant from the workings of the maching it ran on (Basic and microcomputers fuel this trend). This accounts for the popularity of Forth, a language that wallows in the chacteristics of its processor and is infinitly extendable and unreadable (perfect for a Real Programmer).

The 68000 changes all this. The 68000 is designed with an instruction set that provides for the efficient implementation of most HLL statements. On the Mac you can trace machine code and see it follow, line by line, the structure of a Pascal program (I do this all the time). At last the Real Programmers have a language that raises laziness to a high art. And MacPascal is at the top of the heap. One jots down the code he (she) wants, and it is immediately checked for syntax, semantic form, and is even emulated to check for logical errors. It can then be automatically and effortlessly converted into machine code. Or can it?

The Real Programmers at Apple are a snotty bunch (supposedly the worst were canned, but I don't believe it). They think that all the Real Programmers in the world work for Apple, or Microsoft, or IBM (blue suits), or NASA (rocket jocks), or the National Security Agency (spooks), and that there is no need to provide a compiler for the Quiche Eating public. You see they all have compilers on their Lisas (so do I, but I hate it). Therefore, Mr. Jobs allowed Apple to shoot itself in the foot and there is still no compiler. Now I will admit that MacPascal is perfect for the Real-Programmer-growing-up and for the Quiche Eaters too. But, the Real Programmers cannot exist for long on MacPascal and UCSD Pascal. They need a native code compiler or they will all switch to the excellent C systems available for the IBM PC (interpreter, preprocessor, compiler, optimiser, runtime profiler, assembler, libraries, source code debuggers, all integrated into one system). It would be a shame if the Mac died for lack of Real Programmers.

For me this is the real purpose of Pascal; a lazy way to write machine code. Like a spelling checker or a business letter generator, Pascal is a way to save time, not an excuse to not learn to spell or write. One can use MacPascal to diddle with the system, knowing full well that his efforts can be smoothly integrated into the natural Mac way of programming. This arguement should explain why an interpreted language, or a psuedo code system won't do. Not to mention the fact that without native code you can never make desk accessories, window definition functions, control definition functions, INIT resources, etc. More importantly, if you compile your procedures into resources (the standard method), you can call them from inside MacPascal. For an example of this see my article on printing (August Vol.1 No.9) where the PDEF resources are called in just this manner. This way when your MacPascal program gets too long you just compile parts of it until it is more managable. If it weren't for MacPascal I would switch to C in a second.

The Great Compiler Hunt

First of all, Apple intends to port the excellent Lisa compiler over to the Mac (without the dumb OS it now uses). The problem is that they don't have the good sense to just do it; they are going to re-write the whole MDS system. I was told it would not see pre-release until December. My personal prediction is that we will all grow old first and then we will have to buy the new Mac and the new hard disk, to the tune of about $5000.

[Note: MacTutor is pushing for a ".REL" file standard that would allow linking of object code files from a variety of programming languages. We are on record as supporting the MDS ".REL" file format as that standard with proposed extensions submitted by Bill Duvall's new linker, which is compatible with the MDS system as well as his own C system. MacFortran from Microsoft is also very close to being compatable with this standard, and hence Bill's new linker. We encourage Apple and other proposed compilers to support the MDS ".REL" file format for object code files so that all languages can be linked with one common linker. We hope that Apple in developing the Lisa compiler for Pascal on the Mac will consider conforming to this standard. What we don't need is for Apple (and others) to give us yet another incompatible object code file format (ie, don't dump the MDS system Apple!) More on this in upcomming issues. -Ed.]

Tom Leonard of TML systems, Melbourne, FL. (a Real Programmer for sure) is writing a Pascal compiler to go with the MDS system (by Bill Duvall, another Real Programmer). It was going to be in beta test by the writing of this article but didn't make it. Next month look for a Desk Accessory in this column. It will be emulated in MacPascal and compiled in TML Pascal. If this comes true we can do great things. He plans to sell it for $49.95 Stay tuned..

I have a beta copy of Rascal by MetaResearch of Portland OR.. This is a very interesting package. They wrote it to do real time I/O and it is great for that. It runs under an application that integrates editor, compiler, linker and runtime package. What you do is write procedures named _Init, _Main, _Mouse, _Key, _Update, _Event, _Menu, _ and _Halt, and the system calls the correct procedure as needed. The code (native 68000 code) is put into the data fork of the object file with a jump table leading to the procedures. Provisions are made to create stand alone applications (with a 19K overhead). If you wrote an application to break the data fork out into resources you could make anything you wanted. The bad news is that it is not quite Pascal. There are no declared types, and other less important parts are not implemented. The upgrade promises to correct some of these, but I haven't seen it (even though they said it would be ready long ago). The other problem is that it is copy protected (although Steve Jasic's NOSY method of getting things onto hard disks works well). You can buy it now for $99.

I heard rumors that Borland, of Turbo Pascal (for the PC) fame, was doing a compiler for the Mac. Where it is, I don't know. The other bad part is that it seems Turbo Pascal is not native 8086 code. I would not count on them producing native 68000 code either. Many of the Amiga announcements promised Pascal from Borland, so we shall soon see.

UCSD has had a Mac compiler for some time. It makes P-code so I don't know how you are supposed to debug it. You can make stand alone applications. But, you can never call procedures in resources from MacPascal with this system. If it weren't so un-Mac-like in style this would be the premier Quiche Eaters system.


I have three interesting new books. Two on MacPascal, one on programming the Mac. The MacPascal books are The MacPascal Book, by Paul Goodman and Alan Zeldin, Brady Communications company, and Macintosh Pascal, by Lowell A. Carmony and Robert L. Holliday, Computer Science Press. Both are mostly about learning Pascal with MacPascal. Both are also filled with excellent examples, something that the MacPascal docs are short on. If you are a Real-Programmer-in-Training you should get one of these and do some of the examples. It is hard for me to do a good review for two reasons: 1- I already know Pascal; 2- I am familiar with the MacPascal system. The true test is whether a beginning Pascal person can get up to speed using only one of these books. I was told by a computer store person that these books would get yanked from circulation because with one of these books and a pirate copy of MacPascal you have no reason to buy the real thing (Apple doesn't like that). If this is true then they are good books indeed (although you should still buy the product, the MacPascal creators deserve the money). See for yourself. If anyone has any experiences, write a review for MacTutor. I'm sure Dave Smith (our illustrious publisher) would be interested. The main differences between them are that The MacPascal book is typeset while Macintosh Pascal is in Geneva 12. The MacPascal Book also has appendices covering useful things including answers to excercises, syntax diagrams, Quickdraw and SANE.

I also have a copy of Macintosh revealed by Stephen Chernicoff, Apple Press, Hayden book company. This is the first true alternative to Inside Macintosh. I'm sure much will be said about this book in these pages. The true test, again, is whether one can learn about the Mac using this book and without Inside Mac. I would guess that it passes. Even if you already have Inside Mac there are interesting things here. Like the formats of all finder related resources for instance. Chernicoff is from Apple so the book is very accurate. I was shocked, though, to see that he forgot the register information for PACK 7, which in his book implies that it is strictly stack based. He says the information is for all languages although the examples are for Lisa Pascal (when is Apple going to finally give up on Lisa Pascal?).

Enough fluff! I have some programs to present.

Printing Revisited

After I wrote the article on printing in August I realised people might just want to make a printout of a large graphic using MacPascal without having to deal with the details of the Printing Manager. The way to do this is to run Pict_to_clip (below), quit MacPascal, start MacDraw, paste, and print.

What Pict_to_clip does is save the quickdraw calls that you make in the form of a 'picture'. Pictures are covered in the MacPascal Appendix on quickdraw so I won't go too deep. All you have to do is OpenPicture, then make some quickdraw calls and then ClosePicture. You may then DrawPicture, if you wish, and when you are done you KillPicture to free the memory used by the handle. Once you have a handle to your picture, you want the program to copy it onto the clipboard. After it is on the clipboard you can paste it in the scrapbook or just go directly to MacDraw and manipulate and print it all you want.

Clipboard is the name of the file that the scrap is saved in on USA Macs. On other Macs it has different names. So what we are really dealing with here is the Scrap Manager. The Scrap Manager has it's own chapter in Inside Mac, so we should all refer there now (even though we'll only use two functions). First we ZeroScrap; very simple. Then we PutScrap using a pointer to the picture, it's length and a longint that is the four ascii chars 'PICT'.

DrawSomething is the procedure that makes the quickdraw calls. The first example is a recursive routine that draws the fractal above. The second draws a sin(x)/x function. If you need to know more about recursion and fractals get one of the books above, both cover the subject. The sin(x)/x function is an excercise for the reader (note that the program draws the picture upside down, why?). The limitations Drawsomething must observe are that if the PICT gets greater than 32K the Mac locks up. Furthermore, if you paste a 30K picture into MacDraw it gets very slow (2 minutes to update the screen). I have made more intricate drawings by using the LaserWriter with the program from August (I must have done something right 'cause it worked). This won't work with the ImageWriter because there is a 32K/page limit on spool files. More after this short program.

Program to put a picture onto the clipboard. DrawSomething procedure could be anything. This example draws the fractal shown above.

program Pict_to_clip;
     sane, Quickdraw2;

 procedure DrawSomething;
      stopsize = 4;

  procedure SquareTo (xxx : integer);
       pt : point;
       r : rect;
   if xxx > stopSize then
        xxx := xxx div 2;
        moveto(pt.h + xxx, pt.v);
        SquareTo(xxx);{ upper right sub square }
        moveto(pt.h, pt.v + xxx);
        SquareTo(xxx);{ lower left sub square }
        moveto(pt.h, pt.v);
        SquareTo(xxx);{ upper left sub square }
        setrect(R, pt.h, pt.v, pt.h + xxx, pt.v + xxx);

 begin { of DrawSomething }
     moveto(-256, -256);

 procedure main;
       bigR, normR : rect;
       PicH : PicHandle;
       length, theType, lll : longint;
     setrect(bigR, -1000, -1000, 1000, 1000);
     setrect(normR, 0, 0, 250, 250);

     picH := OpenPicture(bigR);{ 2000 by 2000 plotting area }
     DrawPicture(PicH, normR);{ compress 2000^2 into 250^2 }

     lll := LinlineF($A9FC);{ _ZeroScrap }
     theType := $50494354;{ 'PICT' }
     length := GetHandleSize(PicH);
     writeln('length is', length);
     lll := LinlineF($A9FE, length, theType, picH^);
     { _PutScrap}
     KillPicture(PicH);{ also disposes of handle }


DrawSomething procedure to produce second drawing shown above. Use this code in Pict_to_clip.

 function form (x, y : integer) : integer;
       d : extended;
       y2, x2 : integer;
     x2 := x - 257;
     y2 := y - 257;                                  { 257, 257 is center 
peak }
     d := sqrt((x2 * x2) + (y2 * y2));   { d is distance from center}
     d := sin(d / 15) * 2000 / d;
     form := num2integer(d) + (y div 2) + 50;

 procedure DrawSomething;
       yst = 8;
       xst = 4;
       hi : boolean;
       V, x, y : integer;
       arr : array[0..2000] of integer;
     y := 0;
     while y < 512 do
              x := xst;
              hi := true;{ above last line }
              moveto(0, form(0, y));
              while x < 512 do
                       V := form(x, y);  { calculate function }
                       if V < arr[x] then
                             begin { if new value under previous line 
                                  moveto(x, V);
                                  hi := false;
                              begin { new value above previous line }
                                  if hi then { were above before, no 
change }
                                       lineto(x, V)
                                  else { changing from under to above 
                                       moveto(x, V);
                                  hi := true;
                                  arr[x] := V;
                       x := x + xst;
           y := y + yst;

Random problems

Ed Groth of Scottsdale, Az. brought to my attention a bug in MacPascal. It seems that Quickdraw and SANE both have a random function with the same name! The SANE Random is therefore unavailable. The fix is to wade through the SANE chapter in Inside Mac until you discover that all of SANE is in packages 4 and 5, and that you can call the functions directly. Use the following incantation.

   { _elems68K, $20 is Random }

This performs the function x:=random(x); Use any extended type number instead of x in your program.


I liked Rick Flott's discovery of how to draw arrow heads (Toolbox tips MacTutor Vol.1, No.9) so much that I had to do it myself. For those who can't decipher C, I present my version below. For a complete description of how it works refer to the August issue. To make the drawing above I used Pict_to_clip to make a 200 by 200 picture that I pasted directly into MacWrite. Note that it looks much better here than it does on the screen because of the LaserWriter. If it were a MacPaint cutout instead of a PICT it would look the same as it does on the screen.

Procedure to draw arrow heads. Use this in any program just as you would Lineto. Note: no example of it's usage is included here.

{ ArrowLineto works just like Lineto except }
{ an arrow head is drawn at the point H,V. }
{ The size and width of the arrow head are }
{ determined by the constants. }
 procedure ArrowLineto (H, V : integer);
       Asize = 20;{ angular size of head }
       Ah = 10;{ always half of head angle }
       aL = 16;{ length of head }
       startpt : point;
       R : rect;
       Ang : integer;
     setrect(R, H - aL, V - aL, H + aL, V + aL);
     PtToAngle(R, startpt, Ang);
      lineto(h, v);
     paintarc(R, Ang - Ah, Asize);

Out of Memory?

If you are getting the message "not enough memory to continue execution, hiding the program window may help", when you know full well there is plenty of memory, it is because a nonrelocatable block has been allocated on the heap after execution began. Opening windows or dialog boxes is the most common source of this problem. If your final code is to be a desk accessory you will have this same problem with Microsoft products. The solution is to call NewPtr(small amount), open your windows, and then call DisposePtr. This will leave a little space under your window for MacPascal (or Microsoft Chart) to use when it calls the poison function SetPtrSize. If you are an advanced enough user to get this problem then you are advanced enough to know what I mean.

I think this covers it for this month, so, see ya next time. And if you have problems or questions or suggestions then write me care of MacTutor!


Community Search:
MacTech Search:

Software Updates via MacUpdate

Path Finder 7.2 - Powerful, award-winnin...
Become a master of file management with Path Finder. Take full control over your file system. Save your time: compare and synchronize folders, view hidden files, use Dual Pane and full keyboard... Read more
Sid Meier's Civilization: Beyond Ea...
Sid Meier's Civilization: Beyond Earth is a new science-fiction-themed entry into the award-winning Civilization series. Set in the future, global events have destabilized the world leading to a... Read more
ForkLift 2.6.6 - Powerful file manager:...
ForkLift is a powerful file manager and ferociously fast FTP client clothed in a clean and versatile UI that offers the combination of absolute simplicity and raw power expected from a well-executed... Read more
Microsoft Remote Desktop 8.0.21 - Connec...
With Microsoft Remote Desktop, you can connect to a remote PC and your work resources from almost anywhere. Experience the power of Windows with RemoteFX in a Remote Desktop client designed to help... Read more
OnyX 3.1.0 - Maintenance and optimizatio...
OnyX is a multifunctional utility for OS X. It allows you to verify the startup disk and the structure of its System files, to run miscellaneous tasks of system maintenance, to configure the hidden... Read more
Spotify - Stream music, crea...
Spotify is a streaming music service that gives you on-demand access to millions of songs. Whether you like driving rock, silky R&B, or grandiose classical music, Spotify's massive catalogue puts... Read more
ExpanDrive - Access cloud storag...
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
Markly 1.5.3 - Create measurement and de...
Markly is a measurement and design-spec plugin/extension for Photoshop and Sketch. It is made for modern Web designers and app front-end developers. You can add specification marks simply by clicking... Read more
Suitcase Fusion 6 17.3.0 - Font manageme...
Suitcase Fusion 6 is the creative professional's font manager. Every professional font manager should deliver the basics: spectacular previews, powerful search tools, and efficient font organization... Read more
Nisus Writer Pro 2.1.2 - Multilingual wo...
Nisus Writer Pro is a powerful multilingual word processor, similar to its entry level products, but brings new features such as table of contents, indexing, bookmarks, widow and orphan control,... Read more

Balls & Holes - Tips and tricks to h...
Balls & Holes is a gorgeous new endless runner that challenges you to make it as far up a mountain as possible before inevitably being sliced into a load of gooey bits. Making this task more difficult are both the wide variety of balls that... | Read more »
Balloony Land offers a fresh twist on th...
Balloony Land by Palringo offers a fresh twist on the match three genre and is out now on iOS and Android. First-off, you'll be popping balloons instead of crushing candy and the balloons will float up and fill the empty spaces instead of dropping... | Read more »
Graphic - vector illustration and design...
Graphic - vector illustration and design 1.0 Device: iOS iPhone Category: Productivity Price: $2.99, Version: 1.0 (iTunes) Description: Autodesk Graphic is a powerful full-featured vector drawing and illustration application right in... | Read more »
Sago Mini Babies (Education)
Sago Mini Babies 1.0 Device: iOS Universal Category: Education Price: $2.99, Version: 1.0 (iTunes) Description: Introducing the Sago Mini babies. Boys and girls love caring for these adorable characters. Feed Robin her favorite mush... | Read more »
PAUSE - Relaxation at your fingertip (H...
PAUSE - Relaxation at your fingertip 1.1 Device: iOS iPhone Category: Healthcare & Fitness Price: $1.99, Version: 1.1 (iTunes) Description: | 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 »
Dub Dash (Games)
Dub Dash 1.0 Device: iOS Universal Category: Games Price: $1.99, Version: 1.0 (iTunes) Description: ARE YOU READY FOR THE ULTIMATE CHALLENGE? UNIQUE SYMBIOSIS OF MUSIC AND GRAPHICS | Read more »
Leave Me Alone (Games)
Leave Me Alone 1.0 Device: iOS Universal Category: Games Price: $1.99, Version: 1.0 (iTunes) Description: 33% off launch sale!!! Somewhere between the 1980s and 1990s there exists a world that never was. A world of skatepunks,... | 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 »

Price Scanner via

Apple Products Four Of 2015′s Top Ten Most Wa..., Future’s global technology brand and the UK’s biggest technology website, has unveiled results from extensive research that show • The Smart Home is what excites the public most about... Read more
13-inch 2.7GHz/128GB Retina MacBook Pro on sa...
Best Buy has the 13″ 2.7GHz/128GB Retina MacBook Pro on sale for $1174.99 for a limited time. Choose free shipping or free local store pickup (if available). Sale price for online orders only, in-... Read more
App Tamer 2.1 Makes El Capitan Cooler, Quiete...
St. Clair Software has announced the availability of a free update to its App Tamer utility for Mac OS X. App Tamer 2.1 delivers compatibility with Yosemite and improves its support for a number of... Read more
15-inch Retina MacBook Pros on sale for up to...
B&H Photo has 2015 15″ Retina MacBook Pros on sale for up to $160 off MSRP including free shipping plus NY sales tax only: - 15″ 2.2GHz Retina MacBook Pro: $1849.99 $150 off - 15″ 2.5GHz Retina... Read more
12-inch Retina MacBooks on sale for $100 off...
Best Buy has 12″ Retina MacBooks available for $100 off MSRP on their online store. Choose free shipping or free local store pickup (if available). Discounted prices available for online orders only... Read more
MacBook Airs on sale for up to $100 off MSRP
Save up to $100 on the purchase of a new 2015 13″ or 11″ 1.6GHz MacBook Air at the following resellers. Shipping is free with each model: 11" 128GB MSRP $899 11" 256GB... Read more
Save 15% with Apple refurbished Mac Pros
The Apple Store has Apple Certified Refurbished Mac Pros available for up to $600 off the cost of new models. An Apple one-year warranty is included with each Mac Pro, and shipping is free. The... Read more
Apple restocks refurbished Mac minis for up t...
Apple has restocked Certified Refurbished 2014 Mac minis, with models available starting at $419. Apple’s one-year warranty is included with each mini, and shipping is free: - 1.4GHz Mac mini: $419 $... Read more
TP-LINK Next-Gen Routers Support a Large Numb...
TP-LINK, specialists in consumer and business networking products, have announced the availability of Archer C2600, the company’s next-generation router featuring wireless AC, multi-user MIMO, and 4-... Read more
Apple refurbished 2014 MacBook Airs available...
Apple has Certified Refurbished 2014 MacBook Airs available starting at $679. An Apple one-year warranty is included with each MacBook, and shipping is free: - 11″ 1.4GHz/128GB MacBook Air: $679... Read more

Jobs Board

Project Manager: *Apple* Pay - Apple (Unite...
…The iOS Systems team is looking for a project manager who will manage Apple Pay server side integration project resources in a matrix organization, track tasks, prepare Read more
*Apple* Retail - Multiple Positions (US) - A...
Job Description:SalesSpecialist - Retail Customer Service and SalesTransform Apple Store visitors into loyal Apple customers. When customers enter the store, you're Read more
Validation Engineering Manager - *Apple* Wa...
…hardware and software development to lead the validation of the next generation Apple Watch and related products. The Validation Team works closely with many Read more
Senior Payments Architect - *Apple* Pay - A...
**Job Summary** Apple , Inc. is looking for a highly motivated, innovative and hands-on senior payments architect to join the Apple Pay Engineering team. You will Read more
*Apple* Retail for Business Support Supervis...
…is looking for a motivated, outgoing, and creative individual who wants to offer Apple Business Customers an unparalleled customer experience. The Apple Retail for Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.