home *** CD-ROM | disk | FTP | other *** search
/ Carousel / CAROUSEL.cdr / mactosh / code / asm_skip.sit < prev    next >
Text File  |  1988-05-14  |  35KB  |  1,880 lines

  1. 11-May-88 21:28:05-MDT,37118;000000000000
  2. Return-Path: <u-lchoqu%sunset@cs.utah.edu>
  3. Received: from cs.utah.edu by SIMTEL20.ARPA with TCP; Wed, 11 May 88 21:27:02 MDT
  4. Received: by cs.utah.edu (5.54/utah-2.0-cs)
  5.     id AA04024; Wed, 11 May 88 21:27:26 MDT
  6. Received: by sunset.utah.edu (5.54/utah-2.0-leaf)
  7.     id AA29307; Wed, 11 May 88 21:27:18 MDT
  8. Date: Wed, 11 May 88 21:27:18 MDT
  9. From: u-lchoqu%sunset@cs.utah.edu (Lee Choquette)
  10. Message-Id: <8805120327.AA29307@sunset.utah.edu>
  11. To: rthum@simtel20.arpa
  12. Subject: SkipFinder.asm
  13.  
  14. ;SkipFinder, version 6.1
  15. ;
  16. ;Copyright 1986 Darin Adler
  17. ;
  18. ;Permission is given to distribute or modify
  19. ;this code for non-commercial purposes.
  20. ;
  21. ;This desk accessory installs a Finder avoider.
  22.  
  23.         INCLUDE    SysEquX.D
  24.         INCLUDE    ToolEquX.D
  25.         INCLUDE    QuickEquX.D
  26.         INCLUDE    MacTraps.D
  27.  
  28.  
  29. ;----------
  30. ;SkipFinder equates
  31. ;----------
  32.  
  33. stashed        EQU    $AE4        ;(a secret place to stash this stuff)
  34.  
  35. FBit        EQU    1            ;option bits
  36. HBit        EQU    0
  37.  
  38. ;Dialog filter equates
  39.  
  40. itemHit        EQU    8
  41. theEvent    EQU    12
  42. theDialog    EQU    16
  43. filtered    EQU    20
  44.  
  45. ;Macros
  46.  
  47.         MACRO    LONG    value    =
  48.         DC    {value}>>16,{value}&$FFFF
  49.         |
  50.  
  51.  
  52. ;----------
  53. ;SkipFinder desk accessory (SkipLoader)
  54. ;----------
  55.  
  56.         RESOURCE 'DRVR' 12 'SkipFinder' 32
  57.  
  58. Skip
  59.         DC.W    0            ;need nothing
  60.         DC.W    0            ;doesn't need time
  61.         DC.W    0            ;no events
  62.         DC.W    0            ;no menu
  63.  
  64.         DC.W    DoIt-Skip        ;open
  65.         DC.W    Done-Skip        ;prime
  66.         DC.W    Done-Skip        ;control
  67.         DC.W    Done-Skip        ;status
  68.         DC.W    Done-Skip        ;close
  69.  
  70. DoIt
  71.         MOVE.W    dCtlRefNum(A1),D3    ;get the refNum
  72.         EOR.W    #$FFFF,D3        ;convert it to a resource ID
  73.         LSL.W    #5,D3            ;adjust it
  74.         OR.W    #$C000,D3        ;make it an owned resource
  75.  
  76.         MOVE.L    stashed,D0        ;stashed?
  77.         BCLR    #31,D0
  78.         MOVE.L    D0,A0
  79.  
  80.         MOVE.L    SysZone,A1
  81.         CMP.L    A1,A0            ;is it already installed?
  82.         BLO    NotInAlready
  83.         CMP.L    bkLim(A1),A0
  84.         BHS    NotInAlready
  85.  
  86.         ADDQ.W    #1,D3            ;#1 is "this is in already"
  87.  
  88.         SUBQ    #4,SP            ;room for return
  89.         MOVE.L    #'DLOG',-(SP)        ;get the dialog template in here
  90.         MOVE.W    D3,-(SP)
  91.         _GetResource
  92.         MOVE.L    (SP)+,A0        ;get the resource handle
  93.         _HNoPurge
  94.         MOVE.L    (A0),A0            ;dereference
  95.         MOVE.W    D3,dItems(A0)        ;fix itemList ID
  96.  
  97.         TST.L    dBounds+topLeft(A0)    ;if topLeft is 0,0 then center it
  98.         BNE.S    DontCenter
  99.  
  100.         MOVE.L    (A5),A1            ;get QuickDraw globals
  101.  
  102.         MOVEQ    #0,D0            ;set up for centering (menu bar)
  103.         ADD.W    screenBits+bounds+bottom(A1),D0 ;calculate centering info
  104.         SUB.W    dBounds+bottom(A0),D0    ;by subtracting (ignore the menu bar)
  105.         ADD.W    #20,D0
  106.         ASR.W    #1,D0            ;and shifting
  107.  
  108.         SWAP    D0            ;move the Y coordinate to high word
  109.  
  110.         MOVE.W    screenBits+bounds+right(A1),D0 ;do the same for X
  111.         SUB.W    dBounds+right(A0),D0
  112.         ASR.W    #1,D0
  113.  
  114.         PEA    dBounds(A0)
  115.         MOVE.L    D0,-(SP)        ;ready for an _OffsetRect
  116.         _OffsetRect
  117.  
  118. DontCenter
  119.         SUBQ    #4,SP            ;reserve room for port ptr
  120.         PEA    (SP)            ;push pointer
  121.         _GetPort
  122.  
  123.         SUBQ    #4,SP
  124.         MOVE.W    D3,-(SP)        ;put on the resource ID
  125.  
  126.         SUBQ    #4,SP            ;make room
  127.         MOVE.L    #'SKIP',-(SP)        ;ask for resource
  128.         MOVE.W    #1,-(SP)
  129.         _GetIndResource
  130.         MOVE.L    (SP)+,A4        ;get resource handle
  131.         MOVE.L    (A4),A0            ;de-ref it
  132.         MOVE.W    2(A0),D4        ;get bits
  133.  
  134.         CLR.L    -(SP)            ;allocate storage on heap
  135.         MOVE.L    #-1,-(SP)        ;put window on top
  136.         _GetNewDialog            ;get the dialog
  137.  
  138.         MOVE.L    (SP),-(SP)
  139.         MOVE.W    #2,-(SP)
  140.         PEA    scratch20
  141.         PEA    scratch20+2
  142.         PEA    scratch8
  143.         _GetDItem
  144.         MOVE.L    scratch20+2,A2        ;get the handle for control #2
  145.  
  146.         MOVE.L    (SP),-(SP)
  147.         MOVE.W    #3,-(SP)
  148.         PEA    scratch20
  149.         PEA    scratch20+2
  150.         PEA    scratch8
  151.         _GetDItem
  152.         MOVE.L    scratch20+2,A3        ;get the handle for control #3
  153.  
  154.         MOVEQ    #0,D0
  155.         BTST    #FBit,D4        ;test F bit
  156.         BEQ.S    @1
  157.         ADDQ.W    #1,D0
  158. @1
  159.         MOVE.L    A2,-(SP)
  160.         MOVE.W    D0,-(SP)
  161.         _SetCtlValue
  162.  
  163.         MOVEQ    #0,D0
  164.         BTST    #HBit,D4        ;test H bit
  165.         BEQ.S    @2
  166.         ADDQ.W    #1,D0
  167. @2
  168.         MOVE.L    A3,-(SP)
  169.         MOVE.W    D0,-(SP)
  170.         _SetCtlValue
  171.  
  172.         BTST    #7,stashed
  173.         BEQ.S    ModalDialogLoop
  174.  
  175.         MOVE.L    A2,-(SP)
  176.         MOVE.W    #255,-(SP)
  177.         _HiliteControl
  178.  
  179.         MOVE.L    A3,-(SP)
  180.         MOVE.W    #255,-(SP)
  181.         _HiliteControl
  182.  
  183. ModalDialogLoop
  184.         MOVE.L    (SP),-(SP)
  185.         _ShowWindow
  186.  
  187.         SUBQ    #2,SP
  188.         PEA    FilterProc
  189.         PEA    4(SP)            ;pass an address for the item number
  190.         _ModalDialog
  191.         MOVE.W    (SP)+,D0        ;get the item number
  192.  
  193.         CMP.W    #2,D0            ;the F check box
  194.         BNE.S    NotF
  195.  
  196.         MOVEQ    #0,D0
  197.         BCHG    #FBit,D4        ;flip F bit
  198.         BNE.S    @1
  199.         ADDQ.W    #1,D0
  200. @1
  201.         MOVE.L    A2,-(SPj
  202.         MOVE.W    D0,-(SP)
  203.         _SetCtlValue
  204.         BRA.S    ModalDialogLoop
  205. NotF
  206.  
  207.         CMP.W    #3,D0            ;the H check box
  208.         BNE.S    NotH
  209.  
  210.         MOVEQ    #0,D0
  211.         BCHG    #HBit,D4        ;flip H bit
  212.         BNE.S    @1
  213.         ADDQ.W    #1,D0
  214. @1
  215.         MOVE.L    A3,-(SP)
  216.         MOVE.W    D0,-(SP)
  217.         _SetCtlValue
  218.         BRA.S    ModalDialogLoop
  219. NotH
  220.  
  221.         _DisposDialog            ;get rid of the dialog
  222.  
  223.         SUBQ    #4,SP            ;room for return
  224.         MOVE.L    #'DLOG',-(SP)        ;get the dialog template in here
  225.         MOVE.W    D3,-(SP)
  226.         _GetResource
  227.         MOVE.L    (SP)+,A0        ;get the resource handle
  228.         _HPurge
  229.  
  230.         MOVE.L    (A4),A0            ;de-ref the handle
  231.         CMP.W    2(A0),D4        ;changed?
  232.         BEQ.S    NoChange
  233.         MOVE.W    D4,2(A0)
  234.         MOVE.L    A4,-(SP)
  235.         _ChangedResource
  236.         MOVE.L    A4,-(SP)
  237.         _WriteResource
  238. NoChange
  239.         MOVE.L    A4,A0
  240.         _HPurge
  241.  
  242.         _SetPort
  243.  
  244. Done
  245.         MOVEQ    #0,D0            ;return no error
  246.         RTS
  247.  
  248. ;----------
  249. ;FilterProc - fancy filtering for the SkipFinder dialog
  250. ;----------
  251.  
  252. FilterProc
  253.         LINK    A6,#0
  254.  
  255.         CLR.B    filtered(A6)
  256.  
  257.         MOVE.L    theEvent(A6),A0
  258.  
  259.         CMP.W    #updatEvt,(A0)
  260.         BNE.S    NotUpdateEvent
  261.  
  262.         MOVE.L    theDialog(A6),D0
  263.  
  264.         MOVE.L    D0,-(SP)
  265.         MOVE.L    D0,-(SP)
  266.         MOVE.L    D0,-(SP)
  267.         MOVE.L    D0,-(SP)
  268.         MOVE.L    D0,-(SP)
  269.  
  270.         _BeginUpdate
  271.         _DrawDialog
  272.         _SetPort
  273.  
  274.         MOVE.W    #1,-(SP)        ;item 1 is always default
  275.         PEA    scratch20
  276.         PEA    scratch20+2
  277.         PEA    scratch8
  278.         _GetDItem
  279.  
  280.         LEA    scratch8,A0        ;rectangle
  281.         MOVEQ    #3,D0            ;width of outline
  282.         MOVEQ    #16,D1            ;rounding factor of outline
  283.         MOVEQ    #-4,D2            ;inset of outline
  284.  
  285.         MOVE.L    A0,-(SP)        ;FrameRoundRect
  286.         MOVE.W    D1,-(SP)
  287.         MOVE.W    D1,-(SP)
  288.  
  289.         MOVE.L    A0,-(SP)        ;InsetRect
  290.         MOVE.W    D2,-(SP)
  291.         MOVE.W    D2,-(SP)
  292.  
  293.         MOVE.W    D0,-(SP)        ;PenSize
  294.         MOVE.W    D0,-(SP)
  295.  
  296.         _PenSize
  297.         _InsetRect
  298.         _FrameRoundRect
  299.  
  300.         _EndUpdate
  301.  
  302.         MOVE.L    theEvent(A6),A0
  303.         CLR.W    (A0)
  304.         BRA.S    DoneFilterProc
  305.  
  306. NotUpdateEvent
  307.         CMP.W    #keyDwnEvt,(A0)
  308.         BNE.S    DoneFilterProc
  309.  
  310.         CMP.B    #3,evtMessage+3(A0)
  311.         BEQ.S    HitButton
  312.  
  313.         CMP.B    #13,evtMessage+3(A0)
  314.         BNE.S    DoneFilterProc
  315. HitButton
  316.         MOVE.L    theDialog(A6),-(SP)
  317.         MOVE.W    #1,-(SP)
  318.         PEA    scratch20
  319.         PEA    scratch20+2
  320.         PEA    scratch8
  321.         _GetDItem
  322.  
  323.         MOVE.L    scratch20+2,-(SP)
  324.         MOVE.W    #1,-(SP)
  325.         _HiliteControl
  326.  
  327.         MOVE.W    #8,A0
  328.         _Delay
  329.  
  330.         MOVE.L    scratch20+2,-(SP)
  331.         CLR.W    -(SP)
  332.         _HiliteControl            ;UnHilite the control
  333.  
  334.         MOVE.L    itemHit(A6),A0
  335.         MOVE.W    #1,(A0)
  336.         ADDQ.B    #1,filtered(A6)
  337.  
  338. DoneFilterProc
  339.         UNLK    A6
  340.         MOVE.L    (SP)+,A0        ;get return address
  341.         ADD    #12,SP            ;pop off parameters
  342.         JMP    (A0)
  343.  
  344.  
  345. ;----------
  346. ;NotInAlready - installs SkipFinder since it is not in yet
  347. ;----------
  348.  
  349. OpenResFile    EQU    $197            ;_OpenResFile trap number
  350.  
  351. NotInAlready
  352.         MOVE.L    #PatchEnd-PatchStart+4,D1    ;figure a size for the handle
  353.  
  354.         MOVE.L    D1,D0
  355.         _NewPtr ,SYS
  356.  
  357.         MOVE.L    A0,stashed
  358.  
  359.         MOVE.L    A0,A1
  360.  
  361.         MOVE.W    #OpenResFile,D0        ;get the old trap address
  362.         _GetTrapAddress
  363.         MOVE.L    A0,(A1)+        ;put this pointer on there
  364.  
  365.         LEA    PatchStart,A0        ;into the new handle
  366.         MOVE.L    #PatchEnd-PatchStart,D0    ;figure a size for the patch
  367.         _BlockMove
  368.  
  369.         MOVE.L    A1,A0            ;set the new trap address
  370.         MOVE.W    #OpenResFile,D0        ;for _InitApplZone
  371.         _SetTrapAddress
  372.  
  373.         BRA    Done            ;that's all folks
  374.  
  375.  
  376. ;----------
  377. ;PatchStart - this (until PatchEnd) sits on the system heap
  378. ;----------
  379.  
  380. PatchStart
  381.         MOVE.L    (A7),A0
  382.         CMP.L    ROMBase,A0        ;are we in ROM now?
  383.         BHS.S    SkipTheFinder
  384.  
  385. DontSkip
  386.         MOVE.L    PatchStart-4,-(SP)    ;old OpenResFile address
  387.         RTS
  388.  
  389. SkipTheFinder
  390.         LEA    CurApName,A0
  391.         CMP.L    4(A7),A0
  392.         BNE.S    DontSkip        ;Launch?
  393.  
  394.         MOVEQ    #0,D0
  395.         LEA    FinderName,A0
  396.         LEA    CurApName,A1
  397.         MOVE.B    (A0)+,D0
  398.         SWAP    D0
  399.         MOVE.B    (A1)+,D0
  400.         _CmpString            ;Finder launch?
  401.         BNE.S    DontSkip
  402.  
  403.         BCLR    #7,stashed        ;is this a special skip?
  404.         BNE.S    DontSkip
  405.  
  406.         BTST    #2,$17B            ;This is the Option key!
  407.         BNE.S    DontSkip
  408.  
  409.         SUBQ    #4,SP            ;make room
  410.         MOVE.L    #'SKIP',-(SP)        ;ask for resource
  411.         MOVE.W    #1,-(SP)
  412.         _GetIndResource
  413.         MOVE.L    (SP)+,D0        ;get the result
  414.         BEQ.S    DontSkip
  415.  
  416.         TST.W    ResErr
  417.         BNE.S    DontSkip        ;uh oh!
  418.  
  419.         MOVE.L    D0,A0
  420.         MOVE.L    (A0),D0            ;dereference it
  421.         AND.L    Lo3Bytes,D0
  422.         MOVE.L    D0,A0
  423.         JMP    (A0)
  424. PatchEnd
  425.  
  426.  
  427. ;-------------------------------------------------------------------------
  428.  
  429.  
  430.         RESOURCE 'SKIP' 65536-16000 '' 0
  431.  
  432.         INCLUDE    Corvus:MDS:.D:FSEqu.D
  433.         INCLUDE    Corvus:MDS:.Txt:PackMacs.Txt
  434.  
  435. ;----------
  436. ;New Equates - not yet in equate files
  437. ;----------
  438.  
  439. ROM85        EQU    $28E
  440. FSFCBLen    EQU    $3F6
  441.  
  442.   .TRAP    _HOpen        $A200+0
  443.   .TRAP    _HGetVInfo    $A200+7
  444.   .TRAP    _HCreate    $A200+8
  445.   .TRAP    _HDelete    $A200+9
  446.   .TRAP    _HOpenRF    $A200+10
  447.   .TRAP    _HRename    $A200+11
  448.   .TRAP    _HGetFileInfo    $A200+12
  449.   .TRAP    _HSetFileInfo    $A200+13
  450.   .TRAP    _AllocContig    $A200+16
  451.   .TRAP    _SetPEOF    $A200+18
  452.   .TRAP    _HGetVol    $A200+20
  453.   .TRAP    _HSetVol    $A200+21
  454.   .TRAP    _HSetFLock    $A200+65
  455.   .TRAP    _HRstFLock    $A200+66
  456.   .TRAP    _HFSDispatch    $A200+96
  457.   .TRAP    _MoveHHi    $A000+100
  458.  
  459.     MACRO    _OpenWD        =
  460.     MOVEQ    #1,D0
  461.     _HFSDispatch
  462.     |
  463.  
  464.     MACRO    _GetWDInfo    =
  465.     MOVEQ    #7,D0
  466.     _HFSDispatch
  467.     |
  468.  
  469. ;New fields for _GetWDInfo:
  470. ioWDIndex    EQU    $1A            ;Working Directory index for _GetWDInfo
  471. ioWDProcID    EQU    $1C            ;WD's ProcID (long)
  472. ioWDVRefNum    EQU    $20            ;WD's Volume RefNum (word)
  473. ioWDDirID    EQU    $30            ;WD's DirID (long)
  474.  
  475. ;New field for _HGetVolInfo:
  476. ioVFndrInfo    EQU    $5A            ;Finder information for volume
  477.  
  478.  
  479. ;----------
  480. ;SkipFinder equates
  481. ;----------
  482.  
  483. ;menu constants
  484.  
  485. AppleMenuID    EQU    128
  486. EditMenuID    EQU    129
  487.  
  488. ;get file dialog constants
  489.  
  490. getSetup    EQU    -1            ;setup number
  491. ;getOpen    EQU    1            ;open button
  492. getOpenDoc    EQU    2            ;open doc button
  493. ;getCancel    EQU    3            ;cancel button
  494. ;getEject    EQU    5            ;eject button
  495. ;getDrive    EQU    6            ;drive button
  496. getShutDown    EQU    12            ;shut down button
  497. getStop        EQU    13            ;stop skipping button
  498. getNothing    EQU    100            ;null event number
  499. getRebuild    EQU    101            ;rebuild list number
  500. getOpenFolder    EQU    103            ;open folder number
  501.  
  502. ;trap constants
  503.  
  504. Pack3        EQU    $A9EA            ;trap number for _Pack3
  505. MoveWindow    EQU    $A91B            ;trap number for _MoveWindow
  506.  
  507. ;globals
  508.  
  509. quickGlobals    EQU    -4
  510. endQuickGlobals    EQU    -grafSize        ;QuickDraw globals
  511.  
  512. currentReply    EQU    endQuickGlobals-4    ;current reply record
  513. applicationReply EQU    currentReply-rName-64    ;application reply record
  514. documentReply    EQU    applicationReply-rName-64 ;document reply record
  515.  
  516. Pack3Address    EQU    documentReply-4        ;old address of trap for Pack3
  517. MoveAddress    EQU    Pack3Address-4        ;old address of trap for MoveWindow
  518. returnAddress    EQU    MoveAddress-4        ;old return address for Pack3
  519.  
  520. owned        EQU    returnAddress-2        ;id of first owned resource
  521.  
  522. AppleMenuHandle    EQU    owned-4            ;handles to the two menus
  523. EditMenuHandle    EQU    AppleMenuHandle-4
  524.  
  525. dismissButton    EQU    EditMenuHandle-2    ;button used to dismiss the last SFPPutFile Dialog
  526. dormant        EQU    dismissButton-4        ;saving place for dormant dialogs
  527. signature    EQU    dormant-4        ;signature of chosen application
  528. stopSkipping    EQU    signature-1        ;stop skipping the Finder?
  529. allFiles    EQU    stopSkipping-1        ;option key shenanigans
  530.  
  531. totalGlobals    EQU    -allFiles
  532.  
  533. ;----------
  534. ;SkipFinder - branch right into the skipping code
  535. ;----------
  536.  
  537. FirstThingsFirst
  538.         BRA.S    DoTheSkipping
  539.  
  540. Options        DC.W    %0000000000000010    ;flags word
  541.  
  542. ;----------
  543. ;constants
  544. ;----------
  545.  
  546. AppleMenu    DC.B    1,appleMark        ;title of Apple menu
  547. vowels        DC.B    'AEIOUaeiou'        ;list of vowels, terminated by ...
  548. nullString    DC.B    0            ;zero byte (also for use as a null string '')
  549.         .ALIGN    2
  550.  
  551. ;----------
  552. ;DoTheSkipping - code starts here
  553. ;----------
  554.  
  555. DoTheSkipping
  556.         MOVE.L    BufPtr,SP
  557.         SUB    #32,SP            ;make room for above A5
  558.         MOVE.L    SP,A5            ;set up A5
  559.         SUB    #totalGlobals,SP    ;make room for below A5
  560.         MOVE.L    A5,CurrentA5
  561.         MOVE.L    SP,CurStackBase
  562.         MOVE.L    SP,StkLowPt
  563.         MOVE.L    SP,A0
  564.         SUB.L    DefltStack,A0
  565.         _SetApplLimit
  566.  
  567.         CLR.B    CurApName        ;current application has no name
  568.  
  569.         LEA    FirstThingsFirst,A0
  570.         _RecoverHandle            ;get the handle to this resource
  571.         _HLock                ;lock us in for the duration
  572.         MOVE.L    A0,-(SP)        ;and detach things
  573.         MOVE.L    A0,-(SP)
  574.         PEA    applicationReply(A5)    ;point to place for returned values
  575.         PEA    applicationReply+2(A5)
  576.         PEA    documentReply(A5)
  577.         _GetResInfo
  578.         MOVE.W    applicationReply(A5),owned(A5)
  579.         _DetachResource
  580.  
  581. ;----------
  582. ;now that basic setup is done, initialize the "application"
  583. ;----------
  584.  
  585.         PEA    quickGlobals(A5)
  586.         _InitGraf
  587.         _InitFonts
  588.         _InitWindows
  589.         _InitMenus
  590.         CLR.L    -(SP)
  591.         _InitDialogs
  592.         _TEInit
  593.  
  594.         SUBQ    #4,SP
  595.         MOVE.W    #watchCursor,-(SP)    ;get the watch
  596.         _GetCursor
  597.         MOVE.L    (SP)+,A0        ;keep it in memory
  598.         _HNoPurge
  599.         MOVE.L    (A0),-(SP)
  600.         _InitCursor            ;clear off the cursor
  601.         _SetCursor
  602.  
  603.         CLR.L    dormant(A5)
  604.         CLR.B    stopSkipping(A5)
  605.  
  606.         SUBQ    #4,SP
  607.         MOVE.W    #AppleMenuID,-(SP)    ;menu ID
  608.         PEA    AppleMenu        ;point to string
  609.         _NewMenu
  610.         MOVE.L    (SP)+,A2
  611.  
  612.         SUBQ    #4,SP
  613.         MOVEQ    #4,D0
  614.         ADD.W    owned(A5),D0
  615.         MOVE.W    D0,-(SP)
  616.         _GetString
  617.         MOVE.L    (SP)+,A3
  618.  
  619.         MOVE.L    A2,-(SP)
  620.         MOVE.L    (A3),-(SP)
  621.         _AppendMenu
  622.  
  623.         MOVE.L    A3,-(SP)
  624.         _ReleaseResource
  625.  
  626.         MOVE.L    A2,-(SP)
  627.         MOVE.L    #'DRVR',-(SP)
  628.         _AddResMenu
  629.  
  630.         MOVE.L    A2,-(SP)
  631.         CLR.W    -(SP)
  632.         _InsertMenu
  633.  
  634.         MOVE.L    A2,AppleMenuHandle(A5)
  635.  
  636.         SUBQ    #4,SP
  637.         MOVEQ    #2,D0
  638.         ADD.W    owned(A5),D0
  639.         MOVE.W    D0,-(SP)
  640.         _GetString
  641.         MOVE.L    (SP)+,A3
  642.  
  643.         SUBQ    #4,SP
  644.         MOVE.W    #EditMenuID,-(SP)
  645.         MOVE.L    (A3),-(SP)
  646.         _NewMenu
  647.         MOVE.L    (SP)+,A2
  648.  
  649.         MOVE.L    A3,-(SP)
  650.         _ReleaseResource
  651.  
  652.         SUBQ    #4,SP
  653.         MOVEQ    #3,D0
  654.         ADD.W    owned(A5),D0
  655.         MOVE.W    D0,-(SP)
  656.         _GetString
  657.         MOVE.L    (SP)+,A3
  658.  
  659.         MOVE.L    A2,-(SP)
  660.         MOVE.L    (A3),-(SP)
  661.         _AppendMenu
  662.  
  663.         MOVE.L    A3,-(SP)
  664.         _ReleaseResource
  665.  
  666.         MOVE.L    A2,-(SP)
  667.         CLR.W    -(SP)
  668.         _InsertMenu
  669.  
  670.         MOVE.L    A2,-(SP)
  671.         CLR.W    -(SP)
  672.         _DisableItem            ;disable Edit menu
  673.  
  674.         MOVE.L    A2,EditMenuHandle(A5)
  675.  
  676.         _DrawMenuBar
  677.  
  678. ;----------
  679. ;now that the application is set up and the menu is drawn, set up the files
  680. ;----------
  681.  
  682. longestQElSize    EQU    $80            ;no param block is longer than $80
  683.  
  684.         MOVEQ    #(longestQElSize/2)-1,D0 ;clear off a param block
  685. @1        CLR.W    -(SP)
  686.         DBRA    D0,@1
  687.  
  688.         MOVE.L    SP,A0
  689.  
  690. StartOver
  691.         MOVE.L    VCBQHdr+qHead,A1    ;point to queue
  692.         CLR.L    ioFileName(A0)
  693. NextVolume
  694.         MOVE.W    VCBVRefNum(A1),ioVRefNum(A0)    ;put the refNum in the block
  695.  
  696.         TST.W    VCBDrvNum(A1)        ;if in a drive, just flush
  697.         BNE.S    @1
  698.  
  699.         TST.W    VCBDRefNum(A1)        ;if not off line, just flush
  700.         BMI.S    @1
  701.  
  702.         _UnmountVol
  703.         BRA.S    StartOver
  704. @1
  705.         _FlushVol
  706.         MOVE.L    (A1),A1            ;advance through the queue
  707.         MOVE.L    A1,D0
  708.         BNE.S    NextVolume
  709.  
  710. ;----------
  711. ;DoDialog - load in the standard file dialogs and do the stuff
  712. ;----------
  713.  
  714. DoDialog
  715.         MOVE.W    owned(A5),-(SP)
  716.         _CouldDialog
  717.  
  718.         MOVE.W    owned(A5),D0        ;get the other ID (for the second dialog)
  719.         ADDQ.W    #2,D0
  720.         MOVE.W    D0,-(SP)
  721.         _CouldDialog
  722.  
  723.         CLR.L    -(SP)            ;offset 0,0
  724.         PEA    nullString        ;no prompt
  725.         PEA    ApplicationFilter    ;no file filter
  726.         MOVE.W    #-1,-(SP)        ;all file types allowed
  727.         CLR.L    -(SP)
  728.         PEA    ButtonHook        ;hook for extra controls
  729.         PEA    applicationReply(A5)    ;put the reply area
  730.         MOVE.L    (SP),currentReply(A5)    ;remind the reply
  731.         MOVE.W    owned(A5),-(SP)        ;id for the dialog
  732.         PEA    MenuFilter        ;menu filter procedure
  733.         BSR    CheckAllFiles
  734.         BSR    .SFPGetFile
  735.  
  736.         MOVE.W    dismissButton(A5),D0    ;shut down?
  737.         CMP.W    #getShutDown,D0
  738.         BEQ    PowerDown
  739.  
  740.         TST.B    stopSkipping(A5)    ;stop skipping?
  741.         BNE.S    NoMoreSkipping
  742.  
  743.         MOVE.W    dismissButton(A5),D0    ;Finder button?
  744.         CMP.W    #getCancel,D0
  745.         BNE.S    KeepSkipping
  746.  
  747.         BTST    #FBit,Options+1        ;keep skipping after Finder?
  748.         BEQ.S    NoMoreSkipping
  749.  
  750.         BSET    #7,stashed        ;keep skipping, go to Finder
  751.         BRA.S    KeepSkipping
  752.  
  753. NoMoreSkipping
  754.         MOVE.L    stashed,A0
  755.         MOVE.L    (A0),A0            ;get the old trap address
  756.         MOVE.W    #OpenResFile,D0        ;for _OpenResFile
  757.         _SetTrapAddress
  758.  
  759.         MOVE.L    stashed,A0
  760.         _DisposPtr
  761.         CLR.L    stashed
  762.  
  763. KeepSkipping
  764.         CLR.B    documentReply+rGood(A5)    ;documentReply is not good if we never do it
  765.  
  766.         MOVE.W    dismissButton(A5),D0    ;check if we need a document
  767.         CMP.W    #getOpenDoc,D0
  768.         BNE    ContinueSkipping
  769.  
  770. ;----------
  771. ;if a document is needed, find the application signature and bring up the second dialog
  772. ;----------
  773.  
  774.         MOVE.L    SP,A0
  775.  
  776.         MOVE.W    applicationReply+rVolume(A5),ioVRefNum(A0)
  777.         CLR.W    ioRefNum(A0)
  778.         LEA    applicationReply+rName(A5),A1
  779.         MOVE.L    A1,ioFileName(A0)
  780.         _GetFileInfo
  781.         MOVE.L    ioFlUsrWds+4(A0),signature(A5) ;store the signature
  782.  
  783.         PEA    applicationReply+rName(A5) ;put the application's name
  784.  
  785.         MOVE.B    applicationReply+rName+1(A5),D0    ;get a character
  786.         LEA    vowels,A0
  787. NextVowel
  788.         MOVE.B    (A0)+,D1
  789.         BEQ.S    NotAVowel
  790.         CMP.B    D0,D1
  791.         BNE.S    NextVowel
  792. IsAVowel
  793.         PEA    'n'
  794.         BRA.S    FinishVowel
  795. NotAVowel
  796.         CLR.L    -(SP)
  797. FinishVowel
  798.         CLR.L    -(SP)
  799.         CLR.L    -(SP)
  800.         _ParamText
  801.  
  802.         CLR.L    -(SP)            ;move onto the stack
  803.         PEA    nullString        ;no prompt
  804.         PEA    DocumentFilter        ;document only filter
  805.         MOVE.W    #-1,-(SP)        ;all file types allowed
  806.         CLR.L    -(SP)
  807.         PEA    ButtonHook        ;hook for check box
  808.         PEA    documentReply(A5)    ;put the reply area
  809.         MOVE.L    (SP),currentReply(A5)    ;remember the reply
  810.         MOVE.W    owned(A5),D0
  811.         ADDQ.W    #2,D0
  812.         MOVE.W    D0,-(SP)        ;id for the dialog
  813.         PEA    MenuFilter        ;no filter procedure
  814.         BSR    CheckAllFiles
  815.         BSR    .SFPGetFile
  816.  
  817.         TST.B    documentReply+rGood(A5)    ;check the result
  818.         BEQ    DoDialog
  819.  
  820. ;----------
  821. ;ContinueSkipping - now, build the Finder information and do the skip
  822. ;----------
  823.  
  824. ContinueSkipping
  825.         SUBQ    #4,SP
  826.         MOVE.W    #watchCursor,-(SP)    ;get the watch
  827.         _GetCursor
  828.         MOVE.L    (SP)+,A0        ;deref it onto stack
  829.         MOVE.L    (A0),-(SP)
  830.         _SetCursor
  831.  
  832.         MOVE.L    AppParmHandle,A0    ;get the handle
  833.  
  834.         MOVEQ    #4,D0            ;size it down to indicate no parameters
  835.         TST.B    documentReply+rGood(A5)    ;check if there are parameters
  836.         BEQ.S    NoDocument
  837.         MOVE.B    documentReply+rName(A5),D0 ;get the size
  838.         ADD.W    #13,D0            ;+13
  839. NoDocument
  840.         _SetHandleSize
  841.         BNE.S    DidFinderInfo        ;if no error:
  842.         TST.W    ROM85
  843.         BMI.S    @1
  844.         _MoveHHi
  845. @1
  846.         MOVE.L    (A0),A0            ;dereference and
  847.         CLR.L    (A0)            ;clear it
  848.         TST.B    documentReply+rGood(A5)    ;was it good?
  849.         BEQ.S    DidFinderInfo
  850.         MOVE.W    dismissButton(A5),D0
  851.         CMP.W    #getOpenDoc,D0        ;was it a print?
  852.         BNE.S    NotPrint
  853.         ADDQ.W    #1,(A0)            ;set for print
  854. NotPrint
  855.         ADDQ.L    #1,(A0)+        ;set for 1 file
  856.         MOVE.W    documentReply+rVolume(A5),(A0)+
  857.         MOVE.L    documentReply+rType(A5),(A0)+
  858.         MOVE.W    documentReply+rVersion(A5),(A0)+
  859.         MOVEQ    #0,D0
  860.         LEA    documentReply+rName(A5),A1
  861.         MOVE.B    (A1),D0
  862. @1
  863.         MOVE.B    (A1)+,(A0)+        ;move the name in
  864.         DBRA    D0,@1
  865. DidFinderInfo
  866.  
  867. ;----------
  868. ;now that the finder info is built, switch systems if we want to
  869. ;----------
  870.  
  871.         MOVE.W    applicationReply+rVolume(A5),D3
  872.         CMP.W    BootDrive,D3        ;boot disk is already OK
  873.         BEQ    DontSwitchSystems
  874.  
  875.         BTST    #HBit,Options+1        ;options say don't switch
  876.         BEQ    DontSwitchSystems
  877.  
  878.         MOVE.L    SP,A0            ;point to param block
  879.         MOVE.W    applicationReply+rVolume(A5),ioVRefNum(A0)
  880.         _SetVol
  881.  
  882.         TST.W    FSFCBLen
  883.         BMI.S    GotVRefNum
  884.  
  885.         CLR.W    ioWDIndex(A0)
  886.         _GetWDInfo            ;get the volume ID
  887.         BMI.S    GotVRefNum
  888.  
  889.         CLR.L    ioFileName(A0)
  890.         CLR.W    ioVolIndex(A0)
  891.         _HGetVInfo            ;get the system volume
  892.         BMI.S    GotVRefNum
  893.  
  894.         MOVE.L    ioVFndrInfo(A0),ioWDDirID(A0)
  895.         _HSetVol
  896. GotVRefNum
  897.         CLR.W    ioVRefNum(A0)
  898.  
  899.         MOVE.L    #SysResName,ioFileName(A0)
  900.         _GetFileInfo
  901.         BNE.S    DontSwitchSystems    ;doesn't exist, don't switch
  902.  
  903.         TST.W    ioRefNum(A0)        ;check if already open
  904.         BNE.S    DontSwitchSystems
  905.  
  906.         MOVE.L    #FinderName,ioFileName(A0)
  907.         _GetFileInfo
  908.         BNE.S    DontSwitchSystems
  909.  
  910.         SUBQ    #4,SP
  911.         _LodeScrap
  912.         ADDQ    #4,SP
  913.  
  914.         CLR.W    -(SP)
  915.         _CloseResFile            ;close all the resource files
  916.  
  917.         MOVE.L    SP,A0
  918.  
  919.         CLR.L    ioFileName(A0)
  920.         _GetVol                ;find the boot volume
  921.  
  922.         TST.W    FSFCBLen
  923.         BMI.S    SetBootDrive
  924.  
  925.         _HGetVol            ;get that volume
  926.  
  927.         CLR.L    ioFileName(A0)
  928.         MOVE.L    #'SKIP',ioWDProcID(A0)
  929.         _OpenWD                ;open it as a WD
  930.  
  931.         _SetVol                ;point to it
  932. SetBootDrive
  933.         MOVE.W    ioVRefNum(A0),BootDrive ;set the boot drive correctly
  934.  
  935.         SUBQ    #2,SP            ;open the new system file
  936.         _InitResources
  937.         ADDQ    #2,SP            ;discard returned integer
  938.  
  939.         _InitFonts
  940. DontSwitchSystems
  941.  
  942. ;----------
  943. ;now that we have switched systems if desired do a Finder launch or other launch
  944. ;----------
  945.  
  946.         MOVE.W    dismissButton(A5),D0
  947.         CMP.W    #getCancel,D0        ;did he press the Finder button?
  948.         BNE.S    NotFinder
  949.  
  950. ;----------
  951. ;Finder launch
  952. ;----------
  953.  
  954.         MOVE.L    SP,A0
  955.         MOVE.W    BootDrive,ioVRefNum(A0)
  956.         _SetVol                ;run the Finder on the correct volume
  957.  
  958.         CLR.W    -(SP)
  959.         PEA    FinderName
  960.         MOVE.L    SP,A0
  961.         _Launch                ;Launch away!
  962.  
  963. ;----------
  964. ;other application launch
  965. ;----------
  966.  
  967. NotFinder
  968.         MOVE.L    SP,A0
  969.         MOVE.W    applicationReply+rVolume(A5),ioVRefNum(A0)
  970.         _SetVol                ;run the application on the correct volume
  971.  
  972.         CLR.W    -(SP)
  973.         PEA    applicationReply+rName(A5)
  974.         MOVE.L    SP,A0
  975.         _Launch                ;Launch away!
  976.  
  977. ;----------
  978. ;PowerDown - shut down the Mac
  979. ;----------
  980.  
  981. PowerDown
  982.         CLR.W    -(SP)            ;close all resource files
  983.         _CloseResFile
  984.  
  985.         MOVE.L    SP,A0            ;point to the io block
  986. EjectVolume
  987.         MOVE.L    VCBQHdr+qHead,A1    ;get the first VCB Queue entry
  988.         MOVE.L    A1,D0            ;check A1
  989.         BEQ.S    Restart
  990.  
  991.         MOVE.W    VCBVRefNum(A1),ioVRefNum(A0)    ;eject a volume
  992.         _Eject
  993.         _UnmountVol
  994.  
  995.         BRA.S    EjectVolume
  996. Restart
  997.         MOVE.L    ROMBase,A0
  998.         RESET
  999.         JMP    10(A0)
  1000.  
  1001.  
  1002. ;----------
  1003. ;ApplicationFilter - selects only applications, or all documents if we are not as picky
  1004. ;----------
  1005.  
  1006. ApplicationFilter
  1007.         MOVE.L    (SP)+,A0        ;get the return address
  1008.  
  1009.         MOVE.L    (SP)+,A1        ;get the param block pointer
  1010.         CLR.W    (SP)            ;clear the result by default
  1011.  
  1012.         MOVE.B    allFiles(A5),D0        ;if all files, bypass APPL check
  1013.         BNE.S    IsApplication
  1014.  
  1015.         CMP.L    #'APPL',ioFlUsrWds(A1)    ;check file type = APPL
  1016.         BEQ.S    IsApplication
  1017.         ST    (SP)            ;an non application shouldn't be
  1018. IsApplication
  1019.         JMP    (A0)
  1020.  
  1021.  
  1022. ;----------
  1023. ;DocumentFilter - selects only documents with the right creator, unless we are not very picky
  1024. ;----------
  1025.  
  1026. DocumentFilter
  1027.         MOVE.L    (SP)+,A0        ;get the return address
  1028.  
  1029.         MOVE.L    (SP)+,A1        ;get the param block pointer
  1030.         CLR.W    (SP)            ;clear the result by default
  1031.  
  1032.         CMP.L    #'APPL',ioFlUsrWds(A1)    ;check file type = APPL
  1033.         BEQ.S    NotDocument
  1034.  
  1035.         MOVE.B    allFiles(A5),D0        ;if all files, bypass signature check
  1036.         BNE.S    IsDocument
  1037.  
  1038.         MOVE.L    ioFlUsrWds+4(A1),D0    ;get the creator
  1039.         CMP.L    signature(A5),D0    ;is it equal?
  1040.         BEQ.S    IsDocument
  1041. NotDocument
  1042.         ST    (SP)            ;an application shouldn't be
  1043. IsDocument
  1044.         JMP    (A0)
  1045.  
  1046.  
  1047. ;----------
  1048. ;ButtonHook - handle all the niceties of the standard file dialog
  1049. ;----------
  1050.  
  1051. dialogPtr    EQU    8
  1052. item        EQU    12
  1053. result        EQU    14
  1054.  
  1055. type        EQU    -2
  1056. box        EQU    type-8
  1057. controlHandle    EQU    box-4
  1058.  
  1059. needed        EQU    controlHandle
  1060.  
  1061. TrackButton
  1062.         MOVE.W    D0,result(A6)
  1063.  
  1064.         MOVE.L    dialogPtr(A6),-(SP)
  1065.         MOVE.W    D0,-(SP)
  1066.         PEA    type(A6)
  1067.         PEA    controlHandle(A6)
  1068.         PEA    box(A6)
  1069.         _GetDItem
  1070.  
  1071.         MOVE.L    controlHandle(A6),A0
  1072.         MOVE.L    (A0),A0
  1073.         MOVE.B    contrlHilite(A0),D0
  1074.         CMP.B    #254,D0
  1075.         BLO.S    FlashButton
  1076.  
  1077.         CLR.W    result(A6)
  1078.         BRA.S    AlmostDone
  1079. FlashButton
  1080.         MOVE.L    controlHandle(A6),-(SP)
  1081.         BSR    FlashControl        ;flash the control
  1082.  
  1083. AlmostDone
  1084.         MOVE.W    result(A6),D0
  1085.         BRA    RescanButton
  1086.  
  1087. EnterKey
  1088.         MOVEQ    #getOpenDoc,D0        ;Open.../Print
  1089.         BRA.S    TrackButton
  1090.  
  1091. BackspaceKey
  1092.         MOVEQ    #getCancel,D0        ;Finder/Cancel
  1093.         BRA.S    TrackButton
  1094.  
  1095. TabKey
  1096. CmdDKey
  1097.         MOVEQ    #getDrive,D0        ;Drive
  1098.         BRA.S    TrackButton
  1099.  
  1100. ReturnKey
  1101.         MOVEQ    #getOpen,D0        ;Open
  1102.         BRA    TrackButton
  1103.  
  1104. CmdTabKey
  1105. CmdEKey
  1106.         MOVEQ    #getEject,D0        ;Eject
  1107.         BSR    TrackButton
  1108.  
  1109. Cmd.Key
  1110. CmdQKey
  1111.         MOVEQ    #getShutDown,D0        ;Shut Down
  1112.         BSR    TrackButton
  1113.  
  1114. ButtonHook
  1115.         LINK    A6,#needed
  1116.  
  1117.         MOVE.W    item(A6),D0
  1118. RescanButton
  1119.         MOVE.W    D0,dismissButton(A5)
  1120.         LEA    ButtonTable,A0
  1121. NextButton
  1122.         TST.W    (A0)
  1123.         BEQ.S    StuffResult
  1124.         MOVE.L    (A0)+,D1
  1125.         SWAP    D1
  1126.         CMP.W    D1,D0
  1127.         BNE    NextButton
  1128.         SWAP    D1
  1129.         JMP    ButtonTable(D1.W)
  1130.  
  1131. ButtonTable
  1132.         DC.W    $1003,EnterKey-ButtonTable
  1133.         DC.W    $1008,BackspaceKey-ButtonTable
  1134.         DC.W    $1009,TabKey-ButtonTable
  1135.         DC.W    $1109,CmdTabKey-ButtonTable
  1136.         DC.W    $100D,ReturnKey-ButtonTable
  1137.         DC.W    $112E,Cmd.Key-ButtonTable
  1138.         DC.W    $1144,CmdDKey-ButtonTable
  1139.         DC.W    $1164,CmdDKey-ButtonTable
  1140.         DC.W    $1145,CmdEKey-ButtonTable
  1141.         DC.W    $1165,CmdEKey-ButtonTable
  1142.         DC.W    $1151,CmdQKey-ButtonTable
  1143.         DC.W    $1171,CmdQKey-ButtonTable
  1144.  
  1145.         DC.W    getOpen,OpenButton-ButtonTable
  1146.         DC.W    getOpenDoc,OpenDocButton-ButtonTable
  1147.         DC.W    getShutDown,ShutDownButton-ButtonTable
  1148.         DC.W    getStop,StopButton-ButtonTable
  1149.         DC.W    getNothing,Nothing-ButtonTable
  1150.  
  1151.         DC.W    0
  1152.  
  1153. StuffResult
  1154.         CMP.W    #$1100,D0        ;it does not understand>1100!
  1155.         BLO.S    @1
  1156.         MOVEQ    #0,D0
  1157. @1
  1158.         MOVE.W    D0,result(A6)
  1159. DoneButton
  1160.         UNLK    A6
  1161.         MOVE.L    (SP)+,A0        ;get return address
  1162.         ADDQ    #6,SP            ;pop off parameters
  1163.         JMP    (A0)
  1164.  
  1165. OpenButton
  1166.         MOVE.L    currentReply(A5),A0
  1167.         TST.B    rName(A0)
  1168.         BNE.S    StuffResult
  1169.         MOVEQ    #getOpenFolder,D0    ;Open folder
  1170.         BRA.S    StuffResult
  1171.  
  1172. OpenDocButton
  1173.         MOVE.L    dialogPtr(A6),-(SP)
  1174.         MOVE.W    #getOpen,-(SP)
  1175.         PEA    type(A6)
  1176.         PEA    controlHandle(A6)
  1177.         PEA    box(A6)
  1178.         _GetDItem
  1179.  
  1180.         MOVE.L    controlHandle(A6),A0
  1181.         MOVE.L    (A0),A0
  1182.         MOVE.B    contrlHilite(A0),D0
  1183.         CMP.B    #254,D0
  1184.         BHS.S    NoButton
  1185.  
  1186. ;        BRA.S    FakeOpenButton
  1187.  
  1188. ShutDownButton
  1189. ;        BRA.S    FakeOpenButton
  1190.  
  1191. FakeOpenButton
  1192.         MOVEQ    #getOpen,D0        ;simulate an open
  1193.         BRA.S    StuffResult
  1194.  
  1195. StopButton
  1196.         MOVE.L    dialogPtr(A6),-(SP)
  1197.         MOVE.W    D0,-(SP)        ;item number
  1198.         PEA    type(A6)
  1199.         PEA    controlHandle(A6)
  1200.         PEA    box(A6)
  1201.         _GetDItem
  1202.  
  1203.         SUBQ    #4,SP
  1204.         MOVE.W    owned(A5),D0
  1205.  
  1206.         LEA    stopSkipping(A5),A0
  1207.         TST.B    (A0)
  1208.         SEQ    (A0)
  1209.         BNE.S    @1
  1210.         ADDQ.W    #1,D0
  1211. @1
  1212.         MOVE.W    D0,-(SP)
  1213.         _GetString
  1214.         MOVE.L    (SP),A0
  1215.         MOVE.L    controlHandle(A6),-(SP)
  1216.         MOVE.L    (A0),-(SP)
  1217.         _SetCTitle
  1218.         _ReleaseResource
  1219. ;        BRA.S    NoButton
  1220.  
  1221. NoButton
  1222.         MOVE.W    #getNothing,D0
  1223.         BRA    StuffResult
  1224.  
  1225. Nothing
  1226.         BSR.S    CheckAllFiles
  1227.         BEQ    StuffResult
  1228.         MOVE.W    #getRebuild,D0
  1229.         BRA    StuffResult
  1230.  
  1231. CheckAllFiles
  1232.         LEA    allFiles(A5),A0
  1233.         MOVEQ    #0,D0
  1234.         BTST    #2,$17B            ;This is the Option key!
  1235.         BEQ.S    NotAllFIles
  1236.         MOVEQ    #-1,D0
  1237. NotAllFiles
  1238.         MOVE.B    (A0),D1
  1239.         MOVE.B    D0,(A0)
  1240.         CMP.B    D0,D1
  1241.         RTS
  1242.  
  1243.  
  1244. ;----------
  1245. ;MenuFiler - handle all the things associated with the menu and the Open.../Print button
  1246. ;----------
  1247.  
  1248. MenuFilter
  1249.         LINK    A6,#0
  1250.  
  1251.         ;before we start the menu, fix the Open.../Print button
  1252.  
  1253.         MOVE.L    theDialog(A6),-(SP)
  1254.         MOVE.W    #getOpen,-(SP)
  1255.         PEA    scratch20
  1256.         PEA    scratch20+2        ;getOpen in scratch20+2
  1257.         PEA    scratch8
  1258.         _GetDItem
  1259.  
  1260.         MOVE.L    theDialog(A6),-(SP)
  1261.         MOVE.W    #getOpenDoc,-(SP)
  1262.         PEA    scratch20
  1263.         PEA    scratch20+6        ;getOpenDoc in scratch20+6
  1264.         PEA    scratch8
  1265.         _GetDItem
  1266.  
  1267.         MOVEQ    #0,D0
  1268.  
  1269.         MOVE.L    scratch20+2,A0
  1270.         MOVE.L    (A0),A0
  1271.         TST.B    contrlHilite(A0)
  1272.         BNE.S    DoUnHilite        ;decide whether to hilite
  1273.  
  1274.         MOVE.L    currentReply(A5),A0
  1275.         TST.B    rName(A0)
  1276.         BNE.S    DoHilite        ;decide whether to hilite
  1277. DoUnHilite
  1278.         MOVE.B    #255,D0
  1279. DoHilite
  1280.         MOVE.L    scratch20+6,A0
  1281.         MOVE.L    (A0),A0
  1282.         CMP.B    contrlHilite(A0),D0
  1283.         BEQ.S    DontHiliteOpenDoc
  1284.  
  1285.         MOVE.L    scratch20+6,-(SP)
  1286.         MOVE.W    D0,-(SP)
  1287.         _HiliteControl
  1288. DontHiliteOpenDoc
  1289.  
  1290. NextFilter
  1291.         CLR.B    filtered(A6)
  1292.  
  1293.         MOVE.L    theEvent(A6),A0
  1294.  
  1295.         CMP.W    #mButDwnEvt,(A0)
  1296.         BNE.S    NotMouseDown
  1297.  
  1298.         SUBQ    #2,SP
  1299.         MOVE.L    evtMouse(A0),-(SP)
  1300.         PEA    scratch20
  1301.         _FindWindow
  1302.         MOVE.W    (SP)+,D0
  1303.  
  1304.         CMP.W    #inMenuBar,D0
  1305.         BNE.S    NotMouseMenu
  1306.  
  1307.         MOVE.L    theEvent(A6),A0
  1308.  
  1309.         SUBQ    #4,SP
  1310.         MOVE.L    evtMouse(A0),-(SP)
  1311.         _MenuSelect
  1312.  
  1313.         BSR    DoMenuItem
  1314.  
  1315.         BRA.S    DoneMouseDown
  1316. NotMouseMenu
  1317.         CMP.W    #inSysWindow,D0
  1318.         BNE.S    NotMouseDA
  1319.  
  1320.         MOVE.L    theEvent(A6),-(SP)
  1321.         MOVE.L    scratch20,-(SP)
  1322.         _SystemClick
  1323.         BRA.S    DoneMouseDown
  1324. NotMouseDA
  1325.         CMP.W    #inDesk,D0
  1326.         BNE    DoneMenuFilter
  1327. DoneMouseDown
  1328. DoneKeyDown
  1329. DoneUpdate
  1330.         MOVE.L    theEvent(A6),A0
  1331.         CLR.W    (A0)
  1332.         BRA    DoneMenuFilter
  1333. NotMouseDown
  1334.         CMP.W    #keyDwnEvt,(A0)
  1335.         BNE.S    NotKeyDown
  1336.  
  1337.         MOVE.L    evtMessage(A0),D0
  1338.         AND.W    #$FF,D0
  1339.  
  1340.         BTST    #cmdKey-8,evtMeta(A0)
  1341.         BEQ.S    NotCmdKey
  1342.  
  1343.         SUBQ    #4,SP
  1344.         MOVE.W    D0,-(SP)
  1345.         _MenuKey
  1346.  
  1347.         TST.W    (SP)
  1348.         BEQ.S    IsCmdKey
  1349.  
  1350.         BSR    DoMenuItem
  1351.         BRA.S    DoneKeyDown
  1352. IsCmdKey
  1353.         ADDQ    #4,SP
  1354.         MOVE.L    theEvent(A6),A0
  1355.         MOVE.L    evtMessage(A0),D0
  1356.         AND.W    #$FF,D0
  1357.  
  1358.         CMP.W    #9,D0
  1359.         BEQ.S    @1
  1360.  
  1361.         CMP.W    #$20,D0
  1362.         BLO.S    DoneMenuFilter
  1363. @1
  1364.         ADD.W    #$1100,D0
  1365.         BRA.S    FilterKey
  1366. NotCmdKey
  1367.         CMP.W    #$20,D0
  1368.         BHS.S    DoneMenuFilter
  1369.  
  1370.         ADD.W    #$1000,D0
  1371. FilterKey
  1372.         MOVE.L    itemHit(A6),A0
  1373.         MOVE.W    D0,(A0)
  1374.         ADDQ.B    #1,filtered(A6)
  1375.         BRA.S    DoneKeyDown
  1376. NotKeyDown
  1377.         CMP.W    #updatEvt,(A0)
  1378.         BNE.S    DoneMenuFilter
  1379.  
  1380.         MOVE.L    theDialog(A6),D0
  1381.  
  1382.         MOVE.L    D0,-(SP)
  1383.         MOVE.L    D0,-(SP)
  1384.         MOVE.L    D0,-(SP)
  1385.         MOVE.L    D0,-(SP)
  1386.  
  1387.         _BeginUpdate
  1388.         _DrawDialog
  1389.         BSR    OutlineButton
  1390.  
  1391.         TST.L    dormant(A5)
  1392.         BEQ.S    @1
  1393.  
  1394.         MOVE.L    (SP),-(SP)
  1395.         BSR    DimWindow
  1396. @1
  1397.         _EndUpdate
  1398.  
  1399.         BRA    DoneUpdate
  1400.  
  1401. DoneMenuFilter
  1402.         SUBQ    #4,SP
  1403.         _FrontWindow
  1404.         LEA    dormant(A5),A1
  1405.         MOVE.L    (SP)+,D0
  1406.  
  1407.         CMP.L    theDialog(A6),D0
  1408.         BEQ.S    BringBackDialog
  1409.         TST.L    (A1)
  1410.         BEQ.S    DimDownDialog
  1411.         BRA.S    NextEvent
  1412.  
  1413. DimDownDialog
  1414.         MOVE.L    theDialog(A6),A0
  1415.         MOVE.L    A0,(A1)
  1416.         MOVE.L    A0,-(SP)
  1417.         BSR    DimWindow
  1418.  
  1419.         MOVE.L    EditMenuHandle(A5),-(SP)
  1420.         CLR.W    -(SP)
  1421.         _EnableItem
  1422.         _DrawMenuBar
  1423.  
  1424. NextEvent
  1425.         _SystemTask
  1426.  
  1427.         SUBQ    #2,SP
  1428.         MOVE.W    #-1,-(SP)
  1429.         MOVE.L    theEvent(A6),-(SP)
  1430.         _GetNextEvent
  1431.         TST.B    (SP)+
  1432.         BEQ.S    NextEvent
  1433.  
  1434.         BRA    NextFilter
  1435.  
  1436. BringBackDialog
  1437.         MOVE.L    (A1),D0
  1438.         BEQ.S    @1
  1439.         CLR.L    (A1)
  1440.  
  1441.         MOVE.L    D0,-(SP)
  1442.         MOVE.L    D0,-(SP)
  1443.         MOVE.L    D0,-(SP)
  1444.  
  1445.         _DrawDialog
  1446.         BSR    OutlineButton
  1447.  
  1448.         MOVE.L    (SP)+,A0
  1449.         MOVE.L    visRgn(A0),-(SP)
  1450.         _ValidRgn
  1451.  
  1452.         MOVE.L    EditMenuHandle(A5),-(SP)
  1453.         CLR.W    -(SP)
  1454.         _DisableItem
  1455.         _DrawMenuBar
  1456. @1
  1457.         UNLK    A6
  1458.         MOVE.L    (SP)+,A0        ;get return address
  1459.         ADD    #12,SP            ;pop off parameters
  1460.         JMP    (A0)
  1461.  
  1462.  
  1463. DoMenuItem
  1464.         MOVE.L    (SP)+,A0
  1465.         MOVE.W    (SP)+,D0        ;get the menu number
  1466.         MOVE.W    (SP)+,D1        ;get the item number
  1467.         MOVE.L    A0,-(SP)
  1468.  
  1469.         CMP.W    #AppleMenuID,D0
  1470.         BNE    NotAppleMenu
  1471.  
  1472.         CMP.W    #2,D1
  1473.         BHI    OpenDeskAccessory
  1474.  
  1475. ;----------
  1476. ;AboutScreen - bring up the about screen
  1477. ;----------
  1478.  
  1479. AboutScreen
  1480.         SUBQ    #4,SP
  1481.         MOVE.W    owned(A5),-(SP)
  1482.         _GetPicture
  1483.         MOVE.L    (SP),A0            ;get the resource handle
  1484.         MOVE.L    (A0),A0            ;dereference
  1485.  
  1486.         MOVE.L    picFrame+topLeft(A0),scratch20+topLeft
  1487.         MOVE.L    picFrame+botRight(A0),scratch20+botRight
  1488.  
  1489.         SUBQ    #4,SP
  1490.         CLR.L    -(SP)
  1491.         PEA    scratch20
  1492.         PEA    nullString
  1493.         MOVE.B    #0,-(SP)
  1494.         MOVE.W    #dBoxProc,-(SP)
  1495.         MOVE.L    MinusOne,-(SP)
  1496.         CLR.B    -(SP)
  1497.         CLR.L    -(SP)
  1498.         _NewWindow
  1499.  
  1500.         MOVE.L    (SP)+,A0        ;get window
  1501.         MOVE.L    (SP)+,A1        ;get picture
  1502.  
  1503.         MOVE.L    A0,-(SP)        ;put window
  1504.         MOVE.L    A1,-(SP)        ;put picture
  1505.         MOVE.L    A1,-(SP)        ;put picture
  1506.         MOVE.L    A0,-(SP)        ;put window
  1507.         MOVE.L    A0,-(SP)        ;put window
  1508.         MOVE.L    A0,-(SP)        ;put window
  1509.  
  1510.         BSR    CenterWindow        ;use window
  1511.         _ShowWindow            ;use window
  1512.         _SetPort            ;use window
  1513.         PEA    scratch20
  1514.         _DrawPicture            ;use picture
  1515.         _ReleaseResource        ;use picture
  1516. AboutLoop
  1517.         SUBQ    #2,SP
  1518.         MOVE.W    #$003F,-(SP)
  1519.         PEA    scratch20
  1520.         _GetNextEvent
  1521.         TST.B    (SP)+
  1522.         BEQ.S    AboutLoop
  1523.  
  1524.         CMP.W    #mButDwnEvt,scratch20+evtNum
  1525.         BEQ.S    DoneAbout
  1526.  
  1527.         CMP.W    #keyDwnEvt,scratch20+evtNum
  1528.         BNE.S    AboutLoop
  1529.  
  1530.         CMP.B    #3,scratch20+evtMessage+3
  1531.         BEQ.S    DoneAbout
  1532.  
  1533.         CMP.B    #13,scratch20+evtMessage+3
  1534.         BNE.S    AboutLoop
  1535.  
  1536. DoneAbout
  1537.         _DisposWindow            ;use window
  1538.  
  1539.         BRA.S    DoneMenuItem
  1540.  
  1541. ;----------
  1542. ;OpenDeskAccessory - open a desk accessory
  1543. ;----------
  1544.  
  1545. OpenDeskAccessory
  1546.         SUB    #256,SP
  1547.         MOVE.L    AppleMenuHandle(A5),-(SP)
  1548.         MOVE.W    D1,-(SP)
  1549.         PEA    6(SP)
  1550.         _GetItem
  1551.  
  1552.         BSET    #7,stashed
  1553.         SUBQ    #2,SP
  1554.         PEA    2(SP)
  1555.         _OpenDeskAcc
  1556.         ADD    #256+2,SP
  1557.         BCLR    #7,stashed
  1558.  
  1559.         CLR.W    -(SP)
  1560.         _HiliteMenu
  1561.         _DrawMenuBar
  1562.         RTS
  1563.  
  1564.  
  1565. NotAppleMenu
  1566.         CMP.W    #EditMenuID,D0
  1567.         BNE.S    DoneMenuItem
  1568.  
  1569.         SUBQ.W    #1,D1
  1570.         SUBQ    #2,SP
  1571.         MOVE.W    D1,-(SP)
  1572.         _SysEdit
  1573.         ADDQ    #2,SP
  1574. DoneMenuItem
  1575.         CLR.W    -(SP)
  1576.         _HiliteMenu
  1577.         RTS
  1578.  
  1579.  
  1580. ;----------
  1581. ;DimWindow - dim down the contents of a window
  1582. ;----------
  1583.  
  1584. DimWindow
  1585.         MOVE.L    (SP)+,A1
  1586.         MOVE.L    (SP)+,A0
  1587.         MOVE.L    A1,-(SP)
  1588.  
  1589.         PEA    portRect(A0)
  1590.         MOVE.L    A0,-(SP)
  1591.         _SetPort
  1592.         MOVE.L    (A5),A0
  1593.         PEA    gray(A0)
  1594.         _PenPat
  1595.         MOVE.W    #patBic,-(SP)
  1596.         _PenMode
  1597.         _PaintRect
  1598.         _PenNormal
  1599.         RTS
  1600.  
  1601.  
  1602. ;----------
  1603. ;OutlineButton - outline the button that is default (button #1)
  1604. ;----------
  1605.  
  1606. OutlineButton
  1607.         MOVE.L    4(SP),-(SP)
  1608.         _SetPort
  1609.  
  1610.         MOVE.L    4(SP),-(SP)
  1611.         MOVE.W    #1,-(SP)        ;item 1 is always default
  1612.         PEA    scratch20
  1613.         PEA    scratch20+2
  1614.         PEA    scratch8
  1615.         _GetDItem
  1616.  
  1617.         LEA    scratch8,A0        ;rectangle
  1618.         MOVEQ    #3,D0            ;width of outline
  1619.         MOVEQ    #16,D1            ;rounding factor of outline
  1620.         MOVEQ    #-4,D2            ;inset of outline
  1621.  
  1622.         MOVE.L    A0,-(SP)        ;FrameRoundRect
  1623.         MOVE.W    D1,-(SP)
  1624.         MOVE.W    D1,-(SP)
  1625.  
  1626.         MOVE.L    A0,-(SP)        ;InsetRect
  1627.         MOVE.W    D2,-(SP)
  1628.         MOVE.W    D2,-(SP)
  1629.  
  1630.         MOVE.W    D0,-(SP)        ;PenSize
  1631.         MOVE.W    D0,-(SP)
  1632.  
  1633.         _PenSize
  1634.         _InsetRect
  1635.         _FrameRoundRect
  1636.  
  1637.         MOVE.L    (SP)+,(SP)
  1638.         RTS
  1639.  
  1640.  
  1641. ;----------
  1642. ;.SFPGetFile - this is the substitute _SFPGetFile that prevents anything
  1643. ;              from calling standard file while it is running
  1644. ;----------
  1645.  
  1646. .SFPGetFile
  1647.         MOVE.L    (SP)+,returnAddress(A5)
  1648.  
  1649.         MOVE.W    #Pack3,D0
  1650.         _GetTrapAddress
  1651.         MOVE.L    A0,Pack3Address(A5)
  1652.         MOVE.L    A0,A1
  1653.  
  1654.         MOVE.W    #MoveWindow,D0
  1655.         _GetTrapAddress
  1656.         MOVE.L    A0,MoveAddress(A5)
  1657.  
  1658.         MOVEQ    #6,D0
  1659.         _NewPtr    ,SYS
  1660.         MOVE.W    #Pack3,D0
  1661.         _SetTrapAddress
  1662.         MOVE.W    #$4EF9,(A0)+        ;JMP ABS.L
  1663.         PEA    PatchStdFile
  1664.         MOVE.L    (SP)+,(A0)+
  1665.  
  1666.         MOVEQ    #6,D0
  1667.         _NewPtr    ,SYS
  1668.         MOVE.W    #MoveWindow,D0
  1669.         _SetTrapAddress
  1670.         MOVE.W    #$4EF9,(A0)+        ;JMP ABS.L
  1671.         PEA    PatchMoveWindow
  1672.         MOVE.L    (SP)+,(A0)+
  1673.  
  1674.         MOVE.W    #sfPGetFile,-(SP)    ;put selector on stack
  1675.         JSR    (A1)
  1676.  
  1677.         MOVE.W    #Pack3,D0
  1678.         _GetTrapAddress
  1679.         _DisposPtr
  1680.  
  1681.         MOVE.W    #Pack3,D0
  1682.         MOVE.L    Pack3Address(A5),A0
  1683.         _SetTrapAddress
  1684.  
  1685.         MOVE.L    returnAddress(A5),-(SP)
  1686.         RTS
  1687.  
  1688.  
  1689. ;----------
  1690. ;PatchStdFile - what PACK 3 calls while .SFPGetFile is working
  1691. ;----------
  1692.  
  1693. PatchStdFile
  1694.         MOVE.L    (SP)+,A0
  1695.  
  1696.         MOVE.W    (SP)+,D0        ;get the selector
  1697.         CMP.W    #sfPutFile,D0
  1698.         BEQ.S    SFPutFile.
  1699.         CMP.W    #sfPPutFile,D0
  1700.         BEQ.S    SFPPutFile.
  1701.         CMP.W    #sfGetFile,D0
  1702.         BEQ.S    SFGetFile.
  1703.         CMP.W    #sfPGetFile,D0
  1704.         BEQ.S    SFPGetFile.
  1705.         MOVEQ    #20,D0            ;dsNoPk3
  1706.         _SysError
  1707. SFPPutFile.
  1708.         ADDQ    #6,SP
  1709. SFPutFile.
  1710.         MOVE.L    (SP)+,A1
  1711.         ADD    #16,SP
  1712.         BRA.S    FinishStdFile
  1713. SFPGetFile.
  1714.         ADDQ    #6,SP
  1715. SFGetFile.
  1716.         MOVE.L    (SP)+,A1
  1717.         ADD    #22,SP
  1718. ;        BRA.S    FinishStdFile
  1719. FinishStdFile
  1720.         CLR.B    (A1)
  1721.         MOVE.L    A0,-(SP)
  1722.  
  1723.         MOVE.W    owned(A5),D0
  1724.         ADDQ.W    #3,D0
  1725.  
  1726.         SUBQ    #4,SP
  1727.         MOVE.W    D0,-(SP)
  1728.         CLR.L    -(SP)
  1729.         MOVE.L    #-1,-(SP)
  1730.         _GetNewDialog
  1731.  
  1732.         MOVE.L    (SP),-(SP)
  1733.         BSR    CenterWindow
  1734.  
  1735.         MOVE.L    (SP),-(SP)
  1736.         _ShowWindow
  1737.  
  1738.         PEA    SFFilter
  1739.         PEA    scratch20
  1740.         _ModalDialog
  1741.  
  1742.         _DisposDialog
  1743.  
  1744.         RTS
  1745.  
  1746.  
  1747. ;----------
  1748. ;PatchMoveWindow - what MoveWindow calls the first time after SF is called
  1749. ;----------
  1750.  
  1751. PatchMoveWindow
  1752.         MOVE.W    #MoveWindow,D0
  1753.         _GetTrapAddress
  1754.         _DisposPtr
  1755.  
  1756.         MOVE.W    #MoveWindow,D0
  1757.         MOVE.L    MoveAddress(A5),A0
  1758.         _SetTrapAddress
  1759.  
  1760.         MOVE.L    (SP)+,A0
  1761.         ADDQ    #6,SP
  1762.         MOVE.L    A0,-(SP)
  1763. ;        BRA.S    CenterWindow
  1764.  
  1765.  
  1766. ;----------
  1767. ;CenterWindow - center a window on the screen
  1768. ;----------
  1769.  
  1770. CenterWindow
  1771.         MOVE.L    (SP)+,A1        ;get the return address
  1772.         MOVE.L    (SP)+,A0
  1773.         MOVE.L    A1,-(SP)
  1774.  
  1775.         MOVEQ    #0,D1            ;get ready for centering
  1776.  
  1777.         MOVE.W    quickGlobals+screenBits+bounds+bottom(A5),D1 ;calculate centering info
  1778.         SUB.W    portRect+bottom(A0),D1    ;by subtracting (ignore the menu bar)
  1779.         ADD.W    #20,D1
  1780.         ASR.W    #1,D1            ;and shifting
  1781.  
  1782.         SWAP    D1            ;move the Y coordinate to high word
  1783.  
  1784.         MOVE.W    quickGlobals+screenBits+bounds+right(A5),D1 ;do the same for X
  1785.         SUB.W    portRect+right(A0),D1
  1786.         ASR.W    #1,D1
  1787.  
  1788.         MOVE.L    A0,-(SP)
  1789.         MOVE.L    D1,-(SP)
  1790.         MOVE.B    #1,-(SP)
  1791.         _MoveWindow            ;move the window into position
  1792.  
  1793.         RTS
  1794.  
  1795.  
  1796. ;----------
  1797. ;SFFilter - fancy filtering for the SF nastiness dialog
  1798. ;----------
  1799.  
  1800. SFFilter
  1801.         LINK    A6,#0
  1802.  
  1803.         CLR.B    filtered(A6)
  1804.  
  1805.         MOVE.L    theEvent(A6),A0
  1806.  
  1807.         CMP.W    #updatEvt,(A0)
  1808.         BNE.S    SFNotUpdate
  1809.  
  1810.         MOVE.L    theDialog(A6),D0
  1811.  
  1812.         MOVE.L    D0,-(SP)
  1813.         MOVE.L    D0,-(SP)
  1814.         MOVE.L    D0,-(SP)
  1815.         MOVE.L    D0,-(SP)
  1816.  
  1817.         _BeginUpdate
  1818.         _DrawDialog
  1819.         BSR    OutlineButton
  1820.         _EndUpdate
  1821.  
  1822.         MOVE.L    theEvent(A6),A0
  1823.         CLR.W    (A0)
  1824.         BRA.S    SFDoneFilter
  1825.  
  1826. SFNotUpdate
  1827.         CMP.W    #keyDwnEvt,(A0)
  1828.         BNE.S    SFDoneFilter
  1829.  
  1830.         CMP.B    #3,evtMessage+3(A0)
  1831.         BEQ.S    SFHitButton
  1832.  
  1833.         CMP.B    #13,evtMessage+3(A0)
  1834.         BNE.S    SFDoneFilter
  1835. SFHitButton
  1836.         MOVE.L    theDialog(A6),-(SP)
  1837.         MOVE.W    #1,-(SP)
  1838.         PEA    scratch20
  1839.         PEA    scratch20+2
  1840.         PEA    scratch8
  1841.         _GetDItem
  1842.  
  1843.         MOVE.L    scratch20+2,-(SP)
  1844.         BSR    FlashControl
  1845.  
  1846.         MOVE.L    itemHit(A6),A0
  1847.         MOVE.W    #1,(A0)
  1848.         ADDQ.B    #1,filtered(A6)
  1849.  
  1850. SFDoneFilter
  1851.         UNLK    A6
  1852.         MOVE.L    (SP)+,A0        ;get return address
  1853.         ADD    #12,SP            ;pop off parameters
  1854.         JMP    (A0)
  1855.  
  1856.  
  1857. ;----------
  1858. ;FlashControl - blink a control for 8 ticks
  1859. ;----------
  1860.  
  1861. FlashControl
  1862.         MOVE.L    (SP)+,A0
  1863.         MOVE.L    (SP)+,A1
  1864.         MOVE.L    A0,-(SP)
  1865.  
  1866.         MOVE.L    A1,-(SP)
  1867.         MOVE.L    A1,-(SP)
  1868.  
  1869.         MOVE.W    #1,-(SP)
  1870.         _HiliteControl
  1871.  
  1872.         MOVE.W    #8,A0
  1873.         CLR.W    -(SP)
  1874.         _HiliteControl            ;Un-hilite the control
  1875.  
  1876.         RTS
  1877.  
  1878.         END
  1879.  
  1880.