home *** CD-ROM | disk | FTP | other *** search
/ World of A1200 / World_Of_A1200.iso / programs / commodity / cxpak / source.lha / source / WCycle.s < prev    next >
Text File  |  1995-01-10  |  8KB  |  541 lines

  1. *****
  2. *
  3. *    $VER : WCycle 1.00, Pierre-Louis MANGEARD, Feb. 1993
  4. *
  5. *****
  6.  
  7.     OPT    l-,c+,d-,w+,o1+,o2+,o3+,o4+,o5+,o6+,o7+,o10+,o11+,o12+
  8.  
  9.     INCLUDE    CxPak_Include
  10.  
  11.     SECTION        NTRYHUNK,CODE
  12.  
  13.     clr.l    d4
  14.     lea    _BSSBase,a4
  15.     lea    _DataBase,a5
  16.     
  17.     suba.l    a1,a1
  18.     EXEC        FindTask        find us
  19.     movea.l    d0,a2
  20.     move.l    d0,cxp_Task(a4)
  21.     lea    pr_MsgPort(a2),a0
  22.     move.l    a0,cxp_Port(a5)
  23.  
  24.     tst.l    pr_CLI(a2)
  25.     bne.s    end_startup        and run the user prog
  26.  
  27. fromWorkbench
  28.  
  29. ;    move.l    cxp_Port(a5),a0        port deja en ao
  30.     CALL        WaitPort    wait for a message
  31.     move.l    cxp_Port(a5),a0
  32.     CALL        GetMsg        then get it
  33.     move.l    d0,RetMsg_    save it for later reply
  34.  
  35. end_startup
  36.  
  37.     bsr.s    _main            call our program
  38.  
  39.     tst.l    RetMsg_
  40.     beq.s    exitToDOS        if I was a CLI
  41.  
  42.     EXEC        Forbid
  43.     movea.l    RetMsg_,a1
  44.     CALL        ReplyMsg
  45.  
  46. exitToDOS
  47.  
  48.     rts
  49.  
  50. _main
  51.  
  52. *****
  53. *    debut effectif du programme.
  54. *****
  55.  
  56.     lea    cxname(a5),a1
  57.     CALL        OldOpenLibrary
  58.     move.l    d0,_CxBase(a4)
  59.     beq    cxp55
  60.  
  61.     lea    intname(a5),a1
  62.     CALL        OldOpenLibrary
  63.     move.l    d0,_IntuitionBase(a4)
  64.     beq    cxp55
  65.  
  66.     lea    layername(a5),a1
  67.     CALL        OldOpenLibrary
  68.     move.l    d0,_LayerBase(a4)
  69.     beq    cxp55
  70.  
  71.     lea    iconname(a5),a1
  72.     CALL        OldOpenLibrary
  73.     move.l    d0,_IconBase(a4)
  74.     beq    cxp55
  75.  
  76.     lea    dosname(a5),a1
  77.     CALL        OldOpenLibrary
  78.     move.l    d0,_DOSBase(a4)
  79.     beq    cxp55
  80.  
  81.  
  82.     tst.l    RetMsg_
  83.     beq    cxp020
  84.  
  85. * si on vient du workbench, recuperer ToolTypeArray :
  86.  
  87.     movea.l    RetMsg_,a2
  88.     movea.l    sm_ArgList(a2),a2    ArgList sauvegarde provisoire en a2
  89.     beq    cxp020
  90.     move.l    wa_Lock(a2),d1
  91.     DOS        CurrentDir
  92.  
  93.     movea.l    wa_Name(a2),a0        name en a0
  94.     ICON        GetDiskObject
  95.     move.l    d0,cxp_DiskObj(a4)
  96.     beq    cxp020
  97.     movea.l    d0,a2
  98.     movea.l    do_ToolTypes(a2),a2
  99.  
  100.  
  101. * recupere PRIORITY en tooltype :
  102.  
  103.     movea.l    a2,a0
  104.     lea    cxp_ToolType(a5),a1
  105.     CALL        FindToolType
  106.     tst.l    d0
  107.     beq.s    cxp05
  108.  
  109.     movea.l    d0,a0
  110.     clr.w    d2
  111.  
  112. * conversion ascii -> entier du tooltype CX_PRIORITY :
  113.  
  114.     cmpi.b    #'-',(a0)
  115.     bne.s    cxp06
  116.  
  117.     moveq    #1,d2
  118.     addq.l    #BYTE,a0
  119.  
  120. cxp06    moveq    #0,d0
  121.  
  122. cxp07    moveq    #0,d1
  123.     move.b    (a0)+,d1
  124.     beq.s    cxp09
  125.     subi.b    #'0',d1
  126.     add.l    d0,d0
  127.     add.l    d0,d1
  128.     lsl.l    #2,d0
  129.     add.l    d1,d0
  130.     bra.s    cxp07
  131.  
  132. cxp09    tst.w    d2
  133.     beq.s    cxp08
  134.  
  135.     neg.b    d0
  136.  
  137. cxp08    move.b    d0,cxp_Pri(a5)
  138.  
  139.  
  140. * recupere QUALIFIER en tooltype :
  141.  
  142. cxp05    movea.l    a2,a0
  143.     lea    cxp_ToolType1(a5),a1
  144.     ICON        FindToolType
  145.     tst.l    d0
  146.     beq.s    cxp04
  147.     movea.l    d0,a0
  148.     lea    IX_dumm(a4),a1
  149.     CX        ParseIX
  150.  
  151.     move.w    IX_dumm+ix_Qualifier(a4),d0
  152.     beq.s    cxp04
  153.     move.w    d0,d1
  154.     or.w    #IEQUALIFIER_LEFTBUTTON,d0
  155.     move.w    d0,cxp_Qual(a5)
  156.     or.w    #IEQUALIFIER_RBUTTON,d1
  157.     move.w    d1,cxp_Qual1(a5)
  158.  
  159. cxp04    movea.l    cxp_DiskObj(a4),a0
  160.     ICON        FreeDiskObject
  161.  
  162.  
  163. * definition du signal :
  164.  
  165. cxp020    clr.l    d0
  166.     movea.l    cxp_Port(a5),a1
  167.     move.b    MP_SIGBIT(a1),d0
  168.     moveq    #1,SigFlg_
  169.     lsl.l    d0,SigFlg_
  170.     ori.l    #SIGBREAKF_CTRL_C,SigFlg_
  171.  
  172. * installation du broker :
  173.  
  174.     lea    cxp_NewBroker(a5),a0
  175.     moveq    #0,d0
  176.     CX        CxBroker
  177.     move.l    d0,Broker_
  178.     beq    cxp55                si WCycle deja la
  179.  
  180.     lea    IX(a5),a0
  181.     move.w    #CX_MAGIC,d0
  182.     bsr    Set_CxNet
  183.     beq    cxp55
  184.  
  185.     lea    IX1(a5),a0
  186.     move.w    #CX_FAIRY,d0
  187.     bsr    Set_CxNet
  188.     beq    cxp55
  189.  
  190.  
  191. * activation du broker :
  192.  
  193.     moveq    #TRUE,d0
  194.     bsr    SwitchBroker
  195.  
  196.  
  197. * recuperation du message :
  198.  
  199. cxp1    move.l    SigFlg_,d0
  200.     EXEC        Wait
  201.  
  202.     cmpi.l    #SIGBREAKF_CTRL_C,d0
  203.     bne.s    cxp3
  204.  
  205.     moveq    #CXCMD_KILL,MsgId_
  206.  
  207. cxp3    movea.l    cxp_Port(a5),a0
  208.     CALL        GetMsg
  209.     tst.l    d0
  210.     beq    cxp40
  211.     movea.l    d0,a2
  212.  
  213. * type et id du message :
  214.  
  215.     movea.l    a2,a0
  216.     CX        CxMsgType
  217.     move.w    d0,MsgType_
  218.  
  219.     movea.l    a2,a0
  220.     CALL        CxMsgID
  221.     move.w    d0,MsgId_
  222.  
  223.     clr.b    cxp_CScreen(a4)
  224.     cmpi.w    #CX_FAIRY,MN_SIZE+ie_Code(a2)
  225.     seq    cxp_CScreen(a4)
  226.  
  227.     movea.l    a2,a1
  228.     EXEC    ReplyMsg
  229.  
  230. * action selon le type :
  231.  
  232.     cmpi.w    #CXM_COMMAND,MsgType_
  233.     beq    cxp40
  234.  
  235.  
  236. * localisation de la fenetre et de l'ecran :
  237.  
  238. * screen en a2 
  239.  
  240.     moveq    #0,d0
  241.     INT        LockIBase
  242.     move.l    d0,-(sp)
  243.  
  244.     movea.l    _IntuitionBase(a4),a0
  245.     movea.l    ib_FirstScreen(a0),a2
  246. cxp5    move.w    ib_MouseY(a0),d0        coord Y de la souris
  247.     cmp.w    sc_TopEdge(a2),d0        - haut de l'ecran
  248.     bge.s    cxp10
  249.     movea.l    sc_NextScreen(a2),a2
  250.     cmpa.w    #0,a2
  251.     bne.s    cxp5
  252.  
  253. cxp10    movea.l    (sp)+,a0
  254.     CALL        UnlockIBase
  255.  
  256.     tst.b    cxp_CScreen(a4)
  257.     bne.s    cxp30
  258.  
  259.     movea.l    a2,a0
  260.     adda.w    #sc_LayerInfo,a0
  261.     move.l    a0,-(sp)
  262.     LAYER        LockLayerInfo
  263.  
  264.     movea.l    (sp),a0
  265.     move.w    sc_MouseX(a2),d0
  266.     move.w    sc_MouseY(a2),d1
  267.     CALL        WhichLayer
  268.     move.l    d0,d2                sauvegarde provisoire
  269.  
  270.     movea.l    (sp),a0
  271.     CALL        UnlockLayerInfo
  272.  
  273.     movea.l    (sp)+,a1            layerinfo en a1
  274.     move.l    d2,d0                restaure d0
  275.     beq    cxp1                si pas de layer, rien
  276.  
  277.     movea.l    d0,a0                layer en a0
  278.     movea.l    lr_Window(a0),a0        window en a0
  279.     cmpa.w    #NULL,a0
  280.     beq    cxp1    
  281.     cmp.l    li_top_layer(a1),d0        top layer ?
  282.     beq.s    cxp20
  283.  
  284.     INT        WindowToFront
  285.  
  286.     bra    cxp1
  287.  
  288. cxp20    INT        WindowToBack
  289.  
  290.     bra    cxp1
  291.  
  292.  
  293. cxp30    movea.l    a2,a0
  294.     INT        ScreenToBack
  295.  
  296.     bra    cxp1
  297.  
  298.  
  299. * on a recu un msg COMMAND :
  300.  
  301. cxp40    cmpi.w    #CXCMD_KILL,MsgId_        kill WCycle
  302.     beq.s    cxp60
  303.  
  304.     cmpi.w    #CXCMD_UNIQUE,MsgId_        toggle WCycle
  305.     beq.s    cxp60
  306.  
  307.     cmpi.w    #CXCMD_DISABLE,MsgId_        dormant WCycle
  308.     bne.s    cxp43
  309.  
  310.     moveq    #FALSE,d0
  311.     bsr.s    SwitchBroker
  312.  
  313.     bra    cxp1
  314.  
  315. cxp43    cmpi.w    #CXCMD_ENABLE,MsgId_        wake up WCycle
  316.     bne    cxp1
  317.  
  318.     moveq    #TRUE,d0
  319.     bsr.s    SwitchBroker
  320.  
  321.     bra    cxp1
  322.  
  323.  
  324. cxp55    moveq    #RETURN_ERROR,d2
  325.  
  326.     bra.s    cxp62
  327.  
  328. * Exit :
  329.  
  330. cxp60    moveq    #RETURN_OK,d2
  331.  
  332. cxp62    tst.l    Broker_
  333.     beq.s    cxp70
  334.  
  335. cxp65    movea.l    Broker_,a0
  336.     CX        DeleteCxObjAll
  337.  
  338. cxp70    movea.l    _DOSBase(a4),a1
  339.     EXEC    CloseLibrary
  340.  
  341. cxp94    movea.l    _IconBase(a4),a1
  342.     CALL        CloseLibrary
  343.  
  344. cxp93    movea.l    _LayerBase(a4),a1
  345.     CALL        CloseLibrary
  346.  
  347. cxp92    movea.l    _IntuitionBase(a4),a1
  348.     CALL        CloseLibrary
  349.  
  350. cxp91    movea.l    _CxBase(a4),a1
  351.     CALL        CloseLibrary
  352.  
  353. * restore la priorite du shell d'origine le cas echeant :
  354.  
  355. cxp90    move.l    d2,d0
  356.  
  357.     rts
  358.  
  359.  
  360. *****
  361. *    subroutines.
  362. *****
  363.  
  364. SwitchBroker:
  365.  
  366. * void SwitchBroker(BOOL)
  367. *             d0 = TRUE or FALSE
  368.  
  369.     movea.l    Broker_,a0
  370.     CX        ActivateCxObj
  371.  
  372.     rts
  373.  
  374.  
  375. Set_CxNet:
  376.  
  377. * success = Set_CxNet(IX, ie_Code)
  378. *  d0 (CCR)          a0     d0:16
  379. * (_CxBase deja en a6)
  380.  
  381.     move.w    d3,-(sp)
  382.  
  383.     clr.l    d3
  384.     movea.l    a0,a2
  385.     move.w    d0,d3
  386.  
  387. * installation du filter :
  388.  
  389.     moveq    #CX_FILTER,d0
  390.     lea    cxp_HotKey(a5),a0
  391.     suba.l    a1,a1
  392.     CALL        CreateCxObj
  393.     move.l    d0,d2
  394.     beq.s    scxn10
  395.     movea.l    Broker_,a0
  396.     movea.l    d0,a1
  397.     CALL        AttachCxObj
  398.  
  399.     movea.l    d2,a0
  400.     movea.l    a2,a1
  401.     CALL        SetFilterIX
  402.  
  403. * installation du sender :
  404.  
  405.     moveq    #CX_SEND,d0
  406.     movea.l    cxp_Port(a5),a0
  407.     movea.l    d3,a1
  408.     CALL        CreateCxObj
  409.     tst.l    d0
  410.     beq.s    scxn10
  411.     movea.l    d2,a0
  412.     movea.l    d0,a1
  413.     CALL        AttachCxObj
  414.  
  415. * installation du custom :
  416.  
  417.     moveq    #CX_CUSTOM,d0
  418.     lea    cxp_Action(pc),a0
  419.     suba.l    a1,a1
  420.     CALL        CreateCxObj
  421.     tst.l    d0
  422.     beq.s    scxn10
  423.     movea.l    d2,a0
  424.     movea.l    d0,a1
  425.     CALL        AttachCxObj
  426.  
  427.     moveq    #TRUE,d0
  428.  
  429. scxn10    move.w    (sp)+,d3
  430.  
  431.     rts
  432.  
  433.  
  434. cxp_Action:
  435.  
  436.     movea.l    _BSSBase+_CxBase,a6
  437.     jsr    _LVODisposeCxMsg(a6)
  438.  
  439.     rts
  440.  
  441.  
  442. *****
  443. *    version.
  444. *****
  445.  
  446.     dc.b    '$VER: WCycle 1.00 (02.93)'
  447.  
  448.     cnop    0,2
  449.  
  450.  
  451. *****
  452. *    constantes du programme.
  453. *****
  454.  
  455.     SECTION        Constantes,DATA
  456.  
  457. _DataBase:
  458.  
  459.   LAB    cxp_NewBroker:
  460.         dc.b    NB_VERSION,0
  461.         dc.l    _DataBase+cxp_BkName
  462.         dc.l    _DataBase+cxp_BkTitle
  463.         dc.l    _DataBase+cxp_BkDescr
  464.         dc.w    NBU_UNIQUE+NBU_NOTIFY
  465.         dc.w    0
  466.     DAT    cxp_Pri
  467.         dc.b    0
  468.         dc.b    0
  469.     DAT    cxp_Port
  470.         dc.l    0
  471.         dc.w    0
  472.  
  473.  
  474.     LAB    IX
  475.         dc.b    IX_VERSION
  476.         dc.b    IECLASS_RAWMOUSE
  477.         dc.w    0
  478.         dc.w    IECODE_UP_PREFIX
  479.     DAT    cxp_Qual
  480.         dc.w    IEQUALIFIER_LEFTBUTTON+IEQUALIFIER_LALT
  481.         dc.w    CXP_QUALMASK
  482.         dc.w    0
  483.  
  484.     LAB    IX1
  485.         dc.b    IX_VERSION
  486.         dc.b    IECLASS_RAWMOUSE
  487.         dc.w    0
  488.         dc.w    IECODE_UP_PREFIX
  489.     DAT    cxp_Qual1
  490.         dc.w    IEQUALIFIER_RBUTTON+IEQUALIFIER_LALT
  491.         dc.w    CXP_QUALMASK
  492.         dc.w    0
  493.  
  494.  
  495.     CHAR    cxname
  496.         CXNAME
  497.     CHAR    dosname
  498.         DOSNAME
  499.     CHAR    intname
  500.         INTNAME
  501.     CHAR    iconname
  502.         ICONNAME
  503.     CHAR    layername
  504.         dc.b    'layers.library',0
  505.     CHAR    cxp_HotKey
  506.     CHAR    cxp_BkName
  507.         dc.b    'WCycle',0
  508.     CHAR    cxp_BkTitle
  509.         dc.b    'Change window or screen depth',0
  510.     CHAR    cxp_BkDescr
  511.         dc.b    'Key+Mousebutton=cycle window or screen',0
  512.     CHAR    cxp_ToolType
  513.         dc.b    'CX_PRIORITY',0
  514.     CHAR    cxp_ToolType1
  515.         dc.b    'QUALIFIER',0
  516.  
  517. *****
  518. *    variables du programme.
  519. *****
  520.  
  521.     SECTION        Variables,BSS
  522.  
  523.     rsreset
  524.  
  525. _CxBase        rs.l    1
  526. _IntuitionBase    rs.l    1
  527. _LayerBase    rs.l    1
  528. _IconBase    rs.l    1
  529. _DOSBase    rs.l    1
  530. cxp_Task    rs.l    1
  531. cxp_DiskObj    rs.l    1
  532. IX_dumm        rs.b    ix_SIZEOF
  533. cxp_CScreen    rs.b    1
  534. pad        rs.b    1
  535. Data_SizeOf    rs.l    0
  536.  
  537. _BSSBase:    ds.l    Data_SizeOf
  538.  
  539.     END
  540.  
  541.