home *** CD-ROM | disk | FTP | other *** search
/ Amiga Computing 66 / ac066b.adf / AMOS.DMS / AMOS.adf / Config1_3.AMOS / Config1_3.amosSourceCode
AMOS Source Code  |  1993-03-15  |  29KB  |  893 lines

  1. '                    AMOS V1.3  Configuration program      
  2. '                    --------------------------------      
  3. '                       Written by Francois Lionet 
  4. '
  5. '                               29/4/1991
  6. '                     Copyright Mandarin / Jawx 1991 
  7. '
  8. '  Note: the CONFMENU procedure contains all the setup menus. Feel free to   
  9. '            examine it and grab its code for your own menus!    
  10. '
  11. Set Buffer 40
  12. Close Editor 
  13. '
  14. Dim CONF$(470)
  15. Global NED,ABASE,DTALONG,ADATA,ADSTR,ADOFF,STMAX,NBDATA,CONF$(),NFILE$
  16. '
  17. Reserve As Work 10,15000
  18. '
  19. Screen Open 0,640,208,4,Hires : Curs Off 
  20. Screen Display 0,,50,,
  21. Set Rainbow 0,1,30,"(1,1,15)(1,-1,15)","",""
  22. Rainbow 0,0,49,212
  23. '
  24. TITLE
  25. SET_MENU
  26. '
  27. Do 
  28.    Menu On 
  29.    ALERT["... Please choose a menu option ..."]
  30.    Repeat : Until Choice
  31.    ALERT[""]
  32.    If STMAX=0 and(Choice(1)>2 or(Choice(1)=2 and Choice(2)>3))
  33.       ALERT["Configuration not loaded!"] : Wait 50
  34.    Else 
  35.       On Choice(1) Proc MN_AMOS,MN_DISC,MN_SET,MN_EDIT
  36.       TITLE
  37.    End If 
  38. Loop 
  39. '
  40. Procedure SET_AMOS
  41.    Menu$(1)=" AMOS "
  42.    Menu$(1,1)=" About this program "
  43.    Menu$(1,2)="--------------------"
  44.    Menu$(1,3)=" Quit               "
  45.    Menu$(1,4)=" Exit to system     "
  46.    Menu$(1,4,1)=" Sure ? "
  47. End Proc
  48. Procedure SET_MENU
  49.    '
  50.    SET_AMOS
  51.    '
  52.    Menu$(2)="  Disc  "
  53.    Menu$(2,1)=" Load default configuration    "
  54.    Menu$(2,2)=" Load other configuration      "
  55.    Menu$(2,3)=" Load an AMOS1.2 configuration "
  56.    Menu$(2,4)="-------------------------------"
  57.    Menu$(2,5)=" Save configuration            "
  58.    Menu$(2,6)=" Save as...                    "
  59.    '
  60.    Menu$(3)="  Set  "
  61.    Menu$(3,1)=" New keyboard              "
  62.    Menu$(3,2)="---------------------------" : Menu Inactive(3,2)
  63.    Menu$(3,3)=" Loaded extensions         "
  64.    Menu$(3,4)=" Help accessory name       "
  65.    Menu$(3,5)=" AMOS system files name    "
  66.    Menu$(3,6)=" Ports names               "
  67.    Menu$(3,7)=" Function key names        "
  68.    Menu$(3,8)=" Directory negative filter "
  69.    Menu$(3,9)=" Amiga function keys       "
  70.    Menu$(3,10)="---------------------------" : Menu Inactive(3,10)
  71.    Menu$(3,11)=" Editor setup              "
  72.    Menu$(3,12)=" Screen display setup      "
  73.    Menu$(3,13)=" Interpretor setup         "
  74.    Menu$(3,14)=" Screen palettes - Page 1  "
  75.    Menu$(3,15)=" Screen palettes - Page 2  "
  76.    Menu$(3,16)="---------------------------" : Menu Inactive(3,16)
  77.    Menu$(3,17)=" Set AMOS to PAL system   "
  78.    Menu$(3,17,1)=" Normal     "
  79.    Menu$(3,17,2)=" Interlaced "
  80.    Menu$(3,18)=" Set AMOS to NTSC system    "
  81.    Menu$(3,18,1)=" Normal     "
  82.    Menu$(3,18,2)=" Interlaced "
  83.    '
  84.    Menu$(4)="  Edit messages  "
  85.    Menu$(4,1)=" - From editor                      "
  86.    Menu$(4,2)=" - From test time                   "
  87.    Menu$(4,3)=" - From run time                    "
  88.    Menu$(4,4)=" - From all LOAD/SAVE operation     "
  89.    Menu$(4,5)=" - From directory and file selector "
  90.    Menu$(4,6)=" - From error screen                "
  91.    Menu$(4,7)=" - From escape screen               "
  92.    Menu$(4,8)=" - From AMOS title                  "
  93. End Proc
  94. Procedure MN_AMOS
  95.    Menu Off 
  96.    If Choice(2)=1 : CONFMENU[9] : End If 
  97.    If Choice(2)=3 : Screen Close 0 : Rainbow Del 0 : Edit : End If 
  98.    If Choice(2)=4 : System : ALERT["Can't quit: workbench is closed!"] : Bell : Wait 50 : End If 
  99. End Proc
  100. Procedure MN_DISC
  101.    Menu Off 
  102.    If Choice(2)=1
  103.       If Ntsc=0
  104.          NFILE$=":AMOS_System/AMOS1_3_PAL.Env"
  105.       Else 
  106.          NFILE$=":AMOS_System/AMOS1_3_NTSC.Env"
  107.       End If 
  108.       LD_DISC[NFILE$,True] : Pop Proc
  109.    End If 
  110.    If Choice(2)=2
  111.       NFILE$=Fsel$("*.Env","","Please choose AMOS1_3.Env file")
  112.       If NFILE$<>""
  113.          LD_DISC[NFILE$,True]
  114.       Else 
  115.          ALERT["... Not done ..."] : Wait 50
  116.       End If 
  117.       Pop Proc
  118.    End If 
  119.    If Choice(2)=3
  120.       F$=Fsel$("*.ENV","","Please choose AMOS1_2.ENV file")
  121.       If F$<>""
  122.          LD_DISC[F$,False] : CHANGE_EXT
  123.          P=Instr(F$,"1_2")
  124.          If P
  125.             Mid$(F$,P)="1_3"
  126.             NFILE$=F$
  127.          Else 
  128.             NFILE$=""
  129.          End If 
  130.       Else 
  131.          ALERT["... Not done ..."] : Wait 50
  132.       End If 
  133.       Pop Proc
  134.    End If 
  135.    If Choice(2)=5
  136.       If NFILE$<>""
  137.          SV_DISC[NFILE$] : Pop Proc
  138.       Else 
  139.          Goto BAD
  140.       End If 
  141.    End If 
  142.    If Choice(2)=6 or FLG<>0
  143.       BAD:
  144.       F$=Fsel$("*.ENV","","Please choose AMOS1_3.ENV file")
  145.       SV_DISC[F$]
  146.       NFILE$=F$
  147.    End If 
  148. End Proc
  149. Procedure MN_SET
  150.    Menu Off 
  151.    If Choice(2)=1
  152.       ST_KEY
  153.    Else 
  154.       If Choice(2)>=17
  155.          ST_TV[(Choice(2)-17)*2+Choice(3)-1]
  156.       Else 
  157.          C=Choice(2)-2
  158.          Restore SDTA
  159.          For X=1 To C : Read Y : Next 
  160.          If C<8
  161.             ST_EDIT[Y]
  162.          Else 
  163.             CONFMENU[Y]
  164.          End If 
  165.       End If 
  166.    End If 
  167.    SDTA: Data 4,$13,$12,5,7,16,13,0,1,2,3,4,5
  168. End Proc
  169. Procedure ST_TV[TVMODE]
  170.    If TVMODE=0
  171.       Poke ADATA+110,0 : Poke ADATA+112,0
  172.       Doke ADATA+34,46 : Doke ADATA+32,103
  173.       Doke ADATA+38,22
  174.       ALERT["... Editor screen in PAL mode ..."]
  175.    End If 
  176.    If TVMODE=1
  177.       Poke ADATA+110,4 : Poke ADATA+112,4
  178.       Doke ADATA+34,46 : Doke ADATA+32,75
  179.       Doke ADATA+38,55
  180.       ALERT["... Editor screen in PAL INTERLACED mode ..."]
  181.    End If 
  182.    If TVMODE=2
  183.       Poke ADATA+110,0 : Poke ADATA+112,0
  184.       Doke ADATA+34,46 : Doke ADATA+32,103
  185.       Doke ADATA+38,18
  186.       ALERT["... Editor screen in NTSC mode ..."]
  187.    End If 
  188.    If TVMODE=3
  189.       Poke ADATA+110,4 : Poke ADATA+112,4
  190.       Doke ADATA+34,46 : Doke ADATA+32,75
  191.       Doke ADATA+38,44
  192.       ALERT["... Editor screen in NTSC INTERLACED mode ..."]
  193.    End If 
  194.    Wait 50
  195. End Proc
  196. Procedure MN_EDIT
  197.    Restore EDTA
  198.    For X=1 To Choice(2) : Read Y : Next 
  199.    ST_EDIT[Y]
  200.    EDTA: Data 1,2,3,6,11,10,12,14
  201. End Proc
  202. Procedure LD_DISC[N$,V13]
  203.    On Error Goto LD_ERROR
  204.    A$="... Loading "+N$+" ..."
  205.    ALERT[A$]
  206.    Bload N$,Start(10)
  207.    WORK
  208.    AD=Start(10) : Repeat : AD=AD+4 : Until Leek(AD)=$3E9
  209.    '
  210.    If V13
  211.       If Leek(AD+12)=0 : ALERT["This is an AMOS1.2x configuration file!!!"] : Wait 150 : NFILE$="" : Pop Proc : End If 
  212.       ABASE=AD+12
  213.       ADOFF=ABASE
  214.       DTALONG=Leek(ABASE-4)
  215.    Else 
  216.       If Leek(AD+12)<>0 : ALERT["This is an AMOS1.3 configuration file!!!"] : Wait 150 : NFILE$="" : Pop Proc : End If 
  217.       ABASE=AD+12
  218.       ADOFF=ABASE+Leek(ABASE-4)
  219.       DTALONG=0
  220.    End If 
  221.    '
  222.    A$=Space$(2048)
  223.    NN=1 : ID=1 : AD=ADOFF
  224.    Do 
  225.       A=Deek(AD) : FLAG=Deek(AD+2) : Add AD,4
  226.       Exit If A=$FFFF
  227.       A=ABASE+A-DTALONG
  228.       If Btst(15,FLAG)
  229.          Repeat 
  230.             Gosub COP_ST
  231.             Inc NN
  232.             A=A+N
  233.             P=Peek(A)
  234.          Until P=$FF
  235.          Dec NN
  236.       Else 
  237.          If Btst(12,FLAG)
  238.             AA=Varptr(A$) : Doke AA,FLAG : Doke AA+2,ID : Add AA,4
  239.             N=0
  240.             Repeat 
  241.                P=Peek(A+N) : Poke AA+N,P : Inc N
  242.             Until P=$FF
  243.             CONF$(NN)=Left$(A$,N+4)
  244.          Else 
  245.             Gosub COP_ST
  246.          End If 
  247.       End If 
  248.       Inc NN : Inc ID
  249.    Loop 
  250.    '
  251.    STMAX=NN : ADATA=AD : ADSTR=AD+FLAG
  252.    '
  253.    If V13=0
  254.       DTALONG=Leek(ABASE-4)
  255.       Copy ADOFF,ADSTR To ADOFF-DTALONG
  256.       Add ADATA,-DTALONG
  257.       Add ADOFF,-DTALONG
  258.       Add ADSTR,-DTALONG
  259.    End If 
  260.    '
  261.    A$="" : X=Free
  262.    '
  263.    FINISHED
  264.    Pop Proc
  265.    '---> Routine  
  266.    COP_ST:
  267.    AA=Varptr(A$) : Doke AA,FLAG : Doke AA+2,ID : Add AA,4
  268.    N=0
  269.    Repeat 
  270.       P=Peek(A+N) : Poke AA+N,P : Inc N
  271.       If P=27 : Poke AA+N,Peek(A+N) : Inc N : Poke AA+N,Peek(A+N) : Inc N : End If 
  272.    Until P=0
  273.    CONF$(NN)=Left$(A$,N+3)
  274.    Return 
  275.    '---> Error
  276.    LD_ERROR:
  277.    Bell : ALERT["Can't find configuration file!"]
  278.    Wait 200
  279.    Resume LD_ERR2
  280.    LD_ERR2:
  281. End Proc
  282. Procedure SV_DISC[N$]
  283.    If N$="" : ALERT["Not done!"] : Bell : Wait 50 : Pop Proc : End If 
  284.    Clw : WORK
  285.    '
  286.    '---> Poke data back into bank 
  287.    ADO=ADOFF
  288.    ADS=ADSTR
  289.    NN=1
  290.    Repeat 
  291.       A=Varptr(CONF$(NN))
  292.       FLAG=Deek(A) : ID=Deek(A+2) : Add A,4
  293.       Doke ADO,ADS-ABASE+DTALONG : Doke ADO+2,FLAG : Add ADO,4
  294.       If Btst(15,FLAG)
  295.          Repeat 
  296.             Gosub ST_COP
  297.             Inc NN : A=Varptr(CONF$(NN)) : I=Deek(A+2) : Add A,4
  298.          Until I<>ID
  299.          Poke ADS,-1 : Inc ADS
  300.          Dec NN
  301.       Else 
  302.          Gosub ST_COP
  303.       End If 
  304.       Inc NN
  305.    Until NN=STMAX
  306.    '
  307.    ' End at a LONG WORD 
  308.    While(ADS-Start(10)) and %11
  309.       Poke ADS,0 : Inc ADS
  310.    Wend 
  311.    NLONG=(ADS-Start(10))/4-8
  312.    Loke Start(10)+$14,NLONG
  313.    Loke Start(10)+$1C,NLONG
  314.    Loke ADS,$3F2 : Add ADS,4
  315.    FINISHED
  316.    '
  317.    ' Saving!
  318.    A$="... Saving "+N$+" ..."
  319.    ALERT[A$]
  320.    Bsave N$,Start(10) To ADS
  321.    ALERT[""]
  322.    Pop Proc
  323.    '
  324.    '---> Poke routine 
  325.    ST_COP:
  326.    If Len(CONF$(NN))>4
  327.       For N=0 To Len(CONF$(NN))-4-1
  328.          Poke ADS,Peek(A+N)
  329.          Inc ADS
  330.       Next 
  331.    End If 
  332.    Poke ADS,0 : Inc ADS
  333.    Return 
  334. End Proc
  335. Procedure CHANGE_EXT
  336.    For NN=1 To STMAX-1
  337.       FLAG=Deek(Varptr(CONF$(NN)))
  338.       ID=Deek(Varptr(CONF$(NN))+2)
  339.       '
  340.       If(FLAG and 255)=4
  341.          '
  342.          If Btst(14,FLAG)=0
  343.             A$=Mid$(CONF$(NN),5)-" "
  344.             Inc N
  345.             If A$<>""
  346.                If N<=3 or N=6
  347.                   A$=A$+".Lib"
  348.                Else 
  349.                   A$=""
  350.                End If 
  351.                CONF$(NN)=Left$(CONF$(NN),4)+A$
  352.             End If 
  353.          End If 
  354.       End If 
  355.    Next 
  356. End Proc
  357. Procedure ST_EDIT[ED_FLG]
  358.    Clw : WORK
  359.    Dim ED$(130)
  360.    NED=0 : NN=1
  361.    '
  362.    For NN=1 To STMAX-1
  363.       FLAG=Deek(Varptr(CONF$(NN)))
  364.       ID=Deek(Varptr(CONF$(NN))+2)
  365.       '
  366.       If(FLAG and 255)=ED_FLG
  367.          '
  368.          If Btst(14,FLAG)=0
  369.             '---> Simple strings 
  370.             Inc NED
  371.             ED$(NED)=Space$(8)+Mid$(CONF$(NN),5)
  372.             Doke Varptr(ED$(NED)),FLAG
  373.             Doke Varptr(ED$(NED))+2,NN
  374.             Doke Varptr(ED$(NED))+4,ID
  375.             CONF$(NN)=""
  376.             '
  377.          Else 
  378.             '
  379.             '---> Strings with control codes 
  380.             ED$=Mid$(CONF$(NN),5) : CONF$(NN)="" : N=1
  381.             Do 
  382.                Do 
  383.                   N1=N
  384.                   Repeat 
  385.                      Exit If N>Len(ED$),2
  386.                      A$=Mid$(ED$,N,1) : Inc N
  387.                      If A$=Chr$(27) : Add N,2 : End If 
  388.                   Until A$>=" "
  389.                   CONF$(NN)=CONF$(NN)+Mid$(ED$,N1,N-N1-1)+Chr$(0)
  390.                   Inc NED : ED$(NED)=Space$(8)
  391.                   Doke Varptr(ED$(NED)),FLAG
  392.                   Doke Varptr(ED$(NED))+2,NN
  393.                   Doke Varptr(ED$(NED))+4,ID
  394.                   Repeat 
  395.                      ED$(NED)=ED$(NED)+A$
  396.                      Exit If N>Len(ED$),3
  397.                      A$=Mid$(ED$,N,1) : Inc N
  398.                   Until A$<" "
  399.                   Dec N
  400.                Loop 
  401.                CONF$(NN)=CONF$(NN)+Mid$(ED$,N1,N-N1)
  402.                Exit 
  403.             Loop 
  404.          End If 
  405.          '  
  406.       End If 
  407.       '
  408.    Next NN
  409.    FINISHED
  410.    '
  411.    ' Open edit window 
  412.    '  
  413.    LED=Min(NED,16)
  414.    Reserve Zone 30
  415.    If NED<>LED
  416.       ARROW[36,3*8,12,22,4,25] : ARROW[36,15*8,12,-22,4,27]
  417.    End If 
  418.    CASE[36,9*8,12,22,4,26]
  419.    VER_TEXT["Quit",4,7]
  420.    Centre At(,19)+"Click on the string to edit."
  421.    Centre At(,20)+"Important: some strings finish with a space, you should not remove it!"
  422.    Centre At(,21)+"Are you working on a COPY of your language disk?"
  423.    Paper 2 : Pen 1 : Wind Open 1,8*8,8*(9-(LED+2)/2),70,LED+2,1 : Scroll Off 
  424.    PY=0 : ACT=0 : Gosub ALL_PRINT
  425.    Window 0 : Paper 1 : Pen 2
  426.    Window 1
  427.    '
  428.    ' Test for mouse 
  429.    '
  430.    Do 
  431.       Do 
  432.          Repeat 
  433.             Wait Vbl 
  434.             If AL : Dec AL : If AL=0 : ALERT[""] : End If : End If 
  435.             Z=Mouse Zone
  436.             If Z<>ACT
  437.                If ACT>0 : N=ACT : ACT=0 : Gosub ST_PRINT : End If 
  438.                If Z>0 and Z<=LED : ACT=Z : N=Z : Gosub ST_PRINT : End If 
  439.             End If 
  440.             If Mouse Key and Z>LED
  441.                Exit If Z=26,3
  442.                If LED<>NED
  443.                   If Z=25 and PY>0
  444.                      Home : Vscroll 1
  445.                      Dec PY : N=1 : Gosub ST_PRINT
  446.                   End If 
  447.                   If Z=27 and PY+LED<NED
  448.                      Locate 0,LED-1 : Vscroll 3
  449.                      Inc PY : N=LED : Gosub ST_PRINT
  450.                   End If 
  451.                End If 
  452.             End If 
  453.          Until ACT>0 and Mouse Key=1
  454.          FLAG=Deek(Varptr(ED$(ACT+PY))) : F=0
  455.          For N=8 To Len(ED$(ACT+PY))
  456.             If Mid$(ED$(ACT+PY),N,1)<>" " : Inc F : End If 
  457.          Next 
  458.          If F or Btst(11,FLAG) or(Btst(14,FLAG)=0)
  459.             Bset 11,FLAG : Exit 
  460.          Else 
  461.             AL=100 : ALERT["This string is not editable!"]
  462.          End If 
  463.       Loop 
  464.       While Mouse Key : Wend 
  465.       Inverse Off : Print Chr$(7);
  466.       '
  467.       ' Edit loop
  468.       '
  469.       XCU=0
  470.       LM=Len(ED$) : ED$=Mid$(ED$(ACT+PY),9)
  471.       If Btst(13,FLAG)
  472.          LMAX=Len(ED$)
  473.       Else 
  474.          LMAX=64
  475.       End If 
  476.       Do 
  477.          Curs Off 
  478.          Locate 4,ACT-1 : Print ED$;
  479.          If Len(ED$)<LMAX : Print String$(".",LMAX-Len(ED$)); : End If 
  480.          Locate 4+XCU,ACT-1 : Curs On 
  481.          Repeat 
  482.             A$=Inkey$ : KY=Scancode
  483.             If Mouse Key : A$=Chr$(13) : End If 
  484.          Until A$<>""
  485.          If A$=Chr$(27) : ED$=Mid$(ED$(ACT+PY),9) : A$=Chr$(13) : End If 
  486.          Exit If A$=Chr$(13)
  487.          If KY=65 and XCU>0 : ED$=Left$(ED$,XCU-1)+Mid$(ED$,XCU+1) : KY=79 : End If 
  488.          If KY=70 : ED$=Left$(ED$,XCU)+Mid$(ED$,XCU+2) : KY=-1 : End If 
  489.          If KY=79 : XCU=Max(0,XCU-1) : KY=-1 : End If 
  490.          If KY=78 : XCU=Min(LMAX,XCU+1) : KY=-1 : End If 
  491.          If A$>=" " and KY>0
  492.             If XCU<LMAX
  493.                ED$=Left$(ED$,XCU)+A$+Mid$(ED$,XCU+1)
  494.                If Len(ED$)>LMAX : ED$=Left$(ED$,LMAX) : End If 
  495.                XCU=Min(LMAX,XCU+1)
  496.             End If 
  497.          End If 
  498.       Loop 
  499.       If Btst(13,FLAG)
  500.          If Len(ED$)<LMAX
  501.             ED$=ED$+Space$(LMAX-Len(ED$))
  502.          End If 
  503.       End If 
  504.       If Btst(14,FLAG)
  505.          If Len(ED$)=0
  506.             ED$=" "
  507.          End If 
  508.       End If 
  509.       ED$(ACT+PY)=Left$(ED$(ACT+PY),8)+ED$
  510.       Doke Varptr(ED$(ACT+PY)),FLAG
  511.       N=ACT : ACT=0 : Gosub ST_PRINT
  512.    Loop 
  513.    '
  514.    ' Put back in strings
  515.    '
  516.    Paper 1 : Wind Close : Paper 1 : Pen 2 : Clw 
  517.    WORK
  518.    NN=1
  519.    Repeat 
  520.       A=Varptr(ED$(NN))
  521.       FLAG=Deek(A)
  522.       N=Deek(A+2)
  523.       ID=Deek(A+4)
  524.       If Btst(14,FLAG)=0
  525.          '---> Simple strings 
  526.          CONF$(N)=Space$(4)+Mid$(ED$(NN),9)
  527.          ED$(NN)="" : Inc NN
  528.       Else 
  529.          '---> Strings with codes 
  530.          ED$=CONF$(N) : CONF$(N)=Space$(4)
  531.          P=1
  532.          Do 
  533.             P1=P
  534.             Repeat 
  535.                Exit If P>Len(ED$),2
  536.                A$=Mid$(ED$,P,1) : Inc P
  537.                If A$=Chr$(27) : Add P,2 : End If 
  538.             Until A$=Chr$(0)
  539.             FLAG=FLAG or Deek(Varptr(ED$(NN)))
  540.             CONF$(N)=CONF$(N)+Mid$(ED$,P1,P-P1-1)+Mid$(ED$(NN),9)
  541.             ED$(NN)="" : Inc NN
  542.          Loop 
  543.          CONF$(N)=CONF$(N)+Mid$(ED$,P1,P-P1)
  544.       End If 
  545.       Doke Varptr(CONF$(N)),FLAG
  546.       Doke Varptr(CONF$(N))+2,ID
  547.       '    
  548.    Until NN>NED
  549.    FINISHED
  550.    Pop Proc
  551.    '------------------- 
  552.    ' Print ALL strings  
  553.    '------------------- 
  554.    ALL_PRINT:
  555.    For N=1 To LED
  556.       Gosub ST_PRINT
  557.       Set Zone N,X Graphic(0),Y Graphic(N-1) To X Graphic(66),Y Graphic(N-1)+8
  558.    Next 
  559.    Return 
  560.    '------------------
  561.    ' Print ONE string 
  562.    '------------------
  563.    ST_PRINT:
  564.    Curs Off 
  565.    If N=ACT
  566.       Inverse On 
  567.    Else 
  568.       Inverse Off 
  569.    End If 
  570.    Locate 0,N-1 : Print Chr$(7); Using "###";N+PY;"-";Mid$(ED$(PY+N),9);
  571.    Return 
  572. End Proc
  573. Procedure CONFMENU[PAGE]
  574.    Dim JMP$(64),ZIT(64),ITZ(64),ZBASE(64)
  575.    ' Handle menu
  576.    MK_MENU:
  577.    Curs Off : Gosub DR_MENU
  578.    NOZ=1
  579.    Do 
  580.       Repeat 
  581.          Z=Mouse Zone : K=Mouse Key
  582.          If Z<>OLDZ
  583.             If OLDZ>0 : ACT=-1 : IT=ZIT(OLDZ) : OLDZ=-1 : Gosub DR_ITEM : End If 
  584.             If Z>0 : OLDZ=Z : ACT=Z : IT=ZIT(Z) : ZNE=ZBASE(IT) : Gosub DR_ITEM : End If 
  585.          End If 
  586.       Until Z<>0 and K<>0
  587.       If JMP$(Z)<>"" : Gosub JMP$(Z) : End If 
  588.       ACT=Z : ZNE=ZBASE(IT) : Gosub DR_ITEM
  589.       If K=1 : Repeat : Until Mouse Key=0 : End If 
  590.    Loop 
  591.    '  
  592.    MN_BACK:
  593.    On Error Goto NO_SC1 : Screen Close 1
  594.    NO_SC2: On Error 
  595.    Colour Back 0 : View 
  596.    Pop 
  597.    Pop Proc
  598.    NO_SC1: Resume NO_SC2
  599.    '
  600.    ST_FLAG: V=V xor 1 : Gosub "POK"+VTYPE$ : Return 
  601.    ST_INTER: V=V xor 4 : Gosub "POK"+VTYPE$ : Return 
  602.    ST_PLUS: Add V,VPL : V=Min(V,VMX) : Gosub "POK"+VTYPE$ : Return 
  603.    ST_MINUS: Add V,-VPL : V=Max(V,VMN) : Gosub "POK"+VTYPE$ : Return 
  604.    R_PLUS: HEXPLUS[V,$100,$F00] : V=Param : Gosub "POK"+VTYPE$ : Return 
  605.    G_PLUS: HEXPLUS[V,$10,$F0] : V=Param : Gosub "POK"+VTYPE$ : Return 
  606.    B_PLUS: HEXPLUS[V,$1,$F] : V=Param : Gosub "POK"+VTYPE$ : Return 
  607.    R_MINUS: HEXPLUS[V,-$100,$F00] : V=Param : Gosub "POK"+VTYPE$ : Return 
  608.    G_MINUS: HEXPLUS[V,-$10,$F0] : V=Param : Gosub "POK"+VTYPE$ : Return 
  609.    B_MINUS: HEXPLUS[V,-$1,$F] : V=Param : Gosub "POK"+VTYPE$ : Return 
  610.    ' Draw menu page 
  611.    DR_MENU:
  612.    Clw : Reserve Zone 64
  613.    IT=0 : ZNE=1 : NOZ=0 : ACT=-1 : OLDPAR=-1
  614.    Repeat 
  615.       Inc IT : ZBASE(IT)=ZNE : Gosub DR_ITEM
  616.    Until FLAG=False
  617.    Return 
  618.    ' Draw one menu item 
  619.    DR_ITEM:
  620.    LAB$="L"+(Str$(PAGE)-" ")+"_"+(Str$(IT)-" ")
  621.    On Error Goto NO_IT
  622.    Restore LAB$ : Read IT$
  623.    On Error 
  624.    M=0 : XX=-1
  625.    Repeat 
  626.       NEND=Instr(IT$,"|",M+1)
  627.       ENC=0 : LBL$="" : FL=0 : ZZ=0 : NB=0
  628.       Repeat 
  629.          N=M+1
  630.          M=Instr(IT$,",",N) : M2=Instr(IT$,":",N) : If M>M2 : M=0 : End If 
  631.          If M=0 or(NEND<>0 and M1>NEND) : M=M2 : FL=1 : End If 
  632.          A$=Upper$(Mid$(IT$,N,1)) : Inc N
  633.          If A$="E" : ENC=1 : End If 
  634.          If A$="L" : Gosub GT_STR : LBL$=A$ : Inc ZZ : End If 
  635.          If A$="C" : CNT=1 : End If 
  636.          If A$="X" : Gosub GT_STR : XX=Val(A$) : End If 
  637.          If A$="Y" : Gosub GT_STR : YY=Val(A$) : End If 
  638.          If A$=">" : Gosub GT_STR : VMN=Val(A$) : End If 
  639.          If A$="<" : Gosub GT_STR : VMX=Val(A$) : End If 
  640.          If A$="+" : Gosub GT_STR : VPL=Val(A$) : End If 
  641.          If A$="V" : Gosub GT_STR : PAR=Val(A$) : End If 
  642.          If A$="S" : Gosub GT_STR : VST$=A$ : End If 
  643.          If A$="J" : Gosub GT_STR : Gosub A$ : End If 
  644.       Until FL
  645.       If NEND
  646.          A$=Mid$(IT$,M+1,NEND-M-1)
  647.       Else 
  648.          A$=Mid$(IT$,M+1)
  649.       End If 
  650.       Gosub DR_WORD
  651.       M=NEND
  652.    Until NEND=0
  653.    FLAG=True
  654.    Return 
  655.    '
  656.    DR_WORD:
  657.    If XX<0 : XX=40-Len(A$)/2 : End If 
  658.    Locate XX,YY
  659.    '
  660.    FST=0
  661.    If Left$(A$,1)="&"
  662.       Inc FST
  663.       B$=Upper$(Mid$(A$,2,1)) : A$=Mid$(A$,3)
  664.       If B$="F"
  665.          Gosub GT_VAL
  666.          A$="  No   " : If V : A$="  Yes  " : End If 
  667.       End If 
  668.       If B$="V"
  669.          L=Val(Left$(A$,1)) : A$=Mid$(A$,2)
  670.          Gosub GT_VAL : A$=Str$(V)
  671.          If Len(A$)<L+1 : A$=A$+Space$(L+1-Len(A$)) : End If 
  672.       End If 
  673.       If B$="P"
  674.          Gosub GT_VAL
  675.          B$=Hex$(V,3) : A$=""
  676.          For N=2 To 4 : A$=A$+Mid$(B$,N,1)+" " : Next 
  677.       End If 
  678.       If B$="-" : A$=" --- " : Inc ZZ : LBL$="ST_MINUS" : End If 
  679.       If B$="+" : A$=" +++ " : Inc ZZ : LBL$="ST_PLUS" : End If 
  680.       If B$="S" : If NOZ : Screen Hide 1 : End If : End If 
  681.    End If 
  682.    '
  683.    X1=X Graphic(XX)-3 : Y1=Y Graphic(YY)-2 : X2=X Graphic(XX+Len(A$))+2 : Y2=Y1+11
  684.    '
  685.    If ZZ<>0 or NOZ=0 or FST<>0
  686.       Inverse Off : If ZZ<>0 and ACT=ZNE : Inverse On : End If 
  687.       Print A$;
  688.       If ENC<>0 and NOZ=0 : Box X1,Y1 To X2,Y2 : End If 
  689.    End If 
  690.    If ZZ<>0
  691.       If NOZ=0
  692.          Set Zone ZNE,X1,Y1 To X2,Y2
  693.          ZIT(ZNE)=IT : ITZ(IT)=ZNE
  694.          If LBL$<>""
  695.             JMP$(ZNE)=LBL$
  696.          End If 
  697.       End If 
  698.       Inc ZNE
  699.    End If 
  700.    XX=XX+(X2-X1)/8+1
  701.    Return 
  702.    '
  703.    NO_IT: Resume NO_IT2
  704.    NO_IT2: FLAG=False
  705.    Return 
  706.    '
  707.    GT_STR:
  708.    A$=Mid$(IT$,N,M-N)
  709.    Return 
  710.    '
  711.    GT_VAL:
  712.    VTYPE$=Left$(A$,1) : ADV=ADATA+Val(Mid$(A$,2))
  713.    Goto "PIK"+VTYPE$
  714.    PIKB: V=Peek(ADV) : Return 
  715.    PIKW: V=Deek(ADV) : Return 
  716.    PIKL: V=Leek(ADV) : Return 
  717.    POKB: Poke ADV,V : Return 
  718.    POKW: Doke ADV,V : Return 
  719.    POKL: Loke ADV,V : Return 
  720.    '
  721.    ST_COL:
  722.    If NOZ
  723.       If PAR<>OLDPAR
  724.          Screen Open 1,640,24,4,Hires : Screen Display 1,,50-24,, : Scroll Off : Flash Off : Curs Off 
  725.          Palette 0,0,0,0
  726.          C=Val(Mid$(VST$,1,1)) : Paper C : Clw 
  727.          C=Val(Mid$(VST$,2,1)) : Pen C : Clw : Print At(1,1);Border$(At(79,1),1);
  728.          C=Val(Mid$(VST$,3,1)) : Pen C : Print At(35,1);"Example";
  729.          C=Val(Mid$(VST$,4,1)) : Pen C : Print " screen";
  730.          OLDPAR=PAR
  731.       End If 
  732.       Screen 1
  733.       For N=0 To 3
  734.          Colour N,Deek(ADATA+PAR+N*2)
  735.       Next 
  736.       Screen 0
  737.    End If 
  738.    Return 
  739.    '
  740.    ST_BOR:
  741.    If NOZ : Colour Back Deek(ADV) : Screen Display 0,,,, : End If 
  742.    Return 
  743.    '
  744.    EX_SCR2:
  745.    Screen Open 1,640,24,4,Hires : Screen Display 1,,0,, : Scroll Off : Curs Off 
  746.    Print : Centre "Example screen" : Print At(1,1);Border$(At(79,1),1);
  747.    Screen 0
  748.    Return 
  749.    '
  750.    ST_YSC:
  751.    If NOZ : Screen Display 1,,V,, : Screen Show 1 : End If 
  752.    Return 
  753.    ' Datas page 1 
  754.    L1_1: Data "C,Y1,E: AMOS Basic - Editor setup "
  755.    L1_2: Data "X2,Y24:...Use LEFT and RIGHT mouse keys to set values...|E,X60,LMn_Back: Back to main menu "
  756.    L1_3: Data "Y4,X0:- Make backups when saving ?|X50,E,LSt_Flag:&FW48"
  757.    L1_4: Data "Y6,X0:- Save icons with programs ?|X50,E,LSt_Flag:&FW30"
  758.    L1_5: Data "Y8,X0:- Try to close workbench on loading ?|X50,E,LSt_Flag:&FW108"
  759.    L1_6: Data "Y10,X0:- PRINTER: line feed with carriage return ?|X50,E,LSt_Flag:&FW50"
  760.    L1_7: Data "Y12,X0:- Text buffer size on loading:|X40,>1024,<524288,+4096,E:&-|E:&+|:&V6L26|:bytes"
  761.    L1_8: Data "Y14,X0:- Editor scrolling speed:|X40,>2,<256,+2,E:&-|E:&+|:&V3W54|:pixels per 1/50 second"
  762.    L1_9: Data "Y16,X0:- File selector opening speed:|X40,>2,<256,+2,E:&-|E:&+|:&V3W52|:pixels per 1/50 second"
  763.    ' Datas page 2   
  764.    L2_1: Data "JEx_Scr2,C,Y1,E: AMOS Basic - Screen display setup "
  765.    L2_2: Data "X2,Y24:...Use LEFT and RIGHT mouse keys to set values...|E,X60,LMn_Back: Back to main menu "
  766.    L2_3: Data "X0,Y4:- Function keys screen interlaced?|:&S|X40,E,LSt_Inter:&FB110"
  767.    L2_4: Data "X0,Y6:- Editor screen interlaced?|:&S|X40,E,LSt_Inter:&FB112&"
  768.    L2_5: Data "X0,Y8:- Number of lines in edit window:|:&S|X40,>8,<64,+1,E:&-|E:&+|:&V2W38|:Lines"
  769.    L2_6: Data "X0,Y9:  Norm: PAL=22(55) / NTSC=18(44)"
  770.    L2_7: Data "X0,Y11:- Position of function key screen:|X40,>0,<310,+1,E:&-|E:&+|:&V3W34|JSt_YSc:(hardware Y coordinate)"
  771.    L2_8: Data "X0,Y12:  Norm: PAL / NTSC= 46"
  772.    L2_9: Data "X0,Y14:- Position of editor screen:|X40,>0,<310,+1,E:&-|E:&+|:&V3W32|JSt_YSc:(hardware Y coordinate)"
  773.    L2_10: Data "X0,Y15:  Norm: PAL / NTSC= 102(75)"
  774.    L2_11: Data "X0,Y17:- Position of file selector:|X40,>0,<310,+1,E:&-|E:&+|:&V3W36|JSt_YSc:(hardware Y coordinate)"
  775.    L2_12: Data "X0,Y18:  Norm: 66"
  776.    L2_13: Data "X0,Y20:- Position of default screen:|X40,>0,<310,+1,E:&-|E:&+|:&V3W10|JSt_YSc:(hardware Y coordinate)"
  777.    L2_14: Data "X0,Y21:  Norm: 50"
  778.    ' Datas page 3   
  779.    L3_1: Data "C,Y1,E: AMOS Basic - Interpretor parameters"
  780.    L3_2: Data "X2,Y24:...Use LEFT and RIGHT mouse keys to set values...|E,X60,LMn_Back: Back to main menu "
  781.    L3_3: Data "Y6,X0:- Maximum number of bobs:|X40,>8,<512,+4,E:&-|E:&+|:&V3W8|:bobs"
  782.    L3_4: Data "Y8,X0:- Number of hardware sprite lines:|X40,>16,<256,+4,E:&-|E:&+|:&V3L16|:scan lines"
  783.    L3_5: Data "Y12,X0:- Variable names buffer size:|X40,>1024,<16384,+256,E:&-|E:&+|:&V5L20|:bytes"
  784.    L3_6: Data "Y14,X0:- Direct mode variable buffer:|X40,>30,<600,+6,E:&-|E:&+|:&V3W24|:bytes"
  785.    L3_7: Data "X2,Y18,E: CAUTION! |: Improper setting of copper buffer can crash the system!"
  786.    L3_8: Data "Y20,X0:- Copper list buffer size:|X40,>3072,<12288,+256,E:&-|E:&+|:&V5L12|:bytes"
  787.    ' Datas page 4 
  788.    L4_1: Data "C,Y1,E: AMOS Basic - Screen palettes setup, page 1 "
  789.    L4_2: Data "X2,Y24:...Use LEFT and RIGHT mouse keys to set values...|E,X60,LMn_Back: Back to main menu "
  790.    L4_3: Data "X0,Y6:- Function key palette:"
  791.    L4_4: Data "X40,Y6:&PW66|V66,S0123,JSt_Col,X40,Y4,LR_Plus,E:+|E,LG_Plus:+|E,LB_Plus:+|X40,Y8,E,LR_Minus:-|E,LG_Minus:-|E,LB_Minus:-"
  792.    L4_5: Data "X50,Y6:&PW68|V66,S0123,JSt_Col,X50,Y4,LR_Plus,E:+|E,LG_Plus:+|E,LB_Plus:+|X50,Y8,E,LR_Minus:-|E,LG_Minus:-|E,LB_Minus:-"
  793.    L4_6: Data "X60,Y6:&PW70|V66,S0123,JSt_Col,X60,Y4,LR_Plus,E:+|E,LG_Plus:+|E,LB_Plus:+|X60,Y8,E,LR_Minus:-|E,LG_Minus:-|E,LB_Minus:-"
  794.    L4_7: Data "X70,Y6:&PW72|V66,S0123,JSt_Col,X70,Y4,LR_Plus,E:+|E,LG_Plus:+|E,LB_Plus:+|X70,Y8,E,LR_Minus:-|E,LG_Minus:-|E,LB_Minus:-"
  795.    L4_8: Data "X0,Y12:- Editor screen palette:"
  796.    L4_9: Data "X40,Y12:&PW58|V58,S1222,JSt_Col,X40,Y10,LR_Plus,E:+|E,LG_Plus:+|E,LB_Plus:+|X40,Y14,E,LR_Minus:-|E,LG_Minus:-|E,LB_Minus:-"
  797.    L4_10: Data "X50,Y12:&PW60|V58,S1222,JSt_Col,X50,Y10,LR_Plus,E:+|E,LG_Plus:+|E,LB_Plus:+|X50,Y14,E,LR_Minus:-|E,LG_Minus:-|E,LB_Minus:-"
  798.    L4_11: Data "X60,Y12:&PW62|V58,S1222,JSt_Col,X60,Y10,LR_Plus,E:+|E,LG_Plus:+|E,LB_Plus:+|X60,Y14,E,LR_Minus:-|E,LG_Minus:-|E,LB_Minus:-"
  799.    L4_12: Data "X0,Y18:- Screen border colour:"
  800.    L4_13: Data "X40,Y18:&PW106|JSt_Bor,X40,Y16,LR_Plus,E:+|E,LG_Plus:+|E,LB_Plus:+|X40,Y20,E,LR_Minus:-|E,LG_Minus:-|E,LB_Minus:-"
  801.    ' Datas page 5 
  802.    L5_1: Data "C,Y1,E: AMOS Basic - Screen palettes setup, page 2 "
  803.    L5_2: Data "X2,Y24:...Use LEFT and RIGHT mouse keys to set values...|E,X60,LMn_Back: Back to main menu "
  804.    L5_3: Data "X0,Y6:- Escape screen palette:"
  805.    L5_4: Data "X40,Y6:&PW82|V82,S0222,JSt_Col,X40,Y4,LR_Plus,E:+|E,LG_Plus:+|E,LB_Plus:+|X40,Y8,E,LR_Minus:-|E,LG_Minus:-|E,LB_Minus:-"
  806.    L5_5: Data "X50,Y6:&PW84|V82,S0222,JSt_Col,X50,Y4,LR_Plus,E:+|E,LG_Plus:+|E,LB_Plus:+|X50,Y8,E,LR_Minus:-|E,LG_Minus:-|E,LB_Minus:-"
  807.    L5_6: Data "X60,Y6:&PW86|V82,S0222,JSt_Col,X60,Y4,LR_Plus,E:+|E,LG_Plus:+|E,LB_Plus:+|X60,Y8,E,LR_Minus:-|E,LG_Minus:-|E,LB_Minus:-"
  808.    L5_7: Data "X0,Y12:- Error line palette:"
  809.    L5_8: Data "X40,Y12:&PW90|V90,S0122,JSt_Col,X40,Y10,LR_Plus,E:+|E,LG_Plus:+|E,LB_Plus:+|X40,Y14,E,LR_Minus:-|E,LG_Minus:-|E,LB_Minus:-"
  810.    L5_9: Data "X50,Y12:&PW92|V90,S0122,JSt_Col,X50,Y10,LR_Plus,E:+|E,LG_Plus:+|E,LB_Plus:+|X50,Y14,E,LR_Minus:-|E,LG_Minus:-|E,LB_Minus:-"
  811.    L5_10: Data "X60,Y12:&PW94|V90,S0122,JSt_Col,X60,Y10,LR_Plus,E:+|E,LG_Plus:+|E,LB_Plus:+|X60,Y14,E,LR_Minus:-|E,LG_Minus:-|E,LB_Minus:-"
  812.    L5_11: Data "X0,Y18:- Follow screen palette:"
  813.    L5_12: Data "X40,Y18:&PW98|V98,S0123,JSt_Col,X40,Y16,LR_Plus,E:+|E,LG_Plus:+|E,LB_Plus:+|X40,Y20,E,LR_Minus:-|E,LG_Minus:-|E,LB_Minus:-"
  814.    L5_13: Data "X50,Y18:&PW100|V98,S0123,JSt_Col,X50,Y16,LR_Plus,E:+|E,LG_Plus:+|E,LB_Plus:+|X50,Y20,E,LR_Minus:-|E,LG_Minus:-|E,LB_Minus:-"
  815.    L5_14: Data "X60,Y18:&PW102|V98,S0123,JSt_Col,X60,Y16,LR_Plus,E:+|E,LG_Plus:+|E,LB_Plus:+|X60,Y20,E,LR_Minus:-|E,LG_Minus:-|E,LB_Minus:-"
  816.    L5_15: Data "X70,Y18:&PW104|V98,S0123,JSt_Col,X70,Y16,LR_Plus,E:+|E,LG_Plus:+|E,LB_Plus:+|X70,Y20,E,LR_Minus:-|E,LG_Minus:-|E,LB_Minus:-"
  817.    ' Datas page 9 
  818.    L9_1: Data "C,Y6,E: AMOS Basic configuration editor "
  819.    L9_2: Data "C,Y10: Written by Francois Lionet "
  820.    L9_3: Data "C,Y12: Copyright 1990 Mandarin / Jawx "
  821.    L9_4: Data "X60,Y22,E,LMn_Back: Click me! "
  822. End Proc
  823. Procedure ST_KEY
  824.    KY$=Fsel$("*.Key","","Please choose a new keyboard","")
  825.    If(KY$<>"") and(Upper$(Right$(KY$,4))=".KEY")
  826.       On Error Goto KY_ERR
  827.       ALERT["... Loading keyboard definition ..."]
  828.       Open In 1,KY$ : LKY=Lof(1) : Close 
  829.       If LKY<512
  830.          A$=Space$(LKY+16) : Bload KY$,Varptr(A$)
  831.          ALERT[""]
  832.          KY$=Fsel$("Sys:AMOS_System/","Default.Key","Click on Ok to save, Quit to abort,","or choose another AMOS_System folder")
  833.          If(KY$<>"") and(Upper$(Right$(KY$,11))="DEFAULT.KEY")
  834.             ALERT["... Saving default keyboard ..."]
  835.             Bsave KY$,Varptr(A$) To Varptr(A$)+LKY
  836.          End If 
  837.       End If 
  838.    End If 
  839.    '  
  840.    KY_RES:
  841.    On Error : Close : ALERT[""]
  842.    Pop Proc
  843.    '
  844.    KY_ERR:
  845.    ALERT["... Disk Error! ..."] : Bell : Wait 100
  846.    Resume KY_RES
  847. End Proc
  848. Procedure WORK
  849.    Channel 0 To Rainbow 0
  850.    Amal 0,"Loop: For RA=0 To 29; Let X=RA; P;P;P;P;P; Next RA; Jump Loop"
  851.    Amal On 
  852.    ALERT["... Processing data ..."]
  853. End Proc
  854. Procedure FINISHED
  855.    Amal 0,"For R0=RA To 29; Let X=R0; P;P;P;P;P; Next R0"
  856.    Amal On 
  857.    ALERT[""]
  858. End Proc
  859. Procedure ARROW[X,Y,SX,SY,S,ZON]
  860.    Set Paint 0
  861.    Ink 2 : Set Paint 3
  862.    For N=0 To S-1
  863.       Polyline X-SX+N,Y+SY To X,Y-SY To X+SX-N,Y+SY
  864.    Next 
  865.    SX=Abs(SX) : SY=Abs(SY)
  866.    Set Zone ZON,X-SX,Y-SY To X+SX,Y+SY
  867. End Proc
  868. Procedure CASE[X,Y,SX,SY,S,ZON]
  869.    Set Paint 0
  870.    Ink 2 : Set Paint 3
  871.    For N=0 To S-1
  872.       Box X-SX+N,Y-SY+N To X+SX-N,Y+SY-N
  873.    Next 
  874.    Set Zone ZON,X-SX,Y-SY To X+SX,Y+SY
  875. End Proc
  876. Procedure VER_TEXT[A$,X,Y]
  877.    For N=1 To Len(A$)
  878.       Locate X,Y+N-1
  879.       Print Mid$(A$,N,1);
  880.    Next 
  881. End Proc
  882. Procedure TITLE
  883.    Paper 1 : Pen 2 : Clw 
  884.    Centre At(,10)+Border$(" AMOS V1.3 ENVIRONMENT EDITOR ",1)
  885. End Proc
  886. Procedure ALERT[A$]
  887.    W=Windon : Window 0
  888.    Centre At(,23)+Space$(78)
  889.    Centre At(,23)+A$
  890.    Window W
  891. End Proc
  892. Procedure HEXPLUS[V,P,MASK]
  893. End Proc[(V and($FFFF xor MASK)) or(MASK and(V+P))]