home *** CD-ROM | disk | FTP | other *** search
/ 17 Bit Software 2: Collection B / 17Bit_Collection_B.iso / files / 2021.dms / in.adf / Sieve / Source / Sieve.AMOS / Sieve.amosSourceCode < prev    next >
Encoding:
AMOS Source Code  |  1992-06-06  |  24.7 KB  |  1,001 lines

  1. '
  2. ' Title    - Sieve   
  3. ' Author   - Richard Kelly 
  4. ' System   - Amiga 500 
  5. ' Language - AMOS BASIC
  6. ' Issue    - V1.0
  7. ' Date     - 7th January 1992
  8. '                      
  9. '--------------------------------------------------------------------------
  10. ' S_ = Static data; Private but retained from call to call 
  11. '                   maybe initialise in main 
  12. ' L_ = Local data
  13. ' G_ = Global data 
  14. ' P_ = Parameter 
  15. ' C_ = Constant  
  16. '--------------------------------------------------------------------------
  17. Dim L_WORK(31),G_FORMULA(3),G_FACTOR#(3),C_FORMULA_TEXT$(10),G_STORE(31)
  18. Global L_WORK(),G_FORMULA(),G_FACTOR#(),C_FORMULA_TEXT$()
  19. '
  20. Global S_LAST_ZONE
  21. S_LAST_ZONE=0
  22. '--------------------------------------------------------------------------
  23. Global C_X_MIN,C_DELTA_X,C_Y_MIN
  24. C_X_MIN=4 : C_DELTA_X=106 : C_Y_MIN=46
  25. '--------------------------------------------------------------------------
  26. Global G_QUIT,G_PLOTTING,G_MENU,G_LAST_COLOUR,G_BOX,G_Y,G_M1$,G_M9$,G_CYCLE
  27. Global G_LAST_MENU,G_SPEED
  28. G_QUIT=False : G_PLOTTING=0 : G_MENU=1 : G_LAST_COLOUR=2 : G_BOX=1 : G_Y=0
  29. G_M1$="   Plot    " : G_M9$="   Cycle   " : G_CYCLE=False : G_SPEED=10
  30. G_LAST_MENU=G_MENU
  31. For I=1 To 3
  32.    G_FORMULA(I)=1 : G_FACTOR#(I)=1.0
  33. Next I
  34. '--------------------------------------------------------------------------
  35. Global G_ML#,G_VAL#
  36. '--------------------------------------------------------------------------
  37. INIT_SCREEN
  38. Repeat 
  39.    Screen 1
  40.    L_ZONE=Mouse Zone
  41.    CHECK_ZONES[L_ZONE]
  42.    CHECK_KEYS
  43.    Screen 2
  44.    L_ZONE=Mouse Zone
  45.    CHECK_COLOUR[L_ZONE]
  46.    If G_PLOTTING>0
  47.       A_LINE
  48.    End If 
  49. Until G_QUIT
  50. Reserve Zone 
  51. Screen Close 1
  52. Screen Close 2
  53. Edit 
  54. '----------------------------------------------------------------
  55. Procedure KEY_OR_MOUSE
  56.    L_EXIT=0
  57.    While L_EXIT=0
  58.       L_KEY$=Inkey$
  59.       L_EXIT=Scancode
  60.       If L_EXIT=0
  61.          L_EXIT=Mouse Click
  62.       End If 
  63.    Wend 
  64. End Proc[L_KEY$]
  65. '
  66. Procedure DISPLAY_MENU_BOXES
  67.    Set Pattern 0
  68.    For J=8 To 24 Step 16
  69.       For I=96+40 To 5*96+40 Step 96
  70.          DISPLAY_BOX[I,J,88,7]
  71.       Next I
  72.    Next J
  73. End Proc
  74. '
  75. Procedure DISPLAY_BOX[P_X,P_Y,P_XLENGTH,P_YLENGTH]
  76.    L_X1=P_X-2
  77.    L_Y1=P_Y-2
  78.    L_X2=P_X+P_XLENGTH+2
  79.    L_Y2=P_Y+P_YLENGTH+2
  80.    Ink 14
  81.    Bar L_X1,L_Y2-1 To L_X2,L_Y2
  82.    Bar L_X2-1,L_Y1 To L_X2,L_Y2
  83.    Ink 1
  84.    Bar L_X1,L_Y1 To L_X2,L_Y1+1
  85.    Bar L_X1,L_Y1 To L_X1+1,L_Y2
  86. End Proc
  87. '
  88. Procedure A_LINE
  89. Shared G_X,G_Y,G_PLOTTING,G_FACTOR#(),C_X_MIN,C_Y_MIN,C_DELTA_X
  90. Shared G_BOX,G_ML#,G_VAL#,G_MENU
  91.    G_ML#=G_FACTOR#(G_PLOTTING)
  92.    L_FX=C_X_MIN+C_DELTA_X*(G_PLOTTING-1)
  93.    L_FY=C_Y_MIN+G_Y
  94.    For L_X=0 To 99
  95.       G_X=L_X
  96.       On G_FORMULA(G_PLOTTING) Proc M3_1,M3_2,M3_3,M3_4,M3_5,M3_6,M3_7,M3_8,M3_9
  97.       L_VAL=Int(G_VAL#)
  98.       L_J=L_VAL/30
  99.       L_COLOUR=Abs(L_VAL-(L_J*30))+2
  100.       Plot L_FX,L_FY,L_COLOUR
  101.       Inc L_FX
  102.    Next L_X
  103.    Inc G_Y
  104.    If G_Y>=100
  105.       G_Y=0
  106.       If G_PLOTTING<>0
  107.          G_PLOTTING=0
  108.          G_M1$="   Plot    "
  109.          If G_MENU=1
  110.             Screen 1
  111.             Paper 15
  112.             DISPLAY_MENU1_ITEM[1]
  113.             Paper 0
  114.             Screen 2
  115.          End If 
  116.       End If 
  117.    End If 
  118. End Proc
  119. '
  120. Procedure CHECK_ZONES[P_ZONE]
  121. Shared S_LAST_ZONE
  122.    If P_ZONE<11
  123.       If P_ZONE<>S_LAST_ZONE
  124.          Paper 15
  125.          Inverse Off 
  126.          DISPLAY_MENU_ITEM[S_LAST_ZONE]
  127.          Inverse On 
  128.          S_LAST_ZONE=P_ZONE
  129.          DISPLAY_MENU_ITEM[S_LAST_ZONE]
  130.          Inverse Off 
  131.          Paper 0
  132.       End If 
  133.       If P_ZONE<>0
  134.          If Mouse Click<>0
  135.             Bell 
  136.             ACTION_MENU[P_ZONE]
  137.          End If 
  138.       End If 
  139.    Else 
  140.       If Mouse Click<>0
  141.          SET_SLIDER[P_ZONE-10]
  142.       End If 
  143.    End If 
  144. End Proc
  145. '
  146. Procedure CHECK_COLOUR[P_ZONE]
  147. Shared G_BOX
  148.    If P_ZONE>0 and Mouse Key<>0
  149.       L_MOUSE=Mouse Click
  150.       If P_ZONE=4
  151.          Bell 70
  152.          SET_COLOUR
  153.       Else 
  154.          If G_BOX<>P_ZONE
  155.             Bell 60
  156.             L_PREV=G_BOX
  157.             G_BOX=P_ZONE
  158.             DISPLAY_HEADER_BOX[L_PREV]
  159.             DISPLAY_HEADER_BOX[G_BOX]
  160.          End If 
  161.       End If 
  162.    End If 
  163. End Proc
  164. '
  165. Procedure CHECK_KEYS
  166. Shared S_LAST_ZONE,G_LAST_MENU,G_SPEED,G_CYCLE
  167.    L_KEY$=Inkey$
  168.    If L_KEY$<>""
  169.       L_SCAN=Scancode
  170.    Else 
  171.       L_SCAN=0
  172.    End If 
  173.    L_SHIFT=Key Shift
  174.    If L_SHIFT=0
  175.       L_MENU=G_LAST_MENU
  176.    Else 
  177.       L_MENU=G_MENU
  178.       If L_SHIFT=1
  179.          L_MENU=2
  180.       End If 
  181.       If L_SHIFT=2
  182.          L_MENU=2
  183.       End If 
  184.       If L_SHIFT=8
  185.          L_MENU=4
  186.       End If 
  187.       If L_SHIFT=16
  188.          L_MENU=3
  189.       End If 
  190.       If L_SHIFT=32
  191.          L_MENU=1
  192.       End If 
  193.    End If 
  194.    If L_MENU<>G_MENU Then DISPLAY_MENU[L_MENU]
  195.    If L_SCAN<>0
  196.       If L_SCAN>=80 and L_SCAN<=89
  197.          ACTION_MENU[L_SCAN-79]
  198.       End If 
  199.       If L_SCAN=70
  200.          DISPLAY_DOCS
  201.       End If 
  202.       If L_SCAN=95
  203.          DISPLAY_HELP
  204.       End If 
  205.       Screen 2
  206.       If L_SCAN>=1 and L_SCAN<=3
  207.          If G_BOX<>L_SCAN
  208.             L_PREV=G_BOX
  209.             G_BOX=L_SCAN
  210.             DISPLAY_HEADER_BOX[L_PREV]
  211.             DISPLAY_HEADER_BOX[G_BOX]
  212.          End If 
  213.       End If 
  214.       If L_SCAN=78
  215.          If G_LAST_COLOUR<31
  216.             SELECT_COLOUR[G_LAST_COLOUR+1]
  217.          Else 
  218.             SELECT_COLOUR[2]
  219.          End If 
  220.       End If 
  221.       If L_SCAN=79
  222.          If G_LAST_COLOUR>2
  223.             SELECT_COLOUR[G_LAST_COLOUR-1]
  224.          Else 
  225.             SELECT_COLOUR[31]
  226.          End If 
  227.       End If 
  228.       CHECK_CYCLE[L_SCAN]
  229.    End If 
  230.    Screen 1
  231. End Proc
  232. '
  233. Procedure DISPLAY_DOCS
  234.    NEW_SCREEN[250,0]
  235.    L_NAME$="Sieve.Doc"
  236.    If Not Exist(L_NAME$)
  237.       L_NAME$=Fsel$("*.Doc","Sieve.Doc","Read a document file")
  238.    End If 
  239.    If L_NAME$<>""
  240.       Open In 1,L_NAME$
  241.       I=0
  242.       Set Input 10,-1
  243.       Repeat 
  244.          Line Input #1,L_LINE$
  245.          Print L_LINE$
  246.          Inc I
  247.          If I>=26
  248.             I=0
  249.             Pen 3
  250.             Print : Print : Print "Press Q to quit, any other key or click mouse to continue"
  251.             Pen 1
  252.             KEY_OR_MOUSE
  253.             L_KEY$=Upper$(Param$)
  254.             Cmove ,-1
  255.             Print Space$(50)
  256.             Cmove ,-3
  257.          End If 
  258.       Until(Eof(1) or(L_KEY$="Q"))
  259.       If Eof(1)
  260.          Pen 3
  261.          Print : Print : Print "End of Docs - Press any key or click mouse to continue"
  262.          Pen 1
  263.          KEY_OR_MOUSE
  264.       End If 
  265.       Close 1
  266.    End If 
  267.    Screen Close 3
  268. End Proc
  269. '
  270. Procedure DISPLAY_HELP
  271.    NEW_SCREEN[250,0]
  272.    HELP_TOP
  273.    Locate 0,25
  274.    Pen 3 : Print "Press any key or click mouse to continue"
  275.    KEY_OR_MOUSE
  276.    Screen Close 3
  277. End Proc
  278. '
  279. Procedure HELP_TOP
  280.    Cls 
  281.    Locate 0,1
  282.    Pen 3 : Centre "Sieve - Help Screen"
  283.    Print 
  284.    Print 
  285.    Pen 2 : Print "Menus" : Pen 1
  286.    Print "    Main Menu - right ALT"
  287.    Print "    Formulae Menu - left ALT"
  288.    Print "    Colours Menu - SHIFT"
  289.    Print "    Palettes Menu - CTLR"
  290.    Print 
  291.    Pen 2 : Print "Keys" : Pen 1
  292.    Print "    F1 - F10 :- Menu item selection"
  293.    Print "    1-3 :- Select Picture box"
  294.    Print "    left/right arrows :- Select colour"
  295.    Print "    up/down arrows - Colour Cycling Control"
  296.    Print "                     CYCLE ON  :- Inc / Dec speed "
  297.    Print "                     CYCLE OFF :- 1 step forward / back"
  298.    Print "    Del - Read Sieve.Docs"
  299.    Print "    Help - this help screen"
  300. End Proc
  301. '
  302. Procedure DISPLAY_LAST_COLOUR
  303. Shared G_LAST_COLOUR
  304.    L_HUE=Colour(G_LAST_COLOUR)
  305.    Screen 1
  306.    DISPLAY_SLIDER[L_HUE]
  307.    Screen 2
  308. End Proc
  309. '
  310. Procedure CHECK_CYCLE[P_SCAN]
  311. Shared G_CYCLE,G_SPEED
  312.    If(P_SCAN=76 or P_SCAN=77)
  313.       If G_CYCLE
  314.          If P_SCAN=77
  315.             If Abs(G_SPEED)>100
  316.                G_SPEED=-Sgn(G_SPEED)*160
  317.             Else 
  318.                G_SPEED=G_SPEED*2
  319.             End If 
  320.          Else 
  321.             G_SPEED=(G_SPEED+Sgn(G_SPEED))/2
  322.          End If 
  323.          If G_SPEED<0
  324.             Shift Down Abs(G_SPEED),2,31,1
  325.          Else 
  326.             Shift Up G_SPEED,2,31,1
  327.          End If 
  328.       Else 
  329.          If P_SCAN=77
  330.             Shift Down 10,2,31,1
  331.          Else 
  332.             Shift Up 10,2,31,1
  333.          End If 
  334.          Wait Vbl 
  335.          Shift Off 
  336.          DISPLAY_LAST_COLOUR
  337.       End If 
  338.    End If 
  339. End Proc
  340. '
  341. Procedure DISPLAY_HEADER[P_BOX,P_CHANGED]
  342. Shared C_FORMULA_TEXT$(),G_FORMULA(),G_FACTOR#(),G_BOX
  343. Shared C_DELTA_X,C_X_MIN,C_Y_MIN
  344.    L_TEXT$=C_FORMULA_TEXT$(G_FORMULA(P_BOX))
  345.    Ink 1
  346.    L_X_BASE=C_X_MIN+C_DELTA_X*(P_BOX-1)
  347.    If P_CHANGED
  348.       L_Y_BASE=C_Y_MIN-16
  349.    Else 
  350.       L_Y_BASE=C_Y_MIN+112
  351.    End If 
  352.    Text L_X_BASE,L_Y_BASE,L_TEXT$
  353.    Text L_X_BASE+8,L_Y_BASE+8,Space$(12)
  354.    Text L_X_BASE+8,L_Y_BASE+8,Str$(G_FACTOR#(P_BOX))
  355.    DISPLAY_HEADER_BOX[P_BOX]
  356. End Proc
  357. '
  358. Procedure DISPLAY_HEADER_BOX[P_BOX]
  359. Shared G_BOX
  360. Shared C_DELTA_X,C_X_MIN,C_Y_MIN
  361.    L_X_BASE=C_X_MIN+C_DELTA_X*(P_BOX-1)
  362.    If G_BOX=P_BOX
  363.       Ink 1
  364.    Else 
  365.       Ink 0
  366.    End If 
  367.    Box L_X_BASE-3,C_Y_MIN-3 To L_X_BASE+99+3,C_Y_MIN+99+3
  368.    Box L_X_BASE-4,C_Y_MIN-4 To L_X_BASE+99+4,C_Y_MIN+99+4
  369.    Ink 1
  370. End Proc
  371. '
  372. Procedure SET_SLIDER[P_ZONE]
  373. Shared G_LAST_COLOUR
  374.    L_POS=(X Mouse-230)/11
  375.    Screen 2
  376.    L_COLOUR=Colour(G_LAST_COLOUR)
  377.    If P_ZONE=1
  378.       L_COLOUR=(L_COLOUR and $FF)+($100*L_POS)
  379.    End If 
  380.    If P_ZONE=2
  381.       L_COLOUR=(L_COLOUR and $F0F)+($10*L_POS)
  382.    End If 
  383.    If P_ZONE=3
  384.       L_COLOUR=(L_COLOUR and $FF0)+(L_POS)
  385.    End If 
  386.    Colour G_LAST_COLOUR,L_COLOUR
  387.    DISPLAY_LAST_COLOUR
  388.    Screen 1
  389. End Proc
  390. '
  391. Procedure DISPLAY_SLIDER[P_COLOUR]
  392.    L_END=204+16*2*11-1
  393.    L_RED=(P_COLOUR and $F00)/$100
  394.    Hslider 204,50 To L_END,55,16,L_RED,1
  395.    Print At(70,6);L_RED;" ";
  396.    L_GREEN=(P_COLOUR and $F0)/$10
  397.    Hslider 204,58 To L_END,63,16,L_GREEN,1
  398.    Print At(70,7);L_GREEN;" ";
  399.    L_BLUE=(P_COLOUR and $F)
  400.    Hslider 204,66 To L_END,71,16,L_BLUE,1
  401.    Print At(70,8);L_BLUE;" ";
  402. End Proc
  403. '
  404. Procedure SET_COLOUR
  405.    SELECT_COLOUR[((X Mouse)-118)/10]
  406. End Proc
  407. '
  408. Procedure SELECT_COLOUR[P_COLOUR]
  409.    Ink 0
  410.    Bar G_LAST_COLOUR*10-10,12 To G_LAST_COLOUR*10-2,20
  411.    Ink P_COLOUR
  412.    Bar P_COLOUR*10-10,12 To P_COLOUR*10-2,20
  413.    G_LAST_COLOUR=P_COLOUR
  414.    DISPLAY_LAST_COLOUR
  415. End Proc
  416. '
  417. Procedure INIT_SCREEN
  418. Shared G_LAST_COLOUR,G_BOX,G_STORE()
  419.    INIT_FORMULA
  420.    Limit Mouse 128,50 To 447,280
  421. '
  422.    Screen Open 1,640,76,16,Hires
  423.    Screen Display 1,140,50,640,76
  424.    Screen 1
  425.    Curs Off : Paper 0 : Pen 1 : Ink 1,0,0 : Flash Off : Cls 0
  426.    Wait Vbl 
  427.    Palette $111,$FFF,$F00,$F70,$FF0,$7F0,$F0,$F7,$FF,$7F,$F,$70F,$F0F,$F07,$0,$A52
  428.    For I=1 To 7
  429.       Locate 4,I
  430.       For J=1 To 10
  431.          K=I+J
  432.          If K>13
  433.             K=K-12
  434.          End If 
  435.          Pen K
  436.          Print Mid$("Sieve V1.0",J,1);
  437.       Next J
  438.    Next I
  439.    Pen 1
  440. '
  441.    Screen Open 2,320,180,32,Lowres
  442.    Screen Display 2,140,127,320,180
  443.    Screen 2
  444.    Curs Off : Paper 0 : Pen 1 : Ink 1,0,0 : Flash Off : Cls 0
  445.    ACTION_MENU4[2]
  446.    Screen 2
  447.    For I=2 To 31
  448.       Ink I
  449.       Bar I*10-10,2 To I*10-2,10
  450.    Next I
  451.    Reserve Zone 4
  452.    Set Zone 4,10,2 To 308,10
  453.    Ink G_LAST_COLOUR
  454.    Bar 10,12 To 18,20
  455. '
  456.    L_COLOUR=Colour(G_LAST_COLOUR)
  457.    DISPLAY_BORDERS
  458.    Screen 1
  459.    DISPLAY_OUTLINES
  460.    DISPLAY_MENU_BOXES
  461.    DISPLAY_MENU[1]
  462.    DISPLAY_SLIDER[L_COLOUR]
  463.    Screen 2
  464.    For I=2 To 31
  465.       G_STORE(I)=Colour(I)
  466.    Next I
  467.    For I=1 To 3
  468.       DISPLAY_HEADER[I,True]
  469.    Next I
  470.    DISPLAY_HEADER[G_BOX,True]
  471. End Proc
  472. '
  473. Procedure DISPLAY_BORDERS
  474. Shared C_DELTA_X,C_X_MIN,C_Y_MIN
  475.    Ink 1
  476.    For I=1 To 3
  477.       L_BASE=C_X_MIN+C_DELTA_X*(I-1)
  478.       Box L_BASE-2,C_Y_MIN-2 To L_BASE+99+2,C_Y_MIN+99+2
  479.       Set Zone I,L_BASE-1,C_Y_MIN-1 To L_BASE+99+1,C_Y_MIN+99+1
  480.    Next I
  481. End Proc
  482. '
  483. Procedure DISPLAY_OUTLINES
  484.    Reserve Zone 13
  485. '   Draw 156,2 To 636,2
  486. '   Draw 156,19 To 636,19
  487. '   Draw 156,36 To 636,36
  488. '   Draw 156,2 To 156,36 
  489. '   Draw 252,2 To 252,36 
  490. '   Draw 348,2 To 348,36 
  491. '   Draw 444,2 To 444,36 
  492. '   Draw 540,2 To 540,36 
  493. '   Draw 636,2 To 636,36 
  494.    L_END=204+16*2*11-1
  495.    Print At(20,6);"Red";
  496.    Set Zone 11,204,50 To L_END,55
  497.    Print At(20,7);"Green";
  498.    Set Zone 12,204,58 To L_END,63
  499.    Print At(20,8);"Blue";
  500.    Set Zone 13,204,66 To L_END,71
  501. End Proc
  502. '
  503. Procedure DISPLAY_MENU[P_MENU]
  504. Shared G_MENU
  505.    Paper 15
  506.    G_MENU=P_MENU
  507.    For L_ZONE=1 To 10
  508.       DISPLAY_MENU_ITEM[L_ZONE]
  509.    Next L_ZONE
  510.    Paper 0
  511. End Proc
  512. '
  513. Procedure ACTION_MENU[P_ZONE]
  514.    L_MENU=G_MENU
  515.    If L_MENU=1 Then ACTION_MENU1[P_ZONE]
  516.    If L_MENU=2 Then ACTION_MENU2[P_ZONE]
  517.    If L_MENU=3 Then ACTION_MENU3[P_ZONE]
  518.    If L_MENU=4 Then ACTION_MENU4[P_ZONE]
  519. End Proc
  520. '
  521. Procedure DISPLAY_MENU_ITEM[P_ZONE]
  522.    L_MENU=G_MENU
  523.    If L_MENU=1 Then DISPLAY_MENU1_ITEM[P_ZONE]
  524.    If L_MENU=2 Then DISPLAY_MENU2_ITEM[P_ZONE]
  525.    If L_MENU=3 Then DISPLAY_MENU3_ITEM[P_ZONE]
  526.    If L_MENU=4 Then DISPLAY_MENU4_ITEM[P_ZONE]
  527. End Proc
  528. '
  529. Procedure DISPLAY_MENU1_ITEM[P_ZONE]
  530. Shared G_M1$,G_M9$
  531.    If P_ZONE=1 Then Print At(17,1)+Zone$(G_M1$,1)
  532.    If P_ZONE=2 Then Print At(29,1)+Zone$("   About   ",2)
  533.    If P_ZONE=3 Then Print At(41,1)+Zone$("  Formulae ",3)
  534.    If P_ZONE=4 Then Print At(53,1)+Zone$("  Factors  ",4)
  535.    If P_ZONE=5 Then Print At(65,1)+Zone$("   Clear   ",5)
  536.    If P_ZONE=6 Then Print At(17,3)+Zone$("   Load    ",6)
  537.    If P_ZONE=7 Then Print At(29,3)+Zone$("   Save    ",7)
  538.    If P_ZONE=8 Then Print At(41,3)+Zone$("Colour Menu",8)
  539.    If P_ZONE=9 Then Print At(53,3)+Zone$(G_M9$,9)
  540.    If P_ZONE=10 Then Print At(65,3)+Zone$("   Quit    ",10)
  541. End Proc
  542. '
  543. Procedure ACTION_MENU1[P_ZONE]
  544.    If P_ZONE=1 Then M1_RUN
  545.    If P_ZONE=2 Then M1_ABOUT
  546.    If P_ZONE=3 Then DISPLAY_MENU[3] : G_LAST_MENU=3 : Rem Formulae menu
  547.    If P_ZONE=4 Then M1_FACTORS
  548.    If P_ZONE=5 Then M1_CLEAR
  549.    If P_ZONE=6 Then M1_LOAD
  550.    If P_ZONE=7 Then M1_SAVE
  551.    If P_ZONE=8 Then DISPLAY_MENU[2] : G_LAST_MENU=2 : Rem Colours menu 
  552.    If P_ZONE=9 Then M1_CYCLE
  553.    If P_ZONE=10 Then M1_QUIT
  554. End Proc
  555. '
  556. Procedure NEW_SCREEN[P_HEIGHT,P_POS]
  557.    Screen Open 3,640,P_HEIGHT,4,Hires
  558.    Screen Display 3,140,P_POS+50,640,P_HEIGHT
  559.    Screen 3
  560.    Curs Off : Paper 0 : Ink 1,0,0 : Flash Off : Cls 0 : Pen 1
  561.    Wait Vbl 
  562.    Palette $0,$FF0,$FF,$F0F
  563. End Proc
  564. '
  565. Procedure M1_BOX_COPY[P_BOX]
  566. Shared C_DELTA_X,C_X_MIN,C_Y_MIN
  567.       L_X1=C_X_MIN+C_DELTA_X*(P_BOX-1)
  568.       L_X2=L_X1+100
  569.       Screen Copy 3,L_X1,C_Y_MIN,L_X2,C_Y_MIN+100 To 2,L_X1,C_Y_MIN
  570. End Proc
  571. '
  572. Procedure M1_RUN
  573. Shared G_PLOTTING,G_M1$,G_BOX
  574.    G_PLOTTING=-G_PLOTTING
  575.    If G_PLOTTING=0
  576.       G_PLOTTING=G_BOX
  577.       Screen 2
  578.       DISPLAY_HEADER[G_BOX,False]
  579.       Screen 1
  580.    End If 
  581.    Paper 15
  582.    If G_PLOTTING>0
  583.       G_M1$="  Pause"+Str$(G_PLOTTING)+"  "
  584.    Else 
  585.       G_M1$=" Resume"+Str$(Abs(G_PLOTTING))+"  "
  586.    End If 
  587.    If Mouse Zone=1 Then Inverse On 
  588.    DISPLAY_MENU1_ITEM[1]
  589.    Inverse Off 
  590.    Paper 0
  591. End Proc
  592. '
  593. Procedure M1_ABOUT
  594.    NEW_SCREEN[70,48]
  595.    Pen 1 : Locate 0,1 : Centre "Sieve V1.0 - 1991"
  596.    Pen 2 : Cmove ,2 : Centre "Written in AMOS Basic"
  597.    Pen 2 : Cmove ,1 : Centre "By Richard Kelly"
  598.    Pen 3 : Cmove ,2 : Centre "Press any key or click mouse to continue"
  599.    KEY_OR_MOUSE
  600.    Screen Close 3
  601. End Proc
  602. '
  603. Procedure M1_FACTORS
  604. Shared G_FACTOR#(),G_BOX
  605.    NEW_SCREEN[20,77]
  606.    Curs On 
  607.    Locate 0,0
  608.    Centre "New Factor value"
  609.    Locate 0,1 : Centre " "
  610.    Input "? ";I#
  611.    Screen Close 3
  612.    G_FACTOR#(G_BOX)=I#
  613.    Screen 2
  614.    DISPLAY_HEADER[G_BOX,True]
  615.    Screen 1
  616. End Proc
  617. '
  618. Procedure M1_LOAD
  619. Shared C_DELTA_X,C_X_MIN,C_Y_MIN
  620. Shared L_WORK
  621.    L_FILE$=Fsel$("*.IFF","Sieve.IFF","Load an old SIEVE Screen")
  622.    If L_FILE$<>""
  623.       If Exist(L_FILE$)
  624.          Screen Open 3,320,180,32,Lowres
  625.          Screen To Back 
  626.          Flash Off 
  627.          Wait Vbl 
  628.          Load Iff L_FILE$
  629.          For I=2 To 31
  630.             L_WORK(I)=Colour(I)
  631.          Next I
  632.          Screen 2
  633.          For I=2 To 31
  634.             Colour I,L_WORK(I)
  635.          Next I
  636.          L_Y1=C_Y_MIN+106
  637.          L_Y2=L_Y1+16
  638.          Screen Copy 3,0,L_Y1,320,L_Y2 To 2,0,L_Y1
  639.          For I=1 To 3
  640.             M1_BOX_COPY[I]
  641.          Next I
  642.          Screen Close 3
  643.          DISPLAY_LAST_COLOUR
  644.          Screen 1
  645.       End If 
  646.    End If 
  647. End Proc
  648. '
  649. Procedure M1_CLEAR
  650. Shared C_X_MIN,C_DELTA_X,C_Y_MIN,G_BOX,G_Y
  651.    Screen 2
  652.    Ink 0
  653.    L_BASE=C_X_MIN+C_DELTA_X*(G_BOX-1)
  654.    Bar L_BASE,C_Y_MIN To L_BASE+99,C_Y_MIN+99
  655.    Screen 1
  656.    G_Y=0
  657. End Proc
  658. '
  659. Procedure M1_SAVE
  660.    L_FILE$=Fsel$("*.IFF","Sieve.IFF","Save of SIEVE Screen")
  661.    If L_FILE$<>""
  662.       Screen 2
  663.       Save Iff L_FILE$
  664.       Screen 1
  665.    End If 
  666. End Proc
  667. '
  668. Procedure M1_CYCLE
  669. Shared G_CYCLE,G_M9$
  670.    Screen 2
  671.    If G_CYCLE
  672.       Shift Off 
  673.       G_CYCLE=False
  674.       G_M9$="   Cycle   "
  675.    Else 
  676.       If G_SPEED<0
  677.          Shift Down Abs(G_SPEED),2,31,1
  678.       Else 
  679.          Shift Up G_SPEED,2,31,1
  680.       End If 
  681.       G_CYCLE=True
  682.       G_M9$="Stop Cycle "
  683.    End If 
  684.    Screen 1
  685.    Paper 15
  686.    If Mouse Zone=9 Then Inverse On 
  687.    DISPLAY_MENU1_ITEM[9]
  688.    Inverse Off 
  689.    Paper 0
  690. End Proc
  691. '
  692. Procedure M1_QUIT
  693. Shared G_QUIT
  694.    NEW_SCREEN[20,77]
  695.    Reserve Zone 2
  696.    L_Y$=Zone$(" Yes ",1)
  697.    L_N$=Zone$(" No  ",2)
  698.    Print At(20,0);"QUIT - Please confirm       or"
  699.    Pen 2
  700.    Print At(42,0);L_Y$
  701.    Print At(51,0);L_N$
  702.    Repeat 
  703.       L_QUIT$=Upper$(Inkey$)
  704.       L_ZONE=Mouse Zone
  705.       If L_ZONE=1
  706.          Inverse On 
  707.          Print At(42,0);L_Y$
  708.          Inverse Off 
  709.          Print At(51,0);L_N$
  710.       Else 
  711.          If L_ZONE=2
  712.             Inverse On 
  713.             Print At(51,0);L_N$
  714.             Inverse Off 
  715.          Else 
  716.             Print At(51,0);L_N$
  717.          End If 
  718.          Print At(42,0);L_Y$
  719.       End If 
  720.       If Mouse Click<>0
  721.          If L_ZONE=1
  722.             L_QUIT$="Y"
  723.          End If 
  724.          If L_ZONE=2
  725.             L_QUIT$="N"
  726.          End If 
  727.       End If 
  728.    Until(L_QUIT$="Y") or(L_QUIT$="N")
  729.    If L_QUIT$="Y"
  730.       G_QUIT=True
  731.    End If 
  732.    Screen Close 3
  733. End Proc
  734. '
  735. Procedure DISPLAY_MENU2_ITEM[P_ZONE]
  736.    If P_ZONE=1 Then Print At(17,1)+Zone$("   Swap    ",1)
  737.    If P_ZONE=2 Then Print At(29,1)+Zone$("   Copy    ",2)
  738.    If P_ZONE=3 Then Print At(41,1)+Zone$("  Reverse  ",3)
  739.    If P_ZONE=4 Then Print At(53,1)+Zone$(" Alternate ",4)
  740.    If P_ZONE=5 Then Print At(65,1)+Zone$("  Spread   ",5)
  741.    If P_ZONE=6 Then Print At(17,3)+Zone$("  Repeat   ",6)
  742.    If P_ZONE=7 Then Print At(29,3)+Zone$(" Palettes  ",7)
  743.    If P_ZONE=8 Then Print At(41,3)+Zone$("Reverse All",8)
  744.    If P_ZONE=9 Then Print At(53,3)+Zone$("Altern All ",9)
  745.    If P_ZONE=10 Then Print At(65,3)+Zone$(" Main Menu ",10)
  746. End Proc
  747. '
  748. Procedure ACTION_MENU2[P_ZONE]
  749. Shared G_LAST_COLOUR
  750.    L_LAST_COLOUR=G_LAST_COLOUR
  751.    If P_ZONE>=1 and P_ZONE<=6
  752.       NEW_SCREEN[16,102]
  753.       Print At(28,0);"Click Colour ";
  754.       If P_ZONE=1
  755.          Print "to Swap with";
  756.       End If 
  757.       If P_ZONE=2
  758.          Print "to Copy to";
  759.       End If 
  760.       If P_ZONE>2
  761.          Print "at end of range";
  762.       End If 
  763.       Screen 2
  764.       Change Mouse 2
  765.       Repeat 
  766.       Until(Mouse Key<>0) and(Mouse Zone=4)
  767.       Bell 60
  768.       SET_COLOUR
  769.       Change Mouse 1
  770.       Screen Close 3
  771.    End If 
  772.    L_START=Min(L_LAST_COLOUR,G_LAST_COLOUR)
  773.    L_END=Max(L_LAST_COLOUR,G_LAST_COLOUR)
  774.    Screen 2
  775.    If P_ZONE=1 Then M2_SWAP[L_START,L_END]
  776.    If P_ZONE=2 Then M2_COPY[L_LAST_COLOUR,G_LAST_COLOUR]
  777.    If P_ZONE=3 Then M2_REVERSE[L_START,L_END]
  778.    If P_ZONE=4 Then M2_ALTERN[L_START,L_END]
  779.    If P_ZONE=5 Then M2_SPREAD[L_START,L_END]
  780.    If P_ZONE=6 Then M2_REPEAT[L_START,L_END]
  781.    If P_ZONE=8 Then M2_REVERSE[2,31]
  782.    If P_ZONE=9 Then M2_ALTERN[2,31]
  783.    DISPLAY_LAST_COLOUR
  784.    Screen 1
  785.    If P_ZONE=7 Then DISPLAY_MENU[4] : G_LAST_MENU=4 : Rem defaults menu
  786.    If P_ZONE=10 Then DISPLAY_MENU[1] : G_LAST_MENU=1 : Rem main menu
  787. End Proc
  788. '
  789. Procedure M2_SWAP[P_START,P_END]
  790.    L_COLOUR=Colour(P_START)
  791.    Colour P_START,Colour(P_END)
  792.    Colour P_END,L_COLOUR
  793. End Proc
  794. '
  795. Procedure M2_COPY[P_START,P_END]
  796.    Colour P_END,Colour(P_START)
  797. End Proc
  798. '
  799. Procedure M2_SPREAD[P_START,P_END]
  800.    L_DELTA#=P_END-P_START
  801.    If L_DELTA#>0
  802.       L_C1=Colour(P_START)
  803.       L_C2=Colour(P_END)
  804.       L_DR#=((L_C2 and $F00)-(L_C1 and $F00))/L_DELTA#
  805.       L_DG#=((L_C2 and $F0)-(L_C1 and $F0))/L_DELTA#
  806.       L_DB#=((L_C2 and $F)-(L_C1 and $F))/L_DELTA#
  807.       For I=P_START To P_END-1
  808.          J#=I-P_START
  809.          L_RX#=L_DR#*J#
  810.          L_R=(L_C1 and $F00)+L_RX#
  811.          L_GX#=L_DG#*J#
  812.          L_G=(L_C1 and $F0)+L_GX#
  813.          L_BX#=L_DB#*J#
  814.          L_B=(L_C1 and $F)+L_BX#
  815.          L_COLOUR=(L_R and $F00)+(L_G and $F0)+(L_B and $F)
  816.          Colour I,L_COLOUR
  817.       Next I
  818.    End If 
  819. End Proc
  820. '
  821. Procedure M2_REVERSE[P_START,P_END]
  822.    For I=P_START To P_START+(P_END-P_START)/2
  823.       M2_SWAP[I,(P_START+P_END-I)]
  824.    Next I
  825. End Proc
  826. '
  827. Procedure M2_ALTERN[P_START,P_END]
  828. Shared L_WORK()
  829.    For I=P_START To P_END
  830.       L_WORK(I)=Colour(I)
  831.    Next I
  832.    J=P_START
  833.    For I=P_START To P_END Step 2
  834.       Colour I,L_WORK(J)
  835.       Inc J
  836.    Next I
  837.    If P_START<P_END
  838.       For I=P_START+1 To P_END Step 2
  839.          Colour I,L_WORK(J)
  840.          Inc J
  841.       Next I
  842.    End If 
  843. End Proc
  844. '
  845. Procedure M2_REPEAT[P_START,P_END]
  846.    If P_START>2
  847.       J=P_END
  848.       For I=P_START-1 To 2 Step -1
  849.          Colour I,Colour(J)
  850.          Add J,-1,P_START To P_END
  851.       Next I
  852.    End If 
  853.    If P_END<31
  854.       J=P_START
  855.       For I=P_END+1 To 31
  856.          Colour I,Colour(J)
  857.          Add J,1,P_START To P_END
  858.       Next I
  859.    End If 
  860. End Proc
  861. '
  862. Procedure INIT_FORMULA
  863. Shared C_FORMULA_TEXT$()
  864.    C_FORMULA_TEXT$(1)="  x^2+y^2  "
  865.    C_FORMULA_TEXT$(2)=" SINx+SINy "
  866.    C_FORMULA_TEXT$(3)="   xSINy   "
  867.    C_FORMULA_TEXT$(4)=" TANx+TANy "
  868.    C_FORMULA_TEXT$(5)="  1/x+1/y  "
  869.    C_FORMULA_TEXT$(6)="  x^3+y^3  "
  870.    C_FORMULA_TEXT$(7)="SINHx+SINHy"
  871.    C_FORMULA_TEXT$(8)=" SQRx+SQRy "
  872.    C_FORMULA_TEXT$(9)=" LOGx+LOGy "
  873.    C_FORMULA_TEXT$(10)=" Main Menu "
  874. End Proc
  875. '
  876. Procedure DISPLAY_MENU3_ITEM[P_ZONE]
  877. Shared C_FORMULA_TEXT$()
  878.    If P_ZONE>0 and P_ZONE<6
  879.       Print At(5+12*P_ZONE,1)+Zone$(C_FORMULA_TEXT$(P_ZONE),P_ZONE);
  880.    End If 
  881.    If P_ZONE>5 and P_ZONE<11
  882.       Print At(5+12*(P_ZONE-5),3)+Zone$(C_FORMULA_TEXT$(P_ZONE),P_ZONE);
  883.    End If 
  884. End Proc
  885. '
  886. Procedure ACTION_MENU3[P_ZONE]
  887. Shared G_FORMULA(),G_BOX
  888.    If P_ZONE<10
  889.       G_FORMULA(G_BOX)=P_ZONE
  890.       Screen 2
  891.       DISPLAY_HEADER[G_BOX,True]
  892.       Screen 1
  893.    End If 
  894.    If P_ZONE=10 Then DISPLAY_MENU[1] : G_LAST_MENU=1
  895. End Proc
  896. '
  897. Procedure M3_1
  898. Shared G_X,G_Y,G_ML#,G_VAL#
  899.    L_X#=G_X
  900.    L_Y#=G_Y
  901.    G_VAL#=G_ML#*(L_X#*L_X#+L_Y#*L_Y#)
  902. End Proc
  903. '
  904. Procedure M3_2
  905. Shared G_X,G_Y,G_ML#,G_VAL#
  906.    L_X#=G_X
  907.    L_Y#=G_Y
  908.    G_VAL#=10.0*G_ML#*(Sin(L_X#)+Sin(L_Y#))
  909. End Proc
  910. '
  911. Procedure M3_3
  912. Shared G_X,G_Y,G_ML#,G_VAL#
  913.    L_X#=G_X
  914.    L_Y#=G_Y
  915.    G_VAL#=G_ML#*L_X#*Sin(L_Y#)
  916. End Proc
  917. '
  918. Procedure M3_4
  919. Shared G_X,G_Y,G_ML#,G_VAL#
  920.    L_X#=G_X
  921.    L_Y#=G_Y
  922.    G_VAL#=G_ML#*(Tan(L_X#)+Tan(L_Y#))
  923. End Proc
  924. '
  925. Procedure M3_5
  926. Shared G_X,G_Y,G_ML#,G_VAL#
  927.    L_X#=G_X
  928.    L_Y#=G_Y
  929.    If G_X<>0 and G_Y<>0
  930.       G_VAL#=G_ML#*(1000.0/L_X#+1000.0/L_Y#)
  931.    Else 
  932.       G_VAL#=0.0
  933.    End If 
  934. End Proc
  935. '
  936. Procedure M3_6
  937. Shared G_X,G_Y,G_ML#,G_VAL#
  938.    L_X#=G_X
  939.    L_Y#=G_Y
  940.    G_VAL#=G_ML#*(L_X#*L_X#*L_X#+L_Y#*L_Y#*L_Y#)
  941. End Proc
  942. '
  943. Procedure M3_7
  944. Shared G_X,G_Y,G_ML#,G_VAL#
  945.    L_X#=G_X
  946.    L_Y#=G_Y
  947.    G_VAL#=1000.0*G_ML#*(Hsin(L_X#/100.0)+Hsin(L_Y#/100.0))
  948. End Proc
  949. '
  950. Procedure M3_8
  951. Shared G_X,G_Y,G_ML#,G_VAL#
  952.    L_X#=G_X
  953.    L_Y#=G_Y
  954.    G_VAL#=1000.0*G_ML#*(Sqr(L_X#)+Sqr(L_Y#))
  955. End Proc
  956. '
  957. Procedure M3_9
  958. Shared G_X,G_Y,G_ML#,G_VAL#
  959.    L_X#=G_X
  960.    L_Y#=G_Y
  961.    G_VAL#=1000.0*G_ML#*(Ln(L_X#)+Ln(L_Y#))
  962. End Proc
  963. '
  964. Procedure DISPLAY_MENU4_ITEM[P_ZONE]
  965.    If P_ZONE=1 Then Print At(17,1)+Zone$("  Pastel   ",1)
  966.    If P_ZONE=2 Then Print At(29,1)+Zone$("  Rainbow  ",2)
  967.    If P_ZONE=3 Then Print At(41,1)+Zone$("   Gawdy   ",3)
  968.    If P_ZONE=4 Then Print At(53,1)+Zone$("   Store   ",4)
  969.    If P_ZONE=5 Then Print At(65,1)+Zone$("Colour Menu",5)
  970.    If P_ZONE=6 Then Print At(17,3)+Zone$("   Teams   ",6)
  971.    If P_ZONE=7 Then Print At(29,3)+Zone$("   Grey    ",7)
  972.    If P_ZONE=8 Then Print At(41,3)+Zone$("  Custom   ",8)
  973.    If P_ZONE=9 Then Print At(53,3)+Zone$("  Restore  ",9)
  974.    If P_ZONE=10 Then Print At(65,3)+Zone$(" Main Menu ",10)
  975. End Proc
  976. '
  977. Procedure ACTION_MENU4[P_ZONE]
  978. Shared G_STORE()
  979.    Screen 2
  980.    Wait Vbl 
  981.    If P_ZONE=1 Then Palette $111,$FFF,$D83,$C83,$B94,$A94,$9A5,$8A5,$7B6,$6B6,$5C7,$4C7,$3D8,$3C8,$4B9,$4A9,$59A,$58A,$67B,$66B,$75C,$74C,$83D,$83C,$94B,$94A,$A59,$A58,$B67,$B66,$C75,$C74
  982.    If P_ZONE=2 Then Palette $111,$FFF,$F00,$F30,$F60,$F90,$FC0,$FF0,$CF0,$9F0,$6F0,$3F0,$F0,$F3,$F6,$F9,$FC,$FF,$CF,$9F,$6F,$3F,$F,$30F,$60F,$90F,$C0F,$F0F,$F0C,$F09,$F06,$F03
  983.    If P_ZONE=3 Then Palette $111,$FFF,$F00,$F70,$FF0,$7F0,$F0,$F7,$FF,$77F,$F0F,$F07,$F00,$F70,$FF0,$7F0,$F0,$F7,$FF,$77F,$F0F,$F07,$F00,$F70,$FF0,$7F0,$F0,$F7,$FF,$77F,$F0F,$F07
  984.    If P_ZONE=6 Then Palette $111,$FFF,$FAA,$F55,$F00,$A00,$500,$FFA,$FF5,$FF0,$AA0,$550,$AFA,$5F5,$F0,$A0,$50,$AFF,$5FF,$FF,$AA,$55,$AAF,$55F,$F,$A,$5,$FAF,$F5F,$F0F,$A0A,$505
  985.    If P_ZONE=7 Then Palette $111,$FFF,$0,$111,$111,$222,$222,$333,$333,$444,$444,$555,$555,$666,$666,$777,$777,$888,$888,$999,$999,$AAA,$AAA,$BBB,$BBB,$CCC,$CCC,$DDD,$DDD,$EEE,$EEE,$FFF
  986.    If P_ZONE=8 Then Palette $111,$FFF,$F0,$2D2,$4B4,$696,$886,$996,$BB4,$DD2,$FF0,$FD2,$FB4,$F96,$F77,$D66,$B44,$922,$700,$923,$B46,$D69,$F8C,$D6F,$B4F,$92F,$70F,$52F,$44F,$66F,$99F,$CCF
  987.    If P_ZONE=4
  988.       For I=2 To 31
  989.          G_STORE(I)=Colour(I)
  990.       Next I
  991.    End If 
  992.    If P_ZONE=9
  993.       For I=2 To 31
  994.          Colour I,G_STORE(I)
  995.       Next I
  996.    End If 
  997.    DISPLAY_LAST_COLOUR
  998.    Screen 1
  999.    If P_ZONE=5 Then DISPLAY_MENU[2] : G_LAST_MENU=2
  1000.    If P_ZONE=10 Then DISPLAY_MENU[1] : G_LAST_MENU=1
  1001. End Proc