TweetFollow Us on Twitter

Disk Files
Volume Number:3
Issue Number:10
Column Tag:Basic School

Reading & Writing Disk Files

By Dave Kelly, MacTutor Editorial Board, Ontario, CA

READING & WRITING “Z” FAST WAY

Reading and writing data is often taken for granted. Yet we read and write data every time we turn on our computers. Fundamental to the Macintosh is the handling of graphics, sometimes in MacPaint format, and sometimes in DRAW or PICT format. Zedcor has some interesting commands that will speed up your data handling no matter which format you are using.

Fig. 1 Paint scroller program scrolls PICT images

The commands I am referring to are WRITE FILE (E-159) and READ FILE (E-126). I have used the examples in the manual as a base to set up my demo programs. Before I discuss this more, let’s review the syntax:

READ FILE [#] filenumber%, desinationAddress&, NumberofBytes&

and

WRITE FILE [#] filenumber%, desinationAddress&, NumberofBytes&

The key is to set up variables that you want to read or write, find the pointer to the variable (destinationAddress& ) and read or write the desired NumberofBytes&. Easy, right? I can just imagine some of the possibilities. How about a communications program? Or a file transfer program? Or how about writing your own minifinder?

The WRITE FILE example in the ZBasic manual demonstrates a way that variables may be temporarily stored (quickly) to disk, run another application, then return to this program and read the variables back via READ FILE. This could always be done before (with other Basic commands), but not as fast. I’ve taken the WRITE FILE example and modified slightly to create a Mini Finder type program. Those of you who have been around the Macintosh for a while will remember the old days when the minifinder option was not a part of the Finder. Several minifinder type programs popped up. By replacing the regular finder with a smaller finder, space on the disk can be preserved. That was really all you could do when disks were limited to 400K. Now with 800K disks and hard disks, the need is not as great. Still, with all the things being added to the system file, if you don’t have a hard disk your system disk is probably pretty full. My system file on my hard disk is over 1M byte (with all the fonts loaded of course).

HOW IT WORKS

First you must realize that this program will not work properly unless you compile it into a “full-blown” application. Since the program will launch another application it will be impossible to return to ZBasic and load you basic source code to run it again. So just compile as an application first. Also, this application must be located in the “blessed” folder (i.e. the system folder). The reason for this is that this application will temporarily take the place of the Finder (which also must remain in the system folder). In a sense, our ZBasic application becomes a system application.

The program makes use of two global variables (available to all Macintosh applications) namely, CurApName ($910) and FinderName ($2F0). The variable FinderName contains the name of the Finder application (usually “Finder”). CurApName contains the name of your application program. An application has no way to know if a user has changed its name. If the application needs to no its own name, it may refer to CurApName. The trick that this application uses is to temporarily change the name of the Finder application to the current application name. The CurApName and FinderName variables are stored in Pascal format with length first with the string following. Be careful to observe the proper length of the strings. CurApName is type Str31 which means it is a string with length (max) of 32. FinderName can only be 16 characters long because it is of type Str15. (A partial list of global variables is found on page E-198 in the ZBasic manual).

Dummy first and last variables are set up to determine the block of variables that you want to read. The variables will be read or write from that block of memory which is marked by the first and last variables. It is important to realize that ZBasic determines which variable is last during the compile process not during run time. This is the reason for the subroutine “Get Last Variable Pointer” at the end of the program. Notice that the last variable is defined at the very end of the program. If you only have a few variables to store you may want to position the first and last to include only those variables. Just remember that space should be reserved for reading variables back. Just for fun the program records the timer count as one of the variables to be stored. When the program is re-run after launching another application, it will check the timer again and display the elapsed time.

An important additional comment is that you should remember to tell the user what you have in mind when every you display a GetFile dialog box. IF your program displays a dialog box to load/save a file or as in this case to launch an application, be sure the the user knows why the dialog is displayed. If the dialog was displayed as the result of a menu that was selected then the purpose is self explanatory. Occasionally, I’ve seen programs that start up by displaying a GetFile dialog, without specifying that the application is looking for a paint type file (for example). Well, I don’t keep my paint files in the same folder as the applications so I wouldn’t know which type of file was being requested. My suggested solution is to display another dialog above or below the GetFile dialog which explains what kind of info is being requested. This is one way to make the program much more user usable.

The ZBasic Quick “ZFinder” demo may spark some more ideas to help your next programming project. The listing is included at the end of this column.

MORE FILE READING

The next program was derived from the READ FILE demo on page E-126 of the ZBasic manual. Actually the only part of the demo that is used here is the method of reading a paint file. For more information on reading paint files I refer you to my column in September 1985 (gee, that was 2 years ago). Using READ FILE we read 720 lines with 72 bytes per line. The BLOCKMOVE statement is used to move the paint picture into a reserved space in memory. Some of the variables used in the 1st example on page E-126 are:

X%(1),71 -> represents a single line (72 chars) of the paint picture.
X$(719) ->  720 lines of the paint picture.
FL& ->  File length (does not include pattern header).

The toolbox routine UNPACKBITS is used to decompress the paint file a line at a time. The BLOCKMOVE statement moves the unpacked picture for safe keeping until the entire file is unpacked. Be sure that this routine is not used between Event ON statements and Event OFF as it will slow down a lot. That is because the Event statements cause the compiler to put GETNEXTEVENT calls at the beginning of each basic line. This routine works about 10 times faster without GETNEXTEVENT traps.

The are a few side effects of the Event loop which should be explained. For some reason the PUT statement didn’t work properly outside of the event loop. Originally, I had put the initial PUT statement in the subroutine that reads the paint file. This caused the picture to be erase by some refreshing of the output window. But when placed in the loop, the refreshing recognized that there was a change. I can’t explain why this happened. Perhaps, Andy or Michael Gariepy of Zedcor could explain this one sometime.

Credit for the cursors and scrolling go to Lee Bass of West Covina, CA. (Thanks Lee). Lee’s original program had no menu and no event loop. Really, the event loop should be short as possible (this one is kind of long), but since Lee implemented the mouse functions without an event loop that’s how it stayed. I would prefer that ON MOUSE be used to detect any mouse movements and remove all the appropriate statements from the event loop. If you are just learning you may want to try modifying the program by implementing ON MOUSE GOSUB type structure to the program. Lee’s cursors were created with ResEdit and converted to RMaker files to make it easier for you to type in these programs if you are so inclined. The window was divided in to thirds horizontally and thirds vertically to give 9 sections for the nine different cursors. During the main event loop the mouse is read to determine its position and the cursor is modified according to which of the window sections the coordinates fall. Pretty simple but maybe you have a better way. If you have any suggestions feel free to send them in.

This program requires that you use RMaker to create the cursor resources. Since the current version of RMaker doesn’t work well with HFS you should move the compiled application and RMaker out on to the desktop and run it from there. The RMaker source file can be in any folder. RMaker appends the cursor resources to the application file only if you have named the application the same as the name in the first line of the RMaker source file. If you can’t find RMaker (distributed with ZBasic) or don’t like it (or just plain don’t understand it) you may want to create your cursors with ResEdit. The cursor resource ID numbers are :

257-> up arrow
258-> down arrow
259-> left arrow
260-> right arrow
261-> top/left arrow
262-> top/right arrow
263-> bottom/right arrow
264-> bottom/left arrow
265-> center

To use ResEdit, create a new CURS resource for each ID number and either draw the cursor with its mask for each of the ID numbers above or use the RMaker listing to type data directly into the resource. Open the CURS resource as a general type and type the hex code directly into the window. You can check your work by opening the resource again as a cursor type and editing as needed. This is a good way to make your own custom cursors too. I recommend using resources whenever possible with your compiled applications because it makes it much easier to modify things later if you have to change anything. The cursor editor in ResEdit will do what you need.

Well, the column section is short this month, but you’ve got two programs to play with. Would you like to see a column about a particular subject? Just ask! Now that ZBasic is going strong there is such a large amount of material to discuss that it is difficult to know where to begin. Your preferences are welcome.

Other related MacTutor columns: “Random Access Files” Sept. 1986; “Reading Paint Files”, Sept. 1985; “On Fonts & Cursors”, Oct. 1986; “Reading MacPaint Files”, May 1987; “Scrolling in ZBasic”, April 1987. Some of these and others are also available in “Best of MacTutor, Vol. 1” book and “The Complete MacTutor, Vol. 2” book.

An unrelated note: Among the numerous bugs in the MS Compiler which have come upon us here is another interesting one:

CLS:N=1:WHILE N<>0
INPUT;”Enter a number to print   : “,N
PRINT”   “;N
WEND:END

This program gives a system BOMB when the binary version is used. With the decimal version everything works fine. The output is:

Enter a number to print    :1E-3 1.000099E-03
Enter a number to print    :1E-4 .0001001
Enter a number to print    :1E-5 .0000101
Enter a number to print    :1E-6 .0000011
Enter a number to print    :1E-7 .0000001
Enter a number to print    :1E-8 BOMB!!!!

There has been no new response from Microsoft regarding the compiler. I still highly recommend ZBasic 4.0. Microsoft, are you listening??

REM ZBasic Quick Finder
REM ©MacTutor and Zedcor, 1987
REM Adapted from E-159 of ZBasic Manual
REM By Dave Kelly

REM This program allows you to Execute other applications
REM and return with all variables as they were
REM THIS APPLICATION MUST BE IN SYSTEM FOLDER 
REM TO WORK WITH HFS
REM NOTE: ALL VARIABLES ARE RESTORED UPON RETURN
REM TO THIS PROGRAM

WINDOW OFF
WINDOW#1,””,(100,30)-(400,90),2
CurApName&=&910
FinderName&=&2E0
I=0
FirstVariable%=0
GOSUB “Get Last Variable pointer”

REM Check to see if returning from another application
OPEN”R”,1,”ZVARS”
 REM  If returning from an application
LONG IF LOF(1,1)>10
 REM  reload all the variables
 READ FILE #1,VARPTR(FirstVariable%), LastVariable&-VARPTR(FirstVariable%)
 TEXT 2,12,1
 PRINT”Last Application: “;:PRINT Application$
 PRINT”Elapsed Time: “;TIMER-StartTime&;” Seconds”
XELSE
 TEXT 2,12,1
 PRINT SPC(5);”Welcome to Macintosh.”
 SysLength=PEEK(FinderName&)
 SystemFinder$=””
 FOR I=1 TO SysLength
 SystemFinder$=SystemFinder$+ CHR$(PEEK(FinderName&+I))
 NEXT
 REM SystemFinder$ is the name of the original Startup appl.
END IF
PRINT”Please select an application to run.”
StartTime&=TIMER

REM Moves This Applications filename to 
REM FinderName global variable
FOR I=0 TO 15: REM filename MUST be less than 16
 POKE FinderName&+I,PEEK(CurApName&+I)
NEXT
REM *** Get name of application to execute
Application$=FILES$(1,”APPL”,,Volume%)
REM APPL=any executable file
REM Last variable used as dummy for READ and WRITE
LONG IF Application$=””
 CLOSE #1
 KILL “ZVARS”
 REM Restore Finder filename as desktop start-up
 POKE FinderName&,SysLength
 FOR I=1 TO LEN(SystemFinder$)+1
 POKE FinderName&+I, PEEK(VARPTR(SystemFinder$)+I)
 NEXT
XELSE
 RECORD#1,0,0:REM Reset file pointer to file begin
 REM *** Save Variables before executing Application
 WRITE FILE #1,VARPTR(FirstVariable%), LastVariable&-VARPTR(FirstVariable%)
 CLOSE#1
 REM Execute Application now...
 RUN Application$,Volume%
END IF
END
“Get Last Variable pointer”
LastVariable&=VARPTR(LastVariable%)
RETURN



REM Paint Scroll Demo
REM ©Mactutor 1987
REM By Dave Kelly and Lee Bass
REM Thanks Lee!!
REM Adapted from E-126 of ZBasic manual

WINDOW OFF
COORDINATE WINDOW
DEF MOUSE=1
X&=MEM(-1)
DIM X%(1),71 X$(719):X%(0)=576:X%(1)=720
ScrollInc=20:’Increment for moving picture
WINDOW #1,””,(50,80)-(430,310),3
Wptr&=WINDOW(14)
GOSUB “OpenFile”

MENU 1,0,1,”File”
MENU 1,1,1,”Open /O”
MENU 1,2,1,”Quit/Q”
ON MENU GOSUB “MenuEvent”:MENU ON:MOUSE ON
“Main Program Loop”
DO
IF New=1 THEN PUT (-XChange,-YChange),X%(0), PSET:New=0
MouseEvent=MOUSE(0):Horizpos=MOUSE(1):Vertpos=MOUSE(2)
LONG IF Horizpos>0 AND Horizpos<380 AND Vertpos>0 AND Vertpos<230' in 
our window
 LONG IF Vertpos>153:REM bottom section
 IF Horizpos<127 THEN CursorNumber=264
 IF Horizpos>=127 AND Horizpos<=253 THEN                       CursorNumber=258
 IF Horizpos>253 THEN CursorNumber=263
 END IF
 LONG IF Vertpos>=77 AND Vertpos<=153
 REM middle section
 IF Horizpos<127 THEN CursorNumber=259
 IF Horizpos>=127 AND Horizpos<=253 THEN                       CursorNumber=265
 IF Horizpos>253 THEN CursorNumber=260
 END IF
 LONG IF Vertpos<77:REM top section
 IF Horizpos<127 THEN CursorNumber=261
 IF Horizpos>=127 AND Horizpos<=253 THEN                       CursorNumber=257
 IF Horizpos>253 THEN CursorNumber=262
 END IF
 LONG IF MouseEvent<0
REM cursor down change xx,yy to move picture
 IF CursorNumber=259 THEN XChange=XChange-ScrollInc
 IF CursorNumber=260 THEN XChange=XChange+ScrollInc
 IF CursorNumber=257 THEN YChange=YChange-ScrollInc
 IF CursorNumber=258 THEN YChange=YChange+ScrollInc
 IF CursorNumber=261 THEN XChange=XChange-                     ScrollInc:YChange=YChange-ScrollInc
 IF CursorNumber=262 THEN XChange=XChange+ScrollInc:YChange=YChange-ScrollInc
 IF CursorNumber=263 THEN XChange=XChange+ScrollInc:YChange=YChange+ScrollInc
 IF CursorNumber=264 THEN XChange=XChange-                     ScrollInc:YChange 
= YChange+ScrollInc
 IF YChange<0 THEN YChange=0
 IF XChange<0 THEN XChange=0
 IF YChange>720-230 THEN YChange=720-230
 IF XChange>576-380 THEN XChange=576-380
 PUT (-XChange,-YChange),X%(0),PSET
 END IF
 MyCursor=CursorNumber:
 CURSOR MyCursor
XELSE
 CURSOR 0:CursorNumber=0:REM Not in our window
END IF
UNTIL Finished=1
MENU OFF:MOUSE OFF
END

“MenuEvent”
Menunumber=MENU(0)
Menuitem=MENU(1)
IF Menuitem=1 THEN GOSUB “OpenFile”
IF Menuitem=2 THEN END
MENU
RETURN

“OpenFile”
CALL HIDEWINDOW(Wptr&)
WINDOW#2,””,(100,30)-(400,55),2
TEXT 2,12,1
LOCATE 0,0
CLS LINE
PRINT SPC(5);”Please Select a Paint File to View”;
“Load PaintPic”
F$=FILES$(1,”PNTG”,”PNTG”,V%)
IF F$=”” THEN CALL SHOWWINDOW(Wptr&):RETURN
LOCATE 0,0
CLS LINE
PRINT “Now Loading “;F$;
REM Read in the Paint File
OPEN”I”,1,F$,1,V% : S&=LOF(1):REM Set length of Paint File
A&=VARPTR(A$):Y&=VARPTR(X$(0)):X&=A&:N=256
FL&=S&-512:CURSOR 4:RECORD #1,512
FOR I = 1 TO 720:REM Lines in the Paint Picture
 LONG IF N>180
 BLOCKMOVE X&,A&,256-N:X&=A&
 IF N>FL& THEN NX=FL& ELSE NX=N
 READ FILE #1,A&+256-N,NX:FL&=FL&-NX
 END IF
 CALL UNPACKBITS(X&,Y&,72):N=X&-A&
NEXT
CLOSE #1
XChange=0:YChange=0:New=1
WINDOW CLOSE 2
CALL SHOWWINDOW(Wptr&)
WINDOW 1
RETURN

;RMaker File for Paint Scroll Program

!Paint Scroll

Type CURS=GNRL

     ,257
.H
0080 0140 0220 0410 0808 1004 2002 7E3F 0220 0220 0220 0220 0220 0220 
0220 03E0 0080 01C0 03E0 07F0 0FF8 1FFC 3FFE 7FFF 03E0 03E0 03E0 03E0 
03E0 03E0 03E0 03E0 0000 0008
 ,258
03E0 0220 0220 0220 0220 0220 0220 0220 7E3F 2002 1004 0808 0410 0220 
0140 0080 03E0 03E0 03E0 03E0 03E0 03E0 03E0 03E0 7FFF 3FFE 1FFC 0FF8 
07F0 03E0 01C0 0080 000F 0008
     ,259
0100 0300 0500 0900 1100 21FF 4001 8001 4001 21FF 1100 0900 0500 0300 
0100 0000 0100 0300 0700 0F00 1F00 3FFF 7FFF FFFF 7FFF 3FFF 1F00 0F00 
0700 0300 0100 0000 0007 0000
     ,260
0080 00C0 00A0 0090 0088 FF84 8002 8001 8002 FF84 0088 0090 00A0 00C0 
0080 0000 0080 00C0 00E0 00F0 00F8 FFFC FFFE FFFF FFFE FFFC 00F8 00F0 
00E0 00C0 0080 0000 0007 000F
     ,261
FFC0 8080 8100 8200 8100 8080 9040 A820 C410 8220 0140 0080 0000 0000 
0000 0000 FFC0 FF80 FF00 FE00 FF00 FF80 FFC0 EFE0 C7F0 83E0 01C0 0080 
0000 0000 0000 0000 0000 0000
     ,262
07FE 0202 0102 0082 0102 0202 0412 082A 1046 0882 0500 0200 0000 0000 
0000 0000 07FE 03FE 01FE 00FE 01FE 03FE 07FE 0FEE 1FC6 0F82 0700 0200 
0000 0000 0000 0000 0000 000E
     ,263
0000 0000 0000 0000 0200 0500 0882 1046 082A 0412 0202 0102 0082 0102 
0202 07FE 0000 0000 0000 0000 0200 0700 0F82 1FC6 0FEE 07FE 03FE 01FE 
00FE 01FE 03FE 07FE 000F 000F
     ,264
0000 0000 0000 0000 0080 0140 8220 C410 A820 9040 8080 8100 8200 8100 
8080 FFC0 0000 0000 0000 0000 0080 01C0 83E0 C7F0 EFE0 FFC0 FF80 FF00 
FE00 FF00 FF80 FFC0 000F 0000
     ,265
0000 0080 01C0 03E0 0080 0080 1004 3086 7DDF 3086 1004 0080 0080 03E0 
01C0 0080 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 
0000 0000 0000 0000 0008 0008
 
AAPL
$117.89
Apple Inc.
+1.42
MSFT
$47.85
Microsoft Corpora
-0.14
GOOG
$541.65
Google Inc.
+4.15

MacTech Search:
Community Search:

Software Updates via MacUpdate

ForeverSave 2.1.3 - 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
Voila 3.8.1 - Capture, annotate, organiz...
Voila is a screen-capture, recording, and annotation tool that is a full-featured replacement for Mac's screen-capture and screen-recording capabilities. It has a large and robust set of editing,... Read more
SyncTwoFolders 2.0.6 - Syncs two user-sp...
SyncTwoFolders simply synchronizes two folders. It supports synchronization across mounted network drives and it is a possibility to run a simulation showing in a log what will be done. Please visit... Read more
Duplicate Annihilator 5.1.1 - Find and d...
Duplicate Annihilator takes on the time-consuming task of comparing the images in your iPhoto library using effective algorithms to make sure that no duplicate escapes. Duplicate Annihilator detects... Read more
Cobook 3.0.7 - Intelligent address book....
Cobook Contacts is an intuitive, engaging address book. Solve the problem of contact management with Cobook Contacts and its simple interface and powerful syncing and integration possibilities.... Read more
StatsBar 1.9 - Monitor system processes...
StatsBar gives you a comprehensive and detailed analysis of the following areas of your Mac: CPU usage Memory usage Disk usage Network and bandwidth usage Battery power and health (MacBooks only)... Read more
Cyberduck 4.6 - FTP and SFTP browser. (F...
Cyberduck is a robust FTP/FTP-TLS/SFTP browser for the Mac whose lack of visual clutter and cleverly intuitive features make it easy to use. Support for external editors and system technologies such... Read more
Maya 2015 - Professional 3D modeling and...
Maya is an award-winning software and powerful, integrated 3D modeling, animation, visual effects, and rendering solution. Because Maya is based on an open architecture, all your work can be scripted... Read more
Evernote 6.0.1 - Create searchable notes...
Evernote allows you to easily capture information in any environment using whatever device or platform you find most convenient, and makes this information accessible and searchable at anytime, from... Read more
calibre 2.11 - Complete e-library manage...
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... Read more

Latest Forum Discussions

See All

Playdek has Annouced a Delicious Thanksg...
Playdek has Annouced a Delicious Thanksgiving Sale Posted by Jessica Fisher on November 24th, 2014 [ permalink ] Playdek, makers of | Read more »
Pair Solitaire Review
Pair Solitaire Review By Jennifer Allen on November 24th, 2014 Our Rating: :: ADDICTIVE. SO ADDICTIVEUniversal App - Designed for iPhone and iPad Welcome to your new ‘five more minutes, oh no, why is it dark outside’ addiction.   | Read more »
DryGin Studios Release a Free-to-Play Ve...
DryGin Studios Release a Free-to-Play Version of Bio Inc Posted by Ellis Spice on November 24th, 2014 [ permalink ] Universal App - Designed for iPhone and iPad | Read more »
The Hunted Review
The Hunted Review By Jordan Minor on November 24th, 2014 Our Rating: :: A GROAN IN THE DARKUniversal App - Designed for iPhone and iPad The Hunted’s multiplayer thrills are overshadowed by bland visuals and average gameplay.   | Read more »
Need for Speed No Limits has Been Unveil...
Need for Speed No Limits has Been Unveiled for iOS Posted by Ellis Spice on November 24th, 2014 [ permalink ] EA and Firemonkeys have announced Need for Speed No Limits, the next mobile installment | Read more »
Space Expedition Review
Space Expedition Review By Jordan Minor on November 24th, 2014 Our Rating: :: ONE SMALL STEPUniversal App - Designed for iPhone and iPad The only thing boring about Space Expedition’s lonely journey is its title.   | Read more »
Ubisoft Gives Everyone Two New Ways to E...
Ubisoft Gives Everyone Two New Ways to Earn In-Game Stuff for Far Cry 4 Posted by Jessica Fisher on November 21st, 2014 [ permalink ] | Read more »
Golfinity – Tips, Tricks, Strategies, an...
Dig this: Would you like to know what we thought of being an infinite golfer? Check out our Golfinity review! Golfinity offers unlimited ways to test your skills at golf. Here are a few ways to make sure your score doesn’t get too high and your... | Read more »
Dark Hearts, The Sequel to Haunting Meli...
Dark Hearts, The Sequel to Haunting Melissa, is Available Now Posted by Jessica Fisher on November 21st, 2014 [ permalink ] Universal App - Designed for iPhone and iPad | Read more »
Meowza! Toyze Brings Talking Tom to Life...
Meowza! | Read more »

Price Scanner via MacPrices.net

Jumptuit Launches One-Tap Windows 8.1 iTunes...
Jumptuit has launched Windows 8.1 support for One-Tap iTunes Sync. with which Windows 8.1 users can now easily sync their iTunes libraries with Microsoft OneDrive. Jumptuit provides easy access from... Read more
CEA Study Finds More People Recycling Electro...
A new study by the Consumer Electronics Association (CEA) finds that electronics recycling receives the continued and growing support of consumers. According to the CEA,s Recycling and Reuse Study,... Read more
15″ 2.2GHz Retina MacBook Pro on sale for $17...
 B&H Photo has the 2014 15″ 2.2GHz Retina MacBook Pro on sale today for $1749. Shipping is free, and B&H charges NY sales tax only. B&H will also include free copies of Parallels Desktop... Read more
27-inch 3.5GHz 5K iMac in stock today and on...
 B&H Photo has the new 27″ 3.5GHz 5K iMac in stock today and on sale for $2299 including free shipping plus NY sales tax only. Their price is $200 off MSRP, and it’s the lowest price available... Read more
21-inch 1.4GHz iMac on sale for $979, save $1...
B&H Photo has the new 21″ 1.4GHz iMac on sale for $979.99 including free shipping plus NY sales tax only. Their price is $120 off MSRP. B&H will also include free copies of Parallels Desktop... Read more
13-inch 1.4GHz/256GB MacBook Air on sale for...
B&H Photo has lowered their price on the 13″ 1.4GHz/256GB MacBook Air to $1059.99 including free shipping plus NY sales tax only. Their price is $140 off MSRP, and it’s the lowest price for this... Read more
Save up to $400 with Apple refurbished 2014 1...
The Apple Store has restocked Apple Certified Refurbished 2014 15″ Retina MacBook Pros for up to $400 off the cost of new models. An Apple one-year warranty is included with each model, and shipping... Read more
New 13-inch 1.4GHz MacBook Air on sale for $8...
 Adorama has the 2014 13″ 1.4GHz/128GB MacBook Air on sale for $899.99 including free shipping plus NY & NJ tax only. Their price is $100 off MSRP. B&H Photo has the 13″ 1.4GHz/128GB MacBook... Read more
Apple Expected to Reverse Nine-Month Tablet S...
Apple and Samsung combined accounted for 62 percent of the nearly 36 million branded tablets shipped in 3Q 2014, according to early vendor shipment share estimates from market intelligence firm ABI... Read more
Stratos: 30 Percent of US Smartphone Owners t...
Stratos, Inc., creator of the Bluetooth Connected Card Platform, has announced results from its 2014 Holiday Mobile Payments Survey. The consumer survey found that nearly one out of three (30 percent... Read more

Jobs Board

*Apple* Solutions Consultant (ASC) - Apple (...
**Job Summary** The ASC is an Apple employee who serves as an Apple brand ambassador and influencer in a Reseller's store. The ASC's role is to grow Apple Read more
*Apple* Solutions Consultant (ASC)- Retail S...
**Job Summary** The ASC is an Apple employee who serves as an Apple brand ambassador and influencer in a Reseller's store. The ASC's role is to grow Apple Read more
Project Manager, *Apple* Financial Services...
**Job Summary** Apple Financial Services (AFS) offers consumers, businesses and educational institutions ways to finance Apple purchases. We work with national and Read more
*Apple* Store Leader Program - College Gradu...
Job Description: Job Summary As an Apple Store Leader Program agent, you can continue your education as you major in the art of leadership at the Apple Store. You'll Read more
*Apple* Retail - Multiple Positions (US) - A...
Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, you're also the Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.