home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format 42 / af042b.adf / Extras.lha / Menu_Editor.AMOS / Menu_Editor.amosSourceCode
AMOS Source Code  |  1992-02-21  |  42KB  |  1,578 lines

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