home *** CD-ROM | disk | FTP | other *** search
/ A.C.E. 2 / ACE CD 2.iso / FILES / UTILS / AMOSPRO5.DMS / in.adf / Menu_Editor.AMOS / Menu_Editor.amosSourceCode
Encoding:
AMOS Source Code  |  1992-09-30  |  40.9 KB  |  1,593 lines

  1. '--------------------------------------------------------------- 
  2. ' AMOS Professional Menu Editor  
  3. '
  4. ' By Fran�ois Lionet 
  5. '  
  6. ' (c) 1990-1992 Europress Software Ltd.  
  7. '--------------------------------------------------------------- 
  8. Set Buffer 40
  9.  
  10. VER$="1.30"
  11.  
  12. Close Editor 
  13.  
  14. '------------------- 
  15. ' USER SET UP ZONE 
  16. '------------------- 
  17. ' Maximum number of menu items 
  18. MXMN=150
  19. ' NTSC users set display to 200! 
  20. DISPLAY=256 : YHI=40 : YLOW=YHI+DISPLAY-63
  21. ' This is the size of the TREE and EDIT screen 
  22. TREESY=192
  23. ' Change for later versions of AMOS! 
  24. VERSION=102
  25. ' Menu bank number 
  26. NUMBANK=6
  27.  
  28. Dim DTRY(4),DTRY$(4),JMP$(64),ZIT(64),ITZ(64),ZBASE(64),PAR(20),PAR$(20),SPAR(20),TUNE(10)
  29. Dim MN$(MXMN),DR$(4),OB$(20),OBLOC$(20)
  30. Global PAR(),PAR$(),VERSION
  31. Global MXMN,MN$(),X_DF,Y_DF,D_DF,S_DF,I_DF,B_DF,A_DF,Z_DF
  32. Global TREESY,YHI,YTREE,NTOTAL,NFIRST,NLAST,MN_EMPTY$,MCHG,NCUR,NDR,CUR$,LCUR$,DR$(),OB$(),OBLOC$(),OB$
  33. Global MX,MY,TMX,TMY
  34.  
  35. ' If an accessory, grab the banks
  36. If Command Line$="GRAB"
  37.    If Prg Under
  38.       Trap Bgrab 1
  39.       Trap Bgrab 2
  40.    End If 
  41. End If 
  42.  
  43. Screen Open 0,640,64,4,Hires : Flash Off : Curs Off 
  44. Screen Display 0,,YLOW,,
  45. Palette $0,$77,$EEE,$DD
  46. Wind Save 
  47.  
  48. Screen Open 1,320,TREESY,2,Lowres : Curs Off : Scroll Off 
  49. Palette 0,$CCC
  50. Screen Display 1,,YHI,,
  51. Reserve Zone MXMN+4
  52.  
  53. Limit Mouse 128,YHI To 128+320,40+DISPLAY
  54. Get Fonts 
  55. For N=1 To 20 : PAR$(N)=Left$(Font$(N),15)+" "+Mid$(Font$(N),31,2) : Next 
  56.  
  57. X_DF=8 : Y_DF=12 : D_DF=16 : S_DF=22 : I_DF=24 : B_DF=26 : Z_DF=28 : A_DF=Z_DF+16
  58. '          1234567890123456789012345678901234567890123456789   
  59. MN_EMPTY$="A              12110-      ----------------"+"(LO0,0:IN1,2:IN2,0:SF2:SS0)>Empty<"+Chr$(0)+Chr$(0)+Chr$(0)+Chr$(0)
  60. For N=0 To MXMN : MN$(N)=Chr$(127) : Next 
  61. PAR(5)=1 : PAR(6)=2 : PAR(7)=1 : PAR(8)=1 : PAR(9)=0 : PAR(13)=1
  62. CBOB=1 : CICO=1 : CINK1=2 : CINK2=0 : PAR(14)=2 : TXTLEN=80
  63. Goto MN_IN
  64.  
  65. '---> Title page 
  66. MN_SAVEIT:
  67. Pop : Pop 
  68. MN_IN:
  69. R_SCREEN$=""
  70. PAGE=1 : Gosub MK_MENU
  71.  
  72. '---> Hello! 
  73. MN_TITLE:
  74. Channel 0 To Screen Display 0
  75. A$="      Let R0="+Str$((DISPLAY)/2-32)+";"
  76. A$=A$+"   Let R1=4;"
  77. A$=A$+"   Move 0,0-R0,1;"
  78. A$=A$+"L: Move 0,0-R0,R1; Move 0,R0,R1;"
  79. A$=A$+"   Let R0=R0/2; Let R1=R1-1; If R1>0 Jump M; Let R1=1;"
  80. A$=A$+"M: Move 0,R0,R1; Move 0,0-R0,R1;"
  81. A$=A$+"   If R0>0 Jump L"
  82. Amal 0,A$ : Amal On 
  83. ALERT["Version"+VER$,"By Fran�ois Lionet","(c) 1992 Europress Software Ltd."]
  84. Amal Off : Screen Display 0,,YLOW,,
  85. Return 
  86. '
  87. '---> Save menu script 
  88. MN_SAVE:
  89. If SCCOL=0 : Bell : Return : End If 
  90. F$=Fsel$("*.Menu","","Please enter menu's name","Name must end by .MENU!")
  91. If Upper$(Right$(F$,5))=".MENU"
  92.    Screen 0 : Wind Open 1,0,0,80,3 : Curs Off : Print : Centre "Saving "+F$
  93.    On Error Goto D_ERROR
  94.    Open Out 1,F$
  95.    Screen 2
  96.    Print #1,SCCOL
  97.    Print #1,SCRES
  98.    Screen 0
  99.    For N=0 To MXMN
  100.       Print #1,Len(MN$(N))
  101.       Print #1,MN$(N);
  102.    Next 
  103.    Close 
  104.    Wind Close 
  105.    On Error 
  106.    MNAME$=F$
  107.    Return 
  108. End If 
  109. Return 
  110. '
  111. '---> Load a menu script 
  112. MN_LOAD:
  113. F$=Fsel$("*.Menu","","Please enter menu's name","Name must end by .MENU!")
  114. If Upper$(Right$(F$,5))=".MENU"
  115.    If SCCOL : Screen Close 2 : SCCOL=0 : End If 
  116.    Screen 0 : Wind Open 1,0,0,80,3 : Curs Off : Print : Centre "Loading "+F$
  117.    On Error Goto D_ERROR
  118.    Open In 1,F$
  119.    Input #1,SCCOL,SCRES
  120.    For N=0 To MXMN
  121.       Input #1,L : MN$(N)=Input$(1,L)
  122.    Next 
  123.    Close 
  124.    Wind Close 
  125.    On Error 
  126.    SC_OPEN
  127.    MCHG=-1 : SET_CUR[0] : TREE
  128.    MNAME$=F$
  129.    Goto MN_EDITIT
  130. End If 
  131. Return 
  132. '
  133. '---> Save menu bank 
  134. MN_BANK:
  135. If SCCOL=0 : Bell : Return : End If 
  136. F$=Fsel$("*.Abk","","Please enter bank name (.ABK)","Bank number"+Str$(NUMBANK)+"!")
  137. If Upper$(Right$(F$,4))=".ABK"
  138.    Screen 0 : Wind Open 1,0,0,80,3 : Curs Off : Print : Centre "Saving "+F$
  139.    SET_MN
  140.    Menu Calc 
  141.    Erase NUMBANK : Menu To Bank NUMBANK
  142.    On Error Goto D_ERROR
  143.    Save F$,NUMBANK
  144.    Erase NUMBANK
  145.    Menu Del 
  146.    Screen 0 : Wind Close 
  147. End If 
  148. Return 
  149. '
  150. '---> Quit & grab menu bank  
  151. MN_GBNK:
  152. If SCCOL=0 or BGRB=0 : Bell : Return : End If 
  153. SET_MN
  154. Menu Calc 
  155. Erase NUMBANK : Menu To Bank NUMBANK
  156. Trap Bsend NUMBANK
  157. Trap Bsend 1
  158. Trap Bsend 2
  159. Goto MN_ABORT
  160. '
  161. D_ERROR: Wind Close : ALERT["",">>> DISC ERROR <<<",""] : Resume D_ERR
  162. D_ERR: Close : Erase 6 : Return 
  163. '
  164. '---> End
  165. MN_ABORT:
  166. If Dreg(0)=0 : For N=1 To 15 : Erase N : Next : End If 
  167. Default : Edit 
  168. '
  169. '---> Create a menu
  170. MN_NEW_IT:
  171. Pop : Pop 
  172. PAGE=2 : PAR(1)=16 : PAR(2)=0
  173. Gosub MK_MENU
  174. ' Go on
  175. NW_GO:
  176. If PAR(1)>16 and PAR(2)=$8000
  177.    ALERT["","Hires screens are limited to 16 colours!",""]
  178.    Goto MN_NEW_IT
  179. Else 
  180.    SCRES=PAR(2)
  181.    SCCOL=PAR(1)
  182.    SC_OPEN
  183. End If 
  184. For N=0 To MXMN : MN$(N)=Chr$(127) : Next 
  185. MCHG=-1 : SET_CUR[0] : TREE
  186. Goto MN_EDITIT
  187. '
  188. '---> Editing
  189. MN_EDITIT:
  190. If SCCOL=0 : Bell : Return : End If 
  191. Pop : Pop 
  192. R_SCREEN$="Choose_Item"
  193. PAGE=3 : Gosub MK_MENU
  194. '
  195. '---> Choose an item!
  196. CHOOSE_ITEM:
  197. Screen 1 : Screen To Front 1
  198. TREE
  199. OLDZI=0 : REFLAG=0
  200. Do 
  201.    Repeat 
  202.       If Mouse Key=2
  203.          TRY_MENU
  204.          Screen 1
  205.       End If 
  206.       ZI=Mouse Zone : K=Mouse Key
  207.       If ZI<>OLDZI
  208.          If OLDZI>0 and OLDZI-1<>NCUR : ACT_ITEM[OLDZI-1,0] : End If 
  209.          OLDZI=0
  210.          If ZI>0 and ZI<=MXMN : ACT_ITEM[ZI-1,1] : OLDZI=ZI : End If 
  211.       End If 
  212.       Exit If Scin(X Mouse,Y Mouse)<>1 and OLDZI=0,2
  213.    Until K<>0 and ZI<>0
  214.    D=0
  215.    If ZI<=MXMN
  216.       ACT_ITEM[NCUR,0]
  217.       SET_CUR[ZI-1]
  218.       ACT_ITEM[NCUR,1]
  219.       E=0 : Gosub DR_MENU
  220.       Screen 1 : ZI=-1
  221.    End If 
  222.    If ZI=MXMN+1 : D=-TREESY : End If 
  223.    If ZI=MXMN+2 : D=-8*4 : End If 
  224.    If ZI=MXMN+3 : D=8*4 : End If 
  225.    If ZI=MXMN+4 : D=TREESY : End If 
  226.    If D
  227.       If D<0
  228.          Screen Copy Logic,17,-D,320,TREESY To Logic,17,0
  229.          Cls 0,17,TREESY-16+D To 320,TREESY
  230.       Else 
  231.          Screen Copy Logic,17,0,320,TREESY-D To Logic,17,D
  232.          Cls 0,17,0 To 320,D
  233.       End If 
  234.       Add YTREE,D
  235.       MCHG=1 : TREE
  236.    End If 
  237. Loop 
  238. ACT_ITEM[NCUR,1]
  239. Return 
  240. '
  241. '---> Change item flags
  242. '
  243. IT_LNK:
  244. IT_ACT:
  245. IT_IMV:
  246. MK_EMPTY
  247. MN_FLAGS[NCUR]
  248. Return 
  249. '
  250. IT_LNE:
  251. IT_MVE:
  252. If NCUR>=0
  253.    A$=Left$(LCUR$,Len(LCUR$)-1)+"A"
  254.    IT_SEARCH[A$,0]
  255.    While Param>=0
  256.       MN_FLAGS[Param]
  257.       A$=Left$(A$,Len(A$)-1)+Chr$(Asc(Right$(A$,1))+1)
  258.       IT_SEARCH[A$,Param+1]
  259.    Wend 
  260.    MK_EMPTY
  261. End If 
  262. Return 
  263. '
  264. ' Erase branch coord 
  265. ER_POS:
  266. ZERO_COORD : INFO["All offsets erased!"] : Return 
  267. '
  268. '---------------   
  269. ' Create branch
  270. CR_BRA:
  271. If NCUR>=0
  272.    If Len(LCUR$)<4
  273.       IT_SEARCH[LCUR$+"A",0]
  274.       If Param<0
  275.          IT_EMPTY
  276.          If Param
  277.             Left$(CUR$,4)=LCUR$+"A" : MN$(Param)=CUR$+Mid$(MN_EMPTY$,5)
  278.             SET_CUR[Param]
  279.             MCHG=-1 : TREE : REFLAG=1
  280.             ZERO_COORD
  281.          End If 
  282.       End If 
  283.    End If 
  284. End If 
  285. Return 
  286. '------------- 
  287. ' Insert item
  288. IT_INS:
  289. If NCUR>=0
  290.    For N=MXMN-1 To NCUR Step -1
  291.       MN$(N+1)=MN$(N)
  292.    Next 
  293.    MN$(NCUR)=CUR$+Mid$(MN_EMPTY$,5)
  294.    MN_RENUM : SET_CUR[NCUR]
  295.    MCHG=-1 : TREE : REFLAG=1
  296.    ZERO_COORD
  297. End If 
  298. Return 
  299. '----------
  300. ' Add item 
  301. IT_ADD:
  302. If NCUR>=0
  303.    A$=Left$(LCUR$,Len(LCUR$)-1)+Chr$(Asc(Right$(LCUR$,1))+1)
  304.    IT_SEARCH[A$,0]
  305.    If Param<0
  306.       IT_EMPTY
  307.       If Param
  308.          Left$(CUR$,4)=A$ : MN$(Param)=CUR$+Mid$(MN_EMPTY$,5)
  309.          SET_CUR[Param]
  310.          MCHG=-1 : TREE : REFLAG=1
  311.          ZERO_COORD
  312.       End If 
  313.    End If 
  314. End If 
  315. Return 
  316. '------------- 
  317. ' Delete item
  318. IT_DEL:
  319. If NCUR>=0
  320.    IT_SEARCH[LCUR$,0]
  321.    While Param>=0 and N<MXMN-1
  322.       MN$(Param)=Chr$(127)
  323.       IT_SEARCH[LCUR$,Param+1]
  324.    Wend 
  325.    Sort MN$(0) : MN_RENUM
  326.    SET_CUR[NCUR]
  327.    MCHG=-1 : TREE : REFLAG=1
  328.    ZERO_COORD
  329. End If 
  330. Return 
  331. '
  332. '---> Draw menu
  333. MN_DRAWIT:
  334. If NCUR<0
  335.    Bell 
  336.    Return 
  337. End If 
  338. R_SCREEN$="Ob_Edit"
  339. X=Free
  340. Pop : Pop 
  341. Screen 2 : Screen To Front 2 : Cls 0
  342. XTREE=1 : YTREE=9 : SXTREE=Screen Width/2-XTREE : SYTREE=TREESY-16-YTREE
  343. XOB=Screen Width/2+1 : YOB=9
  344. NDR=PAR
  345. Reserve Zone 65
  346. For C=0 To Screen Colour-1 : DR_COLOUR[C] : Next 
  347. CL_TREE : Locate 0,0 : Paper 0 : Pen 1 : Print "Current item:"
  348. SET_INK[CINK1,CINK2]
  349. CL_OB : Locate Screen Width/16,0 : Paper 0 : Pen 1 : Print "Current element:"
  350. CUR_SET
  351. For Y=-200 To YHI Step 16 : Screen Display 2,,Y,, : Wait Vbl : Next 
  352. P=A_DF
  353. For N=0 To 3
  354.    Q=Instr(MN$(NCUR),Chr$(0),P) : DR$(N)=Mid$(MN$(NCUR),P,Q-P) : P=Q+1
  355. Next 
  356. MN$(NCUR)=Left$(MN$(NCUR),A_DF-1)
  357. For N=0 To 20 : OB$(N)="" : Next 
  358. P=1 : N=0
  359. Repeat 
  360.    If Mid$(DR$(NDR),P,1)="("
  361.       Q=Instr(DR$(NDR),"(",P+1) : If Q<=P : Q=Len(DR$(NDR))+1 : End If 
  362.       OB$(N)=Mid$(DR$(NDR),P,Q-P)
  363.       If Mid$(OB$(N),2,3)="LOe" : OB$(N)="" : End If 
  364.       P=Q : Inc N
  365.    Else 
  366.       Inc Q
  367.    End If 
  368. Until Q>=Len(DR$(NDR))
  369. COB=0
  370. DR_TREE
  371. DR_OB[COB]
  372. BACK_DRAW:
  373. PAR(20)=COB : PAGE=4 : Gosub MK_MENU
  374. '
  375. ' Back to edit 
  376. BTO_EDIT:
  377. MAKE_MN
  378. Screen 2
  379. For Y=YHI To -Screen Height Step -16 : Screen Display 2,,Y,, : Wait Vbl : Next 
  380. Cls 0
  381. Goto MN_EDITIT
  382. '
  383. ' In the edit screen 
  384. OB_EDIT:
  385. Screen 2 : Screen To Front 2
  386. If PAR(20)<>COB : COB=PAR(20) : DR_OB[COB] : End If 
  387. Do 
  388.    Exit If Scin(X Mouse,Y Mouse)<>2
  389.    Z=Mouse Zone
  390.    If Z=65
  391.       If DR_ROUT$<>"" : Gosub GO_DRAW : End If 
  392.       Z=0
  393.    End If 
  394.    K=Mouse Key : Y=Y Screen(Y Mouse)
  395.    If Z<>0 and K=1
  396.       If Z<=Screen Colour
  397.          If TREESY-Y>8
  398.             SET_INK[Z-1,CINK2]
  399.          Else 
  400.             SET_INK[CINK1,Z-1]
  401.          End If 
  402.          CUR_SET
  403.       End If 
  404.       While Mouse Key : Wend 
  405.    End If 
  406. Loop 
  407. Return 
  408. '
  409. '---> General drawing routine
  410. GO_DRAW:
  411. Do 
  412.    Do 
  413.       SET_PAR
  414.       X1=-1
  415.       If DXOB=0 and SXOB=0
  416.          Repeat 
  417.             Exit If Mouse Zone<>65,3
  418.             DXOB=X Screen(X Mouse)-XTREE : DYOB=Y Screen(Y Mouse)-YTREE
  419.          Until Mouse Key=1
  420.       End If 
  421.       FLAG=0 : Gosub DR_ROUT$
  422.       If TXTOB$<>""
  423.          SXOB=Text Length(TXTOB$)
  424.          SYOB=SYFONT
  425.       End If 
  426.       If SXOB=0
  427.          Repeat 
  428.             WT_MOVE[0]
  429.             Exit If Mouse Zone<>65,3
  430.             X=X Screen(X Mouse)-DXOB-XTREE : Y=Y Screen(Y Mouse)-DYOB-YTREE
  431.             If X>=MNX and Y>=MNY
  432.                SXOB=X : SYOB=Y
  433.                SXOB=Min(SXOB,SXTREE)
  434.                SYOB=Min(SYOB,SYTREE)
  435.                Gosub DRW_IT
  436.             End If 
  437.          Until Mouse Key=0
  438.          If SXOB<0 : DXOB=DXOB+SXOB : SXOB=-SXOB : End If 
  439.          If SYOB<0 : DYOB=DYOB+SYOB : SYOB=-SYOB : End If 
  440.       End If 
  441.       Repeat 
  442.          If DXOB=X Screen(X Mouse)-XTREE and DYOB=Y Screen(Y Mouse)-YTREE : WT_MOVE[3] : End If 
  443.          Exit If Mouse Zone<>65,3
  444.          If Mouse Key=2
  445.             DXOB=0 : SXOB=0
  446.             If X1>=0 : Put Block 1 : End If 
  447.             Exit 2
  448.          End If 
  449.          X=X Screen(X Mouse)-XTREE : Y=Y Screen(Y Mouse)-YTREE
  450.          If X+SXOB>0 and Y+SYOB>0
  451.             DXOB=X : DYOB=Y : Gosub DRW_IT
  452.          End If 
  453.       Until Mouse Key=1
  454.       If NCUR>=0 and SXOB>=MNX and SYOB>=MNY
  455.          OB$="("
  456.          Gosub ST_ROUT$
  457.          X=Free
  458.          OB$(COB)=OB$ : DR_OB[COB]
  459.          DR_TREE
  460.          While Mouse Key : Wend 
  461.       Else 
  462.          SXOB=0 : DXOB=0
  463.       End If 
  464.    Loop 
  465. Loop 
  466. If X1>=0 : Put Block 1 : Del Block 1 : End If 
  467. Return 
  468. DRW_IT:
  469. If X1>=0 : Put Block 1 : Del Block 1 : End If 
  470. X1=XTREE+DXOB : Y1=YTREE+DYOB : X2=X1+SXOB : Y2=Y1+SYOB
  471. If X1>X2 : Swap X1,X2 : End If 
  472. If Y1>Y2 : Swap Y1,Y2 : End If 
  473. X1=X1 and $FFFFFFF0
  474. X2=(X2+16) and $FFFFFFF0
  475. If Y2+2>=Screen Height : Y2=Screen Height-2 : End If 
  476. If X2+16>Screen Width : X2=Screen Width-16 : End If 
  477. Get Block 1,X1,Y1,X2-X1+16,Max(Y2-Y1+2,2)
  478. Clip XTREE,YTREE To XTREE+SXTREE-1,YTREE+SYTREE
  479. FLAG=1 : Gosub DR_ROUT$ : Wait 2
  480. Clip 
  481. Return 
  482. '
  483. ST_FONT:
  484. Pop : Pop 
  485. PAGE=5 : Gosub MK_MENU : Goto BACK_DRAW
  486. '
  487. ST_PATP: Inc PAR(15) : PAR(15)=Min(PAR(15),34) : CUR_SET : Return 
  488. '
  489. ST_PATM: Dec PAR(15) : M=Min(0,-Length(1)) : PAR(15)=Max(PAR(15),M) : CUR_SET : Return 
  490. '
  491. T_SET: CUR_SET : Return 
  492. '
  493. G_DROB: Screen 2 : DR_OB[PAR(20)] : Return 
  494. '
  495. OB_INS:
  496. If COB<20
  497.    For N=19 To PAR(20) Step -1 : OB$(N+1)=OB$(N) : Next 
  498.    OB$(PAR(20))=""
  499. End If 
  500. Screen 2 : DR_OB[PAR(20)]
  501. Return 
  502. '
  503. OB_DEL:
  504. If PAR(20)<20
  505.    For N=PAR(20) To 19 : OB$(N)=OB$(N+1) : Next 
  506.    OB$(20)=""
  507. End If 
  508. Screen 2 : DR_OB[PAR(20)] : DR_TREE
  509. Return 
  510. '
  511. OB_PUS: OB_BLOC$=OB$(PAR(20)) : INFO["Object stored!"] : Return 
  512. '
  513. OB_PAS:
  514. If OB_BLOC$=""
  515.    INFO[">>> No block! <<<"]
  516. Else 
  517.    OB$(PAR(20))=OB_BLOC$
  518.    Screen 2 : DR_OB[PAR(20)] : DR_TREE
  519. End If 
  520. Return 
  521. '
  522. MK_BOR:
  523. If NDR<>0
  524.    INFO[">>> You must be editing the NORMAL item to do so! <<<"]
  525. Else 
  526.    Screen 2
  527.    DR_TREE
  528.    MAKE_MN
  529.    P=Instr(DR$(0),"LOe")
  530.    If P
  531.       DXOB=0 : DYOB=0
  532.       Add P,3 : Q=Instr(DR$(0),",",P) : SXOB=Val(Mid$(DR$(0),P,Q-P))-1
  533.       P=Q+1 : Q=Instr(DR$(0),")",P) : SYOB=Val(Mid$(DR$(0),P,Q-P))-1
  534.       Swap CINK1,CINK2
  535.       OB$="(" : Gosub S_BOX : DR$(1)=OB$
  536.       Swap CINK1,CINK2
  537.    End If 
  538. End If 
  539. Return 
  540. '
  541. MK_INV:
  542. If NDR<>0
  543.    INFO[">>> You must be editing the NORMAL item to do so! <<<"]
  544. Else 
  545.    Screen 2
  546.    DR_TREE
  547.    MAKE_MN
  548.    A$=Mid$(DR$(0),1)
  549.    P=0
  550.    Do 
  551.       P=Instr(A$,"IN1,",P+1)
  552.       Exit If P=0
  553.       Q=Instr(A$,"IN2,",P+1)
  554.       If Q<>0 and Q-P<9
  555.          A1$=Mid$(A$,P+4,2) : A2$=Mid$(A$,Q+4,2)
  556.          Mid$(A$,P+4)=A2$ : Mid$(A$,Q+4)=A1$
  557.       End If 
  558.    Loop 
  559.    DR$(1)=Mid$(A$,1)
  560. End If 
  561. Return 
  562. '
  563. TR_PUS:
  564. For N=0 To 20 : OBLOC$(N)=OB$(N) : Next 
  565. INFO["Tree stored!"]
  566. Return 
  567. '
  568. TR_PAS:
  569. For N=0 To 20 : Exit If OBLOC$(N)<>"" : Next 
  570. If N>=20
  571.    INFO[">>> No tree stored! <<<"]
  572. Else 
  573.    For N=0 To 20 : OB$(N)=OBLOC$(N) : Next 
  574.    Screen 2 : DR_OB[PAR(20)] : DR_TREE
  575. End If 
  576. Return 
  577. '
  578. LD_BANK:
  579. F$=Fsel$("*.ABK","","Please choose a bank")
  580. If F$<>""
  581.    Screen 2 : Load F$
  582.    If Length(2) : Get Icon Palette : End If 
  583.    If Length(1) : Fade 4 To -1 : End If 
  584.    Screen 2 : DR_OB[PAR(20)] : DR_TREE
  585. Else 
  586.    ALERT["","",">>> Not done <<<"]
  587. End If 
  588. Return 
  589. '
  590. DR_LINE: DR_ROUT$="D_LINE" : ST_ROUT$="S_LINE" : MNX=0 : MNY=0
  591. E_DR: TXTOB$="" : DXOB=0 : SXOB=0 : Return 
  592. D_LINE: If FLAG : Draw XTREE+DXOB,YTREE+DYOB To XTREE+DXOB+SXOB,YTREE+DYOB+SYOB : End If : Return 
  593. S_LINE: S_LOC : S_INK[1,CINK1]
  594. OB$=OB$+"LI"+Mid$(Str$(DXOB+SXOB),2)+","+Mid$(Str$(DYOB+SYOB),2)+")"
  595. Return 
  596. '
  597. DR_BOX: DR_ROUT$="D_BOX" : ST_ROUT$="S_BOX" : Goto E_DR
  598. D_BOX: If FLAG : Box XTREE+DXOB,YTREE+DYOB To XTREE+DXOB+SXOB,YTREE+DYOB+SYOB : End If : Return 
  599. S_BOX: S_INK[1,CINK1]
  600. OB$=OB$+"LO"+Mid$(Str$(DXOB),2)+","+Mid$(Str$(DYOB),2)+":LI"+Mid$(Str$(DXOB+SXOB),2)+","+Mid$(Str$(DYOB),2)+":"
  601. OB$=OB$+"LO"+Mid$(Str$(DXOB+SXOB),2)+","+Mid$(Str$(DYOB),2)+":LI"+Mid$(Str$(DXOB+SXOB),2)+","+Mid$(Str$(SYOB+DYOB),2)+":"
  602. OB$=OB$+"LO"+Mid$(Str$(DXOB+SXOB),2)+","+Mid$(Str$(DYOB+SYOB),2)+":LI"+Mid$(Str$(DXOB),2)+","+Mid$(Str$(SYOB+DYOB),2)+":"
  603. OB$=OB$+"LO"+Mid$(Str$(DXOB),2)+","+Mid$(Str$(DYOB+SYOB),2)+":LI"+Mid$(Str$(DXOB),2)+","+Mid$(Str$(DYOB),2)+")"
  604. Return 
  605. '
  606. DR_BAR: DR_ROUT$="D_BAR" : ST_ROUT$="S_BAR" : MNX=1 : MNY=1 : Goto E_DR
  607. D_BAR:
  608. If FLAG
  609.    If SXOB>0 and SYOB>0
  610.       If PAR(15)<0 : Ink 63,0 : End If 
  611.       Bar XTREE+DXOB,YTREE+DYOB To XTREE+DXOB+SXOB,YTREE+DYOB+SYOB
  612.    End If 
  613. End If 
  614. Return 
  615. S_BAR:
  616. S_LOC
  617. OB$=OB$+"OU"+Mid$(Str$(PAR(13)),2)+":"
  618. OB$=OB$+"PA"+(Str$(PAR(15))-" ")+":"
  619. If PAR(15)>=0
  620.    S_INK[1,CINK1] : S_INK[2,CINK2]
  621. Else 
  622.    S_INK[1,63] : S_INK[2,0]
  623. End If 
  624. S_INK[3,CINK1]
  625. OB$=OB$+"BA"+Mid$(Str$(DXOB+SXOB),2)+","+Mid$(Str$(DYOB+SYOB),2)+")"
  626. Return 
  627. '
  628. DR_ELL: DR_ROUT$="D_Ell" : ST_ROUT$="S_ELL" : MNX=2 : MNY=2 : Goto E_DR
  629. D_ELL:
  630. If FLAG
  631.    If SXOB/2<>0 and SYOB/2<>0
  632.       If PAR(15)<0 : Ink 63,0 : End If 
  633.       Ellipse XTREE+DXOB+SXOB/2,YTREE+DYOB+SYOB/2,SXOB/2,SYOB/2
  634.    End If 
  635. End If 
  636. Return 
  637. S_ELL:
  638. S_INK[1,CINK1]
  639. OB$=OB$+"LO"+Mid$(Str$(DXOB+SXOB/2),2)+","+Mid$(Str$(DYOB+SYOB/2),2)+":"
  640. OB$=OB$+"EL"+Mid$(Str$(SXOB/2),2)+","+Mid$(Str$(SYOB/2),2)+")"
  641. Return 
  642. '
  643. ST_TLEN:
  644. Wind Open 1,0,0,80,1
  645. Clear Key : Clear Key : Put Key Str$(TXTLEN) : Input "Please enter maximum length: ";L
  646. Wind Close 
  647. If L>0 and L<80
  648.    TXTLEN=L
  649. Else 
  650.    Bell 
  651. End If 
  652. Return 
  653. DR_TEXT:
  654. Wind Open 1,0,0,80,1
  655. Input "Please enter text: ";TXTOB$ : TXTOB$=Left$(TXTOB$,TXTLEN)
  656. Wind Close 
  657. If TXTOB$=""
  658.    ALERT["","",">>> Not done <<<"]
  659. Else 
  660.    DR_ROUT$="D_TEXT" : ST_ROUT$="S_TEXT" : DXOB=1 : SXOB=0
  661. End If 
  662. Return 
  663. D_TEXT:
  664. If FLAG
  665.    Text DXOB+XTREE,DYOB+YTREE+Text Base,TXTOB$
  666. Else 
  667.    SXOB=Text Length(TXTOB$) : SYOB=SYFONT
  668. End If 
  669. Return 
  670. S_TEXT:
  671. S_LOC : S_INK[1,CINK1] : S_INK[2,CINK2]
  672. OB$=OB$+"SF"+Mid$(Str$(PAR(14)),2)+":"
  673. OB$=OB$+"SS"+(Str$(SFONT)-" ")+")"
  674. OB$=OB$+TXTOB$
  675. Return 
  676. '
  677. DR_BOB:
  678. If Length(1)
  679.    DR_ROUT$="D_BOB" : ST_ROUT$="S_BOB" : DXOB=1 : SXOB=1
  680. Else 
  681.    Bell 
  682. End If 
  683. Return 
  684. D_BOB:
  685. If K$<>""
  686.    If SC=$4F : Add CBOB,-1,1 To Length(1) : FLAG=-1 : Put Key " " : End If 
  687.    If SC=$4E : Add CBOB,1,1 To Length(1) : FLAG=-1 : Put Key " " : End If 
  688. End If 
  689. If CBOB<=Length(1)
  690.    If FLAG<=0
  691.       A=Sprite Base(CBOB)
  692.       If A : SXOB=(Deek(A)+1)*16 : SYOB=Deek(A+2) : HX=Deek(A+4) : HY=Deek(A+6) : End If 
  693.    End If 
  694.    If FLAG>0
  695.       Paste Bob XTREE+DXOB+HX,YTREE+DYOB+HY,CBOB
  696.    End If 
  697. End If 
  698. Return 
  699. S_BOB:
  700. S_LOC
  701. OB$=OB$+"BO"+Mid$(Str$(CBOB),2)+")"
  702. Return 
  703. '
  704. DR_ICO:
  705. If Length(2)
  706.    DR_ROUT$="D_ICO" : ST_ROUT$="S_ICO" : DXOB=1 : SXOB=1
  707. Else 
  708.    Bell 
  709. End If 
  710. Return 
  711. D_ICO:
  712. If K$<>""
  713.    If SC=$4F : Add CICO,-1,1 To Length(2) : FLAG=-1 : Put Key " " : End If 
  714.    If SC=$4E : Add CICO,1,1 To Length(2) : FLAG=-1 : Put Key " " : End If 
  715. End If 
  716. If CICO<=Length(2)
  717.    If FLAG<=0
  718.       A=Icon Base(CICO)
  719.       If A : SXOB=(Deek(A)+1)*16 : SYOB=Deek(A+2) : End If 
  720.    End If 
  721.    If FLAG>0
  722.       Paste Icon XTREE+DXOB,YTREE+DYOB,CICO
  723.    End If 
  724. End If 
  725. Return 
  726. S_ICO:
  727. S_LOC
  728. OB$=OB$+"IC"+Mid$(Str$(CICO),2)+")"
  729. Return 
  730. '
  731. ' Once again, the graphic menu handling routines.  
  732. ' Grab them for your programs!   
  733. ' Handle menu
  734. MK_MENU:
  735. E=1
  736. For N=0 To 63 : JMP$(N)="" : Next 
  737. RMK_MENU:
  738. Gosub DR_MENU
  739. NOZ=1 : OLDZ=-1 : REFLAG=0
  740. Do 
  741.    Repeat 
  742.       If Mouse Key=2
  743.          If PAGE<4
  744.             TRY_MENU
  745.          Else 
  746.             MAKE_MN : TRY_MENU2
  747.          End If 
  748.       End If 
  749.       If Scin(X Mouse,Y Mouse)<>0 and OLDZ<0
  750.          If R_SCREEN$<>""
  751.             Gosub R_SCREEN$
  752.          End If 
  753.       End If 
  754.       If REFLAG
  755.          E=0 : Goto RMK_MENU
  756.       End If 
  757.       Screen To Front 0 : Screen 0 : Z=Mouse Zone : K=Mouse Key and 1
  758.       If Z<>OLDZ
  759.          If OLDZ>0 : ACT=-1 : IT=ZIT(OLDZ) : OLDZ=-1 : Gosub DR_ITEM : End If 
  760.          If Z>0 : OLDZ=Z : ACT=Z : IT=ZIT(Z) : ZNE=ZBASE(IT) : Gosub DR_ITEM : End If 
  761.       End If 
  762.    Until Z<>0 and K<>0
  763.    If GSB$<>"" : Gosub GSB$ : End If 
  764.    If JMP$(Z)<>"" : Gosub JMP$(Z) : End If 
  765.    Screen 0 : ACT=Z : ZNE=ZBASE(IT) : Gosub DR_ITEM
  766.    If JMP$<>"" : Gosub JMP$ : End If 
  767.    If K=1 : Repeat : Until Mouse Key=0 : End If 
  768. Loop 
  769. '
  770. MN_BACK:
  771. On Error Goto NO_SC1
  772. NO_SC2: On Error 
  773. Colour Back 0 : View 
  774. Pop : Return 
  775. NO_SC1: Resume NO_SC2
  776. ' Draw menu page 
  777. DR_MENU:
  778. Change Mouse 3
  779. Screen 0 : Paper 1 : Pen 2 : Inverse Off 
  780. NOZ=1
  781. X=Free
  782. If E
  783.    Clw 
  784.    Reserve Zone 64 : Reset Zone 
  785.    NOZ=0
  786. End If 
  787. IT=0 : ZNE=1 : ACT=-1 : OLDPAR=-1
  788. Repeat 
  789.    Inc IT : ZBASE(IT)=ZNE : Gosub DR_ITEM
  790. Until FLAG=False
  791. Change Mouse 1
  792. X=Free
  793. Return 
  794. ' Draw a menu item 
  795. DR_ITEM:
  796. LAB$="L"+(Str$(PAGE)-" ")+"_"+(Str$(IT)-" ")
  797. On Error Goto NO_IT
  798. Restore LAB$ : Read IT$
  799. On Error 
  800. M=0 : XX=-1 : JMP$=""
  801. Repeat 
  802.    NEND=Instr(IT$,"|",M+1)
  803.    ENC=0 : LBL$="" : TUNE=0 : RADIO=0 : FL=0 : ZZ=0 : NB=0
  804.    Repeat 
  805.       N=M+1
  806.       M=Instr(IT$,",",N) : M2=Instr(IT$,":",N) : If M>M2 : M=0 : End If 
  807.       If M=0 or(NEND<>0 and M1>NEND) : M=M2 : FL=1 : End If 
  808.       A$=Upper$(Mid$(IT$,N,1)) : Inc N
  809.       If A$="E" : ENC=1 : End If 
  810.       If A$="L" : Gosub GT_STR : LBL$=A$ : Inc ZZ : End If 
  811.       If A$="C" : CNT=1 : End If 
  812.       If A$="X" : Gosub GT_STR : XX=Val(A$) : End If 
  813.       If A$="Y" : Gosub GT_STR : YY=Val(A$) : End If 
  814.       If A$=">" : Gosub GT_STR : VMN=Val(A$) : End If 
  815.       If A$="<" : Gosub GT_STR : VMX=Val(A$) : End If 
  816.       If A$="+" : Gosub GT_STR : VPL=Val(A$) : End If 
  817.       If A$="R" : GSB$="RADIO" : Inc ZZ : Gosub GT_STR : RADIO=Val(A$) : End If 
  818.       If A$="T" : GSB$="TUNE" : Inc ZZ
  819.          Gosub GT_STRDOT : TUNE=Val(A$)
  820.          Gosub GT_STRDOT : NTUNE=Val(A$)
  821.          For TU=1 To NTUNE
  822.             Gosub GT_STRDOT
  823.             TUNE(TU)=Val(A$)
  824.          Next 
  825.       End If 
  826.       If A$="V" : Gosub GT_STR : PAR=Val(A$) : End If 
  827.       If A$="S" : Gosub GT_STR : PAR$=A$ : End If 
  828.       If A$="Z" : Inc ZZ : End If 
  829.       If A$="J" : Inc ZZ : Gosub GT_STR : JMP$=A$ : End If 
  830.    Until FL
  831.    If NEND
  832.       A$=Mid$(IT$,M+1,NEND-M-1)
  833.    Else 
  834.       A$=Mid$(IT$,M+1)
  835.    End If 
  836.    Gosub DR_WORD
  837.    M=NEND
  838. Until NEND=0
  839. FLAG=True
  840. Return 
  841. '  
  842. DR_WORD:
  843. If XX<0 : XX=40-Len(A$)/2 : End If 
  844. Locate XX,YY
  845. '
  846. FST=0
  847. If Left$(A$,1)="&"
  848.    Inc FST
  849.    F$=Upper$(Mid$(A$,2,1)) : B$=Mid$(A$,3)
  850.    ' Tune button
  851.    If F$="T"
  852.       A$=""
  853.       For TU=1 To NTUNE
  854.          If TUNE(TU)=PAR(TUNE)
  855.             PTU1=0
  856.             For TUU=1 To TU
  857.                PTU1=Instr(B$,"/",PTU1+1)
  858.             Next 
  859.             PTU2=Instr(B$,"/",PTU1+1)
  860.             A$=Mid$(B$,PTU1+1,PTU2-PTU1-1)
  861.             Exit 
  862.          End If 
  863.       Next 
  864.    End If 
  865.    ' String param 
  866.    If F$="S" : A$=PAR$(PAR) : End If 
  867.    ' Decimal value
  868.    If F$="V"
  869.       L=Val(B$)
  870.       A$=Str$(PAR(PAR))+" "
  871.       If Len(A$)<L+2 : A$=A$+Space$(L+2-Len(A$)) : End If 
  872.    End If 
  873.    ' Palette
  874.    If F$="P"
  875.       Gosub GT_VAL
  876.       B$=Hex$(V,3) : A$=""
  877.       For N=2 To 4 : A$=A$+Mid$(B$,N,1)+" " : Next 
  878.    End If 
  879.    ' Plus / Moins 
  880.    If F$="-" : A$=" - " : Inc ZZ : LBL$="ST_MINUS" : End If 
  881.    If F$="+" : A$=" + " : Inc ZZ : LBL$="ST_PLUS" : End If 
  882. End If 
  883. '
  884. If A$<>""
  885.    X1=X Graphic(XX)-3 : Y1=Y Graphic(YY)-2 : X2=X Graphic(XX+Len(A$))+2 : Y2=Y1+11
  886.    '
  887.    If ZZ<>0 or NOZ=0 or FST<>0
  888.       Inverse Off 
  889.       If ZZ<>0 and ACT=ZNE : Inverse On : APAR=PAR : End If 
  890.       If RADIO
  891.          If PAR(RADIO)=PAR
  892.             Inverse On 
  893.          End If 
  894.       End If 
  895.       Print A$;
  896.       If ENC<>0 and NOZ=0 : Ink 3 : Box X1,Y1 To X2,Y2 : End If 
  897.    End If 
  898.    If ZZ<>0
  899.       If NOZ=0
  900.          Set Zone ZNE,X1,Y1 To X2,Y2
  901.          ZIT(ZNE)=IT : ITZ(IT)=ZNE
  902.          If LBL$<>""
  903.             JMP$(ZNE)=LBL$
  904.          End If 
  905.       End If 
  906.       Inc ZNE
  907.    End If 
  908.    XX=XX+(X2-X1)/8+1
  909. End If 
  910. Return 
  911. NO_IT: Resume NO_IT2
  912. NO_IT2: FLAG=False
  913. Return 
  914. ST_PLUS: Add PAR(PAR),VPL : PAR(PAR)=Min(PAR(PAR),VMX) : Return 
  915. ST_MINUS: Add PAR(PAR),-VPL : PAR(PAR)=Max(PAR(PAR),VMN) : Return 
  916. GT_VAL: VTYPE$=Left$(A$,1) : ADV=ADATA+Val(Mid$(A$,2)) : Return 
  917. GT_STR: A$=Mid$(IT$,N,M-N) : Return 
  918. GT_STRDOT:
  919. PD=Instr(IT$,"/",N)
  920. If PD=0 or PD>M : PD=M : End If 
  921. A$=Mid$(IT$,N,PD-N)
  922. If PD<M
  923.    N=PD+1
  924. Else 
  925.    PD=M
  926. End If 
  927. Return 
  928. RADIO: PAR(RADIO)=APAR : Return 
  929. TUNE:
  930. For TU=1 To NTUNE
  931.    Exit If PAR(TUNE)=TUNE(TU)
  932. Next 
  933. Add TU,1,1 To NTUNE
  934. PAR(TUNE)=TUNE(TU)
  935. Return 
  936. CH_FONT:
  937. PAR(14)=PAR
  938. Screen 2 : CUR_SET : Screen 0
  939. Return 
  940. Procedure SC_OPEN
  941.    Shared SCRES,SCCOL
  942.    If SCRES=0
  943.       Screen Open 2,320,TREESY,SCCOL,Lowres
  944.    Else 
  945.       Screen Open 2,640,TREESY,SCCOL,Hires
  946.    End If 
  947.    Curs Off : Flash Off 
  948.    Screen Display 2,,-Screen Height,,
  949.    CINK1=2 : CINK2=0 : If Screen Colour=2 : CINK1=1 : End If 
  950.    If Length(2) : Get Icon Palette : End If 
  951.    If Length(1) : Get Sprite Palette : End If 
  952. End Proc
  953. Procedure MAKE_MN
  954.    Shared TMX,TMY
  955.    DR$(NDR)=""
  956.    For N=0 To 20
  957.       DR$(NDR)=DR$(NDR)+OB$(N)
  958.    Next 
  959.    If NDR=3
  960.       DR$(NDR)=DR$(NDR)+"(LOe0,0)"
  961.    Else 
  962.       DR$(NDR)=DR$(NDR)+"(LOe"+Mid$(Str$(TMX),2)+","+Mid$(Str$(TMY),2)+")"
  963.    End If 
  964.    M$=Left$(MN$(NCUR),A_DF-1)
  965.    Mid$(M$,X_DF,8)=Space$(8)
  966.    MN$(NCUR)=M$+DR$(0)+Chr$(0)+DR$(1)+Chr$(0)+DR$(2)+Chr$(0)+DR$(3)+Chr$(0)
  967. End Proc
  968. Procedure S_INK[N,V]
  969.    OB$=OB$+"IN"+Mid$(Str$(N),2)+","+Right$(Str$(V),2)+":"
  970. End Proc
  971. Procedure S_LOC
  972.    Shared DXOB,DYOB
  973.    OB$=OB$+"LO"+Mid$(Str$(DXOB),2)+","+Mid$(Str$(DYOB),2)+":"
  974. End Proc
  975. Procedure WT_MOVE[KY]
  976.    Shared K$,SC
  977.    X=X Mouse : Y=Y Mouse
  978.    Do 
  979.       K$=Inkey$ : SC=Scancode
  980.       Exit If K$<>""
  981.       Exit If Mouse Key and KY
  982.       Exit If X Mouse<>X or Y Mouse<>Y
  983.    Loop 
  984. End Proc
  985. Procedure INFO[A$]
  986.    Screen 0 : Paper 1 : Pen 2
  987.    Wind Open 1,0,0,80,1 : Curs Off 
  988.    Centre A$ : Wait 25
  989.    Wind Close 
  990. End Proc
  991. Procedure DR_TREE
  992.    Shared XTREE,YTREE,SXTREE,SYTREE
  993.    MX=0 : MY=0
  994.    CL_TREE
  995.    Clip XTREE,YTREE To XTREE+SXTREE,YTREE+SYTREE
  996.    For N=0 To 20 : OB_DRAW[OB$(N),XTREE,YTREE] : Next 
  997.    TMX=MX : TMY=MY
  998.    Clip 
  999. End Proc
  1000. Procedure DR_OB[N]
  1001.    Shared XOB,YOB
  1002.    CL_OB
  1003.    Clip XOB,YOB To Screen Width-1,TREESY-32
  1004.    OB_DRAW[OB$(N),XOB,YOB]
  1005.    Clip 
  1006. End Proc
  1007. Procedure SET_INK[I1,I2]
  1008.    Shared CINK1,CINK2
  1009.    DR_COLOUR[CINK1-1] : DR_COLOUR[CINK1] : DR_COLOUR[CINK1+1]
  1010.    DR_COLOUR[CINK2-1] : DR_COLOUR[CINK2] : DR_COLOUR[CINK2+1]
  1011.    CINK1=I1 : CINK2=I2
  1012.    LC=Screen Width/Screen Colour
  1013.    Set Text 0 : Set Font 1
  1014.    I=0 : If I1=0 : I=1 : End If : Ink I,I1 : Text LC*I1+LC/2-5,TREESY-9,"1"
  1015.    I=0 : If I2=0 : I=1 : End If : Ink I,I2 : Text LC*I2+LC/2-5,TREESY-1,"2"
  1016. End Proc
  1017. Procedure DR_COLOUR[C]
  1018.    If C>=0 and C<Screen Colour
  1019.       Set Paint 0 : Set Pattern 0
  1020.       LC=Screen Width/Screen Colour
  1021.       Ink C : Bar C*LC,TREESY-15 To C*LC+LC-1,TREESY
  1022.       Set Zone C+1,C*LC,TREESY-15 To C*LC+LC,TREESY
  1023.    End If 
  1024. End Proc
  1025. Procedure CUR_SET
  1026.    Screen 2
  1027.    Ink 0,0,0 : Set Pattern 0 : Set Paint 0
  1028.    Bar Screen Width/2+16,TREESY-31 To Screen Width,TREESY-17
  1029.    SET_PAR
  1030.    Clip 0,TREESY-31 To Screen Width,TREESY-16
  1031.    Gr Writing 0 : Text Screen Width/2+16,TREESY-22,PAR$(PAR(14))
  1032.    Gr Writing 1 : Clip 
  1033.    If PAR(15)<0 : Ink 63,0,CINK2 : End If 
  1034.    Bar Screen Width/2+1,TREESY-30 To Screen Width/2+15,TREESY-17
  1035. End Proc
  1036. Procedure SET_PAR
  1037.    Shared CINK1,CINK2,SYFONT,SFONT
  1038.    Screen 2
  1039.    Ink CINK1,CINK2,CINK1
  1040.    Set Font PAR(14) : SYFONT=Val(Right$(PAR$(PAR(14)),4))
  1041.    SFONT=0 : For N=0 To 2 : If PAR(10+N) : Bset N,SFONT : End If : Next 
  1042.    Set Text SFONT
  1043.    Set Pattern PAR(15) : Set Paint PAR(13)
  1044. End Proc
  1045. Procedure CL_TREE
  1046.    Shared XTREE,YTREE,SXTREE,SYTREE
  1047.    Set Pattern 0 : Set Paint 1
  1048.    If DR$(3)="" or NDR=3
  1049.       Ink 2,2,1
  1050.       Bar XTREE-1,YTREE-1 To Screen Width/2-1,TREESY-16
  1051.    Else 
  1052.       Ink 0,2,2
  1053.       Bar XTREE-1,YTREE-1 To Screen Width/2-1,TREESY-16
  1054.       OB_DRAW[DR$(3),XTREE,YTREE]
  1055.    End If 
  1056.    Set Zone 65,XTREE,YTREE To XTREE+SXTREE-1,YTREE+SYTREE-1
  1057. End Proc
  1058. Procedure CL_OB
  1059.    Shared XOB,YOB
  1060.    Ink 0,2,2 : Set Pattern 0 : Set Paint 1
  1061.    Bar XOB-1,YOB-1 To Screen Width-1,TREESY-32
  1062. End Proc
  1063. Procedure OB_DRAW[DR$,XG,YG]
  1064.    Dim I(4)
  1065.    If DR$<>""
  1066.       P=1
  1067.       Repeat 
  1068.          A$=Mid$(DR$,P,1)
  1069.          If A$="("
  1070.             Repeat 
  1071.                Repeat 
  1072.                   Inc P
  1073.                   A$=Mid$(DR$,P,1)
  1074.                Until(A$>="A") and(A$<="Z")
  1075.                A$=Mid$(DR$,P,2) : Add P,2
  1076.                Gosub "R_"+A$
  1077.             Until Mid$(DR$,P,1)=")"
  1078.             Inc P
  1079.          Else 
  1080.             Q=Instr(DR$,"(",P) : If Q=0 : Q=Len(DR$)+1 : End If 
  1081.             Text XG+XX,YG+YY+Text Base,Mid$(DR$,P,Q-P)
  1082.             MX=Max(XX+Text Length(Mid$(DR$,P,Q-P)),MX) : MY=Max(YY+FY,MY)
  1083.             P=Q
  1084.          End If 
  1085.       Until P>=Len(DR$)
  1086.    End If 
  1087.    Pop Proc
  1088.    '
  1089.    R_LO:
  1090.    Gosub R_VAL : XX=V : Inc P : Gosub R_VAL : YY=V
  1091.    MX=Max(XX,MX) : MY=Max(YY,MY)
  1092.    Return 
  1093.    R_IN:
  1094.    Gosub R_VAL : I=V : Inc P : Gosub R_VAL
  1095.    If I=1
  1096.       Ink V
  1097.    Else 
  1098.       If I=2 : Ink ,V
  1099.       Else 
  1100.          Ink ,,V
  1101.       End If 
  1102.    End If 
  1103.    Return 
  1104.    '
  1105.    R_LI:
  1106.    Gosub R_VAL : X=V : Inc P : Gosub R_VAL : Draw XG+XX,YG+YY To XG+X,YG+V
  1107.    Goto E_MX
  1108.    '
  1109.    R_EL:
  1110.    Gosub R_VAL : X=V : Inc P : Gosub R_VAL : Ellipse XG+XX,YG+YY,X,V
  1111.    X=XX+X : V=YY+V
  1112.    Goto E_MX
  1113.    '
  1114.    R_BA:
  1115.    Gosub R_VAL : X=V : Inc P : Gosub R_VAL : Bar XG+XX,YG+YY To XG+X,YG+V
  1116.    E_MX: XX=X : YY=V : MX=Max(XX,MX) : MY=Max(YY,MY) : Return 
  1117.    '
  1118.    R_BO:
  1119.    Gosub R_VAL
  1120.    If V<=Length(1)
  1121.       A=Sprite Base(V)
  1122.       If A
  1123.          SX=(Deek(A))*16 : SY=Deek(A+2) : HX=Deek(A+4) : HY=Deek(A+6)
  1124.          Paste Bob XG+XX+HX,YG+YY+HY,V
  1125.          X=XX+SX : V=YY+SY
  1126.          Goto E_MX
  1127.       End If 
  1128.    End If 
  1129.    Return 
  1130.    '
  1131.    R_IC:
  1132.    Gosub R_VAL
  1133.    If V<=Length(2)
  1134.       A=Icon Base(V)
  1135.       If A
  1136.          SX=(Deek(A))*16 : SY=Deek(A+2)
  1137.          Paste Icon XG+XX,YG+YY,V
  1138.          X=XX+SX : V=YY+SY
  1139.          Goto E_MX
  1140.       End If 
  1141.    End If 
  1142.    Return 
  1143.    '
  1144.    R_SF: Gosub R_VAL : Set Font V : FY=Val(Mid$(Font$(V),31)) : Return 
  1145.    R_SS: Gosub R_VAL : Set Text V : Return 
  1146.    R_PA: Gosub R_VAL : Set Pattern V : Return 
  1147.    R_OU: Gosub R_VAL : Set Paint V : Return 
  1148.    R_VAL:
  1149.    A=Instr(DR$,",",P) : If A=0 : A=1000 : End If 
  1150.    B=Instr(DR$,":",P) : If B=0 : B=1000 : End If 
  1151.    C=Instr(DR$,")",P) : If C=0 : C=1000 : End If 
  1152.    Q=Min(A,Min(B,C)) : V=Val(Mid$(DR$,P,Q-P)) : P=Q
  1153.    Return 
  1154. End Proc
  1155. Procedure ZERO_COORD
  1156.    If NCUR>=0
  1157.       A$=Left$(LCUR$,Len(LCUR$)-1)+"A"
  1158.       IT_SEARCH[A$,0]
  1159.       While Param>=0
  1160.          M$=Mid$(MN$(Param),1)
  1161.          Mid$(M$,X_DF)=Space$(8)
  1162.          MN$(Param)=M$
  1163.          Right$(A$,1)=Chr$(Asc(Right$(A$,1))+1)
  1164.          IT_SEARCH[A$,Param+1]
  1165.       Wend 
  1166.    End If 
  1167. End Proc
  1168. Procedure MN_FLAGS[N]
  1169.    If N>=0
  1170.       A$=Mid$(MN$(N),1)
  1171.       If Len(A$)>2
  1172.          For P=0 To 4
  1173.             Mid$(A$,D_DF+P,1)=Str$(PAR(P+5))-" "
  1174.          Next 
  1175.          MN$(N)=A$
  1176.       End If 
  1177.    End If 
  1178. End Proc
  1179. Procedure MK_EMPTY
  1180.    A$=Mid$(MN_EMPTY$,1)
  1181.    For P=0 To 4
  1182.       Mid$(A$,D_DF+P,1)=Str$(PAR(P+5))-" "
  1183.    Next 
  1184.    MN_EMPTY$=A$
  1185. End Proc
  1186. Procedure IT_EMPTY
  1187.    A$=Chr$(127)
  1188.    For N=0 To MXMN
  1189.       If MN$(N)=A$ : F=N : Exit : End If 
  1190.    Next 
  1191. End Proc[F]
  1192. Procedure IT_SEARCH[A$,S]
  1193.    FL=-1
  1194.    L=Len(A$)
  1195.    For N=S To MXMN
  1196.       If A$=Left$(MN$(N),L) : FL=N : Exit : End If 
  1197.    Next 
  1198. End Proc[FL]
  1199. Procedure MN_RENUM
  1200.    Dim D(4)
  1201.    For N=0 To MXMN
  1202.       Exit If Len(MN$(N))<2
  1203.       For D=0 To 3
  1204.          Exit If Mid$(MN$(N),D+1,1)<"A"
  1205.       Next 
  1206.       Dec D
  1207.       If D<=OLDD : Inc D(D) : End If 
  1208.       If D>OLDD : D(D)=1 : End If 
  1209.       For P=0 To D
  1210.          Poke Varptr(MN$(N))+P,64+D(P)
  1211.       Next 
  1212.       If D<3
  1213.          For P=D+1 To 3
  1214.             Poke Varptr(MN$(N))+P,32
  1215.          Next 
  1216.       End If 
  1217.       OLDD=D
  1218.    Next 
  1219. End Proc
  1220. Procedure ACT_ITEM[N,I]
  1221.    If N>=NFIRST and N<=NLAST
  1222.       X1=Val("$"+Mid$(MN$(N),Z_DF,2))*2
  1223.       Y1=Val("$"+Mid$(MN$(N),Z_DF+2,2))
  1224.       X2=Val("$"+Mid$(MN$(N),Z_DF+4,2))*2+1
  1225.       Y2=Val("$"+Mid$(MN$(N),Z_DF+6,2))
  1226.       A$=Mid$(MN$(N),Z_DF+8,7)
  1227.       If I
  1228.          Ink 1,1,1 : Bar X1-1,Y1-2 To X2,Y2
  1229.          Ink 0,1
  1230.       Else 
  1231.          Ink 0,0,0 : Bar X1-1,Y1-2 To X2,Y2
  1232.          Ink 1,0
  1233.       End If 
  1234.       Text X1,Y1+6,A$
  1235.       Ink 1 : Box X1-1,Y1-2 To X2,Y2
  1236.    End If 
  1237.    For P=0 To 4
  1238.       PAR(5+P)=Val(Mid$(MN$(N),D_DF+P,1))
  1239.    Next 
  1240. End Proc
  1241. Procedure TREE
  1242.    Dim D(4)
  1243.    Screen 1
  1244.    If MCHG<0
  1245.       Cls 0,17,0 To 320,TREESY
  1246.    End If 
  1247.    If MCHG
  1248.       Sort MN$(0)
  1249.       If MN$(0)=Chr$(127) : MN$(0)=Mid$(MN_EMPTY$,1) : CUR$=Left$(MN$(0),4) : End If 
  1250.       Change Mouse 3
  1251.       Dim Y(5)
  1252.       Y1=YTREE
  1253.       OLDD=1 : NFIRST=MXMN : NLAST=0
  1254.       Ink 1,0
  1255.       Reset Zone 
  1256.       X=Free
  1257.       For N=0 To MXMN
  1258.          Exit If MN$(N)=Chr$(127)
  1259.          A$=""
  1260.          For D=0 To 3
  1261.             DD=Asc(Mid$(MN$(N),D+1,1))-64
  1262.             Exit If DD<0
  1263.             A$=A$+Str$(DD)-" "+"."
  1264.          Next 
  1265.          X1=-6*8+72*D
  1266.          For E=D+1 To 3 : Y(E)=0 : Next 
  1267.          If D>OLDD
  1268.             D(D)=1
  1269.             Ink 1 : Draw X2,Y1+4 To X1,Y1+4
  1270.          End If 
  1271.          If D<OLDD
  1272.             Add Y1,2*10
  1273.             If Y(D)
  1274.                Ink 1 : Draw X1+28,Y(D) To X1+28,Y1-2
  1275.                Exit If D=1 and Y1>TREESY
  1276.             End If 
  1277.          End If 
  1278.          If D=OLDD
  1279.             Add Y1,10 : Inc D(D)
  1280.          End If 
  1281.          D$=Space$(7)
  1282.          L=Len(A$)-1
  1283.          If L>7 : A$=Right$(A$,7) : L=7 : End If 
  1284.          Mid$(D$,4-L/2,L)=A$
  1285.          X2=X1+7*8+1 : Y2=Y1+8
  1286.          OLDD=D : Y(D)=Y2 : OX2=X2
  1287.          If Y1>=0 and Y2<=TREESY
  1288.             Set Zone N+1,X1,Y1 To X2,Y2
  1289.          End If 
  1290.          If Y1>-12 and Y1<TREESY+12
  1291.             If CUR$<>Left$(MN$(N),4)
  1292.                Ink 1,0
  1293.                Box X1-1,Y1-2 To X2,Y2
  1294.             Else 
  1295.                SET_CUR[N]
  1296.                Ink 1,1,1 : Bar X1-1,Y1-2 To X2,Y2
  1297.                Ink 0,1
  1298.             End If 
  1299.             Text X1,Y1+6,D$
  1300.             A$=MN$(N)
  1301.             Mid$(A$,Z_DF,8)=(Hex$(X1/2,2)+Hex$(Y1,2)+Hex$(X2/2,2)+Hex$(Y2,2))-"$"
  1302.             Mid$(A$,Z_DF+8,7)=D$
  1303.             MN$(N)=A$
  1304.             NFIRST=Min(N,NFIRST)
  1305.             NLAST=Max(N,NLAST)
  1306.          End If 
  1307.       Next 
  1308.       While MN$(N)<>Chr$(127)
  1309.          Inc N
  1310.       Wend 
  1311.       NTOTAL=N
  1312.       Ink 1,0
  1313.       ARROW[8,0,8,-30,4,MXMN+1]
  1314.       ARROW[8,32,8,-16,4,MXMN+2]
  1315.       Set Slider 1,0,1,8,1,0,1,1
  1316.       If NLAST
  1317.          Vslider 0,48 To 16,TREESY-49,NTOTAL,NFIRST,NLAST-NFIRST
  1318.       Else 
  1319.          Vslider 0,48 To 16,TREESY-49,10,0,10
  1320.       End If 
  1321.       ARROW[8,TREESY-49,8,14,4,MXMN+3]
  1322.       ARROW[8,TREESY-49+16,8,32,4,MXMN+4]
  1323.       Change Mouse 1
  1324.       MCHG=0
  1325.    End If 
  1326. End Proc[FLAG]
  1327. Procedure SET_CUR[N]
  1328.    CUR$="" : LCUR$=""
  1329.    If Left$(MN$(N),1)<>Chr$(127)
  1330.       NCUR=N : CUR$=Left$(MN$(N),4)
  1331.       For P=1 To 4
  1332.          If Len(CUR$)>=P
  1333.             If Mid$(CUR$,P,1)>="A"
  1334.                LCUR$=LCUR$+Mid$(CUR$,P,1)
  1335.             End If 
  1336.          End If 
  1337.       Next 
  1338.    End If 
  1339. End Proc
  1340. Procedure TRY_MENU
  1341.    Shared SCCOL
  1342.    If SCCOL
  1343.       Change Mouse 3
  1344.       Screen 2 : Screen To Front 2 : Cls 0
  1345.       Screen Display 2,,YHI,,
  1346.       SET_MN
  1347.       Menu On 
  1348.       Change Mouse 1
  1349.       While Mouse Key : Wend 
  1350.       UNSET_MN
  1351.       Menu Del 
  1352.       Screen Display 2,,-Screen Height,,
  1353.    End If 
  1354. End Proc
  1355. Procedure TRY_MENU2
  1356.    Change Mouse 3
  1357.    Screen 2
  1358.    SET_MN
  1359.    Menu On 
  1360.    Change Mouse 1
  1361.    While Mouse Key : Wend 
  1362.    UNSET_MN
  1363.    Menu Del 
  1364. End Proc
  1365. Procedure SET_MN
  1366.    X=Free
  1367.    Screen 2
  1368.    If Screen Colour>2
  1369.       Ink 1,2 : Paper 1 : Pen 2
  1370.    Else 
  1371.       Ink 0,1 : Paper 0 : Pen 2
  1372.    End If 
  1373.    For N=0 To MXMN
  1374.       Exit If Left$(MN$(N),1)=Chr$(127)
  1375.       SET_MN_ITEM[MN$(N),1]
  1376.    Next 
  1377. End Proc
  1378. Procedure UNSET_MN
  1379.    Dim D(4)
  1380.    For NN=0 To MXMN
  1381.       Exit If MN$(NN)=Chr$(127)
  1382.       M$=Left$(MN$(NN),15)
  1383.       For ND=0 To 3
  1384.          Exit If Mid$(M$,ND+1,1)<"A"
  1385.          D(ND)=Asc(Mid$(M$,ND+1,2))-64
  1386.       Next 
  1387.       If ND=1 : X=X Menu(D(0)) : Y=Y Menu(D(0)) : End If 
  1388.       If ND=2 : X=X Menu(D(0),D(1)) : Y=Y Menu(D(0),D(1)) : End If 
  1389.       If ND=3 : X=X Menu(D(0),D(1),D(2)) : Y=Y Menu(D(0),D(1),D(2)) : End If 
  1390.       If ND=4 : X=X Menu(D(0),D(1),D(2),D(3)) : Y=Y Menu(D(0),D(1),D(2),D(3)) : End If 
  1391.       If X>32767 : X=X-65536 : End If 
  1392.       If Y>32767 : Y=Y-65536 : End If 
  1393.       Mid$(M$,X_DF,4)=(Str$(X)-" ")+"  " : Mid$(M$,Y_DF,4)=(Str$(Y)-" ")+"  "
  1394.       MN$(NN)=M$+Mid$(MN$(NN),16)
  1395.    Next 
  1396. End Proc
  1397. Procedure SET_MN_ITEM[M$,FLG]
  1398.    Dim D(4),D$(4)
  1399.    For ND=0 To 3
  1400.       Exit If Mid$(M$,ND+1,1)<"A"
  1401.       D(ND)=Asc(Mid$(M$,ND+1,2))-64
  1402.    Next 
  1403.    If ND
  1404.       GO$="R"+Str$(ND)-" "
  1405.       P=A_DF
  1406.       For N=0 To 3
  1407.          Q=Instr(M$,Chr$(0),P) : D$(N)=Mid$(M$,P,Q-P) : P=Q+1
  1408.       Next 
  1409.       X=-1000
  1410.       If FLG
  1411.          If Mid$(M$,X_DF,1)>" "
  1412.             X=Val(Mid$(M$,X_DF,4))
  1413.             Y=Val(Mid$(M$,Y_DF,4))
  1414.          End If 
  1415.       End If 
  1416.       AC$="A"+Mid$(M$,D_DF,1)
  1417.       LL$="L"+Mid$(M$,D_DF+1,1)
  1418.       MV$="M"+Mid$(M$,D_DF+2,1)
  1419.       IM$="I"+Mid$(M$,D_DF+3,1)
  1420.       SP$="S"+Mid$(M$,D_DF+4,1)
  1421.       Gosub GO$
  1422.       Gosub GO$+AC$
  1423.       Gosub GO$+LL$
  1424.       Gosub GO$+MV$
  1425.       Gosub GO$+IM$
  1426.       Gosub GO$+SP$
  1427.       If X<>-1000
  1428.          If VERSION=101 : Swap X,Y : End If 
  1429.          Gosub GO$+"XY"
  1430.       End If 
  1431.    End If 
  1432.    Pop Proc
  1433.    '
  1434.    R1: Menu$(D(0))=D$(0),D$(1),D$(2),D$(3) : Return 
  1435.    R2: Menu$(D(0),D(1))=D$(0),D$(1),D$(2),D$(3) : Return 
  1436.    R3: Menu$(D(0),D(1),D(2))=D$(0),D$(1),D$(2),D$(3) : Return 
  1437.    R4: Menu$(D(0),D(1),D(2),D(3))=D$(0),D$(1),D$(2),D$(3) : Return 
  1438.    R1XY: Set Menu(D(0)) To X,Y : Return 
  1439.    R2XY: Set Menu(D(0),D(1)) To X,Y : Return 
  1440.    R3XY: Set Menu(D(0),D(1),D(2)) To X,Y : Return 
  1441.    R4XY: Set Menu(D(0),D(1),D(2),D(3)) To X,Y : Return 
  1442.    R1A0: Menu Inactive(D(0)) : Return 
  1443.    R2A0: Menu Inactive(D(0),D(1)) : Return 
  1444.    R3A0: Menu Inactive(D(0),D(1),D(2)) : Return 
  1445.    R4A0: Menu Inactive(D(0),D(1),D(2),D(3)) : Return 
  1446.    R1A1: Menu Active(D(0)) : Return 
  1447.    R2A1: Menu Active(D(0),D(1)) : Return 
  1448.    R3A1: Menu Active(D(0),D(1),D(2)) : Return 
  1449.    R4A1: Menu Active(D(0),D(1),D(2),D(3)) : Return 
  1450.    R1L0: Menu Tline(D(0)) : Return 
  1451.    R2L0: Menu Tline(D(0),D(1)) : Return 
  1452.    R3L0: Menu Tline(D(0),D(1),D(2)) : Return 
  1453.    R4L0: Menu Tline(D(0),D(1),D(2),D(3)) : Return 
  1454.    R1L1: Menu Line(D(0)) : Return 
  1455.    R2L1: Menu Line(D(0),D(1)) : Return 
  1456.    R3L1: Menu Line(D(0),D(1),D(2)) : Return 
  1457.    R4L1: Menu Line(D(0),D(1),D(2),D(3)) : Return 
  1458.    R1L2: Menu Bar(D(0)) : Return 
  1459.    R2L2: Menu Bar(D(0),D(1)) : Return 
  1460.    R3L2: Menu Bar(D(0),D(1),D(2)) : Return 
  1461.    R4L2: Menu Bar(D(0),D(1),D(2),D(3)) : Return 
  1462.    R1M0: Menu Static(D(0)) : Return 
  1463.    R2M0: Menu Static(D(0),D(1)) : Return 
  1464.    R3M0: Menu Static(D(0),D(1),D(2)) : Return 
  1465.    R4M0: Menu Static(D(0),D(1),D(2),D(3)) : Return 
  1466.    R1M1: Menu Movable(D(0)) : Return 
  1467.    R2M1: Menu Movable(D(0),D(1)) : Return 
  1468.    R3M1: Menu Movable(D(0),D(1),D(2)) : Return 
  1469.    R4M1: Menu Movable(D(0),D(1),D(2),D(3)) : Return 
  1470.    R1I0: Menu Item Static(D(0)) : Return 
  1471.    R2I0: Menu Item Static(D(0),D(1)) : Return 
  1472.    R3I0: Menu Item Static(D(0),D(1),D(2)) : Return 
  1473.    R4I0: Menu Item Static(D(0),D(1),D(2),D(3)) : Return 
  1474.    R1I1: Menu Item Movable(D(0)) : Return 
  1475.    R2I1: Menu Item Movable(D(0),D(1)) : Return 
  1476.    R3I1: Menu Item Movable(D(0),D(1),D(2)) : Return 
  1477.    R4I1: Menu Item Movable(D(0),D(1),D(2),D(3)) : Return 
  1478.    R1S0: Menu Link(D(0)) : Return 
  1479.    R2S0: Menu Link(D(0),D(1)) : Return 
  1480.    R3S0: Menu Link(D(0),D(1),D(2)) : Return 
  1481.    R4S0: Menu Link(D(0),D(1),D(2),D(3)) : Return 
  1482.    R1S1: Menu Separate(D(0)) : Return 
  1483.    R2S1: Menu Separate(D(0),D(1)) : Return 
  1484.    R3S1: Menu Separate(D(0),D(1),D(2)) : Return 
  1485.    R4S1: Menu Separate(D(0),D(1),D(2),D(3)) : Return 
  1486. End Proc
  1487. Procedure ALERT[A$,B$,C$]
  1488.    Screen 0
  1489.    Paper 1 : Pen 2 : Wind Open 1,0,0,78,8,2 : Curs Off 
  1490.    Centre A$ : Print : Centre B$ : Print : Centre C$ : Print 
  1491.    Print : Print : Centre ">>> Press mousekey to go on <<<"
  1492.    While Mouse Key : Wend 
  1493.    Repeat : Until Mouse Key
  1494.    Wind Close 
  1495. End Proc
  1496. Procedure ARROW[X,Y,SX,SY,S,ZON]
  1497.    D=Sgn(SY) : SY=Abs(SY)
  1498.    Box X-SX,Y To X+SX,Y+SY
  1499.    For N=0 To S
  1500.       If D>0
  1501.          Polyline X-SX+1,Y+1 To X,Y+SY-N-1 To X+SX-1,Y
  1502.       Else 
  1503.          Polyline X-SX+1,Y+SY-1 To X,Y+N+1 To X+SX,Y+SY-1
  1504.       End If 
  1505.    Next 
  1506.    Set Zone ZON,X-SX,Y To X+SX,Y+SY
  1507. End Proc
  1508. Procedure CASE[X,Y,SX,SY,S,ZON]
  1509.    Set Paint 0
  1510.    Ink 2 : Set Paint 3
  1511.    For N=0 To S-1
  1512.       Box X-SX+N,Y-SY+N To X+SX-N,Y+SY-N
  1513.    Next 
  1514.    Set Zone ZON,X-SX,Y-SY To X+SX,Y+SY
  1515. End Proc
  1516. ' The graphic menu page definitions! 
  1517. '
  1518. '---> Title page 
  1519. L1_1: Data "C,Y1,E,LMn_Title:                               AMOS Menu editor                             "
  1520. L1_2: Data "X72,Y6,E,LMn_Abort: Quit "
  1521. L1_3: Data "X02,Y4,E,LMn_New_It: Create a new menu "
  1522. L1_4: Data "X02,Y6,E,LMn_Load:    Load a menu    "
  1523. L1_5: Data "X24,Y4,E,LMn_EditIt: Edit current menu "
  1524. L1_6: Data "X24,Y6,E,LMn_Save: Save current menu "
  1525. L1_7: Data "X46,Y4,E,LMn_Bank:  Save menu bank   "
  1526. L1_8: Data "X46,Y6,E,LMn_GBnk: Quit & grab bank  "
  1527. '
  1528. '---> Screen creation page 
  1529. L2_1: Data "C,Y0: NEW MENU - Default screen creation "
  1530. L2_2: Data "X66,Y6,E,LMn_SaveIt: Prev. menu "
  1531. L2_3: Data "X66,Y4,E,LNw_Go:  Edit it!  "
  1532. L2_4: Data "X0,Y2:- Number of colours:"
  1533. L2_5: Data "X30,Y2,E,R1,V2: 2 |E,R1,V4: 4 |E,R1,V8: 8 |E,R1,V16: 16 |E,R1,V32: 32 |E,R1,V64: 64 "
  1534. L2_6: Data "X0,Y4:- Resolution mode:"
  1535. L2_7: Data "X30,Y4,E,R2,V0: Lowres |E,R2,V$8000: Hires "
  1536. '
  1537. '---> Edit page
  1538. L3_1: Data "X2,Y0:Item status:|X24,Y0:Tree editor:|X52,Y0:Draw menu:"
  1539. L3_2: Data "X2,Y2,E,LIt_Act,T5/2/0/1:&T/ Inact. / Active /"
  1540. L3_3: Data "X11,Y4,E,LIt_Lnk,T9/2/0/1:&T/ Linked / Separ. /"
  1541. L3_4: Data "X2,Y4,E,LIt_Lne,T6/3/0/1/2:&T/ T.line /  Line  /  Bar   /"
  1542. L3_5: Data "X2,Y6,E,LIt_Mve,T7/2/0/1:&T/ Br.sta / Br.mov /"
  1543. L3_6: Data "X11,Y6,E,LIt_Imv,T8/2/0/1:&T/ It.sta / It.mov /"
  1544. L3_7: Data "X24,Y2,E,LIt_Add: Add  item |E,LIt_Ins: Ins  item "
  1545. L3_8: Data "X24,Y4,E,LCr_Bra:  Branch   |E,LIt_Del:  Delete   "
  1546. L3_9: Data "X24,Y6,E,LEr_Pos: Reset  menu  position "
  1547. L3_10: Data "X52,Y2,E,V0,LMn_DrawIt:   Normal   "
  1548. L3_11: Data "X65,Y2,E,V1,LMn_DrawIt: Highlight  "
  1549. L3_12: Data "X52,Y4,E,V2,LMn_DrawIt:  Inactive  "
  1550. L3_13: Data "X65,Y4,E,V3,LMn_DrawIt: Background "
  1551. L3_14: Data "X65,Y6,E,V4,LMn_SaveIt: Prev. menu "
  1552. '
  1553. '---> Draw page
  1554. L4_1: Data "X2,Y0:Draw functions:|X32:Settings:|X43:Object:|X58:Misc:"
  1555. L4_2: Data "X2,Y2,E,LDr_Line: Line |E,LDr_Box: Box |E,LDr_Bar: Bar |E,LDr_Ell: Ellipse "
  1556. L4_3: Data "X2,Y4,E,LDr_Ico: Icon |E,LDr_Bob: Bob |E,LDr_Text: Text |E,LSt_TLen: T. len "
  1557. L4_4: Data "X2,Y6,E,LMk_Inv: Make inverse |E,LMk_Bor: Make border "
  1558. L4_5: Data "X32,Y2,E,JT_Set,T10/2/0/1:&T/N/U/"
  1559. L4_6: Data "X34,Y2,E,JT_Set,T11/2/0/1:&T/N/B/"
  1560. L4_7: Data "X36,Y2,E,JT_Set,T12/2/0/1:&T/N/I/"
  1561. L4_8: Data "X38,Y2,E,LSt_Patm:-"
  1562. L4_9: Data "X40,Y2,E,LSt_Patp:+"
  1563. L4_10: Data "X32,Y4,E,JT_Set,T13/2/0/1:&T/ Not out / Outline /"
  1564. L4_11: Data "X32,Y6,E,LSt_Font: S. Font "
  1565. L4_12: Data "X43,Y2,E,JG_Drob,V20,>0,<20,+1:&-|:&V3|E:&+"
  1566. L4_13: Data "X43,Y4,E,LOb_Ins: Ins  |E,LOb_Del: Del  "
  1567. L4_14: Data "X43,Y6,E,LOb_Pus: Push |E,LOb_Pas: Past "
  1568. L4_15: Data "X58,Y4,E,LLd_Bank: Load a memory bank "
  1569. L4_16: Data "X58,Y2,E,LTr_Pus:Push item|E,LTr_Pas:Paste item"
  1570. L4_17: Data "X58,Y6,E,LBTo_Edit:   Previous  menu   "
  1571. '
  1572. '---> Font menu
  1573. L5_1: Data "C,Y1:Please choose a font:|X66,Y1,LMn_Back: Prev. Menu "
  1574. L5_2: Data "X2,Y2,V1,LCh_Font:&S"
  1575. L5_3: Data "X21,Y2,V2,LCh_Font:&S"
  1576. L5_4: Data "X40,Y2,V3,LCh_Font:&S"
  1577. L5_5: Data "X59,Y2,V4,LCh_Font:&S"
  1578. L5_6: Data "X2,Y3,V5,LCh_Font:&S"
  1579. L5_7: Data "X21,Y3,V6,LCh_Font:&S"
  1580. L5_8: Data "X40,Y3,V7,LCh_Font:&S"
  1581. L5_9: Data "X59,Y3,V8,LCh_Font:&S"
  1582. L5_10: Data "X2,Y4,V9,LCh_Font:&S"
  1583. L5_11: Data "X21,Y4,V10,LCh_Font:&S"
  1584. L5_12: Data "X40,Y4,V11,LCh_Font:&S"
  1585. L5_13: Data "X59,Y4,V12,LCh_Font:&S"
  1586. L5_14: Data "X2,Y5,V13,LCh_Font:&S"
  1587. L5_15: Data "X21,Y5,V14,LCh_Font:&S"
  1588. L5_16: Data "X40,Y5,V15,LCh_Font:&S"
  1589. L5_17: Data "X59,Y5,V16,LCh_Font:&S"
  1590. L5_18: Data "X2,Y6,V17,LCh_Font:&S"
  1591. L5_19: Data "X21,Y6,V18,LCh_Font:&S"
  1592. L5_20: Data "X40,Y6,V19,LCh_Font:&S"
  1593. L5_21: Data "X59,Y6,V20,LCh_Font:&S"