Tweet Follow Us on Twitter
New Toolbox
Volume Number: 6
Issue Number: 10
Column Tag: Assembly Lab

New Toolbox Routines

By Hugues A. Oliver, Perpignan, France

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

Introduction

[Hugues A. Oliver is a 23 year old student at Ecole Supérieure d’Ingénieur de Marseille. He started programming Macintosh computers in 1986 and now works on a Mac II.]

Every Macintosh programmer knows that the foundation of a Macintosh program is the event loop, and the main component of a Macintosh application is windows. When an event occurs, the Mac OS signals the application and sends the event’s type and some other information in a structure called EventRecord to your program. Then, the program takes whatever action is appropriate for the event’s type but, before, your program must find for which opened window the event is related to.

My idea was to add for each opened windows an associated procedure which I’ve called : Window Procedure. When an event occurs, the EventRecord is sent to the window procedure which responds by taking action for each type of event. A pointer to this procedure should be placed somewhere in the Window record (I will explain where below) .Once you’ve intercept the event record a special procedure should get our procedure pointer and call the window procedure. You must be aware that the address that will be stored in your window record must always be a pointer to an executable procedure. If the segment containing the procedure moves, you know what will happen...

In every application, the window is used to contain a document. A document can be a set of texts, lists (from the list manager) and graphics. Whenever you want to use in your window a text, picture or list, the common technique is to declare in your source code globals variables to keep track of the new added structure. To use the new “object” , you also need to rewrite some parts of your source code.

If you want to write an application which could open a unlimited number of windows with TEdit in it, for example, you can’t use this technique.

Some programmers use the WRefCon of the window to hold the TEHandle of the text displayed in the window, but there is only one WrefCon field in the window record...

A good way to use the WRefCon to hold as many variables as we want is to use linked list and a new data structure, which will contain linked lists of TEHandle,ListHandle or Picture Handle, the window procedure and some other information.

I’ve called this new structure the Window AuxRecord.

The Window AuxRecord

The Window AuxRecord will be used to keep all the information the window requires to operate on texts, lists or pictures. A handle to this AuxRecord will be placed in the RefCon field of each new opened windows. The fields of the Aux WindowRecord will be explained in the new toolbox calls section.

In order to use this new structure described above, I wrote some new routines.

The NewToolBox Library

Each of the new toolbox calls have been written in assembly language, using the Consulair 68000 assembler.

The Think C text editor was used to write the source code. To build the newToolBox library, you need to compile each source file then to convert them to the Think C library format using the RelConv utility. Once you’ve compiled and converted the object file, you create a new Think C project, you can name it ‘NewToolBox,’ and then you add the libraries you’ve just created to your project.

Now, you compile your project using the Build Library option. The header file associated with the library contains the prototype of each new added toolbox routines

To use this library: add it in your project and #include the header file where needed.

The New ToolBox Calls

InstalWindow():

This procedure will open a new window on the Macintosh desktop. It first creates space for a window record and then calls the GetNewWindow() function. WindID is the ID of the Window template on the resource file. If the window template can’t be read, InstalWindow() aborts and returns an error code.

Then, the function creates space for the Auxiliary Window record and replaces the original WrefCon of the new created window with a handle to the AuxWindowRecord. The content of WrefCon is saved and will be placed in the WauxRefCon of the AuxWindowRecord.

All the fields of the new structure are initialized.

The clip region origin is set to (0,0). You can use this field to add scrolling functionalities to your window.

The current active text and list are initialized with NIL, as well as the window THPrint. If your application prints the window’s content, you will allocate space for a TPrint record and place a handle to this record in the WPrintRec of the AuxWindRecord.

The WvRefNum is cleared, if texts or lists use data from disk, the volume reference number of the file containing the data will be placed in the WvRefNum field.

The WContRect is set with the window’s portRect minus the scroll bar size. If your window has a size box, you will place true in the WhasGrow field, which will allow the event loop to draw the size box if needed when an update event occurs.

The address of the Window procedure is placed in WindProc. Remember: your window procedure should never move.

Space is also allocated for the text, list and picture linked list in the WText,WList and WPic fields.

As a matter of fact,the linked list of text is a list of auxiliary text record :

The list auxiliary record is a bit more complicated, as you can see below :

Two fields are used to keep the font information needed to draw the content of each list’s cells.

The picture auxiliary record holds the transfer mode for QuickDraw drawing operation and the destination rectangle for the picture.

The InstalWindow() function will return the windowPtr in the variable ‘theWindow’.

If a memory allocation has failed, an error code is returned and no window is opened.

ExecWindow():

Each time an event occurs concerning the window, you will call this procedure.

The procedure looks for the WindProc fields of the AuxWindowRecord and then executes the procedure at the given address (assuming you’re never unloading and/or re-loading the segment containing the Window procedure). Before, ExecWindow(), places the EventRecord address on the stack.

GetWindowAuxRec():

Will return a handle to the windowAuxRecord.

GetWindowClip() and SetWindowClip():

Will return or set the WcontRect and Worigin of the window AuxRecord.

SetCurrents() and GetCurrents():

These procedures allows you to save and restore the values of the current active text or list in your window.

DeInstalWindow():

The whole space allocated for text(s), list(s), pict(s) and TPrint for the given window is released, and the window is closed.

I had new toolbox routines to provide the TextEdit and List Manager more functionality and to make life easier for the programmer who wants to open, handle and close texts and lists.

I have not forgotten Pictures and Controls. Each new PicHandle created when reading a picture from resource file, will be placed in a linked list.

A procedure, which I call ControlProcedure, will be executed whenever the user clicks in an active control. The procedure’s address is placed in the contrlRefCon.

InstalText():

Assuming a window has already been setup, this function will create a new text in your window.

textId is the ID of a template which contains two rectangles: the viewRect and the destination rectangle of the text.

Figure 5.

The inPort field of the TERecord is set with the whichWindow parameter.

Then, the new TEHandle is placed at the end of the WText list.

The function returns an error code before aborting if memory allocation fails or if the template can’t be found or read.

FindText():

Mouse down events are sent to the Window Procedure by the event loop of your application and by the ExecWindow procedure.

You’ll call the FindText function with the local coordinates of the mouse to know if the mouse down occurs in a text (the function returns the TEHandle of the text) or not (the function returns NIL).

This function simply calls PtInRect() for each texts of the WText list with the text’s viewRect and the local coordinates of the mouse as parameters.

DrawTexts():

Redraws the text(s) belonging to whichWindow.

TEUpdate is called for every text of the window.

ActivateText():

Calls TEActivate for the current active text . The TEhandle of the active text is store in the WactivTxt of the windowAuxRec.

If currentText is NIL, ActivateText does nothing.

DeactivateText():

Does the same as ActivateText() but TEDeactivate() is called instead of TEActivate()

InstalList():

Creates a new list in whichWindow, the routine first looks for a template on the resource file.

the template contains all the parameters needed by the LNew() routine. listID is the resource number of the list template.

Space is also allocated for the ListAuxRec and all fields initialized.

fontList and sizList are the font and size used by the ListDefProcedure to draw the cells content. These values are read from the List template.

If the list have controls (scrolls bar) , they are hidden (contrlVis field set to zero) because the list is supposed to be inactive when the window is opened.

FindList():

The routine works exactly in the same way the Findtext() routine does. But, before calling PtInRect(), if the list have scroll bar, 16 pixels are added to the list vRect bottom or right point.

DrawLists():

Will redraw the list(s) of whichWindow.

If your list has never been drawn before, a call to LUpdate will always draw the list’s scroll bars. (LUpdate sets the contrlVis of each scroll bars with 255). This will be a little annoying if your window displays more than one list because every list of the window seems to be active when your window will appear for the first time on the desktop. In order to avoid this, the DrawLists() routine will hide the scroll bars handle before calling LUpdate(). The scroll bars are drawn separately by calling the Draw1Control() routine which draws the control only if necessary (if contrlVis is 255).

ActivateList():

the list manager routine LActivate() is called for the current active list with TRUE as first parameter .

DeactivateLists():

LActivate() called with FALSE for the current active list (if any).

ListKey():

You will call this procedure whenever the event loop will report a keyDown event for an active list.

Each character typed will be added to the active cell data and the cell redrawn.

The routine tests also for characters like Return, Enter or the arrow keys and instead of adding the value to the cell data, changes the current active cell.

The Control Manager have also been enhanced with new routines:

InstalControl():

Will be used to create a new control from a template read from a resource file.

The control reference value is replaced with a procedure pointer . This procedure will be executed each time you click in the control and, of course, will never remove the segment containing the control procedure.

After the TrackControl function, you will call ExecControl() which call your contrlProc.

HiliteAllControls():

Calls HiliteControl() for each control of the window control list, except for those with the contrlRef field set to -1. This, to avoid the scroll bars of a list to be drawn if the list is not active.

Drawing the list’s scrollbars is the DrawList() or ActivateList() job only.

Pictures can be added to every windows, using the InstalPic() function, which adds picHandle to the list of pictures that belong to the window.An auxiliary picture record is also added. It will contain the ID of the picture resource, the pen transfer mode used to draw the picture and the destination rectangle (in local coordinates).

As DrawList and DrawTexts, DrawPicts() will draw every pictures of whichWindow.

FindPict() will allow the user to know if he ‘clicks’ in the picture frame.

The Demo Project

The demo project, written in Think C v 4.00, demonstrates the use of the new toolbox routines and shows a simple Window procedure.

Five different windows displaying texts, textual lists and pictures can be opened together.

The Window procedure is in the “CExecWindow.c” file.This segment should never be unloaded .

Conclusion

The window procedure presented here is implemented in a very simple way.A more sophisticated approach would be to store the window procedure as a resource in a resource file.

The window auxiliary record can also easily be modified to hold more ‘objects’, not only texts, lists and pictures.

Continued in next frame
Volume Number: 6
Issue Number: 10
Column Tag: Assembly Lab

New Toolbox Routines (code)

By Hugues A. Oliver, Perpignan, France

Listing: Library.Txt
;------------------------------
; ****** Include Files ******
;------------------------------ 
INCLUDE Traps.D
INCLUDE ToolEquX.D
INCLUDE SysErrX.D
INCLUDE SysEquX.D
INCLUDE QuickEquX.D 
INCLUDE PackMacs.Txt 
;------------------------------
; ******* Constants *********
;------------------------------ 
 NIL EQU 0
 TRUE EQU 0101ドル
 FALSE EQU 0000ドル 
;------------------------------
; ***** Wind AuxRec *******
;------------------------------ 
 Worigin EQU 0 
 WContRect EQU 4 
 WactivTxt EQU 12 
 WactivLst EQU 16 
 Wgrow EQU 20 
 WPrintRec EQU 22 
 WindProc EQU 26
 WvRefNum EQU 30 
 WAuxRefC EQU 32
 WText EQU 36
 WList EQU 40 
 WPic EQU 44 
 SizeWindRec EQU 156 
 SizeAuxWind EQU 48
 
;--------------------------------
; ******* List AuxRec *********
;--------------------------------
 SizeListAuxRec EQU 14
 LID EQU 0
 theList EQU 2
 nextList EQU 6
 fontList EQU 10
 sizList EQU 12
 
;--------------------------------
; ******* Text AuxRec *********
;-------------------------------- 
 SizeTEAuxRec EQU 10
 TID EQU 0
 theText EQU 2
 nextText EQU 6
;------------------------------
; ******* Pic AuxRec ********
;------------------------------ 
 SizePicAuxRec EQU 20
 PID EQU 0
 thePic EQU 2
 nextPicEQU 6
 tMode EQU 10
 destRectEQU 12
;------------------------------
; **** Control AuxRec ****
;------------------------------ 
 SizeCtrlAuxRec EQU 6
 contrlID EQU 0
 contrlProc EQU 2
 
;--------------------------------
; ******* New TE *********
;-------------------------------- 
 .TRAP _TEStylNew $A83E
 .TRAP _TEDispatch $A83D
 
 .MACRO _GetStylHandle
 MOVE.W #4,-(SP)
 _TEDispatch
 .ENDM
 
 .MACRO _SetStylHandle
 MOVE.W #5,-(SP)
 _TEDispatch
 .ENDM
;--------------------------------
; ******* Externals *********
;--------------------------------
XREF CurrentText,CurrentList
;------------------------------ 
Listing: LText.Asm
;******************************************
;* T E D I T M A N A G E R 
;******************************************
INCLUDE Library.Txt
;------------------------------
; *** External Definition ***
;------------------------------ 
XDEF InstalText
XDEF FindText
XDEF DrawTexts
XDEF DeactivateText
XDEF ActivateText
 
;------------------------------
;******* Text Record *********
;------------------------------
;TERec = Record {100 bytes}
;{ 0} destRect : Rect
;{ 8} viewRect : Rect
;{ 16} selRect : Rect
;{ 24} lineHeight : -1
;{ 26} fontAscent : -1
;{ 28} selPoint : Point
;{ 32} selStart : INTEGER
;{ 34} selEnd : INTEGER
;{ 36} active : INTEGER
;{ 38} wordBreak : ProcPtr
;{ 42} clikLoop : ProcPtr
;{ 46} clickTime : LongInt
;{ 50} clickLoc : INTEGER
;{ 52} caretTime : LongInt
;{ 56} caretState : INTEGER
;{ 58} just : INTEGER
;{ 60} TELength : INTEGER
;{ 62} hText : Handle
;{ 66} recalBack : INTEGER
;{ 68} recalLines : INTEGER
;{ 70} clikStuff : INTEGER
;{ 72} crOnly : INTEGER
;{ 74} txFont : 1/2 Handle
;{ 76} txFace : 1/2 Handle
;{ 78} txMode : XferMode
;{ 80} txSize : -1
;{ 82} inPort : GrafPtr
;{ 86} highHook : ProcPtr
;{ 90} caretHook : ProcPtr
;{ 94} nLines : INTEGER
;{ 96} lineStarts : Array[0:1] of INTEGER
;------------------------------
; ***** Text AuxRecord ********
;------------------------------ 
;TEAuxRec = Record {12 bytes}
;{0} TID :INTEGER 
;{2} theText :TEHandle 
;{6} nextText :TEAuxHandle 
;---------------------------------------------- 
;FUNCTION InstalText
;(textID:INTEGER;whichWindow:WindowPtr):OSErr;
;----------------------------------------------
;------------------------------
; Parameters
;------------------------------
textID EQU 12
whichWindow EQU 8
;------------------------------
; Local Variables
;------------------------------
theHandle EQU -10
theNText EQU -6
error EQU -2
;------------------------------
InstalText
 LINK A6,#-10 ;local space
 MOVEM.L A2-A4/D3-D7,-(SP) ;save registers
 MOVE.W noErr,error(A6) ;
 SUBQ.L #4,SP ;space for result
 MOVE.L #’TEHD’,-(SP) ;restype is’TEHD’
 MOVE.W textID(A6),-(SP) ;res ID
 _GetResource ;
 MOVEA.L (SP)+,A1 ;
 SUBQ.L #2,SP ;
 _ResError ;check for error
 MOVE.W (SP)+,error(A6) ;
 BNE @0 ;
 MOVE.L A1,theHandle(A6) ;save handle
 MOVEA.L (A1),A1 ;
 SUBQ.L #4,SP ;space for TEHandle 
 PEA teDestRect(A1) ;
 PEA teViewRect(A1) ;
 _TEStylNew ;
 MOVEA.L (SP),A1 ;TEHandle in A1
 MOVE.L A1,theNText(A6) ;save it
 _TECalText ;Tech Note #131
 MOVE.L theNText(A6),A1 ;
 MOVE.L (A1),A1 ;
 MOVE.L whichWindow(A6),teGrafPort(A1);
 MOVE.W #TRUE,-(SP) ;
 MOVE.L theNText(A6),-(SP) ;
 _TEAutoView ;
 MOVE.L whichWindow(A6),A0;
 MOVE.L WrefCon(A0),A0 ;
 MOVE.L (A0),A0 ;
 MOVE.L WText(A0),A3 ; 
 MOVEA.L (A3),A3 ;
 CMPI.L #NIL,theText(A3) ;is there any text ?
 BEQ @2 ;no, so add one
 
@4
 CMPI.L #NIL,nextText(A3);other text after ?
 BEQ @3 ;no,add one (@3) 
 MOVEA.L nextText(A3),A3 ;go to the next one
 MOVEA.L (A3),A3 ;
 BRA @4 ;
 
@3
 MOVEQ #SizeTEAuxRec,D0 ;place for textAuxRec
 _NewHandle ;
 MOVE.W D0,error(A6) ;
 BNE @1 ;if error go @1
 MOVE.L A0,nextText(A3) ;
 MOVEA.L A0,A3 ;
 MOVEA.L (A3),A3 ;
 MOVE.L theNText(A6),theText(A3);
 MOVE.L #NIL,nextText(A3);
 MOVE.W textID(A6),TID(A3);
 BRA @0 ;
 
@2 
 MOVE.L theNText(A6),theText(A3);for the 
 MOVE.L #NIL,nextText(A3); first text 
 MOVE.W textID(A6),TID(A3) ;TEAuxRec already
 BRA @0 ;exists
 
@1
 MOVE.L theNText(A6),-(SP);we can’t allocate
 _TEDispose ;space for TEAuxRec
@0
 MOVE.W error(A6),D0 ;
 MOVEM.L (SP)+,A2-A4/D3-D7 ;
 UNLK A6 ;
 MOVE.L (SP)+,A0 ;
 ADD.L #6,SP ;clean up the stack
 MOVE.W D0,(SP) ;push function result
 JMP (A0) ;
 
;---------------------------------------------- 
 ;FUNCTION FindText
;(thePoint:Point;whichWindow:WindowPtr):TEHandle
;----------------------------------------------
;------------------------------
; Parameters
;------------------------------
thePoint EQU 12
;------------------------------
; Variables
;------------------------------
SauvHdl EQU -4
;------------------------------
FindText
 LINK A6,#-4 ;
 MOVEM.L A2-A4/D3-D7,-(SP);
 MOVE.L #NIL,A1 ;
 MOVE.L whichWindow(A6),A0;
 MOVE.L WrefCon(A0),A0 ;
 MOVE.L (A0),A0 ;
 MOVE.L WText(A0),A3 ;begining
 MOVE.L A3,SauvHdl(A6) ;of text list
 MOVEA.L (A3),A3 ;saved on stack
 CMPI.L #NIL,theText(A3) ;is there any text?
 BEQ @0 ;no,so go away 
@3 
 MOVEA.L theText(A3),A2 ;
 MOVEA.L (A2),A2 ;
 SUBQ.L #2,SP ;
 MOVE.L thePoint(A6),-(SP);do we
 PEA teViewRect(A2) ;click in
 _PtInRect ;this one ?
 MOVE.L SauvHdl(A6),A3 ;
 MOVE.L (A3),A3 ;
 TST.B (SP)+ ;
 BNE @1 ;yes ! go @1
 CMPI.L #NIL,nextText(A3) ;no.
 BEQ @0 ;if no more texts
 MOVEA.L nextText(A3),A3 ;go @0 ,if not...
 MOVE.L A3,SauvHdl(A6) ;next one !
 MOVEA.L (A3),A3 ;
 BRA @3 ; 
@1 
 MOVE.L theText(A3),A1 ;”clicked” TEHandle @0 
 ;in A1 
 MOVEM.L (SP)+,A2-A4/D3-D7 ;
 UNLK A6 ;
 MOVE.L (SP)+,A0 ;
 ADD.L #8,SP ;
 MOVE.L A1,(SP) ;
 JMP (A0) ; 
 
;---------------------------------------------- 
;PROCEDURE DrawTexts(whichWindow:WindowPtr);
;----------------------------------------------
;------------------------------
; Local Variables
;------------------------------
TextAuxHdl EQU -4
;------------------------------
DrawTexts
 LINK A6,#-4 ;
 MOVEM.L A2-A4/D3-D7,-(SP) ; 
 MOVE.L whichWindow(A6),A0 ;
 MOVE.L WrefCon(A0),A0 ;
 MOVE.L (A0),A0 ;
 MOVE.L WText(A0),A3 ;
 MOVE.L A3,TextAuxHdl(A6) ;
 MOVE.L (A3),A3 ;
 CMPI.L #NIL,theText(A3) ;is there text in
 BEQ @0 ;the window ? 
@3 
 MOVEA.L theText(A3),A0 ;
 MOVEA.L (A0),A0 ;
 PEA teViewRect(A0) ;
 MOVE.L theText(A3),-(SP) ;
 _TEUpdate ;draw texts
 MOVE.L TextAuxHdl(A6),A3 ;
 MOVE.L (A3),A3 ;
 CMPI.L #NIL,nextText(A3) ;until no more
 BEQ @0 ;texts in list 
 MOVEA.L nextText(A3),A3 ;
 MOVE.L A3,TextAuxHdl(A6) ;
 MOVEA.L (A3),A3 ;
 BRA @3 ;
@0
 MOVEM.L (SP)+,A2-A4/D3-D7 ;no more
 UNLK A6 ;texts
 MOVE.L (SP)+,A0 ;go away.
 ADD.L #4,SP ;
 JMP (A0) ; 
 
;---------------------------------------------- 
;PROCEDURE DeactivateText (whichWindow:WindowPtr);
;----------------------------------------------
DeactivateText
 LINK A6,#0 ;
 MOVEM.L A2-A4/D3-D7,-(SP) ;
 MOVEA.L whichWindow(A6),A1 ;
 MOVE.L WRefCon(A1),A1 ;
 MOVE.L (A1),A1 ;
 MOVE.L WactivTxt(A1),A1 ;
 MOVE.L A1,CurrentText(A5) ;
 CMPA.L #NIL,A1 ;
 BEQ @0 ;
 MOVE.L A1,-(SP) ;
 _TEDeactivate ;
@0
 MOVEM.L (SP)+,A2-A4/D3-D7 ;
 UNLK A6 ;
 MOVE.L (SP)+,A0 ;
 ADD.L #4,SP ;
 JMP (A0) ;
;----------------------------------------------
;PROCEDURE ActivateText(whichWindow:WindowPtr);
;---------------------------------------------- 
ActivateText
 LINK A6,#0 ;
 MOVEM.L A2-A4/D3-D7,-(SP) ;
 MOVEA.L whichWindow(A6),A1 ;
 MOVE.L WRefCon(A1),A1 ;
 MOVE.L (A1),A1 ;
 MOVE.L WactivTxt(A1),A1 ;
 MOVE.L A1,CurrentText(A5) ;
 CMPA.L #NIL,A1 ;
 BEQ @0 ;
 MOVE.L A1,-(SP) ;
 _TEActivate ;
@0
 MOVEM.L (SP)+,A2-A4/D3-D7 ;
 UNLK A6 ;
 MOVE.L (SP)+,A0 ;
 ADD.L #4,SP ;
 JMP (A0) ;
END
Listing: LList.Asm
;******************************************
;* L I S T M A N A G E R 
;******************************************
INCLUDE Library.Txt
;--------------------------------
; *** Externals Definition ***
;-------------------------------- 
XDEF InstalList
XDEF FindList
XDEF DrawLists
XDEF DeactivateList
XDEF ActivateList
XDEF ListKey
 
;------------------------------
; ** List Resource Template **
;------------------------------ 
 vRect EQU 0
 LdataBounds EQU 8
 cSize EQU 16
 listDef EQU 20
 LvScrollEQU 22
 LhScrollEQU 24
 drawItEQU 26
 hasGrow EQU 28
 lRefCon EQU 30
 LTextFont EQU 34
 LTextSize EQU 36
 
;------------------------------
; ******* List Record *********
;------------------------------
; ListRec = Record { 88 bytes}
;{ 0} rView : Rect
;{ 8} port : GrafPtr
;{ 12} indent : Point
;{ 16} cellSize : Point
;{ 20} visible : Rect
;{ 28} vScroll : ControlHandle
;{ 32} hScroll : ControlHandle
;{ 36} selFlags : SignedByte
;{ 37} LActive : BOOLEAN
;{ 38} LReserved : SignedByte
;{ 39} listFlags : SignedByte
;{ 40} clikTime : LongInt
;{ 44} clikLoc : Point
;{ 48} mouseLoc : Point
;{ 52} LClikLoop : ProcPtr
;{ 56} lastClick : Point
;{ 60} refCon : LongInt
;{ 64} listDefProc : Handle
;{ 68} userHandle : Handle
;{ 72} dataBounds : Rect
;{ 80} cells : Handle
;{ 84} maxIndex : INTEGER
;{ 86} cellArray : Array[1:1] of INTEGER
 
;------------------------------
;***** The List AuxRecord ******
;------------------------------
;AuxListRec = Records {14} 
;{0} ID:INTEGER 
;{2} theList :ListHandle
;{6} nextList :AuxListHandle
;{10} fontList :INTEGER
;{12} sizList :INTEGER
;---------------------------------------------- 
;FUNCTION InstalList
;(listID:INTEGER;whichWindow:WindowPtr):OSErr;
;----------------------------------------------
;------------------------------
; Parameters
;------------------------------
whichWindow EQU 8
listID EQU 12 
;------------------------------
; Local Variables
;------------------------------
theHandle EQU -10
theNList EQU -6
error EQU -2
;------------------------------
InstalList
 LINK A6,#-10 ;
 MOVEM.L A2-A4/D3-D7,-(SP) ; 
 MOVE.W #noErr,error(A6) ; 
 SUBQ.L #4,SP ;
 MOVE.L #’LIST’,-(SP) ;
 MOVE.W listID(A6),-(SP) ;get a list
 _GetResource ;template from
 MOVEA.L (SP)+,A3 ;disk
 SUBQ.L #2,SP ;
 _ResError ; 
 MOVE.W (SP)+,error(A6) ;if resource
 BNE @0 ;can’t be read go @0
 MOVE.L A3,theHandle(A6) ;
 MOVE.L (A3),A1 ;
 SUBQ.L #4,SP ;
 PEA vRect(A1) ;
 PEA LdataBounds(A1) ;
 MOVE.L cSize(A1),-(SP) ;
 MOVE.W listDef(A1),-(SP) ;
 MOVE.L whichWindow(A6),-(SP);
 MOVE.W drawIt(A1),-(SP) ;
 MOVE.W hasGrow(A1),-(SP) ;
 MOVE.W LhScroll(A1),-(SP) ;
 MOVE.W LvScroll(A1),-(SP) ;
 _LNew ;create a new 
 MOVEA.L (SP)+,A1 ;list
 MOVE.L A1,theNList(A6) ;
 MOVE.L (A1),A1 ;
 MOVE.L theHandle(A6),A0 ;
 MOVE.L (A0),A0 ;set the list refcon
 MOVE.L lRefCon(A0),refCon(A1);
 MOVE.L whichWindow(A6),A0 ;
 MOVE.L WrefCon(A0),A0 ;
 MOVE.L (A0),A0 ;place the new
 MOVE.L WList(A0),A2 ;listhandle 
 MOVEA.L (A2),A3 ;in the linked list
 CMPI.L #NIL,theList(A3) ;of list but before
 BEQ @1 ; 
@3
 CMPI.L #NIL,nextList(A3) ;we must find
 BEQ @2 ;the last list
 MOVEA.L nextList(A3),A3 ;AuxRec of our 
 MOVEA.L (A3),A3 ;linked list
 BRA @3 ; 
@2
 MOVEQ #SizeListAuxRec,D0 ;we create a new
 _NewHandle ;list AuxRec
 MOVE.W D0,error(A6) ;
 BNE @0 ;if error, go @0 
 MOVE.L A0,nextList(A3) ;
 MOVEA.L A0,A3 ;
 MOVEA.L (A3),A3 ;initialize all
 MOVE.L theNList(A6),theList(A3);
 MOVE.W listID(A6),LID(A3) ;list AuxRec
 MOVE.L #NIL,nextList(A3) ;fields
 MOVE.L theHandle(A6),A0 ;
 MOVE.L (A0),A0 ;
 MOVE.W LTextFont(A0),fontList(A3);
 MOVE.W LTextSize(A0),sizList(A3) ; 
 BRA @5; 
@1
 MOVE.L theNList(A6),theList(A3);
 MOVE.W listID(A6),LID(A3);space for the list
 MOVE.L #NIL,nextList(A3) ;has been already
 MOVE.L theHandle(A6),A0 ;allocated.
 MOVE.L (A0),A0 ;
 MOVE.W LTextFont(A0),fontList(A3);
 MOVE.W LTextSize(A0),sizList(A3) ;
@5 
 MOVE.L theNList(A6),A1;
 MOVE.L (A1),A1 ;if our new
 CMPI.L #NIL,vScroll(A1) ;list has scroll bars
 BEQ @4;will put -1 in the 
 MOVE.L vScroll(A1),A0 ;cntrlRefCon of each
 MOVE.L (A0),A0 ;scroll bars.
 MOVE.L #-1,contrlrfCon(A0);(see article)
 CLR.B contrlVis(A0) ;
@4 ;
 CMPI.L #NIL,hScroll(A1) ;
 BEQ @0; 
 MOVE.L hScroll(A1),A0 ;
 MOVE.L (A0),A0 ;
 MOVE.L #-1,contrlrfCon(A0);
 CLR.B contrlVis(A0) ; 
@0
 MOVE.W error(A6),D0 ;
 MOVEM.L (SP)+,A2-A4/D3-D7 ;
 UNLK A6 ;
 MOVE.L (SP)+,A0 ;
 ADD.L #6,SP ;
 MOVE.W D0,(SP) ;
 JMP (A0) ; 
;---------------------------------------------- 
;FUNCTION FindList
;(testControl:BOOLEAN;thePoint:Point;
;whichWindow:WindowPtr):ListHandle;
;----------------------------------------------
;------------------------------
; Parameters
;------------------------------
thePoint EQU 12
testControl EQU16
;------------------------------
; Local Variables
;------------------------------
AuxListHdl EQU -4
FindList
 LINK A6,#-4 ;
 MOVEM.L A2-A4/D3-D7,-(SP) ;
 MOVE.L #NIL,A1 ;
 MOVE.L whichWindow(A6),A0 ;
 MOVE.L WrefCon(A0),A0 ;
 MOVE.L (A0),A0 ;
 MOVE.L WList(A0),A3 ;
 MOVE.L A3,AuxListHdl(A6) ;find the
 MOVEA.L (A3),A3 ;first list
 CMPI.L #NIL,theList(A3) ;if no list...
 BEQ @6 ;go @6 
@3 
 MOVEA.L theList(A3),A2 ;
 MOVE.L (A2),A2 ;
 SUBQ #8,SP ;we push the
 MOVE.L rview(A2),(SP) ;list’s view rect
 MOVE.L rview+4(A2),4(SP);
 MOVE.L SP,A0 ; 
 SUBQ.L #2,SP ;
 MOVE.L thePoint(A6),-(SP) ;
 MOVE.L A0,-(SP) ;
 MOVE.L (SP),A0 ;
 TST.B testControl(A6) ;does user wants to
 BEQ @5;know if he clicks 
 CMPI.L #NIL,vScroll(A2) ;in the list scroll
 BEQ @4 ;bar ?
 ADDI.W #15,6(A0) ;if yes, we add
@4
 CMPI.L #NIL,hScroll(A2) ;the scroll bar
 BEQ @5;width to the view rect
 ADDI.W #15,4(A0) ;coordinates 
@5
 _PtInRect ;
 MOVE.L AuxListHdl(A6),A3 ;
 MOVE.L (A3),A3 ; 
 TST.B (SP)+ ;if we’ve clicked
 ADDQ.L #8,SP ;in this list go @1
 BNE @1;
 CMPI.L #NIL,nextList(A3) ;we’ve not clicked
 BEQ @6 ;in this one, check
 MOVEA.L nextList(A3),A3 ;another list
 MOVE.L A3,AuxListHdl(A6) ;if any.if not
 MOVEA.L (A3),A3 ;go @6
 BRA @3 ; 
@1
 MOVE.L theList(A3),A1 ; 
@6
 MOVEM.L (SP)+,A2-A4/D3-D7 ;
 UNLK A6 ;
 MOVE.L (SP)+,A0 ;
 ADD.L #10,SP ;clean up the
 MOVE.L A1,(SP) ;stack.
 JMP (A0) ; 
;----------------------------------------------
 ;PROCEDURE DrawLists(whichWindow:WindowPtr);
;----------------------------------------------
;------------------------------
; Local Variables
;------------------------------
vCntl EQU -8
hCntl EQU -12
Drawlists 
 LINK A6,#-12 ;
 MOVEM.L A2-A4/D3-D7,-(SP) ; 
 MOVE.L whichWindow(A6),A0 ;
 MOVE.L WrefCon(A0),A0 ;
 MOVE.L (A0),A0 ;
 MOVE.L WList(A0),A3 ;
 MOVE.L A3,AuxListHdl(A6) ;
 MOVE.L (A3),A3 ;
 CMPI.L #NIL,theList(A3);if no list in
 BEQ @6 ;this window :@6
@3
 MOVE.L theList(A3),A3 ;
 MOVE.L (A3),A3 ;
 CMPI.L #NIL,vScroll(A3) ;
 BEQ @4 ;
 MOVE.L vScroll(A3),-(SP) ;
 _Draw1Control ;
@4
 MOVE.L AuxListHdl(A6),A3 ;
 MOVE.L (A3),A3 ;
 MOVE.L theList(A3),A3 ;
 MOVE.L (A3),A3 ;
 CMPI.L #NIL,hScroll(A3) ;
 BEQ @5 ;
 MOVE.L hScroll(A3),-(SP) ;
 _Draw1Control ;
@5
 MOVEA.L whichWindow(A6),A0 ;
 MOVE.L AuxListHdl(A6),A3 ;
 MOVE.L (A3),A3 ;
 MOVE.W fontList(A3),txFont(A0) ;
 MOVE.W sizList(A3),txSize(A0) ;
 MOVE.L theList(A3),A1 ;
 MOVE.L (A1),A1 ;
 MOVE.L vScroll(A1),vCntl(A6) ;
 MOVE.L hScroll(A1),hCntl(A6) ;
 CLR.L hScroll(A1) ; 
 CLR.L vScroll(A1) ;
 MOVE.L visRgn(A0),-(SP) ;
 MOVE.L theList(A3),-(SP) ;
 _LUpdate ; 
 MOVE.L AuxListHdl(A6),A3 ;
 MOVE.L (A3),A3 ;
 MOVE.L theList(A3),A1 ;
 MOVE.L (A1),A1 ;
 MOVE.L vCntl(A6),vScroll(A1) ;
 MOVE.L hCntl(A6),hScroll(A1) ;
 CMPI.L #NIL,nextList(A3) ;
 BEQ @6 ;
 MOVEA.L nextList(A3),A3 ;
 MOVE.L A3,AuxListHdl(A6) ;
 MOVEA.L (A3),A3 ;
 BRA @3 ;
@6
 MOVEM.L (SP)+,A2-A4/D3-D7 ;
 UNLK A6 ;
 MOVE.L (SP)+,A0 ;
 ADD.L #4,SP ;
 JMP (A0) ;
 
;---------------------------------------------- 
;PROCEDURE DeactivateList (whichWindow:WindowPtr);
;----------------------------------------------
DeactivateList
 LINK A6,#0 ;
 MOVEM.L A2-A4/D3-D7,-(SP) ;
 MOVEA.L whichWindow(A6),A1 ;
 MOVE.L WrefCon(A1),A1 ;
 MOVE.L (A1),A1 ;
 MOVE.L WactivLst(A1),A1 ;
 MOVE.L A1,CurrentList(A5) ;
 CMPA.L #NIL,A1 ;
 BEQ @6 ;
 MOVE.W #FALSE,-(SP) ;
 MOVE.L A1,-(SP) ;
 _LActivate ;
@6
 MOVEM.L (SP)+,A2-A4/D3-D7 ;
 UNLK A6 ;
 MOVE.L (SP)+,A0 ;
 ADD.L #4,SP ;
 JMP (A0) ; 
 
;---------------------------------------------- 
;PROCEDURE ActivateList(whichWindow:WindowPtr);
;----------------------------------------------
ActivateList 
 LINK A6,#0 ;
 MOVEM.L A2-A4/D3-D7,-(SP) ;
 MOVEA.L whichWindow(A6),A1 ;
 MOVE.L WrefCon(A1),A1 ;
 MOVE.L (A1),A1 ;
 MOVE.L WactivLst(A1),A1 ;
 MOVE.L A1,CurrentList(A5) ;
 CMPA.L #NIL,A1 ;
 BEQ @6 ;
 MOVE.W #TRUE,-(SP) ;
 MOVE.L A1,-(SP) ;
 _LActivate ;
@6
 MOVEM.L (SP)+,A2-A4/D3-D7 ;
 UNLK A6 ;
 MOVE.L (SP)+,A0 ;
 ADD.L #4,SP ;
 JMP (A0) ; 
 
;---------------------------------------------- 
;PROCEDURE ListKey(key:Char;inList:ListHandle);
;------------------------------
;------------------------------
; Parameters
;------------------------------
key EQU 12
inList EQU 8
;------------------------------
; Local Variables
;------------------------------
cellule EQU -4
cellule2 EQU -8
;------------------------------
ListKey
 LINK A6,#-8 ;
 MOVEM.L A2-A4/D3-D7,-(SP) ;
 MOVE.L inList(A6),-(SP) ;
 _LLastClick ;coordinates
 MOVE.L (SP)+,cellule(A6) ;
 MOVE.L cellule(A6),cellule2(A6) ;
 CMPI.B #0ドルD,key(A6) ;
 BEQ GoDown ;
 CMPI.B #03,ドルkey(A6) ;
 BEQ GoDown ;
 CMPI.B #1ドルB,key(A6) ;
 BEQ GoAway ;
 CMPI.B #09,ドルkey(A6) ;
 BEQ GoAway ;
 CMPI.B #1ドルE,key(A6) ;
 BEQ GoUp ;
 CMPI.B #1ドルF,key(A6) ;
 BEQ GoDown ;
 CMPI.B #1ドルD,key(A6) ;
 BEQ GoRight ;
 CMPI.B #1ドルC,key(A6) ;
 BEQ GoLeft ;
 CMPI.B #08,ドルkey(A6) ;
 BEQ ClearCell ;
 PEA key(A6) ;
 MOVE.W #1,-(SP) ;
 MOVE.L cellule(A6),-(SP) ;
 MOVE.L inList(A6),-(SP) ;
 _LAddToCell ;
 MOVE.L inList(A6),A1 ;
 MOVE.L (A1),A0 ;
 MOVE.L port(A0),A0 ;
 MOVE.L WrefCon(A0),A3 ;
 MOVE.L (A3),A3 ;
 MOVE.L WList(A3),A3 ;
 MOVE.L (A3),A3 ;
@2 
 CMPA.L theList(A3),A1 ;
 BEQ @1;
 MOVE.L nextList(A3),A3;
 MOVE.L (A3),A3 ;
 BRA @2;
@1
 MOVE.W fontList(A3),txFont(A0) ;
 MOVE.W sizList(A3),txSize(A0) ;
 MOVE.L cellule(A6),-(SP) ;
 MOVE.L inList(A6),-(SP) ;
 _LDraw;
 BRA GoAway ;
ClearCell
 MOVE.L cellule(A6),-(SP) ;
 MOVE.L inList(A6),-(SP) ;
 _LClrCell ;
 MOVE.L cellule(A6),-(SP) ;
 MOVE.L inList(A6),-(SP) ;
 _LDraw;
 BRA GoAway ;
 
GoUp
 TST.W cellule(A6) ;
 BEQ GoAway ; 
 MOVE.W #FALSE,-(SP) ;
 MOVE.L cellule(A6),-(SP) ;
 MOVE.L inList(A6),-(SP) ;
 _LSetSelect ;
 SUBI.W #1,cellule(A6) ;
 MOVE.W #TRUE,-(SP) ;
 MOVE.L cellule(A6),-(SP) ;
 MOVE.L inList(A6),-(SP) ;
 _LSetSelect ;
 MOVE.L inList(A6),A3 ;
 MOVE.L (A3),A3 ;
 MOVE.L cellule(A6),lastClick(A3);
 BRA GoAway ;
GoDown
 MOVE.W cellule(A6),D0 ;
 ADDQ #1,D0 ;
 MOVE.L inList(A6),A3 ;
 MOVE.L (A3),A3 ;
 LEA dataBounds(A3),A0 ;
 CMP.W bottom(A0),D0 ;
 BEQ GoAway ;
 MOVE.W #FALSE,-(SP) ;
 MOVE.L cellule(A6),-(SP) ;
 MOVE.L inList(A6),-(SP) ;
 _LSetSelect ;
 ADDI.W #1,cellule(A6) ;
 MOVE.W #TRUE,-(SP) ;
 MOVE.L cellule(A6),-(SP) ;
 MOVE.L inList(A6),-(SP) ;
 _LSetSelect ;
 MOVE.L inList(A6),A3 ;
 MOVE.L (A3),A3 ;
 MOVE.L cellule(A6),lastClick(A3);
 BRA GoAway ;
 
GoRight
 MOVE.W cellule+2(A6),D0 ;
 ADDQ #1,D0 ;
 MOVE.L inList(A6),A3 ;
 MOVE.L (A3),A3 ;
 LEA dataBounds(A3),A0 
 CMP.W right(A0),D0 
 BEQ GoAway 
 MOVE.W #FALSE,-(SP) 
 MOVE.L cellule(A6),-(SP) 
 MOVE.L inList(A6),-(SP) 
 _LSetSelect 
 ADDI.W #1,cellule+2(A6) 
 MOVE.W #TRUE,-(SP) 
 MOVE.L cellule(A6),-(SP) 
 MOVE.L inList(A6),-(SP) 
 _LSetSelect 
 MOVE.L inList(A6),A3 
 MOVE.L (A3),A3 
 MOVE.L cellule(A6),lastClick(A3) 
 BRA GoAway 
GoLeft
 TST.W cellule+2(A6) 
 BEQ GoAway 
 MOVE.W #FALSE,-(SP) 
 MOVE.L cellule(A6),-(SP) 
 MOVE.L inList(A6),-(SP) 
 _LSetSelect 
 SUBI.W #1,cellule+2(A6) 
 MOVE.W #TRUE,-(SP) 
 MOVE.L cellule(A6),-(SP) 
 MOVE.L inList(A6),-(SP) 
 _LSetSelect 
 MOVE.L inList(A6),A3 
 MOVE.L (A3),A3 
 MOVE.L cellule(A6),lastClick(A3) 
 
GoAway
 MOVE.L inList(A6),-(SP) 
 _LAutoScroll ;
 MOVEM.L (SP)+,A2-A4/D3-D7 
 UNLK A6 
 MOVE.L (SP)+,A0 
 ADD.L #8,SP 
 JMP (A0) 
END
Listing: LWind.Asm
;**************************
;* Window Manager *
;************************** 
INCLUDE Library.Txt
;------------------------------
; *** External Definition ***
;------------------------------ 
XDEF InstalWindow
XDEF DeInstalWindow
XDEF ExecWindow
XDEF GetWindowAuxRec
XDEF GetWindowClip
XDEF SetWindowClip
XDEF SetCurrents
XDEF GetCurrents
XDEF WindowWithGrow
 
;------------------------------
;**** The Window Record ****
;------------------------------
;WindowRecord = Record {156 bytes}
;{ 0} port : GrafPort
;{108} windowKind : INTEGER
;{110} visible : BOOLEAN
;{111} hilited : BOOLEAN
;{112} goAwayFlag : BOOLEAN
;{113} spareFlag : BOOLEAN
;{114} strucRgn : RgnHandle
;{118} contRgn : RgnHandle
;{122} updateRgn : RgnHandle
;{126} windowDefProc : DEFfunHandle
;{130} dataHandle : Handle
;{134} titleHandle : StringHandle
;{138} titleWidth : INTEGER
;{140} ControlList : ControlHandle
;{144} nextWindow : WindowPeek
;{148} windowPic : PicHandle
;{152} WrefCon : LongInt
;------------------------------
;** The Window AuxRecord **
;------------------------------
;AuxWinRecord = Record {48}
;{0} Worigin : Point Origin of ClipRgn
;{4} WContRect : Rect Window’s portRect 
;{12} WactivTxt: TEHandle Current Active TEdit
;{16} WactivLst: ListHandle Current Active List
;{20} Wgrow : BooleanTrue if window has grow 
;{22} WPrintRec: THPrint Handle to Print Record
;{26} WindProc : ProcPtr Window Procedure
;{30} WvRefNum : Integer Volume RefNum.
;{32} WAuxRefC : LongInt the Window WrefCon
;{36} WText : Handle list of TEHandle
;{40} WList : Handle list of ListHandle 
;{44} WPic: Handle list of Pictures
; --------------------------------
;FUNCTION InstalWindow
;(VAR theWindow:WindowPtr;WindID:INTEGER;
; WProc:ProcPtr;hasGrow:BOOLEAN):OSErr;
;----------------------------------------------
;------------------------------
; Parameters
;------------------------------
hasGrow EQU 8
WProc EQU 10
WindID EQU 14
VARtheWindow EQU 16
;------------------------------
; Local Variables
;------------------------------
theWindow EQU -4
theRefCon EQU -8
theHandle EQU -12
error EQU -14
;------------------------------
InstalWindow 
 LINK A6,#-14 ;
 MOVEM.L A2-A4/D3-D7,-(SP) ;
 MOVE.W #noErr,error(A6) ;
 MOVE.L #NIL,theWindow(A6) ;
 MOVE.L #SizeWindRec,D0 ;space for
 _NewPtr ;a new window
 MOVE.W D0,error(A6) ;record.
 BNE @0 ;if error... 
 MOVE.W WindID(A6),-(SP) ; exit.
 MOVE.L A0,-(SP) ; 
 MOVE.L #-1,-(SP) ; 
 _GetNewWindow ;get a window...
 MOVE.L (SP)+,theWindow(A6);from resource
 MOVE.W #nilHandleErr,error(A6);
 CMPI.L #NIL,theWindow(A6) ;can’t read ?
 BEQ @0 ;so, exit. 
 MOVEA.L theWindow(A6),A4 ; 
 MOVE.L WrefCon(A4),theRefCon(A6);
 MOVE.L #NIL,WrefCon(A4) ; 
 MOVE.L #SizeAuxWind,D0 ;space for
 _NewHandle ;AuxWind 
 MOVE.W D0,error(A6) ;record
 BNE @1 ;error ?
 MOVEA.L theWindow(A6),A4 ;put new handle
 MOVE.L A0,WrefCon(A4) ;in WrefCon 
 MOVEA.L (A0),A3 ;initialize...
 MOVE.L #0,Worigin(A3) ;
 MOVE.L portRect(A4),WContRect(A3) ; 
 MOVE.L portRect+4(A4),WContRect+4(A3);
 TST.W hasgrow(A6) ;
 BEQ @2;if window has
 SUB.W #15,WContRect+4(A3) ;scroll bars
 SUB.W #15,WContRect+6(A3) ;portRect. -15
@2
 MOVE.W hasgrow(A6),Wgrow(A3);
 MOVE.L #NIL,WactivTxt(A3) ;
 MOVE.L #NIL,WactivLst(A3) ;
 MOVE.L WProc(A6),WindProc(A3) ;
 MOVE.L #NIL,WPrintRec(A3) ;
 MOVE.L #0,WAuxRefC(A3);
 MOVE.W #0,WvRefNum(A3);
 MOVEQ #SizeListAuxRec,D0 ;space for
 _NewHandle ;linked list
 MOVE.W D0,error(A6) ;
 BNE @1 ;
 MOVEA.L theWindow(A6),A1 ; 
 MOVE.L WrefCon(A1),A1 ;initialize 
 MOVE.L (A1),A3 ;fields
 MOVE.L A0,WList(A3) ;of list
 MOVEA.L (A0),A3 ;Aux record
 CLR.W LID(A3) ; 
 MOVE.L #NIL,theList(A3) ;
 MOVE.L #NIL,nextList(A3) ;
 CLR.W fontList(A3) ;
 CLR.W sizList(A3) ;
 MOVE.W #SizeTEAuxRec,D0 ;and for
 _NewHandle ;text
 MOVE.W D0,error(A6) ;
 BNE @1;
 MOVEA.L theWindow(A6),A1 ; 
 MOVE.L WrefCon(A1),A1 ; 
 MOVE.L (A1),A3 ; 
 MOVE.L A0,WText(A3) ;initialize
 MOVEA.L (A0),A3 ;fields
 CLR.W TID(A3) ;of text 
 MOVE.L #NIL,theText(A3) ;Aux record
 MOVE.L #NIL,nextText(A3) ;
 MOVE.W #SizePicAuxRec,D0 ;
 _NewHandle ;
 MOVE.W D0,error(A6) ;and now
 BNE @1 ;for pictures:
 MOVEA.L theWindow(A6),A1;space for 
 MOVE.L WrefCon(A1),A1 ;Pict AuxRec 
 MOVE.L (A1),A3 ;
 MOVE.L A0,WPic(A3) ;
 MOVEA.L (A0),A3 ; 
 CLR.W PID(A3) ; 
 MOVE.L #NIL,thePic(A3) ; 
 MOVE.L #NIL,nextPic(A3) ; 
 CLR.L destRect(A3) ;
 CLR.L destRect+4(A3) ;
 CLR.W tMode(A3) ;
 BRA @0; 
@1
 MOVE.L theWindow(A6),-(SP);sorry,
 _DisposWindow ;an error occurs.
@0 
 MOVE.W error(A6),D0 ;
 MOVE.L VARtheWindow(A6),A1;
 MOVE.L theWindow(A6),(A1) ;
 MOVEM.L (SP)+,A2-A4/D3-D7 ;
 UNLK A6 ; 
 MOVE.L (SP)+,A0 ;
 ADD.L #12,SP ;clean the
 MOVE.W D0,(SP) ;stack,report
 JMP (A0) ;error and quit 
;----------------------------------------------
;PROCEDURE ExecWindow
;(theEvent:EventRecord;whichWindow:WindowPtr);
;---------------------------------------------- 
;------------------------------
; Parameters
;------------------------------
whichWindow EQU 8
theEvent EQU 12
;------------------------------
ExecWindow
 LINK A6,#0 ;
 MOVEM.L A2-A4/D3-D7,-(SP) ;
 MOVEA.L whichWindow(A6),A4 ;
 TST.L WrefCon(A4) ;NIL in
 BEQ @0 ;the Wind
 MOVEA.L WrefCon(A4),A2 ;Aux Record?
 MOVEA.L (A2),A2 ;
 MOVEA.L WindProc(A2),A2;get the Wind
 CMPA.L #NIL,A2 ;proc address
 BEQ @0 ;address is NIL?
 MOVE.L theEvent(A6),-(SP) ;push eventRec
 MOVE.L whichWindow(A6),-(SP);
 JSR (A2) ;run the WindProc
@0 
 MOVEM.L (SP)+,A2-A4/D3-D7 ;
 UNLK A6 ;
 MOVEA.L (SP)+,A0 ;
 ADD.L #8,SP ;
 JMP (A0) ;
;----------------------------------------------
;FUNCTION GetWindowAuxRec
;(whichWindow:WindowPtr):Handle;
;----------------------------------------------
GetWindowAuxRec
 MOVEA.L (SP)+,A0 ;
 MOVEA.L (SP)+,A1 ;
 TST.L WrefCon(A1) ;
 BEQ @0 ;
 MOVE.L WrefCon(A1),(SP) ;
@0
 JMP(A0) ;
 
;----------------------------------------------
;PROCEDURE GetWindowClip
;(VAR contentRect:rect;VAR clipOrigin:Point;
; whichWindow:WindowPtr);
;------------------------------
; Parameters
;------------------------------
clipOrigin EQU 12
contentRect EQU 16
;------------------------------
GetWindowClip
 LINK A6,#-0 ;
 MOVEM.L A2-A4/D3-D7,-(SP) ;
 MOVE.L whichWindow(A6),A4 ;
 TST.L WrefCon(A4) ;
 BEQ @0 ;
 MOVEA.L WrefCon(A4),A0 ;
 MOVEA.L (A0),A0 ;
 MOVEA.L clipOrigin(A6),A1 ;
 MOVEA.L contentRect(A6),A2 ;
 MOVE.L Worigin(A0),(A1) ;
 MOVE.L WContRect(A0),(A2)+ ;
 MOVE.L WContRect+4(A0),(A2) ;
@0
 MOVEM.L (SP)+,A2-A4/D3-D7 ;
 UNLK A6 ;
 MOVEA.L (SP)+,A0 ;
 ADD.L #12,SP ;
 JMP (A0) ; 
;----------------------------------------------
;PROCEDURE SetWindowClip
;(contentRect:rect;clipOrigin:Point;
; whichWindow:WindowPtr);
;----------------------------------------------
SetWindowClip
 LINK A6,#-0 ;
 MOVEM.L A2-A4/D3-D7,-(SP) ;
 MOVE.L whichWindow(A6),A4 ;
 TST.L WrefCon(A4) ;
 BEQ @0 ;
 MOVEA.L WrefCon(A4),A0 ;
 MOVEA.L (A0),A0 ;
 MOVE.L clipOrigin(A6),Worigin(A0);
 MOVEA.L contentRect(A6),A2 ;
 MOVE.L (A2)+,WContRect(A0) ;
 MOVE.L (A2),WContRect+4(A0) ;
@0
 MOVEM.L (SP)+,A2-A4/D3-D7 ;
 UNLK A6 ;
 MOVEA.L (SP)+,A0 ;
 ADD.L #12,SP ;
 JMP (A0) ;
 
;----------------------------------------------
;PROCEDURE SetCurrents
;(currentText:TEHandle;currentList:ListHandle;
;whichWindow:WindowPtr);
;---------------------------------------------- 
SetCurrents
 MOVEA.L (SP)+,A0 ;
 MOVEA.L (SP)+,A1 ;
 TST.L WrefCon(A1) ;
 BEQ @0 ;
 MOVEA.L WrefCon(A1),A1 ;
 MOVEA.L (A1),A1 ;
 MOVE.L (SP)+,WactivLst(A1) ;
 MOVE.L (SP)+,WactivTxt(A1) ;
@0
 JMP (A0) ;
;----------------------------------------------
;PROCEDURE GetCurrents
;(VAR currentText:TEHandle;
;VAR currentList:ListHandle;
; whichWindow:WindowPtr);
;---------------------------------------------- 
GetCurrents
 MOVEA.L (SP)+,A0 ;
 MOVEA.L (SP)+,A1 ;
 TST.L WrefCon(A1) ;
 BEQ @0 ;
 MOVEA.L WrefCon(A1),A1 ;
 MOVEA.L (A1),A1 ;
 MOVE.L (SP)+,A2 ;
 MOVE.L WactivLst(A1),(A2);
 MOVE.L (SP)+,A2 ;
 MOVE.L WactivTxt(A1),(A2);
@0
 JMP (A0) ;
 
;----------------------------------------------
;FUNCTION WindowWithGrow
;(whichWindow:WindowPtr):BOOLEAN;
;----------------------------------------------
WindowWithGrow
 MOVEA.L (SP)+,A0 ;
 MOVEA.L (SP)+,A1 ;
 TST.L WrefCon(A1) ;
 BEQ @0 ;
 MOVEA.L WrefCon(A1),A1 ;
 MOVEA.L (A1),A1 ;
 MOVE.W Wgrow(A1),(SP) ;
@0
 JMP (A0) ;
;----------------------------------------------
;PROCEDURE DeInstalWindow (whichWindow:WindowPtr);
;----------------------------------------------
DeInstalWindow
 LINK A6,#-0 ;
 MOVEM.L A2-A4/D3-D7,-(SP) ;
 MOVE.L whichWindow(A6),A4 ;
 TST.L WrefCon(A4) ;
 BEQ @0 ; 
 MOVE.L WrefCon(A4),A4 ;we lock
 MOVE.L A4,A0 ;WindAuxRec
 _HLock ; A4 will
 MOVE.L (A4),A4 ;point on it
@2
 TST.L WText(A4);
 BEQ @1;
 MOVE.L WText(A4),A3 ;
 MOVE.L (A3),A2 ;
 MOVE.L nextText(A2),WText(A4);
 TST.L theText(A2);
 BEQ @6;dispose each
 MOVE.L theText(A2),-(SP);text...
 _TEDispose ;
@6 
 MOVE.L A3,A0 ;...and then
 _DisposHandle;the TEAuxRec
 BRA @2;
@1 
 TST.L WList(A4);
 BEQ @3;
 MOVE.L WList(A4),A3 ;
 MOVE.L (A3),A2 ;
 MOVE.L nextList(A2),WList(A4);
 TST.L theList(A2);
 BEQ @7;dispose each
 MOVE.L theList(A2),-(SP);list...
 _LDispose ;
@7
 MOVE.L A3,A0 ;
 _DisposHandle;...and then
 BRA @1;the ListAuxRec
@3
 TST.L WPic(A4) ;
 BEQ @4;
 MOVE.L WPic(A4),A3 ;
 MOVE.L (A3),A2 ;
 MOVE.L nextPic(A2),WPic(A4) ;
 TST.L thePic(A2) ;
 BEQ @8;dispose each
 MOVE.L thePic(A2),-(SP) ;picture
 _KillPicture ;
@8
 MOVE.L A3,A0 ;
 _DisposHandle;and the
 BRA @3;PicAuxRec 
@4 
 TST.L WPrintRec(A4) ;
 BEQ @5;dispose
 MOVE.L WPrintRec(A4),A0 ;the PrintRecord
 _DisposHandle;
@5 
 MOVE.L whichWindow(A6),A4 ;
 MOVE.L WrefCon(A4),A4 ;
 MOVE.L A4,A0 ;
 _HUnLock;
 MOVE.L whichWindow(A6),-(SP);dispose the 
 _DisposWindow;window
@0 
 MOVEM.L (SP)+,A2-A4/D3-D7 ;
 UNLK A6 ;
 MOVEA.L (SP)+,A0 ;
 ADD.L #4,SP ;
 JMP (A0) ;
 
END
Listing: LPic.Asm
;*************************************
;* P I C T U R E M A N A G E R *
;*************************************
INCLUDE Library.Txt
;--------------------------------
; *** Externals Definition ***
;-------------------------------- 
XDEF InstalPict
XDEF DrawPicts
XDEF FindPict
 
;------------------------------
; ****** Picture Record ******
;------------------------------ 
; Picture = Record { 10 bytes}
;{ 0} picSize : INTEGER
;{ 2} picFrame : Rect 
;------------------------------
;****** Pic Aux Record ********
;------------------------------ 
;AuxPicRec = Record {16}
;{0} PID :INTEGER
;{2} thePic :PicHandle
;{6} nextPic :AuxPicHandle
;{10} tMode :INTEGER
;{12} destRect :Rect
 
;---------------------------------------------- 
;FUNCTION InstalPict
;(PicID:INTEGER;whichWindow:WindowPtr):OSErr;
;----------------------------------------------
;------------------------------
; Parameters
;------------------------------
whichWindow EQU 8
PicID EQU 12
;------------------------------
; Local Variables
;------------------------------
theHandle EQU -10
theNPict EQU -6
error EQU -2
;------------------------------
InstalPict
 LINK A6,#-10 ;
 MOVEM.L A2-A4/D3-D7,-(SP) ;
 MOVE.W #noErr,error(A6) ; 
 SUBQ.L #4,SP ;place for PicHdl
 MOVE.W PicID(A6),-(SP) ;pic ID
 _GetPicture ;read it...
 MOVE.L (SP)+,A3 ;
 SUBQ.L #2,SP ;
 _ResError ;
 MOVE.W (SP)+,error(A6) ;
 BNE @0 ;if error :go @0
 MOVE.L A3,-(SP) ;now, detach our
 _DetachResource ;pic resource from the
 SUBQ.L #2,SP ;resource list
 _ResError ;if an error occurs
 MOVE.W (SP)+,error(A6) ;we report it
 BNE @0 ;and we abort.
 MOVE.L A3,theNPict(A6) ;
 MOVE.L whichWindow(A6),A0 ;
 MOVE.L WrefCon(A0),A0 ;
 MOVE.L (A0),A0 ;we find the pict
 MOVE.L WPic(A0),A2 ;list for this window
 MOVEA.L (A2),A3 ;
 CMPI.L #NIL,thePic(A3);no pict,go @1
 BEQ @1 ;
 
@3
 CMPI.L #NIL,nextPic(A3) ;
 BEQ @2 ;we must find
 MOVEA.L nextPic(A3),A3 ;the last pic AuxRec
 MOVEA.L (A3),A3 ;of the list
 BRA @3 ; 
@2
 MOVEQ #SizePicAuxRec,D0 ;
 _NewHandle ;create a new
 MOVE.W D0,error(A6) ;pic AuxRec
 BNE @0 ;
 MOVE.L A0,nextPic(A3) ;
 MOVEA.L A0,A3 ;
 MOVEA.L (A3),A3 ;
 MOVE.W picID(A6),PID(A3);
 MOVE.L theNPict(A6),thePic(A3);
 MOVE.L theNPict(A6),A0;
 MOVE.L (A0),A0 ;
 MOVE.L picFrame(A0),destRect(A3);
 MOVE.L picFrame+4(A0),destRect+4(A3);
 MOVE.L #NIL,nextPic(A3) ;
 CLR.W tMode(A3) ;
 BRA @0 
@1 
 MOVE.W picID(A6),PID(A3);pic AuxRec already 
 ;exists
 MOVE.L theNPict(A6),thePic(A3);
 MOVE.L theNPict(A6),A0;we initialize its 
 ;fields
 MOVE.L (A0),A0 ;
 MOVE.L picFrame(A0),destRect(A3);
 MOVE.L picFrame+4(A0),destRect+4(A3);
 MOVE.L #NIL,nextPic(A3);
 CLR.W tMode(A3) ; 
@0
 MOVE.W error(A6),D0 ;
 MOVEM.L (SP)+,A2-A4/D3-D7 ;
 UNLK A6 ;
 MOVE.L (SP)+,A1 ;
 ADD.L #6,SP ;
 MOVE.W D0,(SP) ;
 JMP(A1) ;
 
;---------------------------------------------- 
;PROCEDURE DrawPicts(whichWindow:WindowPtr);
;------------------------------
; local variables
;------------------------------
AuxPicHdl EQU -4
;------------------------------
DrawPicts
 LINK A6,#-4 ;
 MOVEM.L A2-A4/D3-D7,-(SP) ; 
 MOVE.L whichWindow(A6),A0 ;
 MOVE.L WrefCon(A0),A0 ;
 MOVE.L (A0),A0 ;
 MOVE.L WPic(A0),A3 ;the first
 MOVE.L A3,AuxPicHdl(A6) ;pic AuxRec
 MOVE.L (A3),A3 ;for this window
 CMPI.L #NIL,thePic(A3) ;no pict for this
 BEQ @0 ;window, go @0 
@3 
 MOVE.W tMode(A3),-(SP) ;
 _PenMode ;we set the pen mode
 MOVE.L AuxPicHdl(A6),A3 ;before drawing
 MOVE.L (A3),A3 ; 
 MOVE.L thePic(A3),-(SP) ;
 PEA destRect(A3) ;
 _DrawPicture ;
 _PenNormal ;
 MOVE.L AuxPicHdl(A6),A3 ;
 MOVE.L (A3),A3 ;
 CMPI.L #NIL,nextPic(A3) ;another pict to draw
 BEQ @0 ;no so go @0
 MOVEA.L nextPic(A3),A3 ;
 MOVE.L A3,AuxPicHdl(A6) ;
 MOVEA.L (A3),A3 ;
 BRA @3 ;
@0
 MOVEM.L (SP)+,A2-A4/D3-D7 ;
 UNLK A6 ;
 MOVE.L (SP)+,A0 ;
 ADD.L #4,SP ;
 JMP (A0) ; 
 
;---------------------------------------------- 
;FUNCTION FindPict
;(thePoint:Point;whichWindow:WindowPtr):PicHande
;------------------------------
; Parameters
;------------------------------
thePointEQU 12
;------------------------------
; Local Variables
;------------------------------
theFPic EQU -4
;------------------------------
FindPict
 LINK A6,#-4 ;
 MOVEM.L A2-A4/D3-D7,-(SP) ;
 MOVE.L #NIL,A1 ;
 MOVE.L whichWindow(A6),A0 ;
 MOVE.L WrefCon(A0),A0 ;
 MOVE.L (A0),A0 ;
 MOVE.L WPic(A0),A3 ;
 MOVEA.L (A3),A3 ;
 CMPI.L #NIL,thePic(A3) ;
 BEQ @0 ; 
@3
 MOVE.L thePic(A3),A0 ;
 MOVE.L A0,theFPic(A6) ; 
 SUBQ.L #2,SP ;
 MOVE.L thePoint(A6),-(SP) ;
 PEA destRect(A3) ;do we cliked
 _PtInRect ;in this pict ?
 TST.B (SP)+ ;
 BNE @1 ;yes, so go @1
 CMPI.L #NIL,nextPic(A3) ;no, next pict
 BEQ @0 ;in the (if any)
 MOVEA.L nextPic(A3),A3;if not, go @0
 MOVEA.L (A3),A3 ;
 BRA @3 ; 
@1
 MOVE.L theFPic(A6),A1 ;we’ve found it 
 
@0
 MOVEM.L (SP)+,A2-A4/D3-D7 ;
 UNLK A6 ;
 MOVE.L (SP)+,A0 ;
 ADD.L #8,SP ;
 MOVE.L A1,(SP) ;
 JMP (A0) ; 
 
END
Listing: LCntrl.Asm
;******************************************
;* CONTROL M A N A G E R *
;******************************************
INCLUDE Library.Txt
;------------------------------
; *** External Definition ***
;------------------------------ 
XDEF InstalControl
XDEF ExecControl
XDEF HiliteAllControls 
;------------------------------
; Control Record
;------------------------------ 
;ControlRecord = Record { 41 bytes}
;{ 0} nextControl : ControlHandle
;{ 4} contrlOwner : GrafPtr
;{ 8} contrlRect : Rect
;{ 16} contrlVis : Byte
;{ 17} contrlHilite : Byte
;{ 18} contrlValue : INTEGER
;{ 20} contrlMin : INTEGER
;{ 22} contrlMax : INTEGER
;{ 24} contrlDefProc : DEFfunHandle
;{ 28} contrlData : Handle
;{ 32} contrlAction : ProcPtr
;{ 36} contrlrfCon : LongInt
;{ 40} contrlTitle : String
;------------------------------
; Control AuxRecord
;------------------------------
;ControlAuxRecord = Record { 6 bytes}
;{ 0} contrlID : INTEGER
;{ 2} contrlProc : ProcPtr
;----------------------------------------------
;FUNCTION InstalControl
;(cntrlID:INTEGER;cntrlProc:ProcPtr;
;whichWindow:WindowPtr);INTEGER;
;------------------------------
; Parameters
;------------------------------
cntrlProc EQU 12
cntrlID EQU 16
whichWindow EQU 8
;------------------------------
; Local Variables
;------------------------------
error EQU -2
newContrl EQU -6
;------------------------------
InstalControl
 LINK A6,#-6 ;
 MOVEM.L A2-A4/D3-D7,-(SP) ;
 MOVE.W #noErr,error(A6) ;
 SUBQ.L #4,SP ;
 MOVE.W cntrlID(A6),-(SP) ;the control ID
 MOVE.L whichWindow(A6),-(SP) ;
 _GetNewControl ;get it from 
 MOVE.L (SP)+,A3 ;resource file
 MOVE.L A3,newContrl(A6) ;
 MOVE.W #nilHandleErr,error(A6);
 CMPA.L #NIL,A3 ;can’t get it ?
 BEQ @0 ;go @0
 MOVEQ #SizeCtrlAuxRec,D0 ;create a new
 _NewHandle ;Cntl AuxRec
 BNE @1;if we can’t, go @1
 MOVE.L newContrl(A6),A3 ;
 MOVE.L (A3),A3 ;
 MOVE.L A0,contrlrfCon(A3) ;we replace the 
 MOVE.L (A0),A0 ;cntl refcon with
 MOVE.W cntrlID(A6),contrlID(A0) ;our AuxRec
 MOVE.L cntrlProc(A6),contrlProc(A0);and save
 MOVE.W #noErr,error(A6) ;in it the cntl ID
 BRA @0;and the Cntlproc
@1 
 MOVE.L newContrl(A6),-(SP) ;
 _DisposControl ;
@0
 MOVE.W error(A6),D0 ;
 MOVEM.L (SP)+,A2-A4/D3-D7 ;
 UNLK A6 ;
 MOVE.L (SP)+,A0 ;
 ADD.L #10,SP ;
 MOVE.W D0,(SP) ;
 JMP (A0) ; 
 
;----------------------------------------------
;PROCEDURE ExecControl
;(theControl:ControlHandle);
;------------------------------
; Parameters
;------------------------------
theControl EQU 8
;------------------------------
ExecControl
 LINK A6,#0 ;
 MOVEM.L A2-A4/D3-D7,-(SP) ;
 MOVE.L theControl(A6),A1 ;
 MOVE.L (A1),A1 ;
 MOVEA.L contrlrfCon(A1),A1 ;
 CMPA.L #NIL,A1 ;
 BEQ @0 ; 
 MOVEA.L (A1),A1 ;
 MOVEA.L contrlProc(A1),A1;we run the 
 MOVE.L theControl(A6),-(SP);cntlProc 
 JSR (A1) ;and we return 
@0 ;
 MOVEM.L (SP)+,A2-A4/D3-D7 ;
 UNLK A6 ;
 MOVE.L (SP)+,A0 ;
 ADD.L #4,SP ;
 JMP (A0) ; 
;----------------------------------------------
;PROCEDURE HiliteAllControls
;(HiliteState:INTEGER;whichWindow:WindowPtr);
;------------------------------
; Parameters
;------------------------------
HiliteState EQU 12
;------------------------------
; Local Variables
;------------------------------
CntrlHdlEQU -4
;------------------------------
HiliteAllControls
 LINK A6,#-4 ;
 MOVEM.L A2-A4/D3-D7,-(SP) ;
 MOVE.L whichWindow(A6),A1 ;
 MOVE.L wControlList(A1),A3 ;
 CMPA.L #NIL,A3 ;
 BEQ @0 ;
@1 
 MOVE.L A3,CntrlHdl(A6) ;
 MOVE.L (A3),A3 ;
 CMPI.L #-1,contrlrfCon(A3) ;
 BEQ @2 ;
 MOVE.L CntrlHdl(A6),-(SP);
 MOVE.W HiliteState(A6),-(SP) ; 
 _HiliteControl ;
@2
 MOVE.L CntrlHdl(A6),A3;
 MOVEA.L (A3),A3 ;
 MOVE.L nextControl(A3),A3 ;
 CMPA.L #NIL,A3 ;
 BNE @1 ;
@0 
 MOVEM.L (SP)+,A2-A4/D3-D7 ;
 UNLK A6 ;
 MOVE.L (SP)+,A0 ;
 ADD.L #6,SP ;
 JMP (A0) ; 
 
END
Listing: NewToolBox.h
/*--------------------------------------
 I N C L U D E F I L E S 
 C O N S T A N T S 
 & 
 R O U T I N E S I N T E R F A C E 
--------------------------------------*/
#ifndef _NewToolBox_
#define _NewToolBox_
 
typedef struct WindInfoRec {
 Point Worigin;
 Rect WContRect;
 TEHandle WactivTxt;
 ListHandle WactivLst;
 BooleanWgrow;
 THPrintWPrintRec; 
 ProcPtrWindProc;
 int WvRefNum;
 long WAuxRefC;
 Handle WText;
 Handle WList;
 Handle WPic;
 } WindInfoRec,*WindInfoPtr,**WindInfoHdl;
typedef struct ListAuxRec {
 int ID;
 ListHandle theList;
 Handle nextList;
 int fontList;
 int sizList;
 } ListAuxRec,*ListAuxPtr,**ListAuxHdl;
 
typedef struct PicAuxRec {
 int ID; 
 PicHandle thePic;
 Handle nextPic;
 int tMode;
 Rect destRect;
 } PicAuxRec,*PicAuxPtr,**PicAuxHdl;
 
typedef struct TEAuxRec {
 int ID; 
 TEHandle theText; 
 Handle nextText;
 } TEAuxRec,*TEAuxPtr,**TEAuxHdl;
typedef struct ControlAuxRec {
 int contrlID;
 ProcPtrcontrlProc;
 } ControlAuxRec,*ControlAuxPtr,**ControlAuxHdl;
 
/*----------------------*/
extern pascal OSErrInstalWindow();
extern pascal void DeInstalWindow(WindowPtr whichWindow);
extern pascal void ExecWindow();
extern pascal Handle GetWindowAuxRec(WindowPtr whichWindow);
extern pascal void 
GetWindowClip(Rect *contentRect,Point*clipOrigin,
 WindowPtr whichWindow);
extern pascal void 
SetWindowClip(Rect *contentRect,Point clipOrigin,
 WindowPtr whichWindow);
extern pascal void 
SetCurrents(TEHandle CurrentText,ListHandle 
 CurrentList,WindowPtr whichWindow);
extern pascal void 
GetCurrents(TEHandle *CurrentText,ListHandle
 *CurrentList,WindowPtr whichWindow);
extern pascal BooleanWindowWithGrow(WindowPtr whichWindow);
/*----------------*/
extern pascal void ActivateText(WindowPtr whichWindow);
extern pascal void DeactivateText(WindowPtr whichWindow);
extern pascal void DrawTexts(WindowPtr whichWindow);
extern pascal OSErr
InstalText(int textID,WindowPtr whichWindow);
extern pascal TEHandle 
FindText(Point thePoint,WindowPtr whichWindow);
/*----------------*/
extern pascal void 
DeactivateList(WindowPtr whichWindow);
extern pascal void ActivateList(WindowPtr whichWindow);
extern pascal void 
ListKey(char key,ListHandle inList);
extern pascal void DrawLists(WindowPtr whichWindow);
extern pascal ListHandle 
FindList(Boolean testControl,Point thePoint, WindowPtr whichWindow);
extern pascal OSErr 
InstalList(int listID,WindowPtr whichWindow);
/*----------------*/
extern pascal OSErr
InstalPict(int PicID,WindowPtr whichWindow);
extern pascal void DrawPicts(WindowPtr whichWindow);
extern pascal PicHandle 
FindPict(Point thePoint,WindowPtr whichWindow);
/*----------------*/
extern pascal OSErrInstalControl();
extern pascal void 
ExecControl(ControlHandle theControl); 
extern pascal void 
HiliteAllControls(int HiliteState, WindowPtr whichWindow); 
#endif _NewToolBox_
Listing: CExecWindow.c
/* T H E W I N D O W P R O C E D U R E 
 May 1989 - HA OLIVER
*/
#include “Demo.h”
extern RectdragRect,growRect;
extern TEHandle CurrentText;
extern ListHandle CurrentList;
extern WindowPtrCurrentPort;
extern Handle ListList,TextList,PictList;
extern Boolean isDoc;
extern int dh,dv;
static WindowPtrtheWindow;
static EventRecordtheEvent;
/*------------ Grow*/
DoGrow()
{
}
/*- mouseDown is in “theWindow” ...*/
TestInContent(global)
Point global;
{
 Point newOr,local;
 Rect contRect;
 char result;
 TEHandle theText;
 ListHandle theList;
 int inControlPart;
 ControlHandle theControl;
 PicHandlethePic;
 
local=global;
GetWindowClip(&contRect,&newOr,theWindow);
SetOrigin(0,0);
GlobalToLocal(&local);
ClipRect(&(*theWindow).portRect);
 
if (PtInRect(local,&contRect))
{
 OffsetRect(&contRect,newOr.h,newOr.v);
 ClipRect(&contRect);
 SetOrigin(newOr.h,newOr.v);
 local=global;
 GlobalToLocal(&local);
 
theText=FindText(local,theWindow);
 if (theText!=NULL)
 { if (theText!=CurrentText)
 { if (CurrentText!=NULL)
 TEDeactivate(CurrentText);
 TEActivate(theText);
 CurrentText=theText;
 }
 if (CurrentList!=NULL)
 LActivate(false,CurrentList);
 CurrentList=NULL;
 TEClick(local,false,CurrentText);
 }
 else
 {
theList=FindList(true,local,theWindow);
 if (theList!=NULL)
 { if (theList!=CurrentList)
 { if (CurrentList!=NULL)
 LActivate(false,CurrentList);
 LActivate(true,theList);
 CurrentList=theList;
 }
 if (CurrentText!=NULL) 
 TEDeactivate(CurrentText);
 CurrentText=NULL;
 result =
 LClick(local,theEvent.modifiers,CurrentList);
 }
 else
 { 
inControlPart=
FindControl(local,theWindow,&theControl);
 if (theControl!=NULL)
 {
 if (CurrentList!=NULL)
 LActivate(false,CurrentList);
 CurrentList=NULL;
 if (CurrentText!=NULL) 
 TEDeactivate(CurrentText);
 CurrentText=NULL;
 
 switch(inControlPart)
 {
 case inButton :
 if (TrackControl(theControl,local,NULL)!=0) 
 ExecControl(theControl);break;
 case inCheckBox :
if (TrackControl(theControl,local,NULL)!=0)
 {
 switch(GetCtlValue(theControl))
 {
 case 1:
 SetCtlValue(theControl,0);break;
 case 0:
 SetCtlValue(theControl,1);break;
 } 
 ExecControl(theControl);
 };break;
 case inUpButton :
 case inDownButton:
 case inPageDown :
 case inPageUp :
 case inThumb : 
 default:break;
 
 }
 }
 else
 {
 if (CurrentList!=NULL) 
 LActivate(false,CurrentList);
 CurrentList=NULL;
 if (CurrentText!=NULL) 
 TEDeactivate(CurrentText);
 CurrentText=NULL;
 thePic=FindPict(local,theWindow);
 if(thePic!=NULL)
 {
 SysBeep(5);
 }
 }
 }
}
 SetCurrents(CurrentText,CurrentList,theWindow);
 
 }
}
/*---- mouseDown */
DoMouseDown()
{ 
 switch(FindWindow(theEvent.where,&theWindow))
 {
 case inContent :
 if (theWindow!=FrontWindow()) SelectWindow(theWindow);
 else TestInContent(theEvent.where);break;
 
 case inGoAway :
 if (TrackGoAway(theWindow,theEvent.where))
 { 
 DeInstalWindow(theWindow);
 CurrentText=NULL; 
 CurrentList=NULL;
 if (FrontWindow()==NULL) isDoc=FALSE; 
 };break;
 
 case inGrow :
 if (theWindow!=FrontWindow()) 
 SelectWindow(theWindow);
 else if (WindowWithGrow(theWindow)) 
 DoGrow();break;
 case inDrag :
 DragWindow(theWindow,theEvent.where,&dragRect);
 break;
 
 case inZoomIn :
 case inZoomOut :break;
 }
}
/*------------ A key Down... */
DoKeyDown()
{
 Rect contRect;
 PointnewOr;
 register char key;
 
 GetWindowClip(&contRect,&newOr,theWindow);
 OffsetRect(&contRect,newOr.h,newOr.v);
 ClipRect(&contRect);
 SetOrigin(newOr.h,newOr.v);
 key =theEvent.message & charCodeMask;
 if (CurrentText!=NULL) 
 TEKey(key,CurrentText);
 if (CurrentList!=NULL) 
 { 
 ObscureCursor();
 ListKey(key,CurrentList);
 }
}
/*---------- Update the Window */
DoUpdate()
{
 Rect contRect;
 Point newOr;
BeginUpdate(theWindow);
EraseRect(&(*theWindow).portRect);
SetOrigin(0,0);
ClipRect(&(*theWindow).portRect);
if (WindowWithGrow(theWindow)) DrawGrowIcon(theWindow); GetWindowClip(&contRect,&newOr,theWindow); 
 OffsetRect(&contRect,newOr.h,newOr.v);
ClipRect(&contRect); 
SetOrigin(newOr.h,newOr.v);
DrawPicts(theWindow); 
DrawTexts(theWindow);
DrawLists(theWindow);
DrawControls(theWindow);
EndUpdate(theWindow);
}
 
/*---------------------- Activate the Window*/ 
DoActivate()
{
 Rect contRect;
 Point newOr;
 
if (theEvent.modifiers & activeFlag) 
{
 SetOrigin(0,0);
 ClipRect(&(*theWindow).portRect); 
 HiliteAllControls(CtlActive,theWindow);
 if (WindowWithGrow(theWindow))
 DrawGrowIcon(theWindow); 
 GetWindowClip(&contRect,&newOr,theWindow);
 OffsetRect(&contRect,newOr.h,newOr.v);
 ClipRect(&contRect);
 SetOrigin(newOr.h,newOr.v);
 ActivateText(theWindow);
 ActivateList(theWindow); 
}
 else
{
 SetOrigin(0,0);
 ClipRect(&(*theWindow).portRect);
 HiliteAllControls(CtlInactive,theWindow);
 if (WindowWithGrow(theWindow)) 
 DrawGrowIcon(theWindow); 
 GetWindowClip(&contRect,&newOr,theWindow); OffsetRect(&contRect,newOr.h,newOr.v);
 ClipRect(&contRect);
 SetOrigin(newOr.h,newOr.v);
 DeactivateText(theWindow);
 DeactivateList(theWindow);
}
}
/*---------------------- */
DoNullEvent()
{
}
/*---- Resume or Suspend needed... */
DoMulti()
{
 Rect contRect;
 Point newOr;
 
if (theEvent.message & 1)
{
 SetOrigin(0,0);
 ClipRect(&(*theWindow).portRect); 
 HiliteAllControls(CtlActive,theWindow);
 if (WindowWithGrow(theWindow)) 
 DrawGrowIcon(theWindow); 
 GetWindowClip(&contRect,&newOr,theWindow);
 OffsetRect(&contRect,newOr.h,newOr.v);
 ClipRect(&contRect);
 SetOrigin(newOr.h,newOr.v);
 ActivateText(theWindow);
 ActivateList(theWindow); 
}
 else
{
 SetOrigin(0,0);
 ClipRect(&(*theWindow).portRect); 
 HiliteAllControls(CtlInactive,theWindow);
 if (WindowWithGrow(theWindow)) 
 DrawGrowIcon(theWindow); 
 GetWindowClip(&contRect,&newOr,theWindow);
 OffsetRect(&contRect,newOr.h,newOr.v);
 ClipRect(&contRect);
 SetOrigin(newOr.h,newOr.v);
 DeactivateText(theWindow);
 DeactivateList(theWindow);
}
}
/*----This Function is called when 
 an Event occurs for “theWindow”
*/ 
pascal void MyWindow(anEventAdd,inWindow)
EventRecord *anEventAdd;
WindowPtr inWindow;
{
 
 theWindow = inWindow;
 theEvent = *anEventAdd;
 GetPort(&CurrentPort);
 SetPort(theWindow);
 switch(theEvent.what)
 {
 case nullEvent :DoNullEvent();break;
 case mouseDown :DoMouseDown();break;
 case mouseUp :break;
 case keyDown :DoKeyDown();break;
 case keyUp :break;
 case autoKey :DoKeyDown();break;
 case updateEvt :DoUpdate();break;
 case activateEvt :DoActivate();break;
 case diskEvt :break;
 case multiFinderEvt:DoMulti();break;
 default:break; /* HighLevelEvent ? */
 }
 SetPort(CurrentPort);
}
/*--------------------*/
Listing: CControl.c
/* -- C O N T R O L P R O C E D U R E 
 May 1989 - HA OLIVER
*/
#include “Demo.h”
pascal void MyControl(theControl)
ControlHandle theControl;
{
 SysBeep(5);
}
/*--------------*/
Listing: CDoMenu.c
/*----------- D O M E N U 
 May 1989 - HA OLIVER
*/
#include “Demo.h”
extern MenuHandle myMenus[LastMenu];
extern Boolean notFinished,isDoc;
extern TEHandle CurrentText;
extern ListHandle CurrentList;
extern WindowPtrCurrentPort;
extern pascal voidMyWindow(),MyControl();
/*---------------------- Menu choice.*/
doMenu(result)
long result;
{
 int theItem,theMenu;
 Str255 name;
 
 theMenu=HiWord(result);
 theItem=LoWord(result);
 switch(theMenu)
 {
 case AppleM:switch(theItem)
 {
 case AboutCom:break;
 default : GetItem(myMenus[1],theItem,&name);
 OpenDeskAcc(&name);break;
 }
 break;
 
 case FileM :switch(theItem)
 {
 case Example1 :doExample1();break;
 case Example2 :doExample2();break;
 case Example3 :doExample3();break;
 case Example4 :doExample4();break;
 case Example5 :doExample5();break;
 case QuitCom : notFinished=FALSE;break;
 }
 break; 
 }
 HiliteMenu(0);
}
/*---------------------- Example1*/
doExample1()
 {
 WindowPtrtheWindow;
 OSErr err;
 
 err =InstalWindow(&theWindow,16001,MyWindow,false);
 if (err==0)
 {
 err =InstalText(6001,theWindow);
 err =InstalText(6002,theWindow);
 err =InstalList(7001,theWindow);
 err =InstalPict(8002,theWindow);
 DisableItem(myMenus[2],1);
 SetWTitle(theWindow,”\pExample #1");
 ShowWindow(theWindow);
 isDoc=true;
 }
 }
 
doExample2()
 {
 WindowPtrtheWindow;
 OSErr err;
 
 err =InstalWindow(&theWindow,16002,MyWindow,false);
 if (err==0)
 {
 err =InstalText(6003,theWindow);
 err =InstalList(7002,theWindow);
 err =InstalPict(8001,theWindow);
 DisableItem(myMenus[2],2);
 SetWTitle(theWindow,”\pExample #2");
 ShowWindow(theWindow);
 isDoc=true;
 }
 }
doExample3()
 {
 WindowPtrtheWindow;
 OSErr err;
 
 err =InstalWindow(&theWindow,16003,MyWindow,false);
 if (err==0)
 {
 err =InstalPict(8003,theWindow);
 DisableItem(myMenus[2],3);
 SetWTitle(theWindow,”\pExample #3");
 ShowWindow(theWindow);
 isDoc=true;
 }
 }
 
doExample4()
 {
 WindowPtrtheWindow;
 OSErr err;
 
 err =InstalWindow(&theWindow,16004,MyWindow,false);
 if (err==0)
 {
 err=InstalList(7003,theWindow);
 err=InstalControl(8001,MyControl,theWindow);
 err=InstalControl(8002,MyControl,theWindow);
 err=InstalControl(8003,MyControl,theWindow);
 DisableItem(myMenus[2],4);
 SetWTitle(theWindow,”\pExample #4");
 ShowWindow(theWindow);
 isDoc=true;
 }
 }
 
doExample5()
 {
 WindowPtrtheWindow;
 OSErr err;
 
 err =InstalWindow(&theWindow,16005,MyWindow,false);
 if (err==0)
 {
 err=InstalList(7004,theWindow);
 err=InstalList(7003,theWindow);
 DisableItem(myMenus[2],5);
 SetWTitle(theWindow,”\pExample #5");
 ShowWindow(theWindow);
 isDoc=true;
 }
 }
Listing: Demo.h
/*--------------------------------------
 I N C L U D E F I L E S & C O N S T A N T S
 --------------------------------------*/
#ifndef _Demo_
#define _Demo_
#include “QuickDraw.h”
#include “MacTypes.h”
#include “FontMgr.h”
#include “WindowMgr.h”
#include “MenuMgr.h”
#include “TextEdit.h”
#include “DialogMgr.h”
#include “EventMgr.h”
#include “DeskMgr.h”
#include “FileMgr.h”
#include “ToolboxUtil.h”
#include “ControlMgr.h”
#include “ColorToolbox.h”
#include “Color.h”
#include “OSUtil.h”
#include “ControlMgr.h”
#include “ListMgr.h”
#include “PrintMgr.h”
#include “StdFilePkg.h”
#include “sane.h”
#include “SegmentLdr.h”
#include “NewToolBox.h”
/*---------------------- Constants*/
#define NULL 0L
#define versRequested1
#define CtlInactive255
#define CtlActive0
/*---------------------- MultiFinder*/
#define sleep 0L
#define multiFinderEvt 15
#define WaitNextEventTrap 0x60
#define UnImplementedTrap 0x9f
/*---------------------- Menu*/
#define AppleM 128
#define FileM 129
#define QuitCom 7
#define Example1 1
#define Example2 2
#define Example3 3
#define Example4 4
#define Example5 5
#define AboutCom 1
#define LastMenu 2
/*---------------------- */
#endif _Demo_
Listing: Demo.c
/*---- D E M O . C
 May 1989 - HA OLIVER
*/
#include “Demo.h”
/*---------------------- Globals...*/
TEHandleCurrentText;
ListHandleCurrentList;
WindowPtr CurrentPort;
Handle ListList,TextList,PictList;
SysEnvRec theWorld;
MenuHandlemyMenus[LastMenu];
CursHandleIbeamHdl,WatchHdl,PlusHdl,CrossHdl;
Cursor Ibeam,Watch,Plus,Cross;
Boolean MultiFinder,notFinished=TRUE,isDoc=FALSE;
EventRecord Event; 
char theChar;
Rect dragRect = { 0, 0, 1024, 1024 },
 growRect = { 0, 0, 1024, 1024 };
/*-------- SetUp Cursors*/
SetUpCursor()
{
 WatchHdl =GetCursor(watchCursor);
 IbeamHdl =GetCursor(iBeamCursor);
 CrossHdl =GetCursor(crossCursor);
 PlusHdl=GetCursor(plusCursor);
 Watch =**WatchHdl;
 Ibeam =**IbeamHdl;
 Cross =**CrossHdl;
 Plus =**PlusHdl;
}
/*---- Set Up the Menu Bar*/
SetUpMenus()
{
 register int i;
 
 myMenus[1] = GetMenu(AppleM);
 myMenus[2] = GetMenu(FileM);
 for ( (i=1); (i<=LastMenu); i++ )
 InsertMenu(myMenus[i], 0);
 DrawMenuBar(); 
}
/*---- SetUp System*/
SetUpSystem()
{
 InitGraf(&thePort);
 InitFonts();
 InitWindows();
 InitMenus();
 TEInit();
 InitDialogs(NULL);
 InitAllPacks();
 InitCursor();
 MaxApplZone();
 MoreMasters();
 MoreMasters();
 MoreMasters();
 MoreMasters();
 MoreMasters();
 FlushEvents(everyEvent,0);
}
/*---- SetUp some Variables ...*/
SetUpVariables()
{
 CurrentText=NULL;
 CurrentList=NULL;
 if (GetTrapAddress(WaitNextEventTrap)
==GetTrapAddress(UnImplementedTrap))
 MultiFinder=FALSE;
 else
 MultiFinder=TRUE;
 if (SysEnvirons(1,&theWorld)!=envNotPresent)
 {
 }
 else notFinished=FALSE;
}
/*---------------------- Adjust Cursor form*/
MaintainCursor()
{
 WindowPtrtheWindow;
 Point pt,newOr;
 Rect contRect;
 Cursor theCursor;
 Booleanchanged;
 
 changed =FALSE;
 theWindow=FrontWindow();
 GetPort(&CurrentPort);
 SetPort(theWindow);
 GetWindowClip(&contRect,&newOr,theWindow);
 OffsetRect(&contRect,newOr.h,newOr.v);
 GetMouse(&pt);
 if (PtInRect(pt,&contRect))
 {
 ClipRect(&contRect);
 SetOrigin(newOr.h,newOr.v);
 if (FindText(pt,theWindow)!=NULL)
 { theCursor=Ibeam;
 changed =TRUE;
 }
 if (FindList(false,pt,theWindow)!=NULL)
 { theCursor=Plus;
 changed =TRUE;
 }
 }
 if (changed)
 SetCursor(&theCursor);
 else
 SetCursor(&arrow);
 SetPort(CurrentPort);
}
/*- How many bytes are free ?*/
CheckMemory()
{
}
/*-- Adjust all Menus*/
MaintainMenu()
{
}
/*---- The Event Loop !*/
doLoop()
{
 WindowPtrinWindow;
 int where;
 BooleaneventOK;
 
 SystemTask();
 if (CurrentText!=NULL) TEIdle(CurrentText);
 if (isDoc) MaintainCursor();
 MaintainMenu();
 CheckMemory();
 
 if (MultiFinder) 
 eventOK=
 WaitNextEvent(everyEvent,&Event,sleep,NULL);
 else
 eventOK=GetNextEvent(everyEvent,&Event);
 
 where=FindWindow(Event.where,&inWindow);
 if (eventOK)
 {
 switch (Event.what) 
 { case nullEvent:break;
 case mouseDown :
 {
 switch (where) 
 { 
 case inMenuBar :
 doMenu(MenuSelect(Event.where));break;
 case inSysWindow :
 SystemClick(&Event,inWindow);break;
 case inDesk :break;
 default:
 ExecWindow(&Event,inWindow);break;
 }
 };break; 
 
 case keyDown :
 case keyUp :
 case autoKey :
 { 
 theChar = Event.message & charCodeMask;
 if ((Event.modifiers & cmdKey) != 0) 
 doMenu(MenuKey(theChar));
 else
 if(inWindow!=NULL)
 ExecWindow(&Event,inWindow); 
 };break;
 case diskEvt :
 case driverEvt :break;
 case multiFinderEvt : 
 if (FrontWindow()!=NULL) 
 ExecWindow(&Event,FrontWindow());break;
 case activateEvt :
 case updateEvt :
 ExecWindow(&Event,Event.message);break;
 }
 }
}
/*---- the main() ...*/
main()
{
 SetUpSystem();
 SetUpVariables();
 SetUpCursor();
 SetUpMenus();
 
 while(notFinished)
 {
 doLoop();
 }
}
Continued in next frame
Volume Number: 6
Issue Number: 10
Column Tag: Assembly Lab

New Toolbox Routines (code 2)

By Hugues A. Oliver, Perpignan, France

Listing: Demo.r
Demo.Rsrc
* -------- MultiFinder --------
Type SIZE = GNRL
 ,-1
.I
22528 ;; 
.L
262144 ;; 
.L
262144 ;; 
 
* -------- Menu definition --------
Type MENU
,128
14円
,129
File
Example 1
Example 2
Example 3
Example 4
Example 5
(-
Quit /Q
* -------- Window --------
Type WIND
 ,16001
50 55 320 430
Invisible GoAway
4
0
Type WIND
 ,16002
66 71 336 446
Invisible GoAway
4
0
Type WIND
 ,16003
82 87 342 452
Invisible GoAway
16
0
Type WIND
 ,16004
98 87 358 462
Invisible GoAway
4
0
Type WIND
 ,16005
114 87 358 462
Invisible GoAway
4
0
* -------- Text --------
Type TEHD = GNRL
 ,6001
.I
10 10 100 244
10 10 100 244
Type TEHD = GNRL
 ,6002
.I
109 10 199 244
109 10 199 244
Type TEHD = GNRL
 ,6003
.I
10 10 178 299
10 10 178 299
* -------- List --------
Type LIST = GNRL
 ,7001
.I
11 254 200 350
0 0 9 2
21 48
.H
0000
0000
0000
0100
0000
00000000
.I
21 12
Type LIST = GNRL
 ,7002
.I
185 10 199 298
0 0 1 4
13 72
.H
0000
0000
0000
0100
0000
00000000
.I
21 12
Type LIST = GNRL
 ,7003
.I
11 254 200 350
0 0 9 4
21 48
.H
0000
0100
0100
0100
0000
00000000
.I
20 10
Type LIST = GNRL
 ,7004
.I
11 14 200 110
0 0 20 4
21 48
.H
0000
0100
0100
0100
0000
00000000
.I
20 12
* -------------- Controls --------------
type CNTL
 ,8001
Check Box
50 50 70 160
Visible
1
0
0 1 0
type CNTL
 ,8002
Radio button
80 50 100 160
Visible
2
0
0 1 0
type CNTL
 ,8003
Button
110 50 130 160
Visible
0
0
0 1 0
* -------------- Pictures ------------
Type PICT = GNRL
 ,8001
.I
1995
0 0 208 312
.H
11 01 A0 00 82 01 00 0A
00 00 00 00 02 D0 02 40
98 00 28 00 00 00 00 00
D0 01 38 00 00 00 00 00
D0 01 38 00 00 00 00 00
D0 01 38 00 00 02 D9 00
02 D9 00 02 D9 00 02 D9
00 02 D9 00 02 D9 00 02
D9 00 02 D9 00 08 00 00
DD FF 00 F8 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 09 01 00 80
DE 00 00 08 FF 00 09 01
00 80 DE 00 00 08 FF 00
09 01 00 80 DE 00 00 08
FF 00 09 01 00 80 DE 00
00 08 FF 00 08 00 00 DD
FF 00 F8 FF 00 02 D9 00
02 D9 00 02 D9 00 08 00
00 DD FF 00 F8 FF 00 09
01 00 80 DE 00 00 08 FF
00 09 01 00 80 DE 00 00
08 FF 00 09 01 00 80 DE
00 00 08 FF 00 09 01 00
80 DE 00 00 08 FF 00 09
01 00 80 DE 00 00 08 FF
00 09 01 00 80 DE 00 00
08 FF 00 09 01 00 80 DE
00 00 08 FF 00 09 01 00
80 DE 00 00 08 FF 00 09
01 00 80 DE 00 00 08 FF
00 09 01 00 80 DE 00 00
08 FF 00 09 01 00 80 DE
00 00 08 FF 00 09 01 00
80 DE 00 00 08 FF 00 09
01 00 80 DE 00 00 08 FF
00 08 00 00 DD FF 00 F8
FF 00 02 D9 00 02 D9 00
02 D9 00 02 D9 00 02 D9
00 02 D9 00 02 D9 00 02
D9 00 02 D9 00 A0 00 83
FF
Type PICT = GNRL
 ,8002
.I
2797
0 0 208 359
.H
11 01 A0 00 82 01 00 0A
00 00 00 00 02 D0 02 40
98 00 2E 00 00 00 00 00
D0 01 68 00 00 00 01 00
D0 01 67 00 00 00 01 00
D0 01 67 00 00 02 D3 00
02 D3 00 02 D3 00 02 D3
00 02 D3 00 02 D3 00 02
D3 00 02 D3 00 0C 00 00
E4 FF 01 FE 0F F5 FF 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0C 00 00 E4 FF 01 FE 08
F5 00 01 80 00 09 E2 00
00 08 F5 00 01 80 00 09
E2 00 00 08 F5 00 01 80
00 09 E2 00 00 08 F5 00
01 80 00 09 E2 00 00 08
F5 00 01 80 00 0C 00 00
E4 FF 01 FE 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0D 01 00 80 E5 00 01 02
08 F5 00 01 80 00 0D 01
00 80 E5 00 01 02 08 F5
00 01 80 00 0D 01 00 80
E5 00 01 02 08 F5 00 01
80 00 0D 01 00 80 E5 00
01 02 08 F5 00 01 80 00
0C 00 00 E4 FF 01 FE 0F
F5 FF 01 80 00 02 D3 00
02 D3 00 02 D3 00 02 D3
00 02 D3 00 02 D3 00 A0
00 83 FF
Type PICT = GNRL
 ,8003
.I
4590
0 0 266 246
.H
00 11 02 FF 0C 00 FF FF
FF FF 00 00 00 00 00 00
00 00 00 F6 00 00 01 0A
00 00 00 00 00 00 00 1E
00 01 00 0A 00 00 00 00
01 0A 00 F6 00 98 80 F6
00 2E 00 59 01 38 01 4F
00 00 00 00 00 00 00 00
00 48 00 00 00 48 00 00
00 00 00 08 00 01 00 08
00 00 00 00 00 00 1F 10
00 00 00 00 00 00 04 33
80 00 00 FF 00 00 FF FF
FF FF FF FF 00 00 FF FF
FF FF CC CC 00 00 FF FF
FF FF 99 99 00 00 FF FF
FF FF 66 66 00 00 FF FF
FF FF 33 33 00 00 FF FF
FF FF 00 00 00 00 FF FF
CC CC FF FF 00 00 FF FF
CC CC CC CC 00 00 FF FF
CC CC 99 99 00 00 FF FF
CC CC 66 66 00 00 FF FF
CC CC 33 33 00 00 FF FF
CC CC 00 00 00 00 FF FF
99 99 FF FF 00 00 FF FF
99 99 CC CC 00 00 FF FF
99 99 99 99 00 00 FF FF
99 99 66 66 00 00 FF FF
99 99 33 33 00 00 FF FF
99 99 00 00 00 00 FF FF
66 66 FF FF 00 00 FF FF
66 66 CC CC 00 00 FF FF
66 66 99 99 00 00 FF FF
66 66 66 66 00 00 FF FF
66 66 33 33 00 00 FF FF
66 66 00 00 00 00 FF FF
33 33 FF FF 00 00 FF FF
33 33 CC CC 00 00 FF FF
33 33 99 99 00 00 FF FF
33 33 66 66 00 00 FF FF
33 33 33 33 00 00 FF FF
33 33 00 00 00 00 FF FF
00 00 FF FF 00 00 FF FF
00 00 CC CC 00 00 FF FF
00 00 99 99 00 00 FF FF
00 00 66 66 00 00 FF FF
00 00 33 33 00 00 FF FF
00 00 00 00 00 00 CC CC
FF FF FF FF 00 00 CC CC
FF FF CC CC 00 00 CC CC
FF FF 99 99 00 00 CC CC
FF FF 66 66 00 00 CC CC
FF FF 33 33 00 00 CC CC
FF FF 00 00 00 00 CC CC
CC CC FF FF 00 00 CC CC
CC CC CC CC 00 00 CC CC
CC CC 99 99 00 00 CC CC
CC CC 66 66 00 00 CC CC
CC CC 33 33 00 00 CC CC
CC CC 00 00 00 00 CC CC
99 99 FF FF 00 00 CC CC
99 99 CC CC 00 00 CC CC
99 99 99 99 00 00 CC CC
99 99 66 66 00 00 CC CC
99 99 33 33 00 00 CC CC
99 99 00 00 00 00 CC CC
66 66 FF FF 00 00 CC CC
66 66 CC CC 00 00 CC CC
66 66 99 99 00 00 CC CC
66 66 66 66 00 00 CC CC
66 66 33 33 00 00 CC CC
66 66 00 00 00 00 CC CC
33 33 FF FF 00 00 CC CC
33 33 CC CC 00 00 CC CC
33 33 99 99 00 00 CC CC
33 33 66 66 00 00 CC CC
33 33 33 33 00 00 CC CC
33 33 00 00 00 00 CC CC
00 00 FF FF 00 00 CC CC
00 00 CC CC 00 00 CC CC
00 00 99 99 00 00 CC CC
00 00 66 66 00 00 CC CC
00 00 33 33 00 00 CC CC
00 00 00 00 00 00 99 99
FF FF FF FF 00 00 99 99
FF FF CC CC 00 00 99 99
FF FF 99 99 00 00 99 99
FF FF 66 66 00 00 99 99
FF FF 33 33 00 00 99 99
FF FF 00 00 00 00 99 99
CC CC FF FF 00 00 99 99
CC CC CC CC 00 00 99 99
CC CC 99 99 00 00 99 99
CC CC 66 66 00 00 99 99
CC CC 33 33 00 00 99 99
CC CC 00 00 00 00 99 99
99 99 FF FF 00 00 99 99
99 99 CC CC 00 00 99 99
99 99 99 99 00 00 99 99
99 99 66 66 00 00 99 99
99 99 33 33 00 00 99 99
99 99 00 00 00 00 99 99
66 66 FF FF 00 00 99 99
66 66 CC CC 00 00 99 99
66 66 99 99 00 00 99 99
66 66 66 66 00 00 99 99
66 66 33 33 00 00 99 99
66 66 00 00 00 00 99 99
33 33 FF FF 00 00 99 99
33 33 CC CC 00 00 99 99
33 33 99 99 00 00 99 99
33 33 66 66 00 00 99 99
33 33 33 33 00 00 99 99
33 33 00 00 00 00 99 99
00 00 FF FF 00 00 99 99
00 00 CC CC 00 00 99 99
00 00 99 99 00 00 99 99
00 00 66 66 00 00 99 99
00 00 33 33 00 00 99 99
00 00 00 00 00 00 66 66
FF FF FF FF 00 00 66 66
FF FF CC CC 00 00 66 66
FF FF 99 99 00 00 66 66
FF FF 66 66 00 00 66 66
FF FF 33 33 00 00 66 66
FF FF 00 00 00 00 66 66
CC CC FF FF 00 00 66 66
CC CC CC CC 00 00 66 66
CC CC 99 99 00 00 66 66
CC CC 66 66 00 00 66 66
CC CC 33 33 00 00 66 66
CC CC 00 00 00 00 66 66
99 99 FF FF 00 00 66 66
99 99 CC CC 00 00 66 66
99 99 99 99 00 00 66 66
99 99 66 66 00 00 66 66
99 99 33 33 00 00 66 66
99 99 00 00 00 00 66 66
66 66 FF FF 00 00 66 66
66 66 CC CC 00 00 66 66
66 66 99 99 00 00 66 66
66 66 66 66 00 00 66 66
66 66 33 33 00 00 66 66
66 66 00 00 00 00 66 66
33 33 FF FF 00 00 66 66
33 33 CC CC 00 00 66 66
33 33 99 99 00 00 66 66
33 33 66 66 00 00 66 66
33 33 33 33 00 00 66 66
33 33 00 00 00 00 66 66
00 00 FF FF 00 00 66 66
00 00 CC CC 00 00 66 66
00 00 99 99 00 00 66 66
00 00 66 66 00 00 66 66
00 00 33 33 00 00 66 66
00 00 00 00 00 00 33 33
FF FF FF FF 00 00 33 33
FF FF CC CC 00 00 33 33
FF FF 99 99 00 00 33 33
FF FF 66 66 00 00 33 33
FF FF 33 33 00 00 33 33
FF FF 00 00 00 00 33 33
CC CC FF FF 00 00 33 33
CC CC CC CC 00 00 33 33
CC CC 99 99 00 00 33 33
CC CC 66 66 00 00 33 33
CC CC 33 33 00 00 33 33
CC CC 00 00 00 00 33 33
99 99 FF FF 00 00 33 33
99 99 CC CC 00 00 33 33
99 99 99 99 00 00 33 33
99 99 66 66 00 00 33 33
99 99 33 33 00 00 33 33
99 99 00 00 00 00 33 33
66 66 FF FF 00 00 33 33
66 66 CC CC 00 00 33 33
66 66 99 99 00 00 33 33
66 66 66 66 00 00 33 33
66 66 33 33 00 00 33 33
66 66 00 00 00 00 33 33
33 33 FF FF 00 00 33 33
33 33 CC CC 00 00 33 33
33 33 99 99 00 00 33 33
33 33 66 66 00 00 33 33
33 33 33 33 00 00 33 33
33 33 00 00 00 00 33 33
00 00 FF FF 00 00 33 33
00 00 CC CC 00 00 33 33
00 00 99 99 00 00 33 33
00 00 66 66 00 00 33 33
00 00 33 33 00 00 33 33
00 00 00 00 00 00 00 00
FF FF FF FF 00 00 00 00
FF FF CC CC 00 00 00 00
FF FF 99 99 00 00 00 00
FF FF 66 66 00 00 00 00
FF FF 33 33 00 00 00 00
FF FF 00 00 00 00 00 00
CC CC FF FF 00 00 00 00
CC CC CC CC 00 00 00 00
CC CC 99 99 00 00 00 00
CC CC 66 66 00 00 00 00
CC CC 33 33 00 00 00 00
CC CC 00 00 00 00 00 00
99 99 FF FF 00 00 00 00
99 99 CC CC 00 00 00 00
99 99 99 99 00 00 00 00
99 99 66 66 00 00 00 00
99 99 33 33 00 00 00 00
99 99 00 00 00 00 00 00
66 66 FF FF 00 00 00 00
66 66 CC CC 00 00 00 00
66 66 99 99 00 00 00 00
66 66 66 66 00 00 00 00
66 66 33 33 00 00 00 00
66 66 00 00 00 00 00 00
33 33 FF FF 00 00 00 00
33 33 CC CC 00 00 00 00
33 33 99 99 00 00 00 00
33 33 66 66 00 00 00 00
33 33 33 33 00 00 00 00
33 33 00 00 00 00 00 00
00 00 FF FF 00 00 00 00
00 00 CC CC 00 00 00 00
00 00 99 99 00 00 00 00
00 00 66 66 00 00 00 00
00 00 33 33 00 00 EE EE
00 00 00 00 00 00 DD DD
00 00 00 00 00 00 BB BB
00 00 00 00 00 00 AA AA
00 00 00 00 00 00 88 88
00 00 00 00 00 00 77 77
00 00 00 00 00 00 55 55
00 00 00 00 00 00 44 44
00 00 00 00 00 00 22 22
00 00 00 00 00 00 11 11
00 00 00 00 00 00 00 00
EE EE 00 00 00 00 00 00
DD DD 00 00 00 00 00 00
BB BB 00 00 00 00 00 00
AA AA 00 00 00 00 00 00
88 88 00 00 00 00 00 00
77 77 00 00 00 00 00 00
55 55 00 00 00 00 00 00
44 44 00 00 00 00 00 00
22 22 00 00 00 00 00 00
11 11 00 00 00 00 00 00
00 00 EE EE 00 00 00 00
00 00 DD DD 00 00 00 00
00 00 BB BB 00 00 00 00
00 00 AA AA 00 00 00 00
00 00 88 88 00 00 00 00
00 00 77 77 00 00 00 00
00 00 55 55 00 00 00 00
00 00 44 44 00 00 00 00
00 00 22 22 00 00 00 00
00 00 11 11 00 00 EE EE
EE EE EE EE 00 00 DD DD
DD DD DD DD 00 00 BB BB
BB BB BB BB 00 00 AA AA
AA AA AA AA 00 00 88 88
88 88 88 88 00 00 77 77
77 77 77 77 00 00 55 55
55 55 55 55 00 00 44 44
44 44 44 44 00 00 22 22
22 22 22 22 00 00 11 11
11 11 11 11 00 00 00 00
00 00 00 00 00 2E 00 59
01 38 01 4F 00 00 00 00
01 0A 00 F6 00 00 04 81
00 8B 00 04 81 00 8B 00
04 81 00 8B 00 04 81 00
8B 00 08 81 00 DC 00 FB
E2 B6 00 08 81 00 DF 00
F8 E2 B6 00 08 81 00 E3
00 F4 E2 B6 00 08 81 00
E5 00 F2 E2 B6 00 08 81
00 E8 00 EF E2 B6 00 08
81 00 E9 00 EE E2 B6 00
08 81 00 EB 00 EC E2 B6
00 08 81 00 ED 00 EA E2
B6 00 08 81 00 EF 00 E8
E2 B6 00 08 81 00 F0 00
E7 E2 B6 00 08 81 00 F1
00 E6 E2 B6 00 08 81 00
F2 00 E5 E2 B6 00 08 81
00 F4 00 E4 E2 B5 00 08
81 00 F5 00 E3 E2 B5 00
08 81 00 F6 00 E2 E2 B5
00 08 81 00 F7 00 E1 E2
B5 00 08 81 00 F8 00 E1
E2 B4 00 08 81 00 F9 00
E0 E2 B4 00 08 81 00 FA
00 DF E2 B4 00 08 81 00
FB 00 DE E2 B4 00 08 81
00 FC 00 DD E2 B4 00 08
81 00 FD 00 DC E2 B4 00
08 81 00 FE 00 DC E2 B3
00 09 81 00 01 00 00 DB
E2 B3 00 09 81 00 01 00
00 DB E2 B3 00 08 81 00
00 00 DA E2 B3 00 06 81
00 DA E2 B2 00 06 81 00
DA E2 B2 00 06 82 00 D9
E2 B2 00 06 83 00 D8 E2
B2 00 06 83 00 D9 E2 B1
00 06 83 00 D9 E2 B1 00
06 84 00 D8 E2 B1 00 06
84 00 D8 E2 B1 00 06 85
00 D8 E2 B0 00 06 85 00
D8 E2 B0 00 06 85 00 D9
E2 AF 00 06 86 00 D8 E2
AF 00 06 86 00 D9 E2 AE
00 06 86 00 D9 E2 AE 00
06 86 00 D9 E2 AE 00 06
86 00 DA E2 AD 00 06 87
00 D9 E2 AD 00 06 87 00
DA E2 AC 00 06 87 00 DA
E2 AC 00 06 87 00 DB E2
AB 00 06 88 00 DB E2 AA
00 06 88 00 DB E2 AA 00
06 88 00 DC E2 A9 00 06
88 00 DD E2 A8 00 06 88
00 DE E2 A7 00 06 88 00
DF E2 A6 00 06 89 00 DF
E2 A5 00 06 89 00 E0 E2
A4 00 06 89 00 E1 E2 A3
00 0A B6 00 F5 E2 E0 00
E2 E2 A2 00 0A BD 00 EA
E2 E4 00 E3 E2 A1 00 0A
C1 00 E1 E2 E9 00 E4 E2
A0 00 0E C4 00 DC E2 EB
00 E6 E2 FA 00 EC E2 BA
00 0E C7 00 D6 E2 EE 00
E7 E2 FC 00 E5 E2 BE 00
0E C9 00 D2 E2 F0 00 E9
E2 FC 00 DF E2 C2 00 0E
CB 00 CE E2 F2 00 EB E2
FC 00 D9 E2 C6 00 0E CD
00 CA E2 F4 00 EC E2 FD
00 D5 E2 C8 00 0E CE 00
C7 E2 F6 00 EF E2 FB 00
D1 E2 CB 00 0E D0 00 C4
E2 F7 00 F1 E2 FB 00 CE
E2 CC 00 0E D2 00 C0 E2
F9 00 F5 E2 F9 00 CA E2
CE 00 0A D3 00 BE E2 E9
00 C5 E2 D0 00 0A D4 00
BA E2 EF 00 C0 E2 D2 00
08 D6 00 81 E2 E3 E2 D4
00 08 D7 00 81 E2 E1 E2
D5 00 08 D8 00 81 E2 DF
E2 D6 00 08 DA 00 81 E2
DB E2 D8 00 08 DB 00 81
E2 D9 E2 D9 00 08 DC 00
81 E2 D7 E2 DA 00 08 DD
00 81 E2 D5 E2 DB 00 08
DE 00 81 E2 D3 E2 DC 00
08 DF 00 81 E2 D1 E2 DD
00 08 E0 00 81 E2 CF E2
DE 00 08 E1 00 81 E2 CE
E2 DE 00 08 E2 00 81 E2
CC E2 DF 00 08 E3 00 81
E2 CA E2 E0 00 08 E4 00
81 E2 C8 E2 E1 00 08 E4
00 81 E2 C8 E2 E1 00 08
E5 00 81 E2 C7 E2 E1 00
08 E6 00 81 E2 C6 E2 E1
00 08 E6 00 81 E2 C6 E2
E1 00 08 E7 00 81 E2 C7
E2 DF 00 08 E8 00 81 E2
C7 E2 DE 00 08 E8 00 81
E2 CC E2 D9 00 08 E8 00
81 05 CD 05 D8 00 08 E9
00 81 05 CE 05 D6 00 08
E9 00 81 05 CE 05 D6 00
08 EA 00 81 05 CF 05 D4
00 08 EB 00 81 05 CF 05
D3 00 08 EB 00 81 05 D0
05 D2 00 08 EC 00 81 05
CF 05 D2 00 08 EC 00 81
05 D0 05 D1 00 08 EC 00
81 05 D1 05 D0 00 08 ED
00 81 05 D0 05 D0 00 08
EE 00 81 05 D0 05 CF 00
08 EE 00 81 05 D1 05 CE
00 08 EF 00 81 05 D0 05
CE 00 08 EF 00 81 05 D1
05 CD 00 08 EF 00 81 05
D2 05 CC 00 08 F0 00 81
05 D2 05 CB 00 08 F0 00
81 05 D2 05 CB 00 08 F1
00 81 05 D2 05 CA 00 08
F1 00 81 05 D2 05 CA 00
08 F1 00 81 05 D3 05 C9
00 08 F1 00 81 05 D3 05
C9 00 08 F1 00 81 05 D3
05 C9 00 08 F2 00 81 05
D3 05 C8 00 08 F2 00 81
05 D3 05 C8 00 08 F2 00
81 05 D3 05 C8 00 08 F2
00 81 05 D4 05 C7 00 08
F2 00 81 05 D4 05 C7 00
08 F3 00 81 05 D3 05 C7
00 08 F3 00 81 05 D3 05
C7 00 08 F3 00 81 05 D3
05 C7 00 08 F3 00 81 17
D4 17 C6 00 08 F3 00 81
17 D4 17 C6 00 08 F3 00
81 17 D4 17 C6 00 08 F3
00 81 17 D4 17 C6 00 08
F3 00 81 17 D4 17 C6 00
08 F4 00 81 17 D3 17 C6
00 08 F4 00 81 17 D3 17
C6 00 08 F4 00 81 17 D3
17 C6 00 08 F4 00 81 17
D3 17 C6 00 08 F4 00 81
17 D3 17 C6 00 08 F4 00
81 17 D3 17 C6 00 08 F4
00 81 17 D3 17 C6 00 08
F4 00 81 17 D3 17 C6 00
08 F4 00 81 17 D3 17 C6
00 08 F4 00 81 17 D3 17
C6 00 08 F4 00 81 17 D3
17 C6 00 08 F4 00 81 17
D3 17 C6 00 08 F4 00 81
17 D3 17 C6 00 08 F4 00
81 17 D3 17 C6 00 08 F4
00 81 17 D2 17 C7 00 08
F4 00 81 17 D2 17 C7 00
08 F4 00 81 17 D2 17 C7
00 08 F4 00 81 17 D2 17
C7 00 08 F4 00 81 17 D2
17 C7 00 08 F4 00 81 17
D1 17 C8 00 08 F4 00 81
17 D1 17 C8 00 08 F4 00
81 17 D1 17 C8 00 08 F4
00 81 17 D1 17 C8 00 08
F4 00 81 17 D1 17 C8 00
08 F4 00 81 17 D0 17 C9
00 08 F3 00 81 17 D1 17
C9 00 08 F3 00 81 D7 D1
D7 C9 00 08 F3 00 81 D7
CF D7 CB 00 08 F3 00 81
D7 CF D7 CB 00 08 F3 00
81 D7 CF D7 CB 00 08 F2
00 81 D7 D0 D7 CB 00 08
F2 00 81 D7 D0 D7 CB 00
08 F2 00 81 D7 CE D7 CD
00 08 F2 00 81 D7 CE D7
CD 00 08 F2 00 81 D7 CE
D7 CD 00 08 F2 00 81 D7
CC D7 CF 00 08 F2 00 81
D7 CC D7 CF 00 08 F2 00
81 D7 CC D7 CF 00 08 F1
00 81 D7 CB D7 D1 00 08
F1 00 81 D7 CB D7 D1 00
08 F1 00 81 D7 CB D7 D1
00 08 F1 00 81 D7 C9 D7
D3 00 08 F1 00 81 D7 C9
D7 D3 00 08 F0 00 81 D7
C9 D7 D4 00 08 F0 00 81
D7 C8 D7 D5 00 08 F0 00
81 D7 C8 D7 D5 00 08 F0
00 81 D7 C7 D7 D6 00 08
EF 00 81 D7 C7 D7 D7 00
08 EF 00 81 D7 C5 D7 D9
00 08 EF 00 81 D7 C3 D7
DB 00 08 EF 00 81 D7 C1
D7 DD 00 08 EE 00 81 D7
C0 D7 DF 00 08 EE 00 81
D7 BE D7 E1 00 08 EE 00
81 D7 BC D7 E3 00 08 EE
00 81 D7 BC D7 E3 00 08
ED 00 81 D7 BD D7 E3 00
08 ED 00 81 D7 BD D7 E3
00 08 EC 00 81 D7 BE D7
E3 00 08 EC 00 81 D7 BE
D7 E3 00 08 EB 00 81 69
BF 69 E3 00 08 EB 00 81
69 BF 69 E3 00 08 EB 00
81 69 BF 69 E3 00 08 EA
00 81 69 C0 69 E3 00 08
EA 00 81 69 C0 69 E3 00
08 E9 00 81 69 C2 69 E2
00 08 E9 00 81 69 C2 69
E2 00 08 E9 00 81 69 C2
69 E2 00 08 E8 00 81 69
C4 69 E1 00 08 E8 00 81
69 C4 69 E1 00 08 E8 00
81 69 C5 69 E0 00 08 E7
00 81 69 C6 69 E0 00 08
E7 00 81 69 C6 69 E0 00
08 E6 00 81 69 C8 69 DF
00 08 E6 00 81 69 C8 69
DF 00 08 E5 00 81 69 C9
69 DF 00 08 E5 00 81 69
C9 69 DF 00 08 E5 00 81
69 CA 69 DE 00 08 E4 00
81 69 CB 69 DE 00 08 E4
00 81 69 CC 69 DD 00 08
E4 00 81 69 CC 69 DD 00
08 E3 00 81 69 CD 69 DD
00 08 E3 00 81 69 CD 69
DD 00 08 E2 00 81 69 CF
69 DC 00 08 E2 00 81 69
CF 69 DC 00 08 E2 00 81
69 CF 69 DC 00 08 E2 00
81 69 D0 69 DB 00 08 E1
00 81 69 D1 69 DB 00 08
E1 00 81 69 D2 69 DA 00
08 E0 00 81 69 D3 69 DA
00 08 E0 00 81 69 D3 69
DA 00 08 DF 00 81 69 D5
69 D9 00 08 DE 00 81 69
D7 69 D8 00 08 DD 00 81
C6 D8 C6 D8 00 08 DD 00
81 C6 D9 C6 D7 00 08 DD
00 81 C6 DA C6 D6 00 08
DC 00 81 C6 DB C6 D6 00
08 DC 00 81 C6 DC C6 D5
00 08 DB 00 81 C6 DD C6
D5 00 08 DA 00 81 C6 DF
C6 D4 00 08 DA 00 81 C6
DF C6 D4 00 08 D9 00 81
C6 E1 C6 D3 00 08 D9 00
81 C6 E1 C6 D3 00 08 D9
00 81 C6 E2 C6 D2 00 08
D8 00 81 C6 E4 C6 D1 00
08 D7 00 81 C6 E6 C6 D0
00 08 D6 00 81 C6 E8 C6
CF 00 08 D5 00 81 C6 EA
C6 CE 00 08 D4 00 81 C6
EC C6 CD 00 08 D3 00 81
C6 EE C6 CC 00 08 D2 00
81 C6 F0 C6 CB 00 08 D1
00 81 C6 F3 C6 C9 00 08
D0 00 81 C6 F4 C6 C9 00
08 CF 00 81 C6 F6 C6 C8
00 08 CE 00 81 C6 F8 C6
C7 00 0A CD 00 CE C6 F0
00 BF C6 C5 00 0A CC 00
D0 C6 EB 00 C5 C6 C3 00
0A CA 00 D6 C6 E4 00 CA
C6 C1 00 0A CA 00 D8 C6
DF 00 CE C6 C0 00 0E C8
00 DB C6 DB 00 D3 C6 E8
00 FD C6 DB 00 12 C8 00
DE C6 D6 00 D6 C6 E8 00
00 C6 FD 00 00 C6 DC 00
15 C6 00 E3 C6 D0 00 DC
C6 E6 00 01 C6 00 FE C6
02 00 00 C6 DD 00 15 C2
00 E8 C6 CE 00 DF C6 E4
00 07 C6 00 C6 00 00 C6
00 C6 DD 00 15 C0 00 ED
C6 C3 00 E9 C6 E2 00 01
C6 00 FE C6 02 00 00 C6
DD 00 15 BC 00 F3 C6 BF
00 ED C6 E0 00 07 C6 00
C6 00 00 C6 00 C6 DD 00
0C 81 00 B6 00 00 C6 FD
00 00 C6 DC 00 08 81 00
B5 00 FD C6 DB 00 04 81
00 8B 00 04 81 00 8B 00
04 81 00 8B 00 04 81 00
8B 00 04 81 00 8B 00 04
81 00 8B 00 04 81 00 8B
00 04 81 00 8B 00 04 81
00 8B 00 04 81 00 8B 00
04 81 00 8B 00 04 81 00
8B 00 00 FF
* -------------- Fin --------------

AltStyle によって変換されたページ (->オリジナル) /

Community Search:
MacTech Search:

Software Updates via MacUpdate

Latest Forum Discussions

Six fantastic ways to spend National Vid...
As if anyone needed an excuse to play games today, I am about to give you one: it is National Video Games Day. A day for us to play games, like we no doubt do every day. Let’s not look a gift horse in the mouth. Instead, feast your eyes on this... | Read more »
Old School RuneScape players turn out in...
The sheer leap in technological advancements in our lifetime has been mind-blowing. We went from Commodore 64s to VR glasses in what feels like a heartbeat, but more importantly, the internet. It can be a dark mess, but it also brought hundreds of... | Read more »
Today's Best Mobile Game Discounts...
Every day, we pick out a curated list of the best mobile discounts on the App Store and post them here. This list won't be comprehensive, but it every game on it is recommended. Feel free to check out the coverage we did on them in the links below... | Read more »
Nintendo and The Pokémon Company's...
Unless you have been living under a rock, you know that Nintendo has been locked in an epic battle with Pocketpair, creator of the obvious Pokémon rip-off Palworld. Nintendo often resorts to legal retaliation at the drop of a hat, but it seems this... | Read more »
Apple exclusive mobile games don’t make...
If you are a gamer on phones, no doubt you have been as distressed as I am on one huge sticking point: exclusivity. For years, Xbox and PlayStation have done battle, and before this was the Sega Genesis and the Nintendo NES. On console, it makes... | Read more »
Regionally exclusive events make no sens...
Last week, over on our sister site AppSpy, I babbled excitedly about the Pokémon GO Safari Days event. You can get nine Eevees with an explorer hat per day. Or, can you? Specifically, you, reader. Do you have the time or funds to possibly fly for... | Read more »
As Jon Bellamy defends his choice to can...
Back in March, Jagex announced the appointment of a new CEO, Jon Bellamy. Mr Bellamy then decided to almost immediately paint a huge target on his back by cancelling the Runescapes Pride event. This led to widespread condemnation about his perceived... | Read more »
Marvel Contest of Champions adds two mor...
When I saw the latest two Marvel Contest of Champions characters, I scoffed. Mr Knight and Silver Samurai, thought I, they are running out of good choices. Then I realised no, I was being far too cynical. This is one of the things that games do best... | Read more »
Grass is green, and water is wet: Pokémo...
It must be a day that ends in Y, because Pokémon Trading Card Game Pocket has kicked off its Zoroark Drop Event. Here you can get a promo version of another card, and look forward to the next Wonder Pick Event and the next Mass Outbreak that will be... | Read more »
Enter the Gungeon review
It took me a minute to get around to reviewing this game for a couple of very good reasons. The first is that Enter the Gungeon's style of roguelike bullet-hell action is teetering on the edge of being straight-up malicious, which made getting... | Read more »

Price Scanner via MacPrices.net

Take 150ドル off every Apple 11-inch M3 iPad Air
Amazon is offering a 150ドル discount on 11-inch M3 WiFi iPad Airs right now. Shipping is free: – 11′′ 128GB M3 WiFi iPad Air: 449,ドル 150ドル off – 11′′ 256GB M3 WiFi iPad Air: 549,ドル 150ドル off – 11′′ 512GB M3... Read more
Apple iPad minis back on sale for 100ドル off MS...
Amazon is offering 100ドル discounts (up to 20% off) on Apple’s newest 2024 WiFi iPad minis, each with free shipping. These are the lowest prices available for new minis among the Apple retailers we... Read more
Apple’s 16-inch M4 Max MacBook Pros are on sa...
Amazon has 16-inch M4 Max MacBook Pros (Silver and Black colors) on sale for up to 410ドル off Apple’s MSRP right now. Shipping is free. Be sure to select Amazon as the seller, rather than a third-party... Read more
Red Pocket Mobile is offering a 150ドル rebate o...
Red Pocket Mobile has new Apple iPhone 17’s on sale for 150ドル off MSRP when you switch and open up a new line of service. Red Pocket Mobile is a nationwide MVNO using all the major wireless carrier... Read more
Switch to Verizon, and get any iPhone 16 for...
With yesterday’s introduction of the new iPhone 17 models, Verizon responded by running "on us" promos across much of the iPhone 16 lineup: iPhone 16 and 16 Plus show as 0ドル/mo for 36 months with bill... Read more
Here is a summary of the new features in Appl...
Apple’s September 2025 event introduced major updates across its most popular product lines, focusing on health, performance, and design breakthroughs. The AirPods Pro 3 now feature best-in-class... Read more
Apple’s Smartphone Lineup Could Use A Touch o...
COMMENTARY – Whatever happened to the old adage, "less is more"? Apple’s smartphone lineup. — which is due for its annual refresh either this month or next (possibly at an Apple Event on September 9... Read more
Take 50ドル off every 11th-generation A16 WiFi i...
Amazon has Apple’s 11th-generation A16 WiFi iPads in stock on sale for 50ドル off MSRP right now. Shipping is free: – 11′′ 11th-generation 128GB WiFi iPads: 299ドル 50ドル off MSRP – 11′′ 11th-generation 256GB... Read more
Sunday Sale: 14-inch M4 MacBook Pros for up t...
Don’t pay full price! Amazon has Apple’s 14-inch M4 MacBook Pros (Silver and Black colors) on sale for up to 220ドル off MSRP right now. Shipping is free. Be sure to select Amazon as the seller, rather... Read more
Mac mini with M4 Pro CPU back on sale for 12ドル...
B&H Photo has Apple’s Mac mini with the M4 Pro CPU back on sale for 1259,ドル 140ドル off MSRP. B&H offers free 1-2 day shipping to most US addresses: – Mac mini M4 Pro CPU (24GB/512GB): 1259,ドル $... Read more

Jobs Board

  • SPREAD THE WORD:
  • Generate a short URL for this page:



All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.