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