TweetFollow 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 #$0D,key(A6)             ;
    BEQ GoDown                      ;
    CMPI.B #$03,key(A6)             ;
    BEQ GoDown                      ;
    CMPI.B #$1B,key(A6)             ;
    BEQ GoAway                      ;
    CMPI.B #$09,key(A6)             ;
    BEQ GoAway                      ;
    CMPI.B #$1E,key(A6)             ;
    BEQ GoUp                        ;
    CMPI.B #$1F,key(A6)             ;
    BEQ GoDown                      ;
    CMPI.B #$1D,key(A6)             ;
    BEQ GoRight                     ;
    CMPI.B #$1C,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 --------------

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

FileMaker Pro 19.4.2 - Quickly build cus...
FileMaker Pro is the tool you use to create a custom app. You also use FileMaker Pro to access your app on a computer. Start by importing data from a spreadsheet or using a built-in Starter app to... Read more
Adobe Illustrator 26.0.3 - Professional...
You can download Adobe Illustrator for Mac as a part of Creative Cloud for only $20.99/month. Adobe Illustrator for Mac is the vector graphics classics in the design industry. It is a digital... Read more
WhatRoute 2.4.9 - Geographically trace o...
WhatRoute is designed to find the names of all the routers an IP packet passes through on its way from your Mac to a destination host. It also measures the round-trip time from your Mac to the router... Read more
Notion 2.0.20 - A unified workspace for...
Notion is the unified workspace for modern teams. Notion Features: Integration with Slack Documents Wikis Tasks Release notes were unavailable when this listing was updated. Download Now]]> Read more
Monterey Cache Cleaner 17.0.2 - Clear ca...
Monterey Cache Cleaner is an award-winning general-purpose tool for macOS X. MCC makes system maintenance simple with an easy point-and-click interface to many macOS X functions. Novice and expert... Read more
Firetask Pro 4.6.8 - Innovative task man...
Firetask Pro represents the next generation of easy-to-use, project-oriented task management apps. By combining David Allen's powerful Getting Things Done (GTD®) approach with classical task... Read more
Smultron 13.0.4 - Easy-to-use, powerful...
Smultron 13 is the text editor for all of us. Smultron is powerful and confident without being complicated. Its elegance and simplicity helps everyone being creative and to write and edit all sorts... Read more
Box Sync 4.0.8057 - Online synchronizati...
Box Sync gives you a hard-drive in the Cloud for online storage. Note: You must first sign up to use Box. What if the files you need are on your laptop -- but you're on the road with your iPhone? No... Read more
Audio Hijack 3.8.10 - Record and enhance...
Audio Hijack (was Audio Hijack Pro) drastically changes the way you use audio on your computer, giving you the freedom to listen to audio when you want and how you want. Record and enhance any audio... Read more
Direct Mail 6.0.1 - Create and send grea...
Direct Mail is an easy-to-use, fully-featured email marketing app purpose-built for macOS. Create, send, and track great looking email campaigns that get results. Start your newsletter by selecting... Read more

Latest Forum Discussions

See All

Hopefully Not Jared’s Last Show – The To...
My suspicions from last week were correct, and after my two kids tested positive for Covid last week both my wife and I have now tested positive as well. It seems you just can’t escape this stuff lately. Thankfully the two little ones are pretty... | Read more »
TouchArcade Game of the Week: ‘Micro RPG...
I feel like idle games are one of those perfect fits for the mobile platform. Not that they replace more involved gaming experiences when you’re in the mood for that, but they do fit in alongside other types of games just fine as a “go to" when you... | Read more »
‘Phantom Blade: Executioners’ Closed Bet...
Phantom Blade: Executioners is holding a small-scale technical test that lets players get first dibs on the KungFuPunk action RPG. Offered to selected players only, S-Game’s first Closed Beta Test will provide players with limited edition in-game... | Read more »
New ‘Warhammer 40,000: Tacticus’ Video S...
Back in September Snowprint Studios, who you may know from their previous Legend of Solgard or Rivengard, announced that they’d partnered up with Games Workshop to put out a new tactical game in the Warhammer 40,000 universe titled Warhammer 40,000... | Read more »
SwitchArcade Round-Up: ‘Pokemon Legends:...
Hello gentle readers, and welcome to the SwitchArcade Round-Up for January 28th, 2022. We’ve got a bunch of new releases to look at today, with a few big hitters, a few mid-level diversions, and a healthy supply of compost. Since it’s Friday, we... | Read more »
Phantom Blade: Executioners, S-Game...
S-Game has kicked off its first Closed Beta Test for Phantom Blade: Executioners, inviting a selected few to get first dibs on the upcoming KungFuPunk action RPG on mobile. The CBT officially begins this January 28th, and beta testers will receive... | Read more »
‘Infinite Galaxy’ First Anniversary: Cel...
Cultivating a new generation of valiant commanders across 240 countries worldwide, Infinite Galaxy has quenched players’ thirst to explore the vastness of space – and there are only more intergalactic adventures to embark on from here on out. Camel... | Read more »
War and Order: How to brave the cold in...
War and Order's 6th-anniversary celebrations are underway, and all in good time too - this season not only brings about fabulous festivities, but it also lets players experience the harsh winter in an entirely new way. [Read more] | Read more »
‘Hidden Folks+’ Is This Week’s New Apple...
The original Hidden Folks from Adriaan de Jongh is an excellent hidden objects game featuring hand drawn visuals. It is an absolute joy to play, and it has now released on Apple Arcade in the form of Hidden Folks+ () as an App Store great. If you’... | Read more »
Mini Metro’s First Big Update of 2022 Ad...
Last year saw great updates for Dinosaur Polo Club’s Mini Metro ($3.99) which is also available on Apple Arcade as an App Store Great. | Read more »

Price Scanner via MacPrices.net

Apple has clearance 2020 13″ MacBook Airs ava...
Apple has clearance, Certified Refurbished, 2020 13″ Intel-based MacBook Airs in stock today starting at only $719 and up to $370 off original MSRP. Each MacBook features a new outer case, comes with... Read more
The cheapest iPhones for sale today at Apple...
Apple has restocked Apple Certified Refurbished iPhone 8 models starting at only $359. Each refurbished iPhone comes with a fresh external case, standard Apple 1-year warranty, and free shipping.... Read more
14″ MacBook Pro with Apple M1 Max CPU now in...
Looking for a new 14″ MacBook Pro with an Apple M1 Max CPU? Stock is finally trickling into Apple resellers. B&H has Silver 14″ M1 Max MacBook Pros in stock today for $2899 including free 1-2 day... Read more
14″ MacBook Pros with Apple M1 Pro CPUs are i...
Amazon is reporting stock of 14″ MacBook Pros with M1 Pro CPUs today with a $50 discount. Shipping is free, and delivery is available by February 1st for most configurations. Be sure to make your... Read more
Apple has restocked 13″ M1 MacBook Pros for $...
Apple has restocked a full line of 13″ M1 MacBook Pros available Certified Refurbished, starting at only $1099 and up to $230 off original MSRP. These are the cheapest M1 MacBook Pros for sale today... Read more
Apple’s AirPods Max headphones are on sale fo...
Amazon has Silver, Blue, and Space Gray Apple AirPods Max headphones on sale today for $100 off MSRP. Shipping is free, and all models are in stock today. Their price is the lowest currently... Read more
Open a new line of service at Verizon and get...
Verizon is giving away 64GB Apple iPhone 12 minis or your choice of an iPhone 11 to customers who choose one of these phones and open a new line of service. Offer is available online only, and no... Read more
Open-box 13″ M1 MacBook Airs now available st...
QuickShip Electronics has open-box return 13″ M1 MacBook Airs in stock and on sale for $200-$400 off MSRP on their eBay store right now with free express delivery. According to QuickShip, “The item... Read more
Verizon’s 2022 iPad promo: $100-$310 off any...
Verizon has cellular-capable iPads on sale for $100-$310 off MSRP when purchased with an Unlimited service plan. Sale price is applied to your account monthly over a 24 or 30 month period, depending... Read more
Sunday Sale: Apple AirPods are on sale for up...
Amazon has Apple AirPods on sale for $10-$100 off MSRP today, depending on the model. All are in stock today with free delivery: – AirPods Max headphones (Blue): $449 $100 off MSRP – AirPods Max... Read more

Jobs Board

Registered Nurse (RN) Employee Health PSJH -...
…is calling for a Registered Nurse (RN) Employee Health PSJH to our location in Apple Valley, CA.** We are seeking a Registered Nurse (RN) Employee Health PSJH to be Read more
Systems Administrator - Pearson (United State...
…and troubleshoot Windows operating systems (workstation and server), laptop computers, Apple iPads, Chromebooks and printers** + **Administer and troubleshoot all Read more
IT Assistant Level 1- IT Desktop Support Anal...
…providing tier-1 or better IT help desk support in a large Windows and Apple environment * Experience using IT Service Desk Management Software * Knowledge of IT Read more
Human Resources Business Partner PSJH - Provi...
…**is calling a** **Human Resources Business Partner, PSJH** **to our location in Apple Valley, CA.** **Applicants that meet qualifications will receive a text with Read more
Manager Community Health Investment Programs...
…is calling a Manager Community Health Investment Programs PSJH to our location in Apple Valley, CA.** **Qualified candidates will be invited to do a self-paced video Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.