home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / gags / blackhol / blackhol.txt < prev   
Text File  |  1990-10-22  |  16KB  |  496 lines

  1. MODULE BLACKHOLE;
  2. (*----------------------------------------------------------------------------
  3.  * System-Version: MOS 3.5
  4.  *----------------------------------------------------------------------------
  5.  * Version       : 1.0
  6.  *----------------------------------------------------------------------------
  7.  * Text-Version  : V#00041
  8.  *----------------------------------------------------------------------------
  9.  * Modul-Holder  : Meinolf Schneider
  10.  *----------------------------------------------------------------------------
  11.  * Copyright July 1990 by Digital Art Meinolf Schneider
  12.  *----------------------------------------------------------------------------
  13.  * MS  : Meinolf Schneider
  14.  *----------------------------------------------------------------------------
  15.  * Datum    Autor Version Bemerkung (Arbeitsbericht)
  16.  *----------------------------------------------------------------------------
  17.  * 23.07.90 MS    1.0     Grundversion
  18.  *----------------------------------------------------------------------------
  19.  * MODUL-BESCHREIBUNG:
  20.  * -------------------
  21.  * Accessory, bei dem das Icon für den Papierkorb in ein schwarzes Loch
  22.  * geändert wird, das sich bei Selektierung dreht.
  23.  *----------------------------------------------------------------------------
  24.  *) (*$C-,M-,R-,S-,N+,L-*)
  25.  
  26.  
  27. FROM    System          IMPORT  BYTE, ADDRESS;
  28.  
  29. FROM    MSSystems       IMPORT  EnterSuperVisorMode;
  30.  
  31.  
  32. CONST   (* Zugriffoffsets für LineA-Variablen *)
  33.         V_REZ_HZ           =       -$C;
  34.         V_REZ_VT           =       -$4;
  35.         BytesOfOneLine     =         2;
  36.  
  37.  
  38. TYPE    Bool            =       BYTE; (* $00 = FALSE oder $FF = TRUE *)
  39.  
  40.         Handle          =       POINTER TO ADDRESS;
  41.  
  42.         ObjectFlags     =       ( selectable, default, isexit, editable,
  43.                                   rbutton, lastob, touchexit, hidetree,
  44.                                   indirect );
  45.         ObjectStates    =       ( selected, crossed, checked, disabled,
  46.                                   outlined, shadowed, draw3d, whitebak,
  47.                                   fe1, fe2 );
  48.  
  49.         ObjectRec       =       RECORD
  50.                                   next          : CARDINAL;
  51.                                   head          : CARDINAL;
  52.                                   tail          : CARDINAL;
  53.                                   typ           : CARDINAL;
  54.                                   flags         : SET OF ObjectFlags;
  55.                                   state         : SET OF ObjectStates;
  56.                                   spec          : ADDRESS;
  57.                                   x             : INTEGER;
  58.                                   y             : INTEGER;
  59.                                   width         : CARDINAL;
  60.                                   height        : CARDINAL;
  61.                                 END;
  62.  
  63.         IconBlk         =       RECORD
  64.                                   pmask         : ADDRESS;
  65.                                   pdata         : ADDRESS;
  66.                                   ptext         : ADDRESS;
  67.                                   chr           : CARDINAL;
  68.                                   xchr          : INTEGER;
  69.                                   ychr          : INTEGER;
  70.                                   xicon         : INTEGER;
  71.                                   yicon         : INTEGER;
  72.                                   wicon         : INTEGER;
  73.                                   hicon         : INTEGER;
  74.                                   xtext         : INTEGER;
  75.                                   ytext         : INTEGER;
  76.                                   wtext         : INTEGER;
  77.                                   htext         : INTEGER;
  78.                                   reserved      : INTEGER;
  79.                                 END;
  80.  
  81.  
  82.  
  83.  
  84. VAR     (* Felder für AES-Aufrufe *)
  85.         control                         : ARRAY[1..5] OF INTEGER;
  86.         global                          : ARRAY[1..15] OF INTEGER;
  87.         intin                           : ARRAY[1..16] OF INTEGER;
  88.         intout                          : ARRAY[1..7] OF INTEGER;
  89.         addrin                          : ARRAY[1..3] OF ADDRESS;
  90.         addrout                         : ADDRESS;
  91.         AESPB                           : ARRAY[1..6] OF ADDRESS;
  92.  
  93.  
  94.         DesktopObjectTreeHdl            : Handle;
  95.         (* Zeiger auf Variable mit Zeiger auf Desktopobjektbaum *)
  96.         
  97.         DesktopObjectTree               : ADDRESS;
  98.         (* Zeiger auf Desktop-Objektbaum *)
  99.         
  100.         TrashObjectPtr                  : ADDRESS;
  101.         (* Zeiger auf das Papierkorbobjekt *)
  102.         
  103.         TrashIconMask, TrashIconData    : ADDRESS;
  104.         (* Zeiger auf die entsprechenden Bilddaten des Papierkorbs *)
  105.         
  106.         OldTrashState                   : SET OF ObjectStates;
  107.         
  108.         MustDrawTrash                   : Bool;
  109.         (* Wird auf TRUE gesetzt, wenn ein FORM_DIAL durchgeführt werden muß *)
  110.         
  111.         BytesOfLine                     : CARDINAL;
  112.         IsSM124                         : Bool;
  113.         (* TRUE = ist monochrome Modus => Zeilensynchronisation möglich! *)
  114.         
  115.         HoleAniPhase                    : CARDINAL;
  116.         (* Animationszähler *)
  117.  
  118.  
  119.  
  120. TABLE.L         (* NEUE ICONS FÜR DEN PAPIERKORB *)
  121. StillHole:      $00000000, $00000000, $00000000, $00008000,
  122.                 $00008000, $0001C000, $0001C000, $0009C800,
  123.                 $00C1C180, $00EBEB80, $007FFF00, $003FFE00,
  124.                 $017FFF40, $003FFE00, $007FFF00, $07FFFFF0,
  125.                 $1FFFFFFC, $07FFFFF0, $007FFF00, $003FFE00,
  126.                 $017FFF40, $003FFE00, $007FFF00, $00EBEB80,
  127.                 $00C1C180, $0009C800, $0001C000, $0001C000,
  128.                 $00008000, $00008000, $00000000, $00000000;
  129.                 
  130. MotionHole1:    $00000000, $00000000, $00000000, $00000000,
  131.                 $0000C300, $00FC6380, $03FF71C0, $07FF31C0,
  132.                 $0F0FF8E0, $0C0FF8E0, $003FFCE0, $00FFFCE0,
  133.                 $03FFFFE0, $07FFFFE0, $0EFFFFC0, $08FFFFC0,
  134.                 $03FFFF10, $03FFFF70, $07FFFFE0, $07FFFFC0,
  135.                 $073FFF00, $073FFC00, $071FF030, $071FF0F0,
  136.                 $038CFFE0, $038EFFC0, $01C63F00, $00C30000,
  137.                 $00000000, $00000000, $00000000, $00000000;
  138.                 
  139. MotionHole2:    $00000000, $00000000, $00000000, $000E0000,
  140.                 $003F8000, $007FE000, $0061F300, $00007B00,
  141.                 $0000FB00, $00FFF998, $03FFFF98, $003FFF98,
  142.                 $00FFFF9C, $01FFFF1C, $07FFFF1C, $07FFFF3C,
  143.                 $0FFFFFF8, $0E3FFFF8, $1E7FFFF0, $1C7FFFF0,
  144.                 $1C7FFFC0, $0C7FFE00, $0C7FFF60, $0C67FFE0,
  145.                 $00778780, $00378000, $0033E000, $0003FF80,
  146.                 $0000FF00, $00003800, $00000000, $00000000;
  147.        
  148. MotionHole3:    $00000000, $00000000, $00000000, $00007000,
  149.                 $00007C00, $000E0E00, $0007C700, $0073C300,
  150.                 $01FFE780, $07FFFF80, $0FFFFFB0, $0F3FFF30,
  151.                 $1C7FFF60, $18FFFFE0, $19FFFFE0, $19FFFFC0,
  152.                 $01FFFF98, $03FFFF18, $037FFF38, $037FFC70,
  153.                 $00FFFFF0, $00FFFFE0, $00F7FFC0, $0071EF00,
  154.                 $0070F000, $00387800, $003C1800, $001F0000,
  155.                 $00078000, $00000000, $00000000, $00000000;
  156.                
  157.  
  158. PROCEDURE LineSync ( BottomLineNo       : CARDINAL );
  159. BEGIN
  160.   ASSEMBLER
  161.   tst.b         IsSM124
  162.   beq.w         ED
  163.   
  164.   jsr           EnterSuperVisorMode
  165.   move.w        -(A3),D1
  166.   mulu          BytesOfLine,D1
  167.   move.l        #$FF8201,A0
  168.   clr.l         D0
  169.   movep.w       0(A0),D0
  170.   lsl.l         #8,D0
  171.   move.b        $C(A0),D0       ; Video Base
  172.   add.l         D1,D0
  173.   move.l        $466,D2
  174.  
  175.  !WaitTopOfLine
  176.   move.l        $466,D1
  177.   sub.l         D2,D1
  178.   cmpi.w        #3,D1
  179.   bhi           WaitEnd
  180.   clr.l         D1
  181.   movep.w       4(A0),D1
  182.   lsl.l         #8,D1
  183.   move.b        $8(A0),D1       ; Video Address Counter
  184.   cmp.l         D0,D1
  185.   bhi           WaitTopOfLine
  186.  
  187.   move.l        $466,D2
  188.  
  189.  !WaitBottomOfLine
  190.   move.l        $466,D1
  191.   sub.l         D2,D1
  192.   cmpi.w        #3,D1
  193.   bhi           WaitEnd
  194.   clr.l         D1
  195.   movep.w       4(A0),D1
  196.   lsl.l         #8,D1
  197.   move.b        $8(A0),D1       ; Video Address Counter
  198.   cmp.l         D0,D1
  199.   bcs           WaitBottomOfLine
  200.  
  201.  !WaitEnd
  202.   andi.w        #$DFFF,SR
  203.  !ED
  204.   END;
  205. END LineSync;
  206.  
  207.  
  208.  
  209. PROCEDURE SetStillHole;
  210. BEGIN
  211.   ASSEMBLER
  212.   st            MustDrawTrash
  213.   lea           StillHole,A2
  214.   move.l        TrashIconMask,A0
  215.   move.l        TrashIconData,A1
  216.   move.w        #31,D0
  217.  !CopyIcon
  218.   move.l        (A2),(A0)+
  219.   move.l        (A2)+,(A1)+
  220.   dbf           D0,CopyIcon
  221.   END;
  222. END SetStillHole;
  223.  
  224.  
  225.                
  226. BEGIN
  227.   ASSEMBLER
  228.   ; APPL_INIT
  229.   lea           control,A0
  230.   move.w        #10,(A0)
  231.   clr.w         2(A0)
  232.   move.w        #1,4(A0)
  233.   clr.w         6(A0)
  234.   clr.w         8(A0)
  235.   
  236.   lea           AESPB,A0
  237.   move.l        #control,(A0)+
  238.   move.l        #global,(A0)+
  239.   move.l        #intin,(A0)+
  240.   move.l        #intout,(A0)+
  241.   move.l        #addrin,(A0)+
  242.   move.l        #addrout,(A0)+
  243.   
  244.   move.l        #AESPB,D1
  245.   move.w        #200,D0
  246.   trap          #2              ; AES-Aufruf
  247.   
  248.   
  249.   ; MENU_REGISTER
  250.   lea           control,A0
  251.   move.w        #35,(A0)
  252.   move.w        #1,2(A0)
  253.   move.w        #1,4(A0)
  254.   move.w        #1,6(A0)
  255.   clr.w         8(A0)
  256.   lea           intin,A0
  257.   lea           global,A1
  258.   move.w        4(A1),(A0)
  259.   pea           copyright(PC)
  260.   move.l        (A7)+,addrin
  261.   move.l        #AESPB,D1
  262.   move.w        #200,D0
  263.   trap          #2              ; AES-Aufruf
  264.   bra           goon
  265.  !copyright
  266.   acz           'BH ©1990 M.Schneider'
  267.   sync
  268.  !goon
  269.   
  270.   
  271.   ; TOS-Version ermitteln, wodurch sich die Variable mit dem Zeiger
  272.   ; auf die aktuelle Desktop-Objektliste ergibt.
  273.   jsr           EnterSuperVisorMode
  274.   move.l        $4F2,A0
  275.   move.w        $2(A0),D1       ; D1 = TOSVersion
  276.   move.l        24(A0),D2       ; D2 = Erstellungsdatum
  277.   clr.l         DesktopObjectTreeHdl
  278.   cmpi.w        #$0100,D1
  279.   bne           NoTOS10
  280.   move.l        #$A0C4,DesktopObjectTreeHdl
  281.   bra           TOSOk
  282.  !NoTOS10
  283.   cmpi.w        #$0102,D1
  284.   bne           NoTOS12
  285.   move.l        #$C942,DesktopObjectTreeHdl
  286.   bra           TOSOk
  287.  !NoTOS12
  288.   cmpi.w        #$0104,D1
  289.   bne           NoTOS14
  290.   cmpi.l        #$08081988,D2
  291.   bne           IsNewTOS14
  292.   move.l        #$71E2,DesktopObjectTreeHdl     ; TOS 1.4 vom 8.8.88
  293.   bra           TOSOk
  294.  !IsNewTOS14
  295.   move.l        #$6E38,DesktopObjectTreeHdl     ; TOS 1.4 > 8.8.88 z.B. 6.4.89
  296.   bra           TOSOk
  297.  !NoTOS14
  298.   cmpi.w        #$0106,D1
  299.   bne           NoTOS16
  300.   cmpi.l        #$06191989,D2
  301.   bne           IsNewTOS16
  302.   move.l        #$6E3C,DesktopObjectTreeHdl     ; altes TOS 1.6
  303.   bra           TOSOk
  304.  !IsNewTOS16
  305.   move.l        #$6E7C,DesktopObjectTreeHdl     ; neues TOS 1.6 v. 29.7.90
  306.  !NoTOS16
  307.  !TOSOk
  308.   andi.w        #$DFFF,SR       ; SuperMode verlassen
  309.   
  310.   dc.w          $A000
  311.   move.w        BytesOfOneLine(A0),BytesOfLine
  312.   sf            IsSM124
  313.   cmpi.w        #400,V_REZ_VT(A0)
  314.   bne           IsNoSM124
  315.   cmpi.w        #640,V_REZ_HZ(A0)
  316.   bne           IsNoSM124
  317.   st            IsSM124
  318.  !IsNoSM124
  319.   
  320.   lea           StillHole,A0
  321.   lea           MotionHole1,A0
  322.   lea           MotionHole2,A0
  323.   lea           MotionHole3,A0  ; wegen optimierenden Linker!
  324.   END;
  325.   
  326.   
  327.   REPEAT
  328.     ASSEMBLER
  329.     ; EVNT_TIMER
  330.     lea           control,A0
  331.     move.w        #24,(A0)
  332.     move.w        #2,2(A0)
  333.     move.w        #1,4(A0)
  334.     clr.w         6(A0)
  335.     clr.w         8(A0)
  336.     
  337.     lea           intin,A0
  338.     move.w        #100,(A0)       ; 100 Millisekunden für andere Prozesse...
  339.     move.w        #0,2(A0)
  340.     
  341.     move.l        #AESPB,D1
  342.     move.w        #200,D0
  343.     trap          #2              ; AES-Aufruf
  344.     
  345.     
  346.     tst.l         TrashObjectPtr
  347.     bne           IHaveTheTrashObject
  348.     
  349.     tst.l         DesktopObjectTreeHdl
  350.     beq.w         UnknownTOS
  351.     move.l        DesktopObjectTreeHdl,A0
  352.     tst.l         (A0)
  353.     beq.w         ThatsNotTheDesktopObjectTree
  354.     
  355.    !SearchTrash
  356.     ; Suchen des Papierkorbobjekts, es ist das erste Icon-Objekt in der Liste
  357.     move.l        DesktopObjectTreeHdl,A0
  358.     move.l        (A0),A0
  359.     move.l        A0,DesktopObjectTree
  360.     
  361.    !NoTrashFound
  362.     lea           2(A0),A0
  363.     cmpi.l        #$FFFF001F,(A0)
  364.     bne           NoTrashFound
  365.     subq.l        #4,A0
  366.     move.l        A0,TrashObjectPtr
  367.     move.l        ObjectRec.spec(A0),A0
  368.     move.l        IconBlk.pmask(A0),TrashIconMask
  369.     move.l        IconBlk.pdata(A0),TrashIconData
  370.     
  371.     ; ... und gleich mal das Icon ändern:
  372.     jsr           SetStillHole
  373.     
  374.    !IHaveTheTrashObject
  375.     move.l        DesktopObjectTreeHdl,A1
  376.     tst.l         (A1)
  377.     beq.w         ThatsNotTheDesktopObjectTree
  378.     move.l        DesktopObjectTree,A0
  379.     cmpa.l        (A1),A0
  380.     bne.w         SearchTrash                  ; Objektbaum wurde neu erstellt!
  381.     
  382.     move.l        TrashObjectPtr,A0
  383.     move.w        ObjectRec.state(A0),D0
  384.     btst          #selected,D0
  385.     beq           TrashIsNotSelected
  386.     move.w        D0,OldTrashState
  387.    
  388.     ; Papierkorb ist selektiert, also animieren. Da selektierte Icons
  389.     ; invertiert werden, muß das neue Icon ebenfalls invertiert werden,
  390.     ; damit es hinterher wieder normal aussieht.
  391.     addq.w        #1,HoleAniPhase
  392.     cmpi.w        #3,HoleAniPhase
  393.     bne           NoAniRestart
  394.     clr.w         HoleAniPhase
  395.    !NoAniRestart
  396.     move.w        HoleAniPhase,D1
  397.     add.w         D1,D1
  398.     lea           MotionHole1,A2
  399.     adda.w        HoleAniOffsets(PC,D1.W),A2
  400.     move.l        TrashIconData,A0
  401.     move.l        TrashIconMask,A1
  402.     move.w        #31,D0
  403.    !CopyMotionHole
  404.     move.l        (A2)+,(A1)+
  405.     clr.l         (A0)+
  406.     dbf           D0,CopyMotionHole
  407.     st            MustDrawTrash
  408.     bra           DrawTrash
  409.    !HoleAniOffsets
  410.     dc.w          0,128,256
  411.    
  412.    
  413.    !TrashIsNotSelected
  414.     move.w        OldTrashState,D0
  415.     btst          #selected,D0
  416.     beq           TrashWasNotSelected
  417.     
  418.     move.l        TrashObjectPtr,A0
  419.     move.w        ObjectRec.state(A0),D0
  420.     btst          #selected,D0
  421.     bne           TrashStillSelected
  422.     
  423.     move.w        D0,OldTrashState
  424.     jsr           SetStillHole
  425.     
  426.    !TrashStillSelected
  427.    !TrashWasNotSelected
  428.    !DrawTrash
  429.     tst.b         MustDrawTrash
  430.     beq.w         NoTrashDraw
  431.     sf            MustDrawTrash
  432.     
  433.     ; WIND_UPDATE (BEGIN)
  434.     lea           control,A0
  435.     move.w        #107,(A0)
  436.     move.w        #1,2(A0)
  437.     move.w        #1,4(A0)
  438.     clr.w         6(A0)
  439.     clr.w         8(A0)
  440.     lea           intin,A0
  441.     move.w        #1,(A0)
  442.     move.l        #AESPB,D1
  443.     move.w        #200,D0
  444.     trap          #2              ; AES-Aufruf
  445.     
  446.     
  447.     ; FORM_DIAL
  448.     lea           control,A0
  449.     move.w        #51,(A0)
  450.     move.w        #9,2(A0)
  451.     move.w        #1,4(A0)
  452.     clr.w         6(A0)
  453.     clr.w         8(A0)
  454.     
  455.     lea           intin,A0
  456.     move.w        #3,(A0)
  457.     move.w        #0,2(A0)
  458.     move.w        #0,4(A0)
  459.     move.w        #0,6(A0)
  460.     move.w        #0,8(A0)
  461.     move.l        TrashObjectPtr,A1
  462.     move.w        ObjectRec.x(A1),10(A0)
  463.     move.w        ObjectRec.y(A1),12(A0)
  464.     move.w        ObjectRec.width(A1),14(A0)
  465.     move.w        ObjectRec.height(A1),16(A0)
  466.     
  467.     move.w        ObjectRec.y(A1),(A3)+
  468.     jsr           LineSync
  469.     
  470.     move.l        #AESPB,D1
  471.     move.w        #200,D0
  472.     trap          #2              ; AES-Aufruf
  473.     
  474.     ; WIND_UPDATE (END)
  475.     lea           control,A0
  476.     move.w        #107,(A0)
  477.     move.w        #1,2(A0)
  478.     move.w        #1,4(A0)
  479.     clr.w         6(A0)
  480.     clr.w         8(A0)
  481.     lea           intin,A0
  482.     move.w        #0,(A0)
  483.     move.l        #AESPB,D1
  484.     move.w        #200,D0
  485.     trap          #2              ; AES-Aufruf
  486.    
  487.    
  488.    !UnknownTOS
  489.    !NoTrashDraw
  490.    !ThatsNotTheDesktopObjectTree
  491.     END;
  492.   
  493.   UNTIL FALSE;
  494.  
  495. END BLACKHOLE.
  496.