home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format 67 / af067a.adf / ACCESS.DMS / ACCESS.adf / AMAL_Editor.AMOS / AMAL_Editor.amosSourceCode
AMOS Source Code  |  1993-03-16  |  40KB  |  1,500 lines

  1. '--------------------------------------------------------------------
  2. ' AMAL Editor
  3. '  
  4. ' By Francois Lionet   
  5. ' (c) 1990-1992 Europress Software Ltd.  
  6. '--------------------------------------------------------------------
  7.  
  8. ' Increase text buffer for really big programs!
  9. Set Buffer 24
  10.  
  11. ' Version number 
  12. Global VER$
  13. VER$="1.30"
  14.  
  15. ' Maximum number of lines for each string
  16. MXLINE=200
  17.  
  18. ' Editor screen size 
  19. HSC=200
  20.  
  21. ' Editor screen position at start
  22. SCY=50
  23.  
  24. ' If you are low in memory!
  25. Close Editor 
  26.  
  27. Dim AM$(64),ED$(MXLINE),M$(5),FLG(4),REGA(26+10)
  28. Global AM$(),ED$(),MXLINE,NSTR,LIM$,M$(),FLG()
  29. Global CST,CUX,CUY,WIY,BLS,BLE,WSY,LLAST,CCH
  30. Global NBMOVE,CPL,PLOFF,PLLEN,PLNAME,PLMOVE,SYNC
  31. Global EDHID,ALARM,ALARM$,SEL0,SEL1,NAME$,ID$
  32. Global HSC,SCY
  33.  
  34. Screen Open 7,640,HSC,4,Hires
  35. Screen Display 7,,350,, : EDHID=1
  36. Palette 0,$77,$EEE,$DD
  37. Reserve Zone 120
  38. WSY=HSC/8-5
  39. Wind Open 1,0,32,80,WSY : Scroll Off 
  40. Set Zone 64,0,0 To 640,15
  41. Set Zone 65,0,HSC-7 To 640,HSC
  42. Set Paint 1 : Set Pattern 0 : Ink 0,0,2 : Bar 0,HSC-7 To 639,HSC-1
  43. Limit Mouse 112,0 To 450,311
  44. '
  45. NBMOVE=48
  46. PLOFF=6
  47. PLLEN=PLOFF+NBMOVE*2
  48. PLNAME=PLLEN+NBMOVE*2
  49. PLMOVE=PLNAME+NBMOVE*8
  50. CPL=1 : CST=1 : CCH=1 : SYNC=1
  51. SEL0=-1 : SEL1=-1
  52. NSTR=16 : LIM$="~"
  53. REED_BANK
  54. '----------------------------------------------------------------------------
  55. _EDIT:
  56. ED_SHOW
  57. MAKE_ED[CST]
  58. ED_INFO : DISP_WIND : SET_STR
  59. MAKE_EDIT
  60. DR_STR[CST,NSTR,1]
  61. Set Zone 66,0,32 To 640,HSC
  62. Show On : Sprite Off : Clear Key 
  63. Do 
  64.    Menu On 
  65.    Repeat 
  66.       Wait Vbl 
  67.       If ALARM
  68.          Dec ALARM
  69.          If ALARM=0 : ED_INFO : End If 
  70.       End If 
  71.       MVE_ED
  72.       Z=Mouse Zone : K=Mouse Key and 1 : C=Choice : K$=Inkey$ : S=Scancode : SS=Scanshift
  73.    Until K$<>"" or K<>0 or C<>0
  74.    If C
  75.       TK_CUR
  76.       On Choice(1) Gosub ED_AMOS,ED_EDIT,ED_DISC,ED_OPT,ED_BLOCK
  77.       K=0 : K$="" : S=0
  78.    End If 
  79.    Menu Off 
  80.    P=0 : P$="" : CY=CUY+WIY
  81.    If K
  82.       If Z>0
  83.          If Z<=NSTR+1 and CST<>Z-1
  84.             DR_STR[CST,NSTR,0] : MAKE_AM[CST,0,LLAST]
  85.             CST=Z-1 : DR_STR[CST,NSTR,1] : MAKE_ED[CST] : DISP_WIND : ED_INFO
  86.          End If 
  87.          If Z=66
  88.             X=X Screen(X Mouse)/8 : Y=(Y Screen(Y Mouse)-32)/8
  89.             If X<>CUX or Y<>CUY
  90.                TK_CUR
  91.                If Y+WIY<=LLAST
  92.                   CUX=Min(Len(ED$(Y+WIY)),X) : CUY=Y : Locate CUX,CUY : INF_X : INF_Y
  93.                End If 
  94.             End If 
  95.          End If 
  96.       End If 
  97.    End If 
  98.    If K$<" "
  99.       D=1 : If SS and %1011 : D=WSY-1 : End If 
  100.       If S=$42
  101.          Clear Key : N=4-(CUX mod 4) : Put Key Space$(N) : S=0
  102.       End If 
  103.       If S=79
  104.          If SS and %11000000
  105.             DR_STR[CST,NSTR,0] : MAKE_AM[CST,0,LLAST]
  106.             Add CST,-D,0 To NSTR : DR_STR[CST,NSTR,1] : MAKE_ED[CST] : DISP_WIND : ED_INFO
  107.          Else 
  108.             S=0 : Add CUX,-D : CUX=Max(0,CUX) : Locate CUX, : INF_X
  109.          End If 
  110.       End If 
  111.       If S=78
  112.          If SS and %11000000
  113.             DR_STR[CST,NSTR,0] : MAKE_AM[CST,0,LLAST]
  114.             Add CST,D,0 To NSTR : DR_STR[CST,NSTR,1] : MAKE_ED[CST] : DISP_WIND : ED_INFO
  115.          Else 
  116.             S=0 : Add CUX,D : CUX=Min(Min(Len(ED$(CY)),CUX),79) : Locate CUX, : INF_X
  117.          End If 
  118.       End If 
  119.       If S
  120.          TK_CUR
  121.          If K$=Chr$(13)
  122.             If Param<>0 and CY<MXLINE
  123.                I_LINE[CY+1]
  124.                If Param
  125.                   ED$(CY+1)=Mid$(ED$(CY),CUX+1)
  126.                   ED$(CY)=Left$(ED$(CY),CUX) : DISP_WIND
  127.                   CUX=0
  128.                   If ED$(CY)<>"" : S=77 : SS=0 : End If 
  129.                End If 
  130.             End If 
  131.          End If 
  132.          If S=76
  133.             Add CUY,-D
  134.             If CUY>=0
  135.                CUX=Min(Len(ED$(CUY+WIY)),CUX) : Locate CUX,CUY : INF_X : INF_Y
  136.             Else 
  137.                E=CUY : CUY=0
  138.                If D=1
  139.                   If WIY : Dec WIY : Vscroll 1 : DISP_LINE[WIY] : End If 
  140.                Else 
  141.                   Add WIY,E : WIY=Max(0,WIY) : DISP_WIND
  142.                End If 
  143.                CUX=Min(Len(ED$(CUY+WIY)),CUX) : Locate CUX,CUY : INF_X : INF_Y
  144.             End If 
  145.             K$=""
  146.          End If 
  147.          If S=77
  148.             If WIY+CUY+D>LLAST : D=LLAST-CUY-WIY : End If 
  149.             Add CUY,D
  150.             If CUY<WSY
  151.                CUX=Min(Len(ED$(CUY+WIY)),CUX) : Locate CUX,CUY : INF_X : INF_Y
  152.             Else 
  153.                Add WIY,CUY-WSY+1 : CUY=WSY-1
  154.                If D=1
  155.                   Vscroll 3 : DISP_LINE[WIY+CUY]
  156.                Else 
  157.                   DISP_WIND
  158.                End If 
  159.                CUX=Min(Len(ED$(CUY+WIY)),CUX) : Locate CUX,CUY : INF_X : INF_Y
  160.             End If 
  161.             K$=""
  162.          End If 
  163.          If S=65
  164.             If CUX
  165.                ED$(CY)=Left$(ED$(CY),CUX-1)+Mid$(ED$(CY),CUX+1)
  166.                Dec CUX : Inc P : P$=" "
  167.             Else 
  168.                If CY and CUY<>0
  169.                   CUX=Min(Len(ED$(CY-1)),79)
  170.                   ED$(CY-1)=ED$(CY-1)+ED$(CY) : D_LINE[CY] : Dec CUY
  171.                   DISP_WIND
  172.                End If 
  173.             End If 
  174.          End If 
  175.          If S=70
  176.             ED$(CY)=Left$(ED$(CY),CUX)+Mid$(ED$(CY),CUX+2)
  177.             Inc P : P$=" "
  178.             If SS and 3 : ED$(CY)="" : Inc P : P$=Chr$(26) : CUX=0 : End If 
  179.          End If 
  180.       End If 
  181.    End If 
  182.    U$=Upper$(K$)
  183.    If SS=%1000
  184.       If U$="Y"
  185.          If CY<LLAST : D_LINE[CY] : End If 
  186.          DISP_WIND : K$=""
  187.       End If 
  188.       TK_CUR
  189.       If U$="B" : BL_S : End If 
  190.       If U$="E" : BL_E : End If 
  191.       If U$="K" : BL_CUT : End If 
  192.       If U$="P" : BL_PASTE : End If 
  193.       If U$="H" : BL_HIDE : End If 
  194.       K$=""
  195.    End If 
  196.    If K$>=" "
  197.       ED$(CY)=Left$(ED$(CY),CUX)+K$+Mid$(ED$(CY),CUX+1)
  198.       If CUX<79 : Inc CUX : End If 
  199.       Inc P
  200.    End If 
  201.    If P
  202.       CY=CUY+WIY : Locate 0,
  203.       Inverse Off : If CY>=BLS and CY<BLE : Inverse On : End If 
  204.       Print Left$(ED$(CY),79); : Inverse Off : Print P$;
  205.       Locate CUX,CUY
  206.    End If 
  207. Loop 
  208. '
  209. ED_DISC: Pop 
  210. MAKE_AM[CST,0,LLAST]
  211. On Choice(2) Goto _LOAD,_LOAD,_SAVE,_SAVAS
  212. '
  213. ED_EDIT: Pop 
  214. MAKE_AM[CST,0,LLAST]
  215. On Choice(2) Goto _RUNALL,_RUNCUR,_RUNSEL,_EDIT,_DEBUG,_EDIT,_PLAY
  216. '
  217. ED_OPT:
  218. On Choice(2) Proc O_SYNC,O_PER,SET_SEL
  219. Return 
  220. '
  221. ED_BLOCK:
  222. On Choice(2) Proc BL_S,BL_E,BL_HIDE,BL_S,BL_CUT,BL_PASTE,BL_S,BL_PRINT,ST_PRINT
  223. Return 
  224. '
  225. ED_AMOS:
  226. MAKE_AM[CST,0,LLAST]
  227. On Choice(2) Proc AM_ABOUT,AM_ABOUT,AM_QUIT,AM_SYSTEM
  228. Return 
  229. '
  230. Procedure O_SYNC
  231.    If NSTR<60
  232.       NSTR=62
  233.       SET_STR
  234.    Else 
  235.       NSTR=16
  236.       SET_STR
  237.       If CST>NSTR
  238.          MAKE_AM[CST,0,LLAST]
  239.          CST=1 : DR_STR[CST,NSTR,1] : DISP_WIND
  240.       End If 
  241.    End If 
  242.    MN_SYNC
  243. End Proc
  244. Procedure O_PER
  245.    Clw 
  246.    Print : Centre "When SYNCHRO OFF, how many 50th of second shall I wait"
  247.    Print : Centre "between each SYNCHRO?"
  248.    Print : Centre " " : INP_TEXT[Str$(SYNC)-" ",2]
  249.    SYNC=Val(Param$)
  250.    If SYNC<=0 or SYNC>=99 : SYNC=1 : End If 
  251.    DISP_WIND
  252. End Proc
  253. Procedure BL_S
  254.    BLS=CUY+WIY : DISP_WIND
  255. End Proc
  256. Procedure BL_E
  257.    BLE=CUY+WIY : DISP_WIND
  258. End Proc
  259. Procedure BL_CLR
  260.    ED$(64)=""
  261. End Proc
  262. Procedure BL_HIDE
  263.    BLS=BLE : DISP_WIND
  264. End Proc
  265. Procedure BL_CUT
  266.    X=Free
  267.    If BLE>BLS and BLE<=LLAST
  268.       MAKE_AM[64,BLS,BLE-1]
  269.       D=BLE-BLS
  270.       For N=BLS To LLAST-D : ED$(N)=ED$(N+D) : Next 
  271.       Add LLAST,-D
  272.       CUX=0 : Y_CENTRE[BLS] : BLS=0 : BLE=0 : DISP_WIND
  273.    End If 
  274. End Proc
  275. Procedure BL_PASTE
  276.    X=Free
  277.    If AM$(64)<>""
  278.       P=21 : S=CUY+WIY
  279.       Do 
  280.          Q=Instr(AM$(64),LIM$,P)
  281.          Exit If Q=0 or S>=MXLINE or LLAST>=MXLINE-1
  282.          If LLAST : For N=LLAST To S+1 Step -1 : ED$(N)=ED$(N-1) : Next : End If 
  283.          ED$(S)=Mid$(AM$(64),P,Q-P)
  284.          P=Q+1 : Inc S : Inc LLAST
  285.       Loop 
  286.       DISP_WIND
  287.       ED$(LLAST)=""
  288.    End If 
  289. End Proc
  290. Procedure BL_PRINT
  291.    On Error Goto E_PRINT
  292.    ED_ALARM["Printing... Press any key to stop.",1]
  293.    If BLE>BLS and BLE<=LLAST
  294.       For N=BLS To BLE-1
  295.          Lprint ED$(N)
  296.       Next 
  297.    End If 
  298.    E_PR: On Error 
  299.    Pop Proc
  300.    E_PRINT: ED_ALARM["Printer strike!",250] : Bell 
  301.    Resume E_PR
  302. End Proc
  303. Procedure ST_PRINT
  304.    S=BLS : E=BLE
  305.    BLS=0 : BLE=LLAST
  306.    BL_PRINT
  307.    BLS=S : BLE=E
  308. End Proc
  309. Procedure Y_CENTRE[Y]
  310.    If Y>=WIY and Y<WIY+WSY
  311.       CUY=Y-WIY
  312.    Else 
  313.       CUY=0 : WIY=Y
  314.    End If 
  315. End Proc
  316. Procedure TK_CUR
  317.    Shared CY
  318.    If ED$(CY)<>""
  319.       For L=1 To Len(ED$(CY))
  320.          If Mid$(ED$(CY),L,1)<>" " : F=1 : Exit : End If 
  321.       Next L
  322.    End If 
  323.    If F=0 and CY<LLAST
  324.       D_LINE[CY] : CUX=0
  325.       DISP_WIND
  326.    End If 
  327.    If F<>0 and CY=LLAST
  328.       If LLAST<MXLINE
  329.          Inc LLAST
  330.          ED$(LLAST)=""
  331.       Else 
  332.          Bell : ED$(CY)="" : CUX=0 : DISP_WIND
  333.       End If 
  334.    End If 
  335. End Proc[F]
  336. Procedure D_LINE[N]
  337.    For M=N To LLAST-1 : ED$(M)=ED$(M+1) : Next 
  338.    ED$(LLAST)=""
  339.    Dec LLAST
  340.    If BLS>N : Dec BLS : End If 
  341.    If BLE>N : Dec BLE : End If 
  342. End Proc
  343. Procedure I_LINE[L]
  344.    If LLAST<MXLINE
  345.       If L<MXLINE
  346.          For N=MXLINE-1 To L Step -1
  347.             ED$(N+1)=ED$(N)
  348.          Next 
  349.          Inc LLAST
  350.          If BLS>L : Inc BLS : End If 
  351.          If BLE>L : Inc BLE : End If 
  352.       End If 
  353.       ED$(L)=""
  354.       F=-1
  355.    End If 
  356. End Proc[F]
  357. Procedure MAKE_ED[N]
  358.    For S=0 To MXLINE : ED$(S)="" : Next 
  359.    X=Free
  360.    If AM$(N)=""
  361.       CUX=0 : CUY=0 : WIY=0 : BLS=0 : BLE=0
  362.    Else 
  363.       CUX=Val(Mid$(AM$(N),1+4*0,4))
  364.       CUY=Val(Mid$(AM$(N),1+4*1,4))
  365.       WIY=Val(Mid$(AM$(N),1+4*2,4))
  366.       BLS=Val(Mid$(AM$(N),1+4*3,4))
  367.       BLE=Val(Mid$(AM$(N),1+4*4,4))
  368.       P=21 : S=0
  369.       Do 
  370.          Q=Instr(AM$(N),LIM$,P)
  371.          Exit If Q=0
  372.          ED$(S)=Mid$(AM$(N),P,Q-P)
  373.          P=Q+1 : Inc S
  374.       Loop 
  375.       LLAST=S
  376.    End If 
  377. End Proc
  378. Procedure MAKE_AM[N,Y1,Y2]
  379.    X=Free
  380.    AM$(N)=Hex$(CUX,3)+Hex$(CUY,3)+Hex$(WIY,3)+Hex$(BLS,3)+Hex$(BLE,3)
  381.    For S=Y1 To Y2
  382.       Exit If ED$(S)=""
  383.       AM$(N)=AM$(N)+ED$(S)+LIM$
  384.    Next 
  385.    X=Free
  386. End Proc
  387. Procedure DISP_WIND
  388.    Curs Off 
  389.    For N=WIY To WIY+WSY-1 : DISP_LINE[N] : Next 
  390.    Locate CUX,CUY
  391.    Curs On 
  392.    INF_X : INF_Y
  393. End Proc
  394. Procedure DISP_LINE[N]
  395.    Locate 0,N-WIY : Inverse Off : Cline 
  396.    If N>=BLS and N<BLE
  397.       Inverse On 
  398.    End If 
  399.    If N<=LLAST : Print Left$(ED$(N),79); : End If 
  400. End Proc
  401. Procedure SET_STR
  402.    CL_STR
  403.    For N=0 To NSTR : DR_STR[N,NSTR,0] : Next 
  404. End Proc
  405. Procedure CL_STR
  406.    Y=12
  407.    Cls 0,0,Y To 640,31
  408.    Ink 2,0,2 : Set Paint 1 : Set Pattern 2 : Bar 0,Y To 639,Y+18
  409. End Proc
  410. Procedure ED_INFO
  411.    Cls 0,0,0 To 640,12
  412.    Set Paint 1 : Set Pattern 0 : Ink 0,0,2 : Bar 0,0 To 639,12
  413.    If ALARM
  414.       Ink 3,0 : Text 16,3+Text Base,ALARM$
  415.    Else 
  416.       Ink 2,0 : Text 16,3+Text Base,"AMAL string editor"
  417.       INF_X : INF_Y
  418.       If CST=0
  419.          A$="Environnement string..."
  420.       Else 
  421.          A$="AMAL channel number"+Str$(CST-1)
  422.       End If 
  423.       Text 54*8,3+Text Base,A$
  424.    End If 
  425. End Proc
  426. Procedure INF_X
  427.    If ALARM=0
  428.       X=30*8
  429.       Cls 0,X,3 To X+48,11
  430.       Ink 2,0 : Text X,3+Text Base,"C:"+Str$(CUX)
  431.    End If 
  432. End Proc
  433. Procedure INF_Y
  434.    If ALARM=0
  435.       X=38*8
  436.       Cls 0,X,3 To X+48,11
  437.       Ink 2,0 : Text X,3+Text Base,"L:"+Str$(CUY+WIY)
  438.    End If 
  439. End Proc
  440. Procedure MVE_ED
  441.    M=Mouse Zone
  442.    If M=64 or M=65
  443.       D=Y Mouse-SCY
  444.       While Mouse Key=1
  445.          SCY=Y Mouse-D
  446.          Screen Display 7,,SCY,,
  447.          Wait Vbl 
  448.       Wend 
  449.    End If 
  450. End Proc
  451. Procedure ED_HIDE
  452.    If EDHID=0
  453.       For Y=SCY To 350 Step 16
  454.          Screen Display 7,,Y,,
  455.          Wait Vbl 
  456.       Next 
  457.       EDHID=-1
  458.    End If 
  459. End Proc
  460. Procedure ED_SHOW
  461.    Wait 2 : Screen To Front 7
  462.    If EDHID
  463.       For Y=350 To SCY Step -16
  464.          Screen Display 7,,Y,,
  465.          Wait Vbl 
  466.       Next 
  467.       EDHID=0
  468.    End If 
  469.    Screen Display 7,,SCY,,
  470.    Screen 7 : Colour 3,$FF0
  471.    Wait Vbl 
  472.    X=Free
  473. End Proc
  474. Procedure MAKE_EDIT
  475.    Menu Del 
  476.    Paper 2 : Pen 0
  477.    '
  478.    Menu$(1)=" AMOS "
  479.    Menu$(1,1)=" About AMAL editor      "
  480.    Menu$(1,2)="------------------------" : Menu Inactive(1,2)
  481.    Menu$(1,3)=" Quit               Esc " : Menu Key(1,3) To 69
  482.    Menu$(1,4)=" Back to system         " : Menu$(1,4,1)=" Really? "
  483.    '
  484.    Menu$(2)=" Edit "
  485.    Menu$(2,1)=" Run all        F1  " : Menu Key(2,1) To 80
  486.    Menu$(2,2)=" Run current    F2  " : Menu Key(2,2) To 81
  487.    Menu$(2,3)=" Run selected   F3  " : Menu Key(2,3) To 82
  488.    Menu$(2,4)="--------------------" : Menu Inactive(2,4)
  489.    Menu$(2,5)=" Debug          F4  " : Menu Key(2,5) To 83
  490.    Menu$(2,6)="--------------------" : Menu Inactive(2,6)
  491.    Menu$(2,7)=" Play editor    F5  " : Menu Key(2,7) To 84
  492.    '
  493.    Menu$(3)=" Disc "
  494.    Menu$(3,1)=" Load AMAL bank "
  495.    Menu$(3,2)="----------------" : Menu Inactive(3,2)
  496.    Menu$(3,3)=" Save AMAL bank "
  497.    Menu$(3,4)=" Save As...     "
  498.    '
  499.    Menu$(4)=" Options "
  500.    Menu$(4,2)=" Set period   "
  501.    Menu$(4,3)=" Set selected " : Menu Key(4,3) To 83
  502.    '
  503.    Menu$(5)=" Block "
  504.    Menu$(5,1)=" Block start   F6 " : Menu Key(5,1) To 85
  505.    Menu$(5,2)=" Block end     F7 " : Menu Key(5,2) To 86
  506.    Menu$(5,3)=" Block hide    F8 " : Menu Key(5,3) To 87
  507.    Menu$(5,4)="------------------" : Menu Inactive(5,4)
  508.    Menu$(5,5)=" Block cut     F9 " : Menu Key(5,5) To 88
  509.    Menu$(5,6)=" Block paste   F10" : Menu Key(5,6) To 89
  510.    Menu$(5,7)="------------------" : Menu Inactive(5,7)
  511.    Menu$(5,8)=" Block print      "
  512.    Menu$(5,9)=" String print     "
  513.    '
  514.    Paper 1 : Pen 2
  515.    MN_SYNC
  516.    '
  517. End Proc
  518. Procedure MN_SYNC
  519.    Paper 2 : Pen 0
  520.    A$=" Synchro off " : B$=" Synchro on  "
  521.    If NSTR<60 : Swap A$,B$ : End If 
  522.    Menu$(4,1)=A$,B$
  523.    Paper 1 : Pen 2
  524. End Proc
  525. Procedure SET_SEL
  526.    '
  527.    Menu Off 
  528.    Cls 0,0,0 To 640,12
  529.    Set Paint 1 : Set Pattern 0 : Ink 0,0,2 : Bar 0,0 To 639,12
  530.    Ink 2,0 : Text 30*8,3+Text Base,"RUN selected channels:"
  531.    Curs Off : Clw : Print : Centre ">>> Press spacebar to end <<<"
  532.    '
  533.    FLG(0)=SEL0 : FLG(1)=SEL0
  534.    CL_STR
  535.    For N=0 To NSTR
  536.       TST_FLG[N]
  537.       If Param
  538.          DR_STR[N,NSTR,1]
  539.       Else 
  540.          DR_STR[N,NSTR,0]
  541.       End If 
  542.    Next 
  543.    '
  544.    Do 
  545.       Repeat 
  546.          MVE_ED
  547.          Z=Mouse Zone : K=Mouse Key and 1 : K$=Inkey$
  548.       Until K$<>"" or K<>0
  549.       '
  550.       If K<>0 and Z<>0 and Z<=NSTR+1
  551.          TST_FLG[Z-1]
  552.          If Param
  553.             CLR_FLG[Z-1]
  554.             DR_STR[Z-1,NSTR,0]
  555.          Else 
  556.             SET_FLG[Z-1]
  557.             DR_STR[Z-1,NSTR,1]
  558.          End If 
  559.          While Mouse Key : Wend 
  560.       End If 
  561.       Exit If K$=" "
  562.    Loop 
  563.    SEL0=FLG(0) : SEL1=FLG(1)
  564.    '
  565.    ED_INFO : SET_STR : DR_STR[CST,NSTR,1] : DISP_WIND
  566. End Proc
  567. '
  568. _LOAD:
  569. F$=Fsel$("*.Abk","","Load an AMAL bank")
  570. If Upper$(Right$(F$,4))=".ABK"
  571.    ED_ALARM["Loading "+F$+"...",1]
  572.    Erase 4
  573.    On Error Goto E_LOAD
  574.    Load F$
  575.    NAME$=F$
  576. Else 
  577.    Bell 
  578. End If 
  579. E_LD: On Error 
  580. REED_BANK
  581. Goto _EDIT
  582. E_LOAD: ED_ALARM["Disc error!",200] : Bell : Resume E_LD
  583. '
  584. _SAVE:
  585. If NAME$<>""
  586.    BANK_SAVE : Goto _EDIT
  587. End If 
  588. '
  589. _SAVAS:
  590. F$=Fsel$("*.Abk","","Save AMAL bank")
  591. If Upper$(Right$(F$,4))=".ABK"
  592.    NAME$=F$
  593.    BANK_SAVE
  594. Else 
  595.    Bell 
  596. End If 
  597. Goto _EDIT
  598. '
  599. Procedure BANK_SAVE
  600.    ED_ALARM["Saving "+NAME$+"...",1]
  601.    MAKE_BANK
  602.    On Error Goto E_SAVE
  603.    Save NAME$,4
  604.    E_SV: PL_CLEAN[4] : On Error 
  605.    Pop Proc
  606.    '
  607.    E_SAVE: ED_ALARM["Disc error!",200] : Bell : Resume E_SV
  608. End Proc
  609. Procedure REED_BANK
  610.    For N=0 To 62 : AM$(N)="" : Next 
  611.    If Length(4)
  612.       If Leek(Start(4))
  613.          AO=Start(4)+Leek(Start(4))
  614.          NS=Deek(AO) : Add AO,2
  615.          AP=AO+64*2
  616.          AM_PIK[0,AP] : AP=Param
  617.          For N=1 To NS
  618.             AM_PIK[N,AP] : AP=Param
  619.          Next 
  620.          PL_CLEAN[16]
  621.       Else 
  622.          Erase 4 : Goto _NBANK
  623.       End If 
  624.    Else 
  625.       _NBANK:
  626.       Reserve As Data 4,PLMOVE+16
  627.       PKSTR["Amal    ",Start(4)-8]
  628.       Doke Start(4)+4,NBMOVE : Add AD,2
  629.       For N=0 To NBMOVE-1 : PKSTR["Empty   ",Start(4)+PLNAME+N*8] : Next 
  630.       AM$(0)="$000$000$000$000$000Bob off : Sprite Off : Rainbow Del"+LIM$+"Screen 0"+LIM$
  631.    End If 
  632.    CST=1 : CCH=0 : CPL=1
  633. End Proc
  634. Procedure AM_PIK[N,AP]
  635.    L=Deek(AP) : Add AP,2
  636.    If L
  637.       AM$(N)="$000$000$000$000$000"+Space$(L)
  638.       If Btst(0,L) : Inc L : End If 
  639.       Copy AP,AP+L To Varptr(AM$(N))+20
  640.       Add AP,L
  641.    End If 
  642. End Proc[AP]
  643. Procedure MAKE_BANK
  644.    AM_LONG : LS=Param
  645.    PL_CLEAN[LS+64*2+16]
  646.    BKLEN : Loke Start(4),Param
  647.    AO=Start(4)+Param
  648.    Doke AO,63 : Add AO,2
  649.    AP=AO+64*2
  650.    AM_POK[0,AP] : AP=Param
  651.    For N=1 To 62
  652.       Doke AO-2+N*2,(AP-AO)/2
  653.       AM_POK[N,AP] : AP=Param
  654.    Next 
  655. End Proc
  656. Procedure AM_POK[N,AP]
  657.    A$=Mid$(AM$(N),21) : L=Len(A$)
  658.    Doke AP,L : Add AP,2
  659.    If Btst(0,L) : Inc L : End If 
  660.    If L : Copy Varptr(A$),Varptr(A$)+L To AP : End If 
  661.    Add AP,L
  662. End Proc[AP]
  663. Procedure AM_LONG
  664.    For N=0 To 62
  665.       S=Len(AM$(N))-20 : If S<0 : S=0 : End If 
  666.       If Btst(0,S) : Inc S : End If 
  667.       Add L,S+2
  668.    Next 
  669. End Proc[L]
  670. Procedure ED_ALARM[A$,L]
  671.    Shared ALARM$,ALARM
  672.    ALARM$=A$
  673.    ALARM=L
  674.    ED_INFO
  675. End Proc
  676. '----------------------------------------------------------------------------
  677. Procedure AM_ABOUT
  678.    Clw 
  679.    Print At(20,3)+Border$(At(60,9),1)
  680.    Centre At(,4)+"AMAL editor V"+VER$
  681.    Centre At(,5)+"-----------------"
  682.    Centre At(,6)+"By Fran�ois Lionet"
  683.    Centre At(,8)+"(c) 1990-1992 Europress Software Ltd."
  684.    Centre At(,14)+"Text buffer free space:"+Str$(Free)
  685.    Centre At(,15)+"Free chip memory:"+Str$(Chip Free)
  686.    Centre At(,16)+"Free fast memory:"+Str$(Fast Free)
  687.    Print At(20,14)+Border$(At(60,16),1)
  688.    Clear Key : Curs Off : Repeat : MVE_ED : Until Inkey$<>"" or Mouse Key<>0
  689.    DISP_WIND : Curs On 
  690. End Proc
  691. Procedure AM_QUIT
  692.    If Dreg(0)=0
  693.       A$="Quit AMAL editor (Y/N) ?"
  694.    Else 
  695.       A$="Quit AMAL editor and grab AMAL bank (Y/N) ?"
  696.    End If 
  697.    ED_ALARM[A$,1]
  698.    MAKE_BANK
  699.    Clear Key : Repeat : A$=Inkey$ : Until A$<>""
  700.    If Upper$(A$)="Y"
  701.       If Dreg(0)=0
  702.          For N=1 To 15 : Erase N : Next 
  703.          Edit 
  704.       End If 
  705.    End If 
  706.    PL_CLEAN[16]
  707. End Proc
  708. Procedure AM_SYSTEM
  709.    System 
  710. End Proc
  711. '----------------------------------------------------------------------------
  712. _DEBUG:
  713. '
  714. Menu Off 
  715. Curs Off 
  716. FLG(0)=SEL0 : FLG(1)=SEL1
  717. INIT_RUN
  718. Synchro Off 
  719. '
  720. Cls 0,0,0 To 640,12
  721. Set Paint 1 : Set Pattern 0 : Ink 0,0,2 : Bar 0,0 To 639,12
  722. Ink 2,0 : Text 34*8,3+Text Base,"AMAL monitor"
  723. Clw 
  724. CL_STR
  725. For N=0 To NSTR
  726.    TST_FLG[N]
  727.    If Param
  728.       DR_STR[N,NSTR,1]
  729.    Else 
  730.       DR_STR[N,NSTR,0]
  731.    End If 
  732. Next 
  733. '
  734. X1REG=5 : X2REG=X1REG+13 : X3REG=X2REG+13 : YREG=3
  735. Print At(X1REG-1,YREG)+Border$(At(X1REG+9,YREG+12),2)
  736. Print At(X2REG-1,YREG)+Border$(At(X2REG+9,YREG+12),2)
  737. Print At(X3REG-1,YREG)+Border$(At(X3REG+14,YREG+9),2)
  738. For N=0 To 26+9 : DR_REG[N,1] : Next 
  739. For N=0 To 7 : DR_ACT[N,0] : Next 
  740. '
  741. Reset Zone 66
  742. OLDA=-1 : OLDZ=-200
  743. '
  744. Do 
  745.    Repeat 
  746.       MVE_ED
  747.       Z=Mouse Zone : K=Mouse Key and 1 : K$=Upper$(Inkey$)
  748.       If Z-70<>OLDZ
  749.          If OLDZ>=0 : IDR_REG[OLDZ,0] : OLDZ=-200 : End If 
  750.          If Z-70>=0 and Z-70<36 : IDR_REG[Z-70,1] : OLDZ=Z-70 : End If 
  751.       End If 
  752.       If Z-106<>OLDA
  753.          If OLDA>=0 : DR_ACT[OLDA,0] : OLDA=-1 : End If 
  754.          If Z-106>=0 : DR_ACT[Z-106,1] : OLDA=Z-106 : End If 
  755.       End If 
  756.    Until K$<>"" or K<>0
  757.    '
  758.    R=0 : A=-1
  759.    '
  760.    If K<>0 and Z<>0 and Z<NSTR+2
  761.       TST_FLG[Z-1]
  762.       If Param
  763.          CLR_FLG[Z-1]
  764.          DR_STR[Z-1,NSTR,0]
  765.       Else 
  766.          SET_FLG[Z-1]
  767.          DR_STR[Z-1,NSTR,1]
  768.       End If 
  769.       SEL0=FLG(0) : SEL1=FLG(1)
  770.       While Mouse Key : Wend 
  771.    End If 
  772.    If K<>0 and OLDZ>=0
  773.       IDR_REG[OLDZ,1]
  774.       Cmove -4,0
  775.       Curs On : INP_TEXT[Mid$(Hex$(REGA(OLDZ),4),2),4] : Curs Off 
  776.       REGA(OLDZ)=Val("$"+Param$)
  777.       DR_REG[OLDZ,-1]
  778.       OLDZ=-200
  779.    End If 
  780.    If K<>0 and OLDA=0
  781.       If CCH : Dec CCH : For N=26 To 35 : DR_REG[N,1] : Next : Wait 3 : End If 
  782.    End If 
  783.    If K<>0 and OLDA=1
  784.       If CCH<NSTR-1 : Inc CCH : For N=26 To 35 : DR_REG[N,1] : Next : Wait 3 : End If 
  785.    End If 
  786.    If K$="I" or(K<>0 and OLDA=2)
  787.       DR_ACT[2,1] : A=2
  788.       TST_FLG[0] : If Param : CHRGET[0] : If ALARM : Goto _EDIT : End If : End If 
  789.       For N=1 To NSTR : TST_FLG[N] : If Param : RAMAL[N] : If ALARM : Goto _EDIT : End If : End If : Next 
  790.       Amal On 
  791.       ED_SHOW
  792.       R=2
  793.    End If 
  794.    If K$="R" or(K<>0 and OLDA=3)
  795.       DR_ACT[3,1] : A=3
  796.       Repeat 
  797.          Synchro 
  798.          For T=1 To SYNC : MVE_ED : Wait Vbl : Next 
  799.       Until Inkey$<>""
  800.       R=1
  801.    End If 
  802.    If K$="G" or(K<>0 and OLDA=4)
  803.       DR_ACT[4,1] : A=4
  804.       Centre At(,17)+" Enter register number (A...Z or 0...9): " : INP_TEXT["",1]
  805.       R$=Upper$(Param$)
  806.       If R$<>""
  807.          Centre At(,18)+"  Enter value to stop at: " : INP_TEXT["",5]
  808.          If Param$<>""
  809.             V=Val(Param$)
  810.             Do 
  811.                On Error Goto _GREG
  812.                Do 
  813.                   Synchro 
  814.                   For T=1 To SYNC : MVE_ED : Wait Vbl : Next 
  815.                   Exit If Inkey$<>"",2
  816.                   If(R$>="A") and(R$=<"Z")
  817.                      R=Amreg(Asc(R$)-65)
  818.                   Else 
  819.                      R=Amreg(CCH,Asc(R$)-48)
  820.                   End If 
  821.                   Exit If R=V,2
  822.                Loop 
  823.                _GREG: Resume _GROG
  824.                _GROG: Bell : On Error : Exit 
  825.             Loop 
  826.             R=1
  827.             Centre At(,17)+Space$(70) : Centre At(,18)+Space$(70)
  828.          End If 
  829.       End If 
  830.    End If 
  831.    If K$="S" or(K<>0 and OLDA=5)
  832.       DR_ACT[5,1] : A=5
  833.       Synchro 
  834.       R=1
  835.    End If 
  836.    If K$=Chr$(27) or(K<>0 and OLDA=6)
  837.       DR_ACT[6,1]
  838.       Exit 
  839.    End If 
  840.    '
  841.    If R : For N=0 To 35 : DR_REG[N,R-1] : Next : End If 
  842.    If A>=0 : If OLDA<>A : DR_ACT[A,0] : End If : End If 
  843.    '
  844. Loop 
  845. Sprite Off 
  846. Goto _EDIT
  847. '
  848. Procedure DR_ACT[N,I]
  849.    Shared X1REG,X3REG,YREG
  850.    If I
  851.       Inverse On 
  852.    Else 
  853.       Inverse Off 
  854.    End If 
  855.    If N=0 : Print At(X3REG-1,YREG+12);Border$(Zone$("<<<<<<",106+N),2); : End If 
  856.    If N=1 : Print At(X3REG+8,YREG+12);Border$(Zone$(">>>>>>",106+N),2); : End If 
  857.    If N=2 : Print At(X1REG+44,YREG+0)+Border$(Zone$(" (I)  Init screen and AMAL ",106+N),2) : End If 
  858.    If N=3 : Print At(X1REG+44,YREG+3)+Border$(Zone$(" (R)  Run until key press  ",106+N),2) : End If 
  859.    If N=4 : Print At(X1REG+44,YREG+6)+Border$(Zone$(" (G)  Go until Reg=Value   ",106+N),2) : End If 
  860.    If N=5 : Print At(X1REG+44,YREG+9)+Border$(Zone$(" (S)  Performs one step    ",106+N),2) : End If 
  861.    If N=6 : Print At(X1REG+44,YREG+12)+Border$(Zone$("(ESC) Quit monitor         ",106+N),2) : End If 
  862.    Inverse Off 
  863. End Proc
  864. Procedure IDR_REG[N,I]
  865.    Shared REGA()
  866.    If I
  867.       Inverse On 
  868.    Else 
  869.       Inverse Off 
  870.    End If 
  871.    DR_REG[N,1]
  872.    Inverse Off 
  873. End Proc
  874. Procedure DR_REG[N,F]
  875.    Shared X1REG,X2REG,X3REG,YREG,REGA()
  876.    If N<26
  877.       If F<0 : Amreg(N)=REGA(N) : End If 
  878.       V=Amreg(N)
  879.       If V<>REGA(N) or F<>0
  880.          If N<13
  881.             Locate X1REG,YREG+N
  882.          Else 
  883.             Locate X2REG,YREG+N-13
  884.          End If 
  885.          Print Zone$("R"+Chr$(65+N)+"="+Hex$(V,4),70+N);
  886.          REGA(N)=V
  887.       End If 
  888.    Else 
  889.       On Error Goto _DRERR
  890.       V=Amreg(CCH,N-26)
  891.       If F<0 : Amreg(CCH,N-26)=REGA(N) : V=REGA(N) : End If 
  892.       If V<>REGA(N)+F
  893.          Locate X3REG,YREG+N-26
  894.          Print Zone$("R("+Mid$(Str$(CCH),2)+","+Chr$(48+N-26)+")="+Hex$(V,4),70+N);
  895.          REGA(N)=V
  896.       End If 
  897.       Pop Proc
  898.       _DRERR: Resume _DRER2
  899.       _DRER2: On Error 
  900.       If F
  901.          Locate X3REG,YREG+N-26
  902.          Print "R("+Mid$(Str$(CCH),2)+","+Chr$(48+N-26)+")      ";
  903.          Reset Zone 70+N
  904.       End If 
  905.    End If 
  906. End Proc
  907. '----------------------------------------------------------------------------
  908. '
  909. _PLAY:
  910. ALARM=0
  911. Reset Zone 1 : Reset Zone 2
  912. PL_INFO : INF_PLAY : PL_STR
  913. DR_STR[CPL+1,NBMOVE+1,1]
  914. MAKE_PLAY
  915. Do 
  916.    Menu On : Curs Off 
  917.    Inverse Off : Clw : Print : Centre ">>> Choose a menu option <<<"
  918.    Repeat 
  919.       If Choice
  920.          On Choice(1) Gosub PL_EDIT,PL_MVE
  921.          Z=0 : Exit 
  922.       End If 
  923.       MVE_ED
  924.       Z=Mouse Zone : K=Mouse Key and 1 : K$=Inkey$ : S=Scancode : SS=Scanshift
  925.    Until K
  926.    Menu Off 
  927.    If Z<>0 and Z<=NBMOVE+2 and CPL<>Z-2
  928.       DR_STR[CPL+1,NBMOVE+1,0]
  929.       CPL=Z-2 : DR_STR[CPL+1,NBMOVE+1,1] : INF_PLAY
  930.    End If 
  931. Loop 
  932. '  
  933. PL_EDIT: Pop 
  934. Goto _EDIT
  935. '  
  936. PL_MVE:
  937. Menu Off 
  938. On Choice(2) Proc PL_TAPE,PL_PLAY,PL_TAPE,PL_INS,PL_DEL
  939. Return 
  940. '
  941. Procedure PL_TAPE
  942.    PL_CLR[CPL]
  943.    Clw 
  944.    Print : Centre "To record, put the mouse pointer at the start of movement,"
  945.    Print : Centre "and enter speed (or press RETURN) to begin recording."
  946.    Print : Centre "-> Press ESC to abort <-"
  947.    Print : Centre "To stop recording, click the mouse button."
  948.    Print : Print : Centre "Movement recording speed: "
  949.    Curs On : INP_TEXT["1",3]
  950.    '
  951.    Clw 
  952.    If Param$<>""
  953.       '
  954.       SP=Val(Param$)
  955.       If SP<=0 or SP>255 : SP=1 : End If 
  956.       '
  957.       Screen Hide 7 : Wait Vbl 
  958.       LMVE=2000 : X$=Space$(LMVE) : Y$=Space$(LMVE)
  959.       ADX=Varptr(X$) : ADY=Varptr(Y$) : LX=0 : LY=0
  960.       XM=X Mouse : YM=Y Mouse
  961.       CPTX=-1 : CPTY=-1
  962.       Repeat 
  963.          '
  964.          ' Tape X movements 
  965.          X=X Mouse
  966.          If X=XM
  967.             Inc CPTX
  968.             If CPTX>126
  969.                Bset 7,CPTX : Poke ADX,CPTX : Inc ADX : Inc LX : CPTX=-1
  970.             End If 
  971.          Else 
  972.             If CPTX>-1
  973.                Bset 7,CPTX : Poke ADX,CPTX : Inc ADX : Inc LX : CPTX=-1
  974.             End If 
  975.             D=X-XM
  976.             D=Min(D,63) : D=Max(D,-63)
  977.             Bclr 7,D : Poke ADX,D : Inc ADX : Inc LX
  978.             XM=X
  979.          End If 
  980.          '
  981.          ' Tape Y movements 
  982.          Y=Y Mouse
  983.          If Y=YM
  984.             Inc CPTY
  985.             If CPTY>126
  986.                Bset 7,CPTY : Poke ADY,CPTY : Inc ADY : Inc LY : CPTY=-1
  987.             End If 
  988.          Else 
  989.             If CPTY>-1
  990.                Bset 7,CPTY : Poke ADY,CPTY : Inc ADY : Inc LY : CPTY=-1
  991.             End If 
  992.             D=Y-YM
  993.             D=Min(D,63) : D=Max(D,-63)
  994.             Bclr 7,D : Poke ADY,D : Inc ADY : Inc LY
  995.             YM=Y
  996.          End If 
  997.          For S=1 To SP : Wait Vbl : Next 
  998.       Until Mouse Key or LX>=LMVE or LY>=LMVE
  999.       '
  1000.       Screen Show 7 : Wait Vbl 
  1001.       PL_CLEAN[LX+LY+16]
  1002.       Clw 
  1003.       Print : Centre "Please enter movement's name (8 letters):"
  1004.       Locate 36,Y Curs+1
  1005.       INP_TEXT["Move"+Str$(CPL),8] : A$=Param$
  1006.       '
  1007.       BKLEN
  1008.       C=CPL-1 : AP=Start(4)+Param : AA=AP
  1009.       Doke Start(4)+PLOFF+C*2,(AP-Start(4)-4)/2
  1010.       PKSTR[Left$(A$+"        ",8),Start(4)+PLNAME+C*8]
  1011.       Doke AP,SP : Add AP,2
  1012.       Doke AP,LX+2+4 : Add AP,2
  1013.       Poke AP,0 : Inc AP
  1014.       For L=0 To LX-1
  1015.          Poke AP,Peek(Varptr(X$)+L) : Inc AP
  1016.       Next 
  1017.       Poke AP,0 : Inc AP
  1018.       Poke AP,0 : Inc AP
  1019.       For L=0 To LY-1
  1020.          Poke AP,Peek(Varptr(Y$)+L) : Inc AP
  1021.       Next 
  1022.       Poke AP,0 : Inc AP
  1023.       If Btst(0,AP) : Inc AP : End If 
  1024.       Doke Start(4)+PLLEN+C*2,AP-AA
  1025.    End If 
  1026.    INF_PLAY
  1027. End Proc
  1028. Procedure PL_PLAY
  1029.    Clw 
  1030.    If Deek(Start(4)+PLOFF+CPL*2-2)
  1031.       Print : Print : Centre ">>> Put the mouse at start of movement, and press mousekey <<<"
  1032.       WT_CLICK
  1033.       Screen Hide 7
  1034.       Synchro Off 
  1035.       X=Free
  1036.       A$=Space$(8)
  1037.       Doke Varptr(A$)+2,X Mouse : Doke Varptr(A$)+4,Y Mouse
  1038.       Amal 63,"PL"+Str$(CPL) To Varptr(A$)
  1039.       Amal On 
  1040.       Repeat 
  1041.          Synchro 
  1042.          X Mouse=Deek(Varptr(A$)+2) : Y Mouse=Deek(Varptr(A$)+4)
  1043.          Wait Vbl 
  1044.          Doke Varptr(A$)+2,X Mouse : Doke Varptr(A$)+4,Y Mouse
  1045.       Until Mouse Key
  1046.       Amal Off 
  1047.       Screen Show 7
  1048.    Else 
  1049.       Bell 
  1050.       Print : Centre "Movement not recorded!"
  1051.       Print : Print : Centre ">>> Press mousekey <<<"
  1052.       WT_CLICK
  1053.    End If 
  1054. End Proc
  1055. Procedure PL_CLR[N]
  1056.    Doke Start(4)+PLOFF+N*2-2,0
  1057.    Doke Start(4)+PLLEN+N*2-2,0
  1058.    PKSTR["Empty   ",Start(4)+PLNAME+N*8-8]
  1059. End Proc
  1060. Procedure PL_CLEAN[L]
  1061.    '
  1062.    BKLEN
  1063.    Reserve As Work 5,Param+L : AD=Start(5)
  1064.    '
  1065.    PKSTR["Amal    ",AD-8]
  1066.    Doke AD+4,NBMOVE : Add AD,6
  1067.    AP=Start(5)+PLMOVE
  1068.    For N=0 To NBMOVE-1
  1069.       For L=0 To 7
  1070.          Poke Start(5)+PLNAME+N*8+L,Peek(Start(4)+PLNAME+N*8+L)
  1071.       Next 
  1072.       A=Deek(Start(4)+PLOFF+N*2)
  1073.       If A
  1074.          AO=Start(4)+4+A*2
  1075.          LO=Deek(Start(4)+PLLEN+N*2)
  1076.          Doke Start(5)+PLOFF+N*2,(AP-Start(5)-4)/2
  1077.          Doke Start(5)+PLLEN+N*2,LO
  1078.          Copy AO,AO+LO To AP
  1079.          Add AP,LO
  1080.       End If 
  1081.    Next 
  1082.    '
  1083.    Erase 4 : Reserve As Data 4,Length(5)
  1084.    Copy Start(5)-8,Start(5)+Length(5) To Start(4)-8
  1085.    Erase 5
  1086.    '
  1087. End Proc
  1088. Procedure PKSTR[A$,A]
  1089.    For L=0 To Len(A$)-1
  1090.       Poke A+L,Asc(Mid$(A$,L+1,1))
  1091.    Next 
  1092. End Proc
  1093. Procedure BKLEN
  1094.    L=PLMOVE
  1095.    For N=0 To NBMOVE-1
  1096.       Add L,Deek(Start(4)+PLLEN+N*2)
  1097.    Next 
  1098. End Proc[L]
  1099. Procedure PL_INS
  1100.    If CPL<NBMOVE
  1101.       For C=NBMOVE-1 To CPL Step -1
  1102.          Doke Start(4)+PLOFF+C*2,Deek(Start(4)+PLOFF+C*2-2)
  1103.          Doke Start(4)+PLLEN+C*2,Deek(Start(4)+PLLEN+C*2-2)
  1104.          For P=0 To 7
  1105.             Poke Start(4)+PLNAME+C*8+P,Peek(Start(4)+PLNAME+C*8-8+P)
  1106.          Next 
  1107.       Next 
  1108.       PL_CLR[CPL]
  1109.       INF_PLAY
  1110.    End If 
  1111. End Proc
  1112. Procedure PL_DEL
  1113.    If CPL<NBMOVE
  1114.       For C=CPL To NBMOVE-1
  1115.          Doke Start(4)+PLOFF+C*2-2,Deek(Start(4)+PLOFF+C*2)
  1116.          Doke Start(4)+PLLEN+C*2-2,Deek(Start(4)+PLLEN+C*2)
  1117.          For P=0 To 7
  1118.             Poke Start(4)+PLNAME+C*8-8+P,Peek(Start(4)+PLNAME+C*8+P)
  1119.          Next 
  1120.       Next 
  1121.       PL_CLR[CPL]
  1122.       INF_PLAY
  1123.    End If 
  1124.    PL_CLR[CPL]
  1125. End Proc
  1126. Procedure PL_STR
  1127.    CL_STR
  1128.    For N=2 To NBMOVE+1
  1129.       DR_STR[N,NBMOVE+1,0]
  1130.    Next 
  1131.    Reset Zone 1
  1132. End Proc
  1133. Procedure INF_PLAY
  1134.    X=30*8
  1135.    Cls 0,X,3 To 639,11
  1136.    A$="Movement:"+Str$(CPL)+" - Name: "
  1137.    For N=0 To 7 : A$=A$+Chr$(Peek(Start(4)+PLNAME+CPL*8+N-8)) : Next 
  1138.    A$=A$+" - Length:"+Str$(Deek(Start(4)+PLLEN+CPL*2-2))
  1139.    Ink 2,0 : Text X,3+Text Base,A$
  1140. End Proc
  1141. Procedure PL_INFO
  1142.    Cls 0,0,0 To 640,12
  1143.    Set Paint 1 : Set Pattern 0 : Ink 0,0,2 : Bar 0,0 To 639,12
  1144.    Ink 2,0 : Text 16,3+Text Base,"PLAY movement editor"
  1145. End Proc
  1146. Procedure MAKE_PLAY
  1147.    '
  1148.    Menu Del 
  1149.    Paper 2 : Pen 0
  1150.    '
  1151.    Menu$(1)=" Edit "
  1152.    Menu$(1,1)=" Back to string editor   Esc " : Menu Key(1,1) To 69
  1153.    '
  1154.    Menu$(2)=" Movement "
  1155.    Menu$(2,1)=" Record     F1 " : Menu Key(2,1) To 80
  1156.    Menu$(2,2)=" Play back  F2 " : Menu Key(2,2) To 81
  1157.    Menu$(2,3)="---------------" : Menu Inactive(2,3)
  1158.    Menu$(2,4)=" Insert     F3 " : Menu Key(2,4) To 82
  1159.    Menu$(2,5)=" Delete     F4 " : Menu Key(2,5) To 83
  1160.    '
  1161.    Paper 1 : Pen 2
  1162.    '
  1163. End Proc
  1164. '----------------------------- 
  1165. _RUNCUR:
  1166. INI_FLG : SET_FLG[CST] : SET_FLG[0]
  1167. Goto _RUN
  1168. '
  1169. _RUNALL:
  1170. INI_FLG : SET_FLG[0]
  1171. For N=1 To NSTR
  1172.    If AM$(N)<>"" : SET_FLG[N] : End If 
  1173. Next 
  1174. Goto _RUN
  1175. '
  1176. _RUNSEL:
  1177. FLG(0)=SEL0 : FLG(1)=SEL1
  1178. Goto _RUN
  1179. '
  1180. _RUN:
  1181. ED_HIDE
  1182. INIT_RUN
  1183. TST_FLG[0] : If Param : CHRGET[0] : If ALARM : Goto _EDIT : End If : End If 
  1184. For N=1 To NSTR
  1185.    TST_FLG[N]
  1186.    If Param : RAMAL[N] : If ALARM : Goto _EDIT : End If : End If 
  1187. Next 
  1188. '  
  1189. If NSTR<16
  1190.    Amal On 
  1191.    Repeat : Until Inkey$<>""
  1192.    Amal Off 
  1193. Else 
  1194.    Amal On 
  1195.    Repeat 
  1196.       Synchro 
  1197.       For T=1 To SYNC : Wait Vbl : Next 
  1198.    Until Inkey$<>""
  1199.    Amal Off : Synchro 
  1200. End If 
  1201. Sprite Off : Update 
  1202. Goto _EDIT
  1203. Procedure INIT_RUN
  1204.    Amal Off 
  1205.    Synchro Off : If NSTR<60 : Synchro On : End If 
  1206. End Proc
  1207. Procedure RAMAL[N]
  1208.    '
  1209.    On Error Goto AM_ERR
  1210.    A$=Mid$(AM$(N),21)
  1211.    If A$<>"" : Amal N-1,A$ : End If 
  1212.    Goto E_RAMAL
  1213.    '
  1214.    AM_ERR:
  1215.    CUX=0 : WIY=0 : P=21 : PE=Amalerr+21
  1216.    Do 
  1217.       Q=Instr(AM$(N),LIM$,P+1)
  1218.       Exit If Q=0
  1219.       If Q>PE : WIY=Y : CUX=PE-P : Exit : End If 
  1220.       Inc Y
  1221.       P=Q+1
  1222.    Loop 
  1223.    CST=N
  1224.    AM$(N)=Hex$(CUX,3)+"$000"+Hex$(WIY,3)+Mid$(AM$(N),13)
  1225.    E=Errn
  1226.    Restore ERR_LIST
  1227.    Do 
  1228.       Read A,ALARM$
  1229.       Exit If A=0 or A=E
  1230.    Loop 
  1231.    ALARM=250
  1232.    Resume E_RAMAL
  1233.    '
  1234.    ERR_LIST:
  1235.    Data 107,"Syntax error in animation string"
  1236.    Data 108,"Next without for"
  1237.    Data 109,"Label not defined"
  1238.    Data 110,"Jump to/within autotest"
  1239.    Data 111,"Autotest already opened"
  1240.    Data 112,"Instruction only valid in autotest"
  1241.    Data 113,"Animation string to long! You MUST split it!"
  1242.    Data 114,"Label already defined"
  1243.    Data 115,"Illegal instruction during autotest"
  1244.    Data 0,"Error during declaration"
  1245.    '
  1246.    E_RAMAL:
  1247. End Proc
  1248. Procedure CHRGET[NS]
  1249.    Dim V(10),V$(10)
  1250.    '
  1251.    X=Free
  1252.    PP=21 : LINE=0
  1253.    Do 
  1254.       QQ=Instr(AM$(NS),LIM$,PP)
  1255.       Exit If QQ=0
  1256.       S$=Mid$(AM$(NS),PP,QQ-PP)
  1257.       PP=QQ+1
  1258.       While Left$(S$,1)=" " : S$=Mid$(S$,2) : Wend 
  1259.       '
  1260.       If Left$(S$,1)<>"'"
  1261.          '
  1262.          Repeat 
  1263.             '
  1264.             While Left$(S$,1)=" " : S$=Mid$(S$,2) : Wend 
  1265.             '
  1266.             Restore TKENS
  1267.             Repeat 
  1268.                Read A$,PAR$,JMP$
  1269.                If A$="" : Goto _SYNT : End If 
  1270.             Until A$=Upper$(Left$(S$,Len(A$)))
  1271.             '
  1272.             S$=Mid$(S$,Len(A$)+1)
  1273.             NP=0 : P=1
  1274.             While Mid$(S$,P,1)=" " : Inc P : Wend 
  1275.             SP$=Mid$(S$,P,1)
  1276.             If SP$<>":" and P<=Len(S$)
  1277.                Do 
  1278.                   '
  1279.                   If Mid$(S$,P,1)='"'
  1280.                      Inc NP
  1281.                      If Mid$(PAR$,NP,1)<>"1" : Goto _SYNT : End If 
  1282.                      Q=Instr(S$,'"',P+1) : If Q=0 : Goto _SYNT : End If 
  1283.                      V$(NP)=Mid$(S$,P+1,Q-P-1)
  1284.                      P=Q+1
  1285.                      While Mid$(S$,P,1)=" " : Inc P : Wend 
  1286.                      SP$=Upper$(Mid$(S$,P,1)) : Inc P
  1287.                   Else 
  1288.                      Inc NP
  1289.                      If Mid$(PAR$,NP,1)<>"0" : Goto _SYNT : End If 
  1290.                      Q=P
  1291.                      Do 
  1292.                         SP$=Upper$(Mid$(S$,Q,1))
  1293.                         Exit If(SP$="") or(SP$=",") or(SP$=":") or(SP$="T")
  1294.                         Inc Q
  1295.                      Loop 
  1296.                      If P=Q
  1297.                         V(NP)=$80000000
  1298.                      Else 
  1299.                         V(NP)=Val(Mid$(S$,P,Q-P))
  1300.                      End If 
  1301.                      If SP$="T" : Inc Q : End If 
  1302.                      P=Q+1
  1303.                   End If 
  1304.                   Exit If SP$=":"
  1305.                   If P>Len(S$)
  1306.                      Exit If(SP$<>",") and(Upper$(SP$)<>"T")
  1307.                   End If 
  1308.                Loop 
  1309.             Else 
  1310.                Inc P
  1311.             End If 
  1312.             '
  1313.             If NP<>Len(PAR$) : Goto _SYNT : End If 
  1314.             On Error Goto _RERR
  1315.             OUT=0 : Wait Vbl : Gosub JMP$ : Update 
  1316.             On Error 
  1317.             Exit If OUT
  1318.             '
  1319.             While Mid$(S$,P,1)=" " : Inc P : Wend 
  1320.             S$=Mid$(S$,P)
  1321.          Until S$=""
  1322.       End If 
  1323.       Inc LINE
  1324.    Loop 
  1325.    ALARM$="" : ALARM=0 : X=Free
  1326.    Pop Proc
  1327.    '
  1328.    _SYNT:
  1329.    ALARM$="Pre-Intrrpretor Error: Syntax error!"
  1330.    _RERR2: ALARM=250
  1331.    AM$(NS)="$000$000"+Hex$(LINE,3)+Mid$(AM$(NS),13)
  1332.    CST=NS : X=Free
  1333.    On Error 
  1334.    Pop Proc
  1335.    '
  1336.    _RERR:
  1337.    Pop 
  1338.    ALARM$="Pre-Interpretor Error: Illegal function call (or other error)!"
  1339.    Resume _RERR2
  1340.    '
  1341.    WHATSC:
  1342.    If Screen<>7 Then Return 
  1343.    NO7: Pop : Pop 
  1344.    ALARM$="Pre-Interpretor Error: You can't modify screen 7!"
  1345.    Goto _RERR2
  1346.    '
  1347.    V1NO7: If V(1)=7 Then Goto NO7
  1348.    Return 
  1349.    '
  1350.    V2NO7: If V(2)=7 Then Goto NO7
  1351.    Return 
  1352.    '
  1353.    TKENS:
  1354.    Data "SPRITE OFF","","R_SPO"
  1355.    Data "BOB OFF","","R_BBO"
  1356.    Data "RAINBOW DEL","","R_RD"
  1357.    Data "IF SCREEN","0","R_IS"
  1358.    Data "IF NOT SCREEN","0","R_INS"
  1359.    Data "IF BANK","0","R_IB"
  1360.    Data "IF NOT BANK","0","R_INB"
  1361.    Data "IF REG","00","R_IR"
  1362.    Data "IF NOT REG","00","R_INR"
  1363.    Data "SET REG","00","R_SR"
  1364.    Data "SCREEN OPEN","00000","R_SO"
  1365.    Data "SCREEN DISPLAY","00000","R_SD"
  1366.    Data "SCREEN OFFSET","000","R_OF"
  1367.    Data "DOUBLE BUFFER","","R_DB"
  1368.    Data "DUAL PLAYFIELD","00","R_DP"
  1369.    Data "DUAL PRIORITY","00","R_DR"
  1370.    Data "SCREEN CLONE","0","R_SC"
  1371.    Data "SCREEN CLOSE","0","R_CC"
  1372.    Data "SCREEN","0","R_SS"
  1373.    Data "LOAD IFF","10","R_LD"
  1374.    Data "BELL","","R_BL"
  1375.    Data "COLOUR","00","R_CO"
  1376.    Data "FLASH OFF","","R_FLO"
  1377.    Data "FLASH","01","R_FL"
  1378.    Data "ERASE","0","R_ER"
  1379.    Data "LOAD","10","R_LB"
  1380.    Data "BOB","0000","R_BB"
  1381.    Data "SET BOB","0000","R_SBO"
  1382.    Data "SPRITE","0000","R_SP"
  1383.    Data "SET SPRITE BUFFER","0","R_SSB"
  1384.    Data "SET RAINBOW","000111","R_SRB"
  1385.    Data "RAINBOW","0000","R_RB"
  1386.    Data "CHANNEL TO SPRITE","00","R_CS"
  1387.    Data "CHANNEL TO BOB","00","R_CB"
  1388.    Data "CHANNEL TO SCREEN DISPLAY","00","R_CSD"
  1389.    Data "CHANNEL TO SCREEN OFFSET","00","R_COF"
  1390.    Data "CHANNEL TO SCREEN SIZE","00","R_CSS"
  1391.    Data "CHANNEL TO RAINBOW","00","R_RN"
  1392.    Data "GET SPRITE PALETTE","0","R_GS"
  1393.    Data "UPDATE EVERY","0","R_UE"
  1394.    Data "HIDE","","R_HI"
  1395.    Data "CLS","0","R_CLS"
  1396.    Data "UNPACK","00","R_UN"
  1397.    Data "CURS OFF","","R_CUO"
  1398.    Data "","",""
  1399.    '
  1400.    R_RM: OUT=True : Return 
  1401.    R_IR: If Amreg(V(1))<>V(2) : OUT=True : End If : Return 
  1402.    R_INR: If Amreg(V(1))=V(2) : OUT=True : End If : Return 
  1403.    R_IS: On Error Goto R_I0 : S=Screen : Screen V(1) : Screen S : Return 
  1404.    R_I0: Resume R_STOP
  1405.    R_INS: On Error Goto R_I1 : S=Screen : Screen V(1) : Screen S : Goto R_STOP
  1406.    R_I1: Resume R_I2
  1407.    R_IB: If Length(V(1))=0 : Goto R_STOP : End If : Return 
  1408.    R_INB: If Length(V(1)) : Goto R_STOP : End If : Return 
  1409.    R_STOP: OUT=True
  1410.    R_I2: Return 
  1411.    '
  1412.    R_HI: Hide On : Return 
  1413.    R_BBO: Bob Off : Return 
  1414.    R_SPO: Sprite Off : Return 
  1415.    R_SO: Gosub V1NO7 : Screen Open V(1),V(2),V(3),V(4),V(5) : Return 
  1416.    R_SD: Gosub V1NO7 : Screen Display V(1),V(2),V(3),V(4),V(5) : Return 
  1417.    R_OF: Gosub V1NO7 : Screen Offset V(1),V(2),V(3) : Return 
  1418.    R_DB: Gosub WHATSC : Double Buffer : Return 
  1419.    R_DP: Gosub WHATSC : Dual Playfield V(1),V(2) : Return 
  1420.    R_DR: Gosub WHATSC : Dual Priority V(1),V(2) : Return 
  1421.    R_SC: Gosub WHATSC : Screen Clone V(1) : Return 
  1422.    R_CC: Gosub WHATSC : Screen Close V(1) : Return 
  1423.    R_SS: Gosub V1NO7 : Screen V(1) : Return 
  1424.    R_LD: Gosub V2NO7 : Load Iff V$(1),V(2) : Return 
  1425.    R_BL: Bell : Return 
  1426.    R_CO: Gosub WHATSC : Colour V(1),V(2) : Return 
  1427.    R_FLO: Gosub WHATSC : Flash Off : Return 
  1428.    R_FL: Gosub WHATSC : Flash V(1),V$(2) : Return 
  1429.    R_ER: Erase V(1) : Return 
  1430.    R_LB: Load V$(1),V(2) : Return 
  1431.    R_BB: Gosub WHATSC : Bob V(1),V(2),V(3),V(4) : Return 
  1432.    R_SBO: Gosub WHATSC : Set Bob V(1),V(2),V(3),V(4) : Return 
  1433.    R_SP: Sprite V(1),V(2),V(3),V(4) : Return 
  1434.    R_SSB: Set Sprite Buffer V(1) : Return 
  1435.    R_SRB: Set Rainbow V(1),V(2),V(3),V$(4),V$(5),V$(6) : Return 
  1436.    R_RB: Rainbow V(1),V(2),V(3),V(4) : Return 
  1437.    R_RD: Rainbow Del : Return 
  1438.    R_CS: Channel V(1) To Sprite V(2) : Return 
  1439.    R_CB: Channel V(1) To Bob V(2) : Return 
  1440.    R_CSD: Gosub V2NO7 : Channel V(1) To Screen Display V(2) : Return 
  1441.    R_COF: Gosub V2NO7 : Channel V(1) To Screen Offset V(2) : Return 
  1442.    R_CSS: Gosub V2NO7 : Channel V(1) To Screen SizeV(2) : Return 
  1443.    R_RN: Channel V(1) To Rainbow V(2) : Return 
  1444.    R_GS: Gosub WHATSC : Get Sprite Palette V(1) : Return 
  1445.    R_UE: Update Every V(1) : Return 
  1446.    R_SR: Amreg(V(1))=V(2) : Return 
  1447.    R_CLS: Gosub WHATSC : Cls V(1) : Return 
  1448.    R_UN: Gosub V2NO7 : Unpack V(1) To V(2) : Return 
  1449.    R_CUO: Gosub WHATSC : Curs Off : Return 
  1450.    '
  1451. End Proc
  1452. '------------------------------
  1453. Procedure WT_CLICK
  1454.    While Mouse Key : Wend 
  1455.    Repeat : Until Mouse Key
  1456.    While Mouse Key : Wend 
  1457. End Proc
  1458. Procedure INP_TEXT[T$,L]
  1459.    X=X Curs : Y=Y Curs
  1460.    Locate X,Y : Print T$;
  1461.    Do 
  1462.       Repeat 
  1463.          MVE_ED
  1464.          A$=Inkey$
  1465.       Until A$<>""
  1466.       Exit If A$=Chr$(13)
  1467.       If A$=Chr$(8) : T$=Left$(T$,Len(T$)-1) : End If 
  1468.       If A$=Chr$(27) : T$="" : Exit : End If 
  1469.       If A$>" " : T$=T$+A$ : End If 
  1470.       T$=Left$(T$,L) : Locate X,Y : Print T$;" "; : Cleft 
  1471.    Loop 
  1472. End Proc[T$]
  1473. Procedure DR_STR[N,M,I]
  1474.    X=(640-M*10)/2+N*10-5 : Y=12
  1475.    I1=0 : I2=2
  1476.    If I : Swap I1,I2 : End If 
  1477.    Set Paint 1 : Set Pattern 0 : Ink I1,,2 : Bar X,Y To X+10,Y+18
  1478.    A$=Str$(N-1)-" " : If Len(A$)=1 : A$="0"+A$ : End If 
  1479.    If N=0 : A$="EE" : End If 
  1480.    Ink I2,I1
  1481.    Text X+1,Y+2+Text Base,Left$(A$,1)
  1482.    Text X+1,Y+2+8+Text Base,Right$(A$,1)
  1483.    Set Zone N+1,X,Y+1 To X+9,Y+1+18
  1484. End Proc
  1485. Procedure INI_FLG
  1486.    For N=0 To MFLG
  1487.       FLG(N)=0
  1488.    Next 
  1489. End Proc
  1490. Procedure SET_FLG[N]
  1491.    N1=N mod 32 : N2=N/32
  1492.    Bset N1,FLG(N2)
  1493. End Proc
  1494. Procedure CLR_FLG[N]
  1495.    N1=N mod 32 : N2=N/32
  1496.    Bclr N1,FLG(N2)
  1497. End Proc
  1498. Procedure TST_FLG[N]
  1499.    N1=N mod 32 : N2=N/32
  1500. End Proc[Btst(N1,FLG(N2))]