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

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