home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format 67 / af067a.adf / ACCESS.DMS / ACCESS.adf / Object_Editor.AMOS / Object_Editor.amosSourceCode < prev   
AMOS Source Code  |  1993-03-16  |  65KB  |  2,168 lines

  1. '------------------------------------------------------------------------- 
  2. ' AMOS Professional Object Editor
  3. ' By Fran�ois Lionet 
  4. ' (c) 1992 Europress Software
  5. '------------------------------------------------------------------------- 
  6. ' This program will automatically grab the banks of the previous program 
  7. ' if it is called from the editor's menu, with a command line: 
  8. ' "GRABO" will grab the Object bank if defined 
  9. ' "GRABI" will grab the Icon bank if defined 
  10. '
  11. ' IMPORTANT NOTE: bank grabbing asks for at least twice as much free ram 
  12. ' as the bank length. Grabbing does not prevent you from saving the
  13. ' bank as a security before returning to your program. 
  14. '------------------------------------------------------------------------- 
  15.  
  16. Set Buffer 14
  17. Close Editor 
  18.  
  19. VER$="1.00"
  20.  
  21. ' These two variables define the maximum size of editable bob  
  22. ' NOTE: on a 1/2 meg machine, max size is always 80x100
  23. '       and screen is always 200 lines high. 
  24. Global SXMAX,SYMAX
  25. SXMAX=320 : SYMAX=200
  26.  
  27. ' Maximum number of bobs 
  28. Global MBANK
  29. MBANK=384
  30.  
  31. ' Size of work screen. Minimum is 156, for very short memory in PAL
  32. Global YDISP,SYWORK
  33. YDISP=45 : If Ntsc Then SYWORK=156 Else SYWORK=197
  34.  
  35. ' WARNING: never break out of the program: this would leave the current
  36. '          bank in memory forever! 
  37. Break Off 
  38.  
  39. ' Grabs the command line 
  40. COM$=Command Line$
  41.  
  42. Dim CLR(3),MN$(60),MN1$(70),FLAG(26),BA(17)
  43. Global MN$(),MN1$(),FLAG(),MNON,MN1,MN2,NMN,NMN1,BMN
  44. Global RES,NCOL,PAL$,SXZOOM,SXBZOOM,SXMZOOM,SYZOOM,SCMODE
  45. Global XZM,YZM,SXZM,SYZM,XOZM,YOZM,SXOZM,SYOZM,ZM
  46. Global XBB,YBB,SXBB,SYBB,OXBB,OYBB,SXRBB,SYRBB,SXMBB,SYMBB,HXBB,HYBB
  47. Global CHANGED,CUBB,NPBB,NPLANS,HSPOT
  48. Global BCHANGED,BNAME$,VER$,BTYPE,BTYPE$,BGRB
  49. Global XBK,YBK,SXBK,SYBK
  50. Global XPT,YPT,SXPT,SYPT
  51. Global XMS,YMS,SXMS,SYMS
  52. Global CLR(),CLRF,CPAT,CPNT
  53. Global MX,MY,MS,MZ,MK,FMK,FMZ,FMS,FWT,MK3,OMS
  54. Global SCB1,SCB2
  55. Global XCOO,YCOO,CRD,ALERT,INF,INF$,MOUS
  56. Global XSP,NBSP,SXSP,SYSP,XSL,YSL,SXSL,SYSL,SXRD,SYRD,SSL,ESL
  57. Global XPAL,YPAL
  58. Global PBANK,LBANK,SPCUR,PDR,BACK,MFLAG
  59. Global ANMAX,SPA,ANX,ANY,BA()
  60. Global FUNDO,CUNDO
  61. Global PAIR,RAIR
  62. Global PNAME$,GBRES,GBNP,GBSX,GBSY,GBNC,GBBK,GBSC
  63.  
  64. Reserve As Work 13,MBANK*4 : Fill Start(13) To Start(13)+Length(13),0
  65. Areg(1)=Start(13) : Dreg(1)=MBANK : Dreg(0)=0 : Call 14
  66.  
  67. ' Menu definitions 
  68. BMN=20 : BPIC=10 : MN1=3 : MN2=56
  69. N=0 : Repeat : N=N+1 : Read MN1$(N) : Until MN1$(N)="End" : NMN1=N
  70. N=BMN+10 : Repeat : N=N+1 : Read MN$(N) : Until MN$(N)="End" : NMN=N-1
  71. Data "0  01000160_About","0  04160096_Mndisc","0  05256096_MnBank","0  52352048_Mngrab","0  06400048_MnHspt","0  07448048_SPalette","0  08496048_MnRes","0  09544048_MnAnim","0  10592048_MnQuit"
  72. Data "1/ 00000000","1  04000096_Mnmain","1/ 02096000","1  13160144_Dsload","1  14304096_DsMerge","1  15400096_Dssave","1  16496096_Dssavas","1FE17592048_SFlag"
  73. Data "2/ 00000000","2  05000096_Mnmain","2/ 02096000","2  18160096_BkGet","2  19256096_BkPut","2  20352048_BkPutTo","2  21400048_BkIns","2  22448048_Bkdel","2  23496048_BkNew","2FG24544048_SFlag","2FH25592048_SFlag"
  74. Data "3/ 00000000","3  52000048_GbBack","3/ 02048000","3  45160096_GbGrab","3  46256096_BkPutTo","3  47352096_GBload","3FF48448048_SFlag","3C 49496048_GBmod1","3c 50544048_GBMod2","3c 51592048_GBMod3"
  75. Data "4/ 00000000","4  06000048_HsOut","4/ 02048000"
  76. Data "4FI27160048_SFlag","4B 28208048_HSet","4b 29256048_HSet","4b 30304048_HSet","4b 31352048_HSet","4b 32400048_HSet","4b 33448048_HSet","4b 34496048_HSet","4b 35544048_HSet","4b 36592048_Hset"
  77. Data "5/ 00000000","5  08000048_MnMain","5/ 02048000"
  78. Data "5FJ37160096_SFlag","5fK38256096_SRes","5c 39352048_Sncol","5c 40400048_SNcol","5c 41448048_SNcol","5c 42496048_SNcol","5c 43544048_SNcol","5c 44592048_SNcol"
  79. Data "End"
  80. Data "a+*00_SPlot0","a+*01_SPlot1","a+*02_SLine","a+*03_SBox","a+*04_SEll","a+*05_SAir","a+*06_SBar","a+*07_SPaint","a+*08_SText","a+*09_GBloc","a+*10_RBloc","fA*11_SFlag","  *12_Clr","/ *13"
  81. Data "a+*14_Scrol1","a+*15_Scrol2","  *16_XSym","  *17_YSym","  *18_Rot","/ *19"
  82. Data "a+*20_Grab","fD*21_SZoom","/ *22"
  83. Data "  *23_SClrf","fC*24_DMode","  *25_Undo"
  84. Data "End"
  85.  
  86. ' Variable init
  87. If Chip Free+Fast Free<250000
  88.    SXMAX=80 : SYMAX=100 : SYWORK=156
  89. End If 
  90. CLR(1)=5 : CLR(2)=0
  91. RES=1 : NPLANS=4 : CLRF=2
  92. SXBZOOM=160
  93. SXRBB=Min(48,SXMAX) : SYRBB=Min(64,SYMAX) : SXBB=SXRBB : SYBB=SYRBB : OXBB=0 : OYBB=0
  94. CPAT=1 : CPNT=0 : RAIR=6 : PAIR=49
  95. PBANK=1 : SPCUR=PBANK
  96. HSPOT=1 : GBMODE=1
  97. THI=8 : CSTYLE=0 : TJAM=0 : DJAM=1
  98. SPA=50
  99. ANX=40 : ANY=SYWORK-40
  100.  
  101. _INIT_MENUS : ZM=2+FLAG(3)*2 : _INIT_WORK[-1] : _LIMIT_MOUSE
  102. _DEL_BANK
  103. CUBB=0
  104.  
  105. If Prg Under
  106.    If COM$="GRABO"
  107.       BGRB=1 : _GRAB_FIND["Sprites "]
  108.       If Param : _GRAB_BANK[Param] : If Param : _DISPLAY_BANK : End If : End If 
  109.    End If 
  110.    If COM$="GRABI"
  111.       BGRB=1 : _GRAB_FIND["Icons   "]
  112.       If Param : _GRAB_BANK[Param] : If Param : _DISPLAY_BANK : End If : End If 
  113.    End If 
  114. End If 
  115.  
  116. GINF$="_MINF" : Gosub _MNMAIN
  117. Screen 1 : Fade 1 To 2 : Wait 16
  118. FMK=1 : FMZ=32 : FMS=0
  119.  
  120.  
  121. ' Main loop
  122. Do 
  123.    Screen 1
  124.    Repeat 
  125.       '
  126.       UFL=-1
  127.       '
  128.       If ALERT
  129.          ALERT=ALERT-1 : If ALERT=0 : Gosub _NEWINF : End If 
  130.       Else 
  131.          LOWMEM=0
  132.          If Chip Free+Fast Free<24000
  133.             If PDR<>3 : If OBLOC : Del Block 2 : OBLOC=0 : End If : End If 
  134.             A$=">>> Chip:"+Str$(Chip Free)+" - Fast:"+Str$(Fast Free)
  135.             If Chip Free>12000
  136.                A$=A$+" - You should free at least 10k <<<" : LOWMEM=1
  137.             Else 
  138.                A$=A$+" - Memory too low, drawing banned. <<<" : LOWMEM=2
  139.                _NOPDR
  140.                GBMODE=1
  141.                If GBBK : Erase GBBK : GBBK=0 : End If 
  142.                If GBSC : Screen Close 3 : GBSC=0 : End If 
  143.             End If 
  144.             If A$<>INF$ : INF$=A$ : _INFO[INF$,1] : INF=1 : Screen 1 : End If 
  145.          Else 
  146.             INF=INF-1 : If INF=0 : Gosub GINF$ : _INFO[INF$,1] : INF=250 : Screen 1 : End If 
  147.          End If 
  148.       End If 
  149.       '
  150.       If FMK=0
  151.          _MOUSE[0]
  152.          If KEY : If Inkey$=" " : MS=SMS : MK=SMK : MZ=SMZ : MX=SMX : MY=SMY : FWT=5 : End If : End If 
  153.       Else 
  154.          MS=FMS : MK=FMK : MZ=FMZ : MX=FMX : MY=FMY : FMK=0 : FWT=5
  155.       End If 
  156.       '
  157.       If MS=1 and LOWMEM<2
  158.          If MZ=1 or MZ=2
  159.             Gosub _COORD
  160.             If DRW$<>"" : Gosub DRW$ : End If 
  161.             OMX=MX : OMY=MY : UFL=0
  162.          Else 
  163.             If MZ>=20
  164.                _ACOL[MZ-20]
  165.             Else 
  166.                _COORDOFF
  167.             End If 
  168.          End If 
  169.       End If 
  170.       '
  171.       If MS=0 and MK=2 and MNON>0 : MZ=2 : MK=1 : End If 
  172.       If UFL : If UNDRW$<>"" : Screen 1 : Gosub UNDRW$ : UNDRW$="" : End If : End If 
  173.       '
  174.    Until MK<>0 and MZ<>0
  175.    If UFL : If UNDRW$<>"" : Screen 1 : Gosub UNDRW$ : UNDRW$="" : End If : End If 
  176.    MFLAG=0
  177.    Do 
  178.       '
  179.       If MS=0 and MK<>0
  180.          Screen 0
  181.          If MZ
  182.             A$=Left$(MN$(MZ),1) : B$=""
  183.             If A$<>"/"
  184.                If A$=" "
  185.                   B$=" " : _DISPLAY_MN[MZ,1] : _WAIT_NOMK : _DISPLAY_MN[MZ,0]
  186.                End If 
  187.                C$=Upper$(A$) : D$=Lower$(A$)
  188.                If(C$<>A$) or(D$<>A$)
  189.                   If A$="F" : B$="f" : STATE=0 : End If 
  190.                   If A$="f" : B$="F" : STATE=1 : End If 
  191.                   If B$=""
  192.                      B$=C$ : If Mid$(MN$(MZ),2,1)="+" : OMZ=MZ : End If 
  193.                      For N=1 To NMN
  194.                         If Left$(MN$(N),1)=C$
  195.                            Left$(MN$(N),1)=D$ : _DISPLAY_MN[N,0]
  196.                         End If 
  197.                      Next 
  198.                   End If 
  199.                End If 
  200.                If B$<>""
  201.                   Gosub _EFFBACK
  202.                   Left$(MN$(MZ),1)=B$ : _WAIT_NOMK : _DISPLAY_MN[MZ,-1]
  203.                   G$="" : P=Instr(MN$(MZ),"_") : If P : G$=Mid$(MN$(MZ),P) : End If 
  204.                   If B$=MNBACK$ : _SET_MENU[0] : MNBACK$="" : End If 
  205.                   If MZ>20 : KEY=-1 : SMZ=MZ : SMS=MS : SMX=MX : SMY=MY : SMK=MK : End If 
  206.                   If G$<>"" : Gosub G$ : End If 
  207.                End If 
  208.             End If 
  209.          End If 
  210.          MZ=0
  211.       End If 
  212.       '
  213.       If MS=1
  214.          Screen 1
  215.          If(MZ=1 or MZ=2) and LOWMEM<2
  216.             Gosub _COORD
  217.             If GODRW$<>"" : Gosub GODRW$ : MZ=0 : CHANGED=1 : End If 
  218.             OMX=MX : OMY=MY
  219.          End If 
  220.          If MZ>2 and MZ<20 and MFLAG=0
  221.             _COPY_HIDE
  222.             On MZ-2 Proc _SETZOOM,_SPAT,_SBORD,_XYSIZE,_XZOOM,_YZOOM,_PICK
  223.             On MZ-9 Proc _SLSL,_SLUP
  224.             If MZ>=12 : MZ=MZ-12 : Gosub _SPCUR : MZ=0 : End If 
  225.          End If 
  226.          If MZ>=20 : MZ=MZ-20 : _COLOUR : End If 
  227.       End If 
  228.       '
  229.       OMK=MK : _MOUSE[0]
  230.       If MK=0 : Exit : End If 
  231.       '
  232.       MFLAG=MFLAG+1
  233.       '
  234.    Loop 
  235. Loop 
  236.  
  237. _ABOUT: PABOUT : Return 
  238. '
  239. _MNQUIT:
  240. Gosub _LOOSIT
  241. If Param
  242.    _SEND_BANK : F=Param
  243.    If F=0
  244.       F=-1
  245.       If BCHANGED
  246.          _DIALOG["Current bank not saved. Quit anyway?",""] : F=Param
  247.       End If 
  248.    End If 
  249.    If F
  250.       _DEL_BANK : Erase 9
  251.       If GBBK : Erase GBBK : End If 
  252.       Screen Close 2 : Screen Close 6
  253.       Screen 1 : Fade 1 : Wait 16 : Screen Close 1
  254.       Screen 0 : Fade 1 : Wait 16 : Screen Close 0
  255.       Edit 
  256.    End If 
  257. End If 
  258. '
  259. _MNMAIN: Screen 0 : _SET_MENU[0] : GINF$="_MINF" : INF=1 : Return 
  260. '
  261. _MINF:
  262. INF$="Chip:"+Str$(Chip Free)+" - Fast:"+Str$(Fast Free)+" - Editing "
  263. If CUBB : INF$=INF$+BTYPE$+Str$(CUBB) Else INF$=INF$+"a new "+BTYPE$ : End If 
  264. INF$=INF$+","+Str$(SXRBB)+" x"+Str$(SYRBB)+" pixels"
  265. Return 
  266. _NEWINF: Gosub GINF$ : INF=1 : Return 
  267. '
  268. ' ANIM MENU
  269. _MNANIM: _ANIM : INF=1 : Return 
  270. '
  271. ' DISC MENU
  272. _MNDISC:
  273. _SET_MENU[1] : GINF$="_DSINF"
  274. _DSINF:
  275. INF$="Editing " : If BNAME$<>"" : INF$=INF$+Right$(BNAME$,40) Else INF$=INF$+"a new bank" : End If 
  276. INF$=INF$+" -"+Str$(LBANK)+" "+BTYPE$ : If LBANK>1 : INF$=INF$+"s" : End If 
  277. INF=1 : Return 
  278. '
  279. ' Load 
  280. _DSLOAD:
  281. _LOOSE_BOB : F=-1
  282. If BCHANGED
  283.    _DIALOG["Load new bank and lose current one ?",""] : F=Param
  284. End If 
  285. If F
  286.    F=0 : _FSEL["*.Abk","Choose an object bank",""] : F$=Param$
  287.    If F$<>""
  288.       F=-1 : _DEL_BANK : _LOAD_BANK[F$,1] : If Param : BNAME$=F$ : CUBB=0 : End If 
  289.    End If 
  290. End If 
  291. If F=0 : _NOT_DONE : End If 
  292. _DISPLAY_BANK : Gosub GINF$
  293. Return 
  294. '
  295. ' Merge
  296. _DSMERGE:
  297. _FSEL["*.Abk","Choose a bank to merge",""] : F$=Param$
  298. If F$<>"" : _LOAD_BANK[F$,SPCUR] : CUBB=0 Else _NOT_DONE : End If 
  299. _DISPLAY_BANK : Gosub GINF$
  300. Return 
  301. '
  302. ' Save as
  303. _DSSAVAS:
  304. Gosub _LOOSIT : F=0
  305. If Param
  306.    _FSEL["*.Abk","Enter a new bank name",""] : F$=Param$
  307.    If F$<>""
  308.       F=-1
  309.       BTYPE=-1 : _GET_TYPE
  310.       If Exist(F$) : _DIALOG[Right$(F$,20)+" already exists. Overwrite it?",""] : F=Param : End If 
  311.       If F : BNAME$=F$ : _SAVE_BANK[BNAME$] : BCHANGED=0 : End If 
  312.    End If 
  313. End If 
  314. If F=0 : _NOT_DONE : End If 
  315. Gosub GINF$ : Return 
  316. ' Save 
  317. _DSSAVE:
  318. Gosub _LOOSIT
  319. If Param
  320.    If BNAME$="" : _FSEL["*.Abk","Choose bank name",""] : BNAME$=Param$ : End If 
  321. If BNAME$<>"" : _GET_TYPE : _SAVE_BANK[BNAME$] : BCHANGED=0 Else _NOT_DONE : End If 
  322. End If 
  323. Gosub GINF$
  324. Return 
  325. '
  326. ' BANK MENU
  327. _MNBANK: _SET_MENU[2] : GINF$="_DSINF" : Gosub _NEWINF : Return 
  328. _BKGET: Gosub _LOOSIT : If Param : _GET_BOB[SPCUR] : _DISPLAY_BANK : End If : Return 
  329. _BKPUTTO:
  330. P=SPCUR : F=-1 : If FLAG(7) : If P<LBANK : _DIALOG["Overwrite "+BTYPE$+Str$(P)+" ?",""] : F=Param : End If : End If 
  331. Goto _BKP
  332. _BKPUT:
  333. If CUBB=0 : _INFO["Current "+BTYPE$+" has no known origin! Use ' Put To ' option instead.",1] : ALERT=250 : Return : End If 
  334. P=CUBB : F=-1
  335. _BKP:
  336. If F : _PUT_BOB[P] : CUBB=P : _DISPLAY_BANK Else _NOT_DONE : End If 
  337. Gosub _NEWINF
  338. Return 
  339. _BKINS: _INS_BOB[SPCUR] : _DISPLAY_BANK : Gosub _NEWINF : Return 
  340. _BKDEL:
  341. F=1
  342. If SPCUR>=PBANK and SPCUR<PBANK+NBSP
  343.    F=0
  344.    If SPCUR<=LBANK
  345.       F=-1 : If FLAG(7) : _DIALOG["Delete "+BTYPE$+Str$(SPCUR)+" ?",""] : F=Param : End If 
  346.       If F : _DEL_BOB[SPCUR] : _DISPLAY_BANK : End If 
  347.    End If 
  348. End If 
  349. If F=0 : _NOT_DONE : End If 
  350. If F=1 : _INFO[BTYPE$+" must be seen, to be deleted!",1] : ALERT=200 : End If 
  351. Gosub _NEWINF : Return 
  352. _BKNEW:
  353. If LBANK
  354.    _DIALOG["Erase all objects?",""]
  355.    If Param : _DEL_BANK : CUBB=0 : _DISPLAY_BANK : End If 
  356. End If 
  357. Gosub _NEWINF : Return 
  358. '  
  359. _LOOSIT: FF=FLAG(6) : FLAG(6)=0 : _LOOSE_BOB : FLAG(6)=FF : Return 
  360. '
  361. ' GRAB MENU
  362. _GBBACK:
  363. If GBMODE=2 and GBBK=0 and GBSC<>0
  364.    _INFO["Packing picture",1]
  365.    On Error Goto _GBOMM
  366.    Spack 3 To 12 : GBBK=12
  367. End If 
  368. If GBMODE<3 : If GBSC : Screen Close 3 : GBSC=0 : End If : End If 
  369. If GBMODE<>2 : If GBBK : Erase GBBK : GBBK=0 : End If : End If 
  370. _GBE: Goto _MNMAIN
  371. _GBOMM: _INFO["Out of memory, cannot pack picture.",1] : Wait 100
  372. Erase 12 : Screen Close 3 : GBBK=0 : GBSC=0 : Resume _GBE
  373. _MNGRAB: _SET_MENU[3] : GINF$="_GBINF"
  374. _GBINF:
  375. If PNAME$<>""
  376.    INF$="Current picture: "+Right$(PNAME$,20)+" - "
  377.    INF$=INF$+Str$(GBSX)+" x"+Str$(GBSY)+","+Str$(GBNC)+" colours, "
  378. If GBRES=1 : INF$=INF$+"lowres." Else INF$=INF$+"hires." : End If 
  379. Else 
  380.    INF$="No picture selected."
  381. End If 
  382. INF=1
  383. Return 
  384. _GBLOAD: PNAME$=""
  385. _GBGRAB:
  386. Gosub _LOOSIT
  387. If Param
  388.    If PNAME$=""
  389.       _GBLPIC
  390.    Else 
  391.       If GBSC=0
  392.          If GBBK
  393.             Unpack GBBK To 3 : Screen Hide 3 : GBSC=1
  394.          Else 
  395.             _GBLPIC
  396.          End If 
  397.       End If 
  398.    End If 
  399.    If GBSC : _GRABIT : End If 
  400. End If 
  401. Gosub _NEWINF : Return 
  402. _GBMOD1: GBMODE=1 : Return 
  403. _GBMOD2: GBMODE=2 : Return 
  404. _GBMOD3: GBMODE=3 : Return 
  405. '
  406. ' HOT SPOT MENU
  407. _HSOUT: FMZ=OMZ : FMK=1 : FMS=0 : Goto _MNMAIN
  408. _MNHSPT: _SET_MENU[4] : MNBACK$="A"
  409. _HSDRAW: DRW$="_hss2" : GODRW$="_Hss1" : OBL=0 : OX1=-1 : Return 
  410. _HSET:
  411. HSPOT=MZ-4 : _SET_HOTSPOT[-1]
  412. If Param$=""
  413.    _INFO["Hot spot not defined!",1]
  414. Else 
  415.    _INFO["Hot spot set to "+Param$,1]
  416. End If 
  417. ALERT=150
  418. Return 
  419. _HSS1: HXBB=MX+OXBB : HYBB=MY+OYBB
  420. _HSS2: X1=HXBB-OXBB : Y1=HYBB-OXBB : SX=0 : SY=0 : Gosub _BB : _ZOOM : UNDRW$="_HSS3" : Return 
  421. _HSS3: Gosub _BBE : _ZOOM : OX1=1 : Return 
  422. '
  423. ' RES MENU 
  424. _MNRES: _SET_MENU[5] : _RES_MENU : Return 
  425. _SRES:
  426. If STATE and NPLANS>4 Then Goto _NOHI
  427. Gosub _LOOSIT : If Param : RES=1+STATE : _INIT_WORK[-1] : End If 
  428. _RES_MENU
  429. Return 
  430. _SNCOL:
  431. NP=MZ-5
  432. If NP<>NPLANS
  433.    If RES=2 and NP>4 : Goto _NOHI : End If 
  434.    Gosub _LOOSIT : If Param : NPLANS=NP : _INIT_WORK[-1] : End If 
  435. End If 
  436. _RES_MENU
  437. Return 
  438. _NOHI: _INFO["Maximum of 16 colours in hires mode!",1] : ALERT=200 : _RES_MENU : Return 
  439. '
  440. ' Pick current sprite
  441. _SPCUR:
  442. If PBANK+MZ=SPCUR
  443.    If Timer<20 and FLAG(6)<>0
  444.       _LOOSE_BOB : If Param : _GET_BOB[SPCUR] : _DISPLAY_BANK : _NOPDR : End If 
  445.       Gosub _NEWINF
  446.    End If 
  447. Else 
  448.    SPCUR=PBANK+MZ : _DISPLAY_BANK
  449. End If 
  450. Timer=0
  451. Return 
  452. '
  453. _SPALETTE: _PALETTE : Return 
  454. '
  455. ' MINI-MENUS 
  456. '
  457. ' Plot 
  458. _SPLOT0:
  459. DRW$="" : UNDRW$="" : GODRW$="_PLOT0" : PDR=0 : Return 
  460. _PLOT0:
  461. _CUNDO : Plot XBB+MX,YBB+MY,CLR(MK) : _ZOOM : Return 
  462. _SPLOT1:
  463. _CUNDO : DRW$="" : UNDRW$="" : GODRW$="_PLOT1" : PDR=0 : Return 
  464. _PLOT1:
  465. _CUNDO : Ink CLR(MK) : Draw XBB+OMX,YBB+OMY To XBB+MX,YBB+MY : _ZOOM : Return 
  466. '
  467. ' Line 
  468. _SLINE:
  469. DROUT1$="_Line" : DROUT2$=DROUT1$ : Goto _SDRAW
  470. _LINE:
  471. Draw XBB+X1,YBB+Y1 To XBB+X1+SX,YBB+Y1+SY
  472. Return 
  473. '
  474. ' Box
  475. _SBOX: DROUT1$="_box" : DROUT2$=DROUT1$ : Goto _SDRAW
  476. _BOX: Box XBB+X1,YBB+Y1 To XBB+X1+SX,YBB+Y1+SY : Return 
  477. '
  478. ' Bar
  479. _SBAR: DROUT1$="_bar" : DROUT2$="_bbar" : Goto _SDRAW
  480. _BBAR: Ink CLR(2),CLR(1),CLR(3)
  481. _BAR:
  482. Gosub _POS
  483. If RX<>0 and RY<>0
  484.    Ink CLR(2),,CLR(3)
  485.    Set Pattern CPAT : Set Paint CPNT
  486.    Bar XBB+EX,YBB+EY To XBB+EX+RX,YBB+EY+RY
  487. End If 
  488. Return 
  489. '
  490. ' Ellipse
  491. _SELL: DROUT1$="_Ell" : DROUT2$=DROUT1$ : Goto _SDRAW
  492. _ELL:
  493. Gosub _POS
  494. RX=RX/2 : RY=RY/2
  495. If RX>0 and RY>0
  496.    Ellipse XBB+EX+RX,YBB+EY+RY,RX,RY
  497. End If 
  498. Return 
  499. _POS:
  500. X=Min(X1,X1+SX) : XX=Max(X1,X1+SX)
  501. Y=Min(Y1,Y1+SY) : YY=Max(Y1,Y1+SY)
  502. EX=Min(X,XX) : EY=Min(Y,YY)
  503. RX=Max(X,XX)-EX : RY=Max(Y,YY)-EY
  504. Return 
  505. '
  506. ' Texte
  507. _STEXT: DROUT1$="_Text" : DROUT2$=DROUT1$ : TXT$="" : PDR=-1 : KEY=0 : Goto _SDRAW
  508. _TEXT:
  509. If PDR>=0 : KEY=0 : TXT$="" : FTXT=0 : PDR=-1 : XHAND=0 : YHAND=0 : SX=0 : SY=0 : While Inkey$<>"" : Wend : Return : End If 
  510. A$=Inkey$
  511. If A$<>""
  512.    If A$=Chr$(27) : TXT$="" : End If 
  513.    If A$=Chr$(8) : If TXT$<>"" : TXT$=Left$(TXT$,Len(TXT$)-1) : End If : End If 
  514.    If A$>=" " : TXT$=TXT$+A$ : End If 
  515.    FTXT=0 : FMV=1
  516. End If 
  517. Ink CLR(1),CLR(2)
  518. Set Text CSTYLE : Gr Writing TJAM
  519. If FTXT=0
  520.    SY=THI : SX=Text Length(TXT$) : XHAND=SX : YHAND=SY : FTXT=FTXT+1
  521. Else 
  522.    Text XBB+X1,YBB+Y1+Text Base,TXT$
  523. End If 
  524. Gr Writing DJAM
  525. OMX=-1
  526. Return 
  527. '
  528. ' Aerographe 
  529. _SAIR:
  530. ' Airbrush power 
  531. If MK=2 : _SETAIR : SMK=0 : End If 
  532. DROUT1$="_Air" : DROUT2$=DROUT1$ : FMK=1 : FMS=1 : FMX=1 : FMY=1 : FMZ=1 : FAIR=1 : Goto _SDRAW
  533. _AIR:
  534. If PDR=1 : PDR=2 : SX=RAIR*2 : SY=SX : XHAND=RAIR : YHAND=RAIR : Return : End If 
  535. If FAIR : FAIR=0 : Return : End If 
  536. N=(RAIR*PAIR)/100
  537. For P=1 To N
  538.    X=RAIR-Rnd(SX) : Y=RAIR-Rnd(SX)
  539.    If X*X+Y*Y<=RAIR*RAIR
  540.       Plot XBB+X1+RAIR+X,YBB+Y1+RAIR+Y
  541.    End If 
  542. Next 
  543. Return 
  544. '
  545. ' Paint  
  546. _SPAINT: DRW$="" : GODRW$="_paint" : PDR=0 : Return 
  547. _PAINT:
  548. _CUNDO : Set Pattern CPAT : Set Paint CPNT : Ink CLR(2),CLR(1),CLR(3)
  549. Paint XBB+MX,YBB+MY : _ZOOM : _WAIT_NOMK
  550. Return 
  551. '
  552. ' Scrollings 
  553. _SCROL1: TSCR=0 : Goto _SCROL0
  554. _SCROL2: TSCR=1
  555. _SCROL0: DRW$="_Scrola" : GODRW$="_Scrolb" : PDR=0 : OSX=-1 : Return 
  556. _SCROLA:
  557. If OSX<>MX or OSY<>MY
  558.    OSX=MX : OSY=MY : Get Block 1,XBB,YBB,SXBB,SYBB,1
  559.    UNDRW$="_ScrolX"
  560. End If 
  561. Return 
  562. _SCROLB:
  563. If OSX>=0
  564.    _CUNDO : _RUNDO
  565.    If MX<>OMX or MY<>OMY
  566.       DX=MX-OSX : DY=MY-OSY
  567.       Cls 0,XBB,YBB To XBB+SXBB,YBB+SYBB
  568.       Put Block 1,XBB+DX,YBB+DY
  569.       If TSCR
  570.          Put Block 1,XBB-SXBB+DX,YBB-SYBB+DY : Put Block 1,XBB+DX,YBB-SYBB+DY : Put Block 1,XBB+SXBB+DX,YBB-SYBB+DY
  571.          Put Block 1,XBB-SXBB+DX,YBB+DY : Put Block 1,XBB+SXBB+DX,YBB+DY
  572.          Put Block 1,XBB-SXBB+DX,YBB+SYBB+DY : Put Block 1,XBB+DX,YBB+SYBB+DY : Put Block 1,XBB+SXBB+DX,YBB+SYBB+DY
  573.       End If 
  574.       _ZOOM
  575.    End If 
  576. End If 
  577. Return 
  578. _SCROLX:
  579. If OSX>=0 : Del Block 1 : BACK=0 : OSX=-1 : End If 
  580. Return 
  581. '
  582. ' Grab partie cachees de l'image 
  583. _GRAB:
  584. DRW$="_Grab0" : GODRW$="_Grab1" : OSX=-1 : Screen 1 : Gosub _DELBACK : Return 
  585. _GRAB0:
  586. If OSX<>MX or OSY<>MY : OSX=MX : OSY=MY : End If 
  587. Return 
  588. _GRAB1:
  589. _CUNDO
  590. If OSX>=0
  591.    If MX<>OSX or MY<>OSY
  592.       DX=OSX-MX : DY=OSY-MY
  593.       If OXBB+DX<0 or OXBB+DX+SXBB>SXRBB : DX=0 : End If 
  594.       If OYBB+DY<0 or OYBB+DY+SYBB>SYRBB : DY=0 : End If 
  595.       OXBB=OXBB+DX : OYBB=OYBB+DY
  596.       Screen Copy 2,OXBB,OYBB,OXBB+SXBB,OYBB+SYBB To 1,XBB,YBB
  597.       Wait Vbl : _ZOOM
  598.    End If 
  599.    OSX=MX : OSY=MY
  600. End If 
  601. Return 
  602. '
  603. ' Block
  604. _RBLOC: MZ=MZ-1 : Gosub _GBLOC : If OBLOC : PDR=3 : SX=SXBL : SY=SYBL : OMX=-1 : _RUNDO : End If : Return 
  605. _GBLOC: PDR=0 : DRW$="_GBloc0" : GODRW$="_GBloc1" : OBL=0 : BMZ=MZ : Return 
  606. '
  607. _GBLOC0:
  608. If PDR=0
  609.    X1=MX : Y1=MY : SX=0 : SY=0
  610.    Gosub _BB : _ZOOM : UNDRW$="_GBloc2"
  611. End If 
  612. If PDR=1
  613.    If SX>0 and SY>0
  614.       Gosub _BBE
  615.       Get Block 2,XBB+X1,YBB+Y1,SX+1,SY+1,1
  616.       XHAND=SX/2 : YHAND=SY/2 : OBLOC=-1
  617.       SXBL=SX : SYBL=SY : XHBL=SX/2 : YHBL=SY/2 : MX=-1
  618.       _ZOOM : FMK=1 : FMS=0 : FMZ=BMZ+1 : FMX=MX : FMY=MY
  619.    Else 
  620.       PDR=0
  621.    End If 
  622. End If 
  623. If PDR=3
  624.    If MX<>OMX or MY<>OMY
  625.       Gosub _PUTBACK : X1=MX-XHBL : Y1=MY-YHBL : Gosub _GETBACK
  626.       If FLAG(0)
  627.          Set Paint 0 : Set Pattern 0 : Ink CLR(2),CLR(2),CLR(2)
  628.          Bar XBB+X1,YBB+Y1 To XBB+X1+SX,YBB+Y1+SY
  629.       End If 
  630.       Put Block 2,XBB+X1,YBB+Y1
  631.       _ZOOM : UNDRW$="_Gbloc2"
  632.    End If 
  633. End If 
  634. Return 
  635. _GBLOC1:
  636. If PDR=0
  637.    PDR=1
  638. End If 
  639. If PDR=1
  640.    SX=MX-X1 : SY=MY-Y1 : Gosub _BB : _ZOOM : UNDRW$="_Gbloc2"
  641. End If 
  642. If PDR=3
  643.    If MK=1
  644.       If MFLAG=0 : Gosub _PUTBACK : _RUNDO : _CUNDO : Gosub DRW$ : End If 
  645.       Gosub _GETBACK : OMX=-1 : Gosub DRW$
  646.    End If 
  647.    If MK=2
  648.       XHBL=Max(0,MX-X1) : XHBL=Min(SX,XHBL)
  649.       YHBL=Max(0,MY-Y1) : YHBL=Min(SY,YHBL)
  650.    End If 
  651. End If 
  652. Return 
  653. _GBLOC2:
  654. If PDR=3
  655.    Gosub _PUTBACK
  656. Else 
  657.    Gosub _BBE : PDR=0
  658. End If 
  659. _ZOOM : Return 
  660. '  
  661. _BBE: If OBL : Gosub _BBD : OBL=0 : End If : Return 
  662. _BB:
  663. If X1<>OX1 or Y1<>OY1 or SX<>OSX or SY<>OSY
  664.    Gosub _BBE : OX1=X1 : OY1=Y1 : OSX=SX : OSY=SY : Gosub _BBD : OBL=1
  665. End If 
  666. Return 
  667. _BBD:
  668. Gr Writing 2 : Ink NCOL-1,NCOL-1,NCOL-1 : Set Pattern 0 : Set Paint 0
  669. Draw XBB-1,OY1+YBB To XBB+SXBB,OY1+YBB : Draw OX1+XBB,YBB-1 To OX1+XBB,YBB+SYBB
  670. If OSX>0 and OSY>0 : Draw XBB-1,YBB+OY1+OSY To XBB+SXBB,YBB+OY1+OSY : Draw XBB+OX1+OSX,YBB-1 To XBB+OX1+OSX,YBB+SYBB : End If 
  671. If OSX>2 and OSY>2 : Bar XBB+OX1+1,YBB+OY1+1 To XBB+OX1+OSX-1,YBB+OY1+OSY-1 : End If 
  672. Gr Writing 1
  673. Return 
  674. '
  675. ' Gestion des dessins objets...
  676. _SDRAW:
  677. Screen 1 : Gosub _DELBACK : _ZOOM
  678. DRW$="_draw0" : GODRW$="_draw1" : PDR=0 : Return 
  679. _DRAW0:
  680. If PDR=1
  681.    If FLAG(2)
  682.       X1=MX-SX : Y1=MY-SY
  683.       Gosub _DELBACK : Ink CLR(OMK) : Gosub DROUT2$
  684.       PDR=0 : CHANGED=1
  685.    Else 
  686.       PDR=2 : XHAND=SX/2 : YHAND=SY/2 : FMV=1
  687.    End If 
  688. End If 
  689. If PDR=2 or PDR<0
  690.    If MX<>OMX or MY<>OMY or FMV<>0
  691.       Gosub _PUTBACK
  692.       X1=MX-SX+XHAND : Y1=MY-SY+YHAND : Gosub _GETBACK
  693.       FMV=0
  694.    End If 
  695.    TIM=(TIM+1) mod(NCOL-1) : Ink TIM,TIM : Gosub DROUT1$
  696. End If 
  697. _ZOOM
  698. UNDRW$="_draw2"
  699. Return 
  700. _DRAW1:
  701. Gosub _PUTBACK : _CUNDO
  702. If MK=2 and FLAG(2)<>0 : PDR=0 : Gosub _DELBACK : _ZOOM : Return : End If 
  703. If MK
  704.    If PDR=0
  705.       X1=MX : Y1=MY : PDR=1
  706.    End If 
  707.    If PDR=1
  708.       SX=MX-X1 : SY=MY-Y1
  709.       Gosub _GETBACK : Ink CLR(MK) : Gosub DROUT1$
  710.    End If 
  711.    If PDR=2 or PDR<0
  712.       _RUNDO
  713.       X1=MX-SX+XHAND : Y1=MY-SY+YHAND
  714.       Ink CLR(MK) : Gosub DROUT2$ : Gosub _GETBACK
  715.    End If 
  716. End If 
  717. _ZOOM
  718. UNDRW$="_Draw2"
  719. Return 
  720. _DRAW2: Gosub _PUTBACK : _ZOOM : Return 
  721. _GETBACK:
  722. XB1=Min(X1-1,X1+SX-1) : XB2=Max(X1+1,X1+SX+1)
  723. YB1=Min(Y1-1,Y1+SY-1) : YB2=Max(Y1+1,Y1+SY+1)
  724. XB1=Max(0,XB1) : YB1=Max(0,YB1)
  725. XB2=Min(SXBB,XB2+2) : YB2=Min(SYBB,YB2+2)
  726. XB2=(XB2-XB1+16) and $FFFFFFF0
  727. YB2=Max(2,YB2-YB1)
  728. Get Block 1,XBB+XB1,YBB+YB1,XB2,YB2,0
  729. BACK=1
  730. Return 
  731. _PUTBACK: If BACK : Put Block 1 : Wait 2 : End If : Return 
  732. _DELBACK: Gosub _PUTBACK
  733. _EFFBACK: If BACK : Del Block 1 : BACK=0 : End If : Return 
  734. '
  735. ' Undo 
  736. _UNDO:
  737. For Y=0 To SYBB-1
  738.    Screen Copy 2,OXBB,OYBB+Y,OXBB+SXBB,OYBB+Y+1 To 2,OXBB,SYMAX-1
  739.    Screen Copy 1,XBB,YBB+Y,XBB+SXBB,YBB+Y+1 To 2,OXBB,OYBB+Y
  740.    Screen Copy 2,OXBB,SYMAX-1,OXBB+SXBB,SYMAX To 1,XBB,YBB+Y
  741.    FUNDO=-1
  742. Next 
  743. Screen 1 : Gosub _EFFBACK
  744. _ZOOM : SMK=0
  745. Return 
  746. '
  747. ' Clr sprite 
  748. _CLR:
  749. Screen 1
  750. _CUNDO : _RUNDO : SMK=0 : Gosub _EFFBACK
  751. Cls 0,XBB,YBB To XBB+SXBB,YBB+SYBB : _ZOOM
  752. CHANGED=1
  753. Return 
  754. '
  755. ' X Symetry  
  756. _XSYM:
  757. Screen 1 : _COPY_HIDE : _RUNDO
  758. If PDR=3
  759.    If SX<SXBB and SY<SYBB
  760.       Screen 2 : Cls 0,OXBB,OYBB To OXBB+SXBB,OYBB+SYBB : Put Block 2,OXBB,OYBB
  761.       Get Block 2,OXBB,OYBB,SX+1,SY+1 : Hrev Block 2 : Put Block 2
  762.       S=(SX+1) and 15 : X=0 : If S : X=16-S : End If 
  763.       Get Block 2,OXBB+X,OYBB,SX+1,SY+1,1
  764.       _COPY_HIDE: _INFO["Current block flipped!",1] : ALERT=150 : Screen 1
  765.    Else 
  766.       _INFO["Current block too big.",1] : ALERT=200
  767.    End If 
  768. Else 
  769.    Get Block 1,XBB,YBB,SXBB,SYBB : Hrev Block 1 : Put Block 1 : Del Block 1 : BACK=0
  770.    _ZOOM : CHANGED=1
  771. End If 
  772. SMK=0
  773. Return 
  774. '
  775. ' Y Symetry  
  776. _YSYM:
  777. Screen 1 : _COPY_HIDE : _RUNDO
  778. If PDR=3
  779.    _INFO["Current block flipped!",1] : ALERT=150 : Screen 1
  780.    Vrev Block 2
  781. Else 
  782.    Get Block 1,XBB,YBB,SXBB,SYBB
  783.    Vrev Block 1 : Put Block 1 : Del Block 1 : BACK=0
  784.    _ZOOM : _COPY_HIDE : CHANGED=1
  785. End If 
  786. SMK=0 : Return 
  787. '
  788. ' Rotation 
  789. _ROT:
  790. Screen 1 : _COPY_HIDE : _RUNDO : _CLEAN_SC2
  791. F=-1 : Screen 2 : XX=SXMAX/2 : YY=SYMAX/2
  792. If PDR<>3
  793.    If SXRBB=SXBB and SYRBB=SYBB
  794.       F=0
  795.       If SXBB<=SYMBB and SYBB<=SXMBB
  796.          If SXBB<=YY and SYBB+16<=XX and SXBB<=XX and SYBB+16<=YY
  797.             _INFO["Processing rotation. Please wait.",1]
  798.             Screen Copy 2,0,0,SXBB,SYBB To 2,0,YY
  799.             TX=SXBB : TY=SYBB : Gosub _ROTATE
  800.             SXBB=(SYRBB+15) and $FFFFFFF0 : SYBB=SXRBB : SXRBB=SXBB : SYRBB=SYBB
  801.             Screen Copy 2,XX,YY,XX+SXBB,YY+SYBB To 2,0,0
  802.             Screen 1 : _DISPLAY_ALL
  803.             _CLEAN_SC2 : CHANGED=1 : F=1 : Gosub _NEWINF
  804.          End If 
  805.       End If 
  806.    End If 
  807.    If F=0 : _INFO["Current "+BTYPE$+" too big to be rotated.",1] : ALERT=200 : End If 
  808.    If F<0 : _INFO["Please make entire "+BTYPE$+" visible before rotation.",1] : ALERT=250 : End If 
  809. Else 
  810.    If SYRBB>YY
  811.       _INFO["Current "+BTYPE$+" too big to allow rotation.",1] : ALERT=200
  812.    Else 
  813.       If SX<XX and SX<YY and SY<XX and SY<YY
  814.          _INFO["Rotating current block. Please wait.",1] : Screen 2
  815.          Put Block 2,0,YY
  816.          TX=SX+1 : TY=SY+1 : Gosub _ROTATE
  817.          SXBL=SY : SYBL=SX : SX=SXBL : SY=SYBL : XHBL=SX/2 : YHBL=SY/2
  818.          Get Block 2,XX,YY,TY,TX,1
  819.          _CLEAN_SC2
  820.          _INFO["Current block rotated!",1] : ALERT=150
  821.       Else 
  822.          _INFO["Current block too big to be rotated.",1] : ALERT=250
  823.       End If 
  824.    End If 
  825. End If 
  826. SMK=0 : Return 
  827. _ROTATE:
  828. F=-1
  829. Screen 2
  830. For X=0 To TX-1
  831.    For Y=0 To TY-1
  832.       Plot XX+TY-Y-1,YY+X,Point(X,YY+Y)
  833.    Next 
  834. Next 
  835. Return 
  836. '
  837. ' Set colour of background 
  838. _SCLRF:
  839. CLRF=CLRF+1 : If CLRF>=NCOL : CLRF=1 : End If 
  840. _INIT_WORK[0] : _DISPLAY_ALL : _ACOL[CLRF]
  841. SMK=0 : Return 
  842. '
  843. ' Change draw-mode 
  844. _DMODE:
  845. Gosub _SFLAG
  846. PDR=0 : Screen 1 : Gosub _DELBACK : SMK=0 : Return 
  847. '
  848. ' Coordinate display 
  849. _COORD:
  850. If MZ=1
  851.    Locate XCOO,YCOO : Print Using "###";MX+OXBB+XOZM;
  852.    Locate XCOO,YCOO+1 : Print Using "###";MY+OYBB+YOZM;
  853. Else 
  854.    Locate XCOO,YCOO : Print Using "###";MX+OXBB;
  855.    Locate XCOO,YCOO+1 : Print Using "###";MY+OYBB;
  856. End If 
  857. CRD=1
  858. Return 
  859. ' Set size of zoom 
  860. _SZOOM: Gosub _SFLAG : ZM=2+FLAG(3)*2 : Screen 1 : _DISPLAY_ZOOM : _ZOOM : Return 
  861. _SFLAG: _SET_FLAG[MN$(MZ)] : SMK=0 : Return 
  862. '
  863. Procedure _DISPLAY_PAT
  864.    Clip 
  865.    Ink CLR(2),CLR(1),CLR(3)
  866.    Set Pattern CPAT
  867.    Set Paint CPNT
  868.    BBAR[5,XPT+1,YPT+1,XPT+SXPT-2,YPT+SYPT-1]
  869.    Set Zone 4,XPT+4,YPT+4 To XPT+SXPT-4,YPT+SYPT-4
  870.    _CLIP
  871. End Proc
  872. Procedure _COPY_HIDE
  873.    Screen Copy 1,XBB,YBB,XBB+SXBB,YBB+SYBB To 2,OXBB,OYBB
  874. End Proc
  875. Procedure _WAIT_NOMK
  876.    If FWT
  877.       Wait FWT : FWT=0
  878.    Else 
  879.       Wait Vbl : While Mouse Key : Wend 
  880.    End If 
  881. End Proc
  882. Procedure _MOUSE[F]
  883.    Wait Vbl 
  884.    MS=Mouse Screen : M=1
  885.    MX=X Screen(MS,X Mouse) : MY=Y Screen(MS,Y Mouse) : MZ=Zone(MS,MX,MY)
  886.    MK=Mouse Key
  887.    If MS<>OMS : OMS=MS : If MK : _WAIT_NOMK : End If : MK=0 : MZ=0 : MS=1 : Pop Proc : End If 
  888.    If MK>=3 : MK=3 : MK3=0 : End If 
  889.    If MK=0 or MS<>1 : MK3=0 : End If 
  890.    If MK=2 : If MS=1 and(MZ<2 or MZ>=20)
  891.          If MK3=0 : Timer=0 : MK3=-1 : End If 
  892.          If Timer<7 : MK=OMK : End If 
  893.    End If : End If 
  894.    If MS<0 : MS=-1 : MZ=0 : End If 
  895.    If MS=1 and F=0
  896.       If MZ=1 : MX=(MX-XZM)/ZM+XOZM : MY=(MY-YZM)/ZM+YOZM : M=2 : End If 
  897.       If MZ=2 : MX=MX-XBB : MY=MY-YBB : M=2 : End If 
  898.    End If 
  899.    If M<>MOUS : Change Mouse M : MOUS=M : End If 
  900. End Proc
  901. Procedure _INIT_MENUS
  902.    Screen Open 6,640,24,4,Lowres
  903.    Screen Hide 6 : Flash Off 
  904.    Screen Open 0,640,51,4,Hires
  905.    Screen Display 0,128,YDISP-3,640,
  906.    Curs Off : Flash Off : Palette 0,0,0,0 : Cls 0
  907.    Fade 1,0,$AA,$77,$EE
  908.    Reserve Zone NMN
  909.    _SET_FLAGS : MNON=-1 : _SET_MENU[0] : _DISPLAY_MINI_MENU
  910.    XINF=8 : YINF=26 : TXINF=640-16 : TYINF=8
  911. End Proc
  912. Procedure _INIT_WORK[FL]
  913.    '
  914.    If FL
  915.       NCOL=2 : If NPLANS>1 : For N=2 To NPLANS : NCOL=NCOL*2 : Next : End If 
  916.       If CLRF>=NCOL : CLRF=1 : End If 
  917.       For C=1 To 3 : If CLR(C)>=NCOL : CLR(C)=C : End If : Next 
  918.       '
  919.       If RES=2 : R=Hires : End If 
  920.       '
  921.       Screen Open 2,SXMAX,SYMAX,NCOL,0
  922.       Flash Off : Curs Off : Cls 0 : Screen Hide 2
  923.       SCB2=Screen Base
  924.       '
  925.       Screen Open 1,320*RES,SYWORK,NCOL,R
  926.       Flash Off : Curs Off : Cls 0
  927.       Screen Display 1,,YDISP+49,, : Wait Vbl 
  928.       SCB1=Screen Base
  929.       Reserve Zone 84
  930.       '
  931.       If PAL$=""
  932.          _GET_PALETTE : For N=0 To 31 : Colour N,0 : Next 
  933.       Else 
  934.          _SET_PALETTE
  935.       End If 
  936.    End If 
  937.    '  
  938.    Screen 1 : Reset Zone : Clip 
  939.    Ink CLRF,CLRF,CLRF : Gr Writing 1
  940.    SXPT=41*RES : XPT=320*RES-SXPT : YPT=0 : SYPT=31
  941.    SXBK=41*RES : XBK=320*RES-SXBK : YBK=SYPT : SYBK=SYWORK-1-YBK
  942.    SXSL=8*RES
  943.    XSP=XBK+1 : SXSP=SXBK-SXSL : SYSP=41 : NBSP=SYBK/SYSP
  944.    SXRD=SXSP : SYRD=SYSP-9
  945.    XSL=320*RES-SXSL : YSL=YBK : SYSL=SYBK
  946.    XCOO=XPT/8+2*RES : YCOO=1
  947.    YBB=4
  948.    XZM=16*RES : YZM=4 : SYZOOM=SYWORK-8
  949.    SXZOOM=SXBZOOM*RES : SXMZOOM=272*RES-SXBK
  950.    If FL
  951.       XPAL=XZM-1 : YPAL=YZM-1
  952.       ANX=64+160*(RES-1) : ANY=SYWORK-40
  953.    End If 
  954.    '
  955.    BBOX[0,0,0,320*RES-1,SYWORK-1]
  956.    BBOX[0,XBK,YBK,XBK+SXBK,YBK+SYBK]
  957.    BBOX[0,0,0,12*RES,SYWORK-1]
  958.    BBOX[0,XPT,YPT,XPT+SXPT+RES-1,YPT+SYPT]
  959.    Paper 0 : Pen CLRF
  960.    '
  961.    _DISPLAY_SEP[2]
  962.    _DISPLAY_BOB[0]
  963.    _DISPLAY_ZOOM
  964.    '
  965.    Clip 
  966.    SXMS=6*RES : M=Min(NCOL,32) : TY=SYWORK/(M+1) : SYMS=SYWORK-TY*M-1
  967.    Set Paint 0 : Set Pattern 0
  968.    For N=0 To M-1
  969.       Ink N,0,N
  970.       If NCOL<=32
  971.          BBAR[20+N,1,SYMS+N*TY,SXMS*2-1,SYMS+N*TY+TY-1]
  972.       Else 
  973.          BBAR[20+N,1,SYMS+N*TY,SXMS-1,SYMS+N*TY+TY-1]
  974.          Ink 32+N,0,32+N
  975.          BBAR[52+N,SXMS,SYMS+N*TY,SXMS*2-1,SYMS+N*TY+TY-1]
  976.       End If 
  977.    Next 
  978.    _DISPLAY_MS
  979.    _DISPLAY_PAT
  980.    _DISPLAY_BANK
  981.    '
  982.    CHANGED=0
  983.    '
  984. End Proc
  985. Procedure _SET_FLAGS
  986.    For N=1 To NMN1 : If Upper$(Mid$(MN1$(N),2,1))="F" : _SET_FLAG[Mid$(MN1$(N),2)] : End If : Next 
  987.    For N=1 To NMN : If Upper$(Left$(MN$(N),1))="F" : _SET_FLAG[MN$(N)] : End If : Next 
  988. End Proc
  989. Procedure _SET_FLAG[A$]
  990.    V=Asc(Mid$(A$,2,1))-65
  991.    FLAG(V)=0 : If Left$(A$,1)="F" : FLAG(V)=1 : End If 
  992. End Proc
  993. Procedure _DISPLAY_BOB[F]
  994.    Clip 
  995.    Ink CLRF,CLRF,CLRF : Set Paint 1 : Set Pattern 0
  996.    XBB=32*RES+SXZOOM
  997.    SXMBB=(XBK-XBB-1) and $FFF0 : SYMBB=SYWORK-11
  998.    SXBB=Max(SXBB,SXRBB) : SYBB=Max(SYBB,SYRBB)
  999.    SXBB=Min(SXMBB,SXBB) : SYBB=Min(SYMBB,SYBB)
  1000.    If OXBB+SXBB>SXRBB : OXBB=SXRBB-SXBB : End If 
  1001.    If OYBB+SYBB>SYRBB : OYBB=SYRBB-SYBB : End If 
  1002.    BBOX[2,XBB-1,YBB-1,XBB+SXBB,YBB+SYBB]
  1003.    If Not F
  1004.       Ink 0,0,CLRF
  1005.    End If 
  1006.    BBAR[6,XBB+SXBB,YBB+SYBB,XBB+SXBB+4*RES,YBB+SYBB+4]
  1007.    Ink CLRF,CLRF
  1008.    _CLIP
  1009. End Proc
  1010. Procedure _DISPLAY_ZOOM
  1011.    Clip 
  1012.    SXOZM=0
  1013.    Reset Zone 7 : Reset Zone 8 : Reset Zone 1
  1014.    If SXZOOM>=32
  1015.       Cls 0,XZM-1,YZM-1 To XZM+SXZOOM+1,YZM+SYZOOM+1
  1016.       SXOZM=Min(SXZOOM/ZM,SXBB) and $FFF0 : SYOZM=Min(SYZOOM/ZM,SYBB)
  1017.       If SXOZM>=16
  1018.          _DISPLAY_XZOOM[2]
  1019.          _DISPLAY_YZOOM[2]
  1020.          Clip : Ink CLRF : BBOX[1,XZM-1,YZM-1,XZM+SXZM,YZM+SYZM]
  1021.       End If 
  1022.    End If 
  1023.    _CLIP
  1024. End Proc
  1025. Procedure _DISPLAY_XZOOM[F]
  1026.    Clip 
  1027.    Set Paint 1 : Set Pattern F
  1028.    If XOZM<0 : XOZM=0 : End If 
  1029.    D=SXBB-XOZM-SXOZM
  1030.    If D<0
  1031.       XOZM=XOZM+D
  1032.       If XOZM<0 : XOZM=0 : SXOZM=SXBB : End If 
  1033.    End If 
  1034.    SXZM=SXOZM*ZM
  1035.    Ink 0,0,CLRF : BBAR[7,XBB-1,YBB+SYBB,XBB+SXBB,YBB+SYBB+4]
  1036.    Ink CLRF,0,CLRF : BBAR[0,XBB+XOZM-1,YBB+SYBB,XBB+XOZM+SXOZM,YBB+SYBB+4]
  1037.    _CLIP
  1038. End Proc
  1039. Procedure _DISPLAY_YZOOM[F]
  1040.    Clip 
  1041.    Set Paint 1 : Set Pattern F
  1042.    If YOZM<0 : YOZM=0 : End If 
  1043.    D=SYBB-YOZM-SYOZM
  1044.    If D<0
  1045.       YOZM=YOZM+D
  1046.       If YOZM<0 : YOZM=0 : SYOZM=SYBB : End If 
  1047.    End If 
  1048.    SYZM=SYOZM*ZM
  1049.    Ink 0,0,CLRF : BBAR[8,XBB+SXBB,YBB-1,XBB+SXBB+4*RES,YBB+SYBB]
  1050.    Ink CLRF,0,CLRF : BBAR[0,XBB+SXBB,YBB+YOZM-1,XBB+SXBB+4*RES,YBB+YOZM+SYOZM]
  1051.    _CLIP
  1052. End Proc
  1053. Procedure _DISPLAY_BANK
  1054.    Screen 1 : Clip 
  1055.    YSP=YBK : Set Pattern 1 : Set Paint 1 : Ink CLRF,0,CLRF
  1056.    Z=12 : For N=Z To Z+NBSP : Reset Zone N : Next 
  1057.    For N=PBANK To PBANK+NBSP-1
  1058.       Y=0 : Ink CLRF,0,CLRF
  1059.       If N<=LBANK+1
  1060.          If SPCUR=N : Ink 0,CLRF,CLRF : End If 
  1061.          BBAR[0,XSP-1,YSP,XSP+SXSP-1,YSP+9]
  1062.          A$=Mid$(Str$(N),2)
  1063.          Text XSP+8,YSP+Text Base+1,A$
  1064.          If N=CUBB : Text XSP,YSP+Text Base+1,"*" : End If 
  1065.          Ink CLRF,0,CLRF : BBAR[Z,XSP-1,YSP+9,XSP+SXSP-1,YSP+SYSP+1]
  1066.          If N<=LBANK
  1067.             _REDUCE_BOB[N,XSP+1,YSP+10,SXRD,SYRD]
  1068.          Else 
  1069.             BTEXT[0,"E",XSP+10,YSP+20]
  1070.          End If 
  1071.       Else 
  1072.          Y=YSP : Exit 
  1073.       End If 
  1074.       YSP=YSP+SYSP : Z=Z+1
  1075.    Next 
  1076.    If Y : Cls 0,XSP,Y+2 To XSP+SXSP-1,SYWORK-1 : End If 
  1077.    _DISPLAY_SLIDER
  1078.    _CLIP
  1079. End Proc
  1080. Procedure _DISPLAY_SLIDER
  1081.    Set Paint 1 : Ink CLRF,0,CLRF
  1082.    Set Pattern 1 : BBAR[11,XSL,YSL,XSL+SXSL-1,YSL+SYSL]
  1083.    Reset Zone 10
  1084.    If LBANK>=NBSP
  1085.       SSL=YSL+(SYSL*(PBANK-1))/(LBANK+1)
  1086.       ESL=Min(YSL+SYSL,SSL+(SYSL*NBSP)/(LBANK+1))
  1087.       Set Pattern 2 : BBAR[10,XSL,SSL,XSL+SXSL-1,ESL]
  1088.    End If 
  1089. End Proc
  1090. Procedure _CLIP
  1091.    Clip XBB,YBB To XBB+SXBB,YBB+SYBB
  1092. End Proc
  1093. Procedure _DISPLAY_MS
  1094.    Clip 
  1095.    X=(SXMS*2)/3
  1096.    Ink CLR(1),CLRF,CLRF
  1097.    Set Pattern 0 : Set Paint 1
  1098.    BBAR[0,XMS,YMS,XMS+X,YMS+SYMS]
  1099.    Ink CLR(2),CLRF,CLRF
  1100.    BBAR[0,XMS+X,YMS,XMS+X*2,YMS+SYMS]
  1101.    Ink CLR(3),CLRF,CLRF
  1102.    BBAR[0,XMS+X*2,YMS,XMS+X*3,YMS+SYMS]
  1103.    Set Zone 9,XMS,YMS To XMS+SXMS*2,YMS+SYMS
  1104.    _DISPLAY_PAT
  1105. End Proc
  1106. Procedure BBOX[Z,X,Y,XX,YY]
  1107.    Box X,Y To XX,YY
  1108.    If Z : Set Zone Z,(X+1),Y To XX-1,YY-1 : End If 
  1109. End Proc
  1110. Procedure BBAR[Z,X,Y,XX,YY]
  1111.    Bar X,Y To XX,YY
  1112.    If Z : Set Zone Z,(X+1),Y To XX,YY : End If 
  1113. End Proc
  1114. Procedure BTEXT[Z,A$,X,Y]
  1115.    Set Pattern 1 : BBAR[Z,X,Y,X+Len(A$)*8+4,Y+10]
  1116.    Text X+3,Y+Text Base+2,A$
  1117. End Proc
  1118. Procedure _SET_MENU[M]
  1119.    '
  1120.    If M<>MNON
  1121.       If MNON>=0
  1122.          A$=Str$(MNON)-" " : Z=0
  1123.          For N=1 To NMN1
  1124.             If MN1$(N)=A$ : Z=Z+1 : MN1$(N)=A$+MN$(Z) : End If 
  1125.          Next 
  1126.       End If 
  1127.       '
  1128.       For N=1 To 20 : MN$(N)="" : Reset Zone N : Next 
  1129.       '
  1130.       MNON=M : A$=Str$(MNON)-" " : Z=0
  1131.       For N=1 To NMN1
  1132.          If Left$(MN1$(N),1)=A$ : Z=Z+1 : MN$(Z)=Mid$(MN1$(N),2) : MN1$(N)=Left$(MN1$(N),1) : End If 
  1133.       Next 
  1134.    End If 
  1135.    '
  1136.    For N=1 To 20
  1137.       If MN$(N)<>""
  1138.          _DISPLAY_MN[N,0]
  1139.          A$=Left$(MN$(N),1) : If(A$>="A") and(A$=<"Z") : _DISPLAY_MN[N,1] : End If 
  1140.       End If 
  1141.    Next 
  1142.    '
  1143. End Proc
  1144. Procedure _DISPLAY_MN[N,F]
  1145.    If MN$(N)<>""
  1146.       If F<0
  1147.          F=0 : A$=Left$(MN$(N),1) : If(A$>="A") and(A$=<"Z") : F=1 : End If 
  1148.       End If 
  1149.       If Mid$(MN$(N),3,1)="*"
  1150.          NN=Val(Mid$(MN$(N),4,2))
  1151.          I=NN+MN2 : X=NN*24 : Y=36 : TY=12 : TX=24 : If NN=25 : TX=36 : End If 
  1152.          If F=0
  1153.             _UNPACK[I,X,Y]
  1154.             Cls 0,X,Y+TY To X+TX,Y+TY+3
  1155.          Else 
  1156.             Screen Copy 0,X,Y+1,X+TX,Y+TY To 0,X,Y
  1157.             _UNPACK[MN2+26,X,Y+TY-1]
  1158.          End If 
  1159.       Else 
  1160.          I=Val(Mid$(MN$(N),3,2))
  1161.          X=Val(Mid$(MN$(N),5,3)) : Y=0 : TX=Val(Mid$(MN$(N),8,3)) : TY=24
  1162.          If F=0
  1163.             If I
  1164.                _UNPACK[I,X,Y]
  1165.             Else 
  1166.                Cls TX,X,Y To 640,Y+TY
  1167.             End If 
  1168.          Else 
  1169.             Zoom 0,X,Y,X+TX,Y+TY To 6,0,0,TX-8,TY-4
  1170.             Wait Vbl 
  1171.             Cls 0,X,Y To X+TX,Y+TY
  1172.             Screen Copy 6,0,0,TX-8,TY-4 To 0,X+4,Y+2
  1173.          End If 
  1174.       End If 
  1175.       If Left$(MN$(N),1)<>"/"
  1176.          Set Zone N,X,Y To X+TX,Y+TY
  1177.       End If 
  1178.    Else 
  1179.       Reset Zone N
  1180.    End If 
  1181. End Proc
  1182. Procedure _UNPACK[N,X,Y]
  1183.    Global BPIC
  1184.    A=Start(BPIC)+Deek(Start(BPIC)+2*(N-1))
  1185.    Unpack A,X,Y
  1186. End Proc
  1187. Procedure _ZOOM
  1188.    If SXOZM>=16
  1189.       Dreg(1)=ZM
  1190.       Dreg(2)=XBB+XOZM
  1191.       Dreg(3)=YBB+YOZM
  1192.       Dreg(4)=XZM
  1193.       Dreg(5)=YZM
  1194.       Dreg(6)=SXOZM
  1195.       Dreg(7)=SYOZM
  1196.       Areg(0)=SCB1
  1197.       Areg(1)=SCB1
  1198.       Call 15
  1199.    End If 
  1200. End Proc
  1201. Procedure _LIMIT_MOUSE
  1202.    Screen 0 : X=X Hard(0) : Y=Y Hard(0)
  1203.    Screen 1 : Limit Mouse X,Y To X Hard(320*RES)-1,Y Hard(SYWORK)-1
  1204. End Proc
  1205. Procedure _DISPLAY_ALL
  1206.    Screen 1
  1207.    Cls 0,XZM-RES,YZM-1 To XBK-2,SYWORK-2
  1208.    _DISPLAY_BOB[0]
  1209.    Screen Copy 2,OXBB,OYBB,OXBB+SXBB,OYBB+SYBB To 1,XBB,YBB
  1210.    _DISPLAY_ZOOM
  1211.    Clip : _DISPLAY_SEP[2] : _CLIP
  1212.    _ZOOM
  1213. End Proc
  1214. Procedure _DISPLAY_SEP[F]
  1215.    If F>=0
  1216.       Set Pattern F : Set Paint 1
  1217.       Ink CLRF,0,CLRF
  1218.    Else 
  1219.       Set Pattern 0 : Set Paint 1
  1220.       Ink 0,0,0
  1221.    End If 
  1222.    X=XZM+SXZOOM+6*RES : If SXZOOM=0 : X=X-2 : End If 
  1223.    BBAR[3,X,YZM-1,X+3*RES,YZM+SYWORK-8]
  1224. End Proc
  1225. Procedure _CLEAN_SC2
  1226.    Screen 2
  1227.    Cls 0,SXRBB,0 To SXMAX,SYMAX
  1228.    Cls 0,0,SYRBB To SXMAX,SYMAX
  1229.    Screen 1
  1230. End Proc
  1231. Procedure _SAVE_BANK[N$]
  1232.    On Error Proc _DISC_ERROR
  1233.    Resume Label _ERR
  1234.    Screen 0
  1235.    Open Out 1,N$
  1236.    
  1237.    If BTYPE<=0
  1238.       Print #1,"AmSp";
  1239.    Else 
  1240.       Print #1,"AmIc";
  1241.    End If 
  1242.    
  1243.    A$=String$(" ",2) : Doke Varptr(A$),LBANK : Print #1,A$;
  1244.    For N=1 To LBANK
  1245.       _INFO[">>> Saving "+BTYPE$+" #"+Str$(N)+" <<<",1]
  1246.       Dreg(0)=2 : Dreg(1)=N : Dreg(7)=0 : Call 14
  1247.       A$=String$(" ",10)
  1248.       TX=Dreg(2) : TY=Dreg(3) : NP=Dreg(4)
  1249.       For A=0 To 4 : Doke Varptr(A$)+A*2,Dreg(A+2) : Next : Print #1,A$;
  1250.       SZ=TX*2*TY*NP : AC=Areg(0) : P=0 : A$=String$(" ",1024)
  1251.       While P<SZ
  1252.          L=Min(1024,SZ-P)
  1253.          Copy AC+P,AC+P+L To Varptr(A$)
  1254.          Print #1,Left$(A$,L);
  1255.          P=P+L
  1256.       Wend 
  1257.    Next 
  1258.    A$=String$(" ",64)
  1259.    Screen 1
  1260.    For C=0 To 31 : Doke Varptr(A$)+C*2,Colour(C) : Next 
  1261.    Print #1,A$;
  1262.    Close 1 : Goto _END
  1263.    _ERR: _INFO["CAUTION: save has failed! The bank on disc is *NOT* valid!",1] : ALERT=250
  1264.    _END:
  1265. End Proc
  1266. Procedure _LOAD_BANK[N$,ST]
  1267.    '
  1268.    On Error Proc _DISC_ERROR
  1269.    Resume Label _ERR
  1270.    '
  1271.    ANMAX=0
  1272.    Screen 0 : NB=0 : OMM=0
  1273.    Open In 1,N$
  1274.    A$=Input$(1,4)
  1275.    If BTYPE<0
  1276.       If A$="AmSp" : BTYPE=0 : BTYPE$="bob" : End If 
  1277.       If A$="AmIc" : BTYPE=1 : BTYPE$="icon" : End If 
  1278.    End If 
  1279.    If(A$="AmSp") or(A$="AmIc")
  1280.       A$=Input$(1,2) : NN=Deek(Varptr(A$))
  1281.       For N=1 To NN
  1282.          If Chip Free+Fast Free>24000
  1283.             _INFO[">>> Loading "+BTYPE$+" #"+Str$(N+ST-1)+" <<<",1]
  1284.             Dreg(1)=N+ST-1 : Dreg(0)=3 : Call 14
  1285.             If Dreg(0)=0
  1286.                A$=Input$(1,10) : A=Varptr(A$)
  1287.                SX=Deek(A) : SY=Deek(A+2) : NP=Deek(A+4) : SZ=SX*2*SY*NP
  1288.                Dreg(2)=SX*16 : Dreg(3)=SY : Dreg(4)=NP
  1289.                Dreg(5)=Deek(A+6) : Dreg(6)=Deek(A+8)
  1290.                Dreg(7)=0 : Dreg(0)=1 : Call 14
  1291.                If Dreg(0)=0
  1292.                   If Chip Free+Fast Free>24000
  1293.                      AC=Areg(0) : P=0
  1294.                      While P<SZ
  1295.                         L=Min(1024,SZ-P)
  1296.                         A$=Input$(1,L)
  1297.                         Copy Varptr(A$),Varptr(A$)+L To AC+P
  1298.                         P=P+L
  1299.                      Wend 
  1300.                      NB=NB+1
  1301.                   Else 
  1302.                      Dreg(0)=5 : Dreg(1)=N+ST-1 : Call 14
  1303.                      OMM=-1 : Exit 
  1304.                   End If 
  1305.                Else 
  1306.                   OMM=-1 : Exit 
  1307.                End If 
  1308.             Else 
  1309.                OMM=-2 : Exit 
  1310.             End If 
  1311.          Else 
  1312.             OMM=-1 : Exit 
  1313.          End If 
  1314.       Next 
  1315.       If OMM=-2
  1316.          _INFO[">>> Too many objects, object loaded up to number"+Str$(NB),1] : ALERT=250
  1317.       End If 
  1318.       If OMM=-1
  1319.          _INFO[">>> Out of memory, object loaded up to number"+Str$(NB),1] : ALERT=250
  1320.       End If 
  1321.       If OMM=0
  1322.          If FLAG(4) : PAL$=Input$(1,64) : _SET_PALETTE : End If 
  1323.       End If 
  1324.       LBANK=LBANK+NB
  1325.    Else 
  1326.       _INFO[">>> This file is not an AMOS Object bank ! <<<",1] : ALERT=250
  1327.    End If 
  1328.    Close 1 : Goto _END
  1329.    '
  1330.    _ERR: _DEL_BANK : NB=0
  1331.    _END:
  1332. End Proc[NB]
  1333. Procedure _GRAB_BANK[B]
  1334.    
  1335.    ANMAX=0 : Screen 0 : NB=0 : OMM=0 : NN=0
  1336.    
  1337.    If Blength(B)
  1338.       
  1339.       AB=Bstart(B)
  1340.       A$=Peek$(AB-8,8)
  1341.       If A$="Sprites " : BTYPE$="bob" : BTYPE=0 : End If 
  1342.       If A$="Icons   " : BTYPE$="icon" : BTYPE=1 : End If 
  1343.       NN=Deek(AB)
  1344.       
  1345.       If NN
  1346.          For N=1 To NN
  1347.             If Chip Free+Fast Free>24000
  1348.                _INFO[">>> Grabbing "+BTYPE$+" #"+Str$(N)+" <<<",1]
  1349.                Dreg(1)=N : Dreg(0)=3 : Call 14
  1350.                If Dreg(0)=0
  1351.                   A=AB+2+(N-1)*8 : AA=Leek(A)
  1352.                   If AA
  1353.                      SX=Deek(AA) : SY=Deek(AA+2) : NP=Deek(AA+4) : SZ=SX*2*SY*NP
  1354.                      Dreg(2)=SX*16 : Dreg(3)=SY : Dreg(4)=NP
  1355.                      Dreg(5)=Deek(AA+6) and $FFF : Dreg(6)=Deek(AA+8) and $FFF
  1356.                      Dreg(7)=0 : Dreg(0)=1 : Call 14
  1357.                      If Dreg(0)=0
  1358.                         If Chip Free+Fast Free>24000
  1359.                            AC=Areg(0) : Copy AA+10,AA+10+SZ To AC
  1360.                            Inc NB
  1361.                         Else 
  1362.                            Dreg(0)=5 : Dreg(1)=N : Call 14
  1363.                            OMM=-1 : Exit 
  1364.                         End If 
  1365.                      Else 
  1366.                         OMM=-1 : Exit 
  1367.                      End If 
  1368.                   End If 
  1369.                Else 
  1370.                   OMM=-2 : Exit 
  1371.                End If 
  1372.             Else 
  1373.                OMM=-1 : Exit 
  1374.             End If 
  1375.          Next 
  1376.       End If 
  1377.    End If 
  1378.    
  1379.    If OMM
  1380.       _DEL_BANK : NB=0
  1381.       _INFO[">>> Out of memory, cannot grab bank!",1] : ALERT=250
  1382.    Else 
  1383.       If NN : A=AB+2+NN*8 : PAL$=Peek$(A,64) : _SET_PALETTE : End If 
  1384.    End If 
  1385.    
  1386.    LBANK=LBANK+NB
  1387.    
  1388. End Proc[NB]
  1389. Procedure _SET_PALETTE
  1390.    Screen 2
  1391.    For C=0 To 31
  1392.       Colour C,Deek(Varptr(PAL$)+C*2)
  1393.    Next 
  1394.    Screen 1 : Get Palette 2
  1395. End Proc
  1396. Procedure _GET_PALETTE
  1397.    Screen 1
  1398.    PAL$=String$(" ",64)
  1399.    For C=0 To 31
  1400.       Doke Varptr(PAL$)+C*2,Colour(C)
  1401.    Next 
  1402. End Proc
  1403. Procedure _GRAB_BOB[N,D]
  1404.    Dreg(0)=2 : Dreg(1)=N : Dreg(7)=-1 : Areg(0)=SCB2 : Call 14
  1405.    If Dreg(0)=0
  1406.       Screen 2
  1407.       Get Bob D,0,0 To Dreg(2)*16,Dreg(3)
  1408.       Hot Spot D,Dreg(5),Dreg(6)
  1409.       Screen 1
  1410.    End If 
  1411. End Proc
  1412. Procedure _SEND_BANK
  1413.    
  1414.    F=0
  1415.    
  1416.    If BGRB
  1417.       If LBANK
  1418.          
  1419.          _GET_TYPE
  1420.          Erase 1+BTYPE
  1421.          OMM=0
  1422.          
  1423.          _DIALOG["Copy bank to previous program?",""]
  1424.          If Param
  1425.             _SET_PALETTE
  1426.             For N=1 To LBANK
  1427.                _INFO[">>> Sending "+BTYPE$+" #"+Str$(N)+" <<<",1]
  1428.                Dreg(0)=2 : Dreg(1)=N : Dreg(7)=-1 : Areg(0)=SCB2 : Call 14
  1429.                If Dreg(0)=0
  1430.                   Screen 2
  1431.                   If BTYPE=0
  1432.                      Trap Get Bob N,0,0 To Dreg(2)*16,Dreg(3)
  1433.                      If Errtrap=0 : Hot Spot N,Dreg(5),Dreg(6) : End If 
  1434.                   Else 
  1435.                      Trap Get Icon N,0,0 To Dreg(2)*16,Dreg(3)
  1436.                   End If 
  1437.                   Screen 1
  1438.                   If Errtrap : OMM=-1 : Exit : End If 
  1439.                End If 
  1440.             Next 
  1441.             
  1442.             If OMM=0
  1443.                Bsend 1+BTYPE : F=-1
  1444.             Else 
  1445.                Bell : _INFO[">>> Out of memory! Cannot transfer back!",1] : Wait 250
  1446.             End If 
  1447.             
  1448.             Erase 1
  1449.             
  1450.          End If 
  1451.       End If 
  1452.    End If 
  1453.    
  1454. End Proc[F]
  1455.  
  1456. Procedure _GET_BOB[N]
  1457.    Screen 2 : Cls 0 : CUBB=0
  1458.    If N<LBANK+1
  1459.       Dreg(0)=2 : Dreg(1)=N : Dreg(7)=0 : Areg(0)=SCB2 : Call 14
  1460.       If Dreg(2)*16>SXMAX or Dreg(3)>SYMAX
  1461.          _INFO[">>> Object too big to be edited! <<<",1] : ALERT=100
  1462.       Else 
  1463.          Repeat 
  1464.             Dreg(0)=2 : Dreg(1)=N : Dreg(7)=-1 : Areg(0)=SCB2 : Call 14
  1465.             If Dreg(2)*Dreg(3)
  1466.                NPBB=Dreg(4) : HXBB=Dreg(5) : HYBB=Dreg(6)
  1467.                OXBB=0 : OYBB=0
  1468.                SXRBB=Dreg(2)*16 : SYRBB=Dreg(3)
  1469.                SXBB=Min(SXMBB,SXRBB) : SYBB=Min(SYMBB,SYRBB)
  1470.                CUBB=N : CHANGED=0 : _SET_HOTSPOT[0]
  1471.                F=0
  1472.                If FLAG(9)
  1473.                   If NPLANS<>NPBB
  1474.                      If RES=2 and NPBB>4 : RES=1 : End If 
  1475.                      F=-1
  1476.                   End If 
  1477.                End If 
  1478.                If F : NPLANS=NPBB : _INIT_WORK[-1] : _RES_MENU : End If 
  1479.             End If 
  1480.          Until F=0
  1481.       End If 
  1482.    Else 
  1483.       Cls 0
  1484.       CUBB=N : CHANGED=0 : _SET_HOTSPOT[0]
  1485.    End If 
  1486.    _DISPLAY_ALL
  1487. End Proc
  1488. Procedure _LOOSE_BOB
  1489.    F=-1
  1490.    If CHANGED
  1491.       If FLAG(6)<>0 and CUBB<>0
  1492.          _PUT_BOB[CUBB]
  1493.       Else 
  1494.          _DIALOG["Current "+BTYPE$+" not saved into bank. Continue?",""]
  1495.          If Param=0 : _NOT_DONE : F=0 : End If 
  1496.       End If 
  1497.    End If 
  1498. End Proc[F]
  1499. Procedure _GET_TYPE
  1500.    If BTYPE<0
  1501.       _DIALOG["Save current bank as a bob bank?","YES=> Bobs, NO=> Icons"]
  1502.       BTYPE=0 : BTYPE$="bob" : If Param=0 : BTYPE=1 : BTYPE$="icon" : End If 
  1503.    End If 
  1504. End Proc
  1505. Procedure _PUT_BOB[N]
  1506.    _COPY_HIDE
  1507.    Dreg(0)=1
  1508.    Dreg(1)=N : Dreg(2)=SXRBB : Dreg(3)=SYRBB : Dreg(4)=-1 : Dreg(5)=HXBB : Dreg(6)=HYBB
  1509.    Areg(0)=SCB2 : Dreg(7)=-1 : Call 14
  1510.    If Dreg(0)=0
  1511.       If N>LBANK
  1512.          LBANK=LBANK+1
  1513.          If SPCUR=LBANK : SPCUR=SPCUR+1 : End If 
  1514.          If PBANK+NBSP=LBANK+1 : PBANK=PBANK+1 : End If 
  1515.       End If 
  1516.       CHANGED=0 : BCHANGED=1 : F=-1
  1517.    Else 
  1518.       _INFO[">>> Out of memory! Cannot put "+BTYPE$+" into bank. Press mousekey.<<<",1]
  1519.       _WAIT_NOMK : Repeat : Until Mouse Key : _WAIT_NOMK : F=0
  1520.    End If 
  1521. End Proc[F]
  1522. Procedure _INS_BOB[N]
  1523.    If SPCUR<=LBANK
  1524.       Dreg(0)=3 : Dreg(1)=N : Call 14
  1525.       If Dreg(0)=0
  1526.          _PUT_BOB[N]
  1527.          If Param
  1528.             LBANK=LBANK+1
  1529.          Else 
  1530.             Dreg(0)=5 : Dreg(1)=N : Call 14
  1531.          End If 
  1532.          ANMAX=0
  1533.       End If 
  1534.    Else 
  1535.       _PUT_BOB[N]
  1536.    End If 
  1537. End Proc[Param]
  1538. Procedure _DEL_BOB[N]
  1539.    Dreg(0)=5 : Dreg(1)=N : Call 14
  1540.    If PBANK+NBSP>LBANK+2
  1541.       If PBANK>1 : PBANK=PBANK-1 : End If 
  1542.    End If 
  1543.    If SPCUR>LBANK : SPCUR=LBANK+1 : End If 
  1544.    If CUBB=N : CUBB=0 : End If 
  1545.    If CUBB>N : CUBB=CUBB-1 : End If 
  1546.    LBANK=LBANK-1 : BCHANGED=1 : ANMAX=0
  1547. End Proc
  1548. Procedure _DEL_BANK
  1549.    Dreg(0)=6 : Call 14
  1550.    LBANK=0 : PBANK=1 : CUBB=1 : SPCUR=1 : BCHANGED=0
  1551.    BNAME$="" : ANMAX=0 : BTYPE=-1 : BTYPE$="object"
  1552. End Proc
  1553. Procedure _REDUCE_BOB[N,X,Y,SX,SY]
  1554.    Dreg(0)=7 : Areg(0)=SCB1
  1555.    Dreg(1)=N : Dreg(2)=X : Dreg(3)=Y : Dreg(4)=SX : Dreg(5)=SY
  1556.    Call 14
  1557. End Proc
  1558. Procedure _DISPLAY_MINI_MENU
  1559.    _UNPACK[MN2-1,0,24]
  1560.    For N=20 To NMN
  1561.       _DISPLAY_MN[N,0] : _DISPLAY_MN[N,-1]
  1562.    Next 
  1563.    ALERT=1
  1564. End Proc
  1565. Procedure _INFO[A$,C]
  1566.    Screen 0
  1567.    Cls 1,8,26 To 632,26+8
  1568.    Ink 3
  1569.    X=8
  1570.    If C
  1571.       L=Text Length(A$) : X=320-L/2
  1572.    End If 
  1573.  
  1574.    Text X,26+Text Base,A$
  1575. End Proc
  1576. Procedure _DIALOG[A$,B$]
  1577.    _INFO["",0] : ZZ=BMN+8
  1578.    Screen Copy 0,0,36,640,51 To 6,0,0
  1579.    Wait Vbl 
  1580.    Cls 0,0,48 To 640,51
  1581.    Screen Copy 0,0,24,640,36 To 0,0,36 : Screen Copy 0,0,26,640,34 To 0,0,30
  1582.    Ink 3
  1583.    If B$=""
  1584.       Text 8,32+Text Base,A$
  1585.    Else 
  1586.       Text 8,28+Text Base,A$ : Text 8,36+Text Base,B$
  1587.    End If 
  1588.    Gosub _GLOU : Z=1 : Gosub _GLOU
  1589.    Do 
  1590.       _MOUSE[0]
  1591.       If MS=0
  1592.          If MK=1
  1593.             Z=MZ-ZZ : If Z=0 or Z=1 : Exit : End If 
  1594.          End If 
  1595.       End If 
  1596.    Loop 
  1597.    F=-1 : Gosub _GLOU : _WAIT_NOMK
  1598.    _UNPACK[MN2-1,0,24] : Screen Copy 6,0,0,640,16 To 0,0,36
  1599.    Reset Zone ZZ : Reset Zone ZZ+1
  1600.    Goto _GLA
  1601.    _GLOU:
  1602.    X=448+96*Z : Y=24 : TX=96 : TY=24
  1603.    _UNPACK[MN2-3+Z,X,Y]
  1604.    If F : Screen Copy 0,X,Y+1,X+TX,Y+TY To 0,X,Y : Cls 0,X,Y+TY-1 To X+TX,Y+TY : End If 
  1605.    Set Zone ZZ+Z,X,Y To X+TX,Y+TY
  1606.    Return 
  1607.    _GLA:
  1608. End Proc[Z-1]
  1609. Procedure _NOT_DONE
  1610.    _INFO[">>> Not done <<<",1] : ALERT=100
  1611. End Proc
  1612. Procedure _SET_HOTSPOT[F]
  1613.    If F=0 : F=1-FLAG(8) : End If 
  1614.    X=HXBB : Y=HYBB
  1615.    If F
  1616.       On HSPOT Gosub H1,H2,H3,H4,H5,H6,H7,H8,H9
  1617.    End If 
  1618.    If X<>HXBB or Y<>HYBB : CHANGED=1 : End If 
  1619.    Goto _SKIP
  1620.    H1: HXBB=0 : HYBB=0 : A$="Top left" : Return 
  1621.    H2: HXBB=SXRBB/2 : HYBB=0 : A$="Top centre" : Return 
  1622.    H3: HXBB=SXRBB-1 : HYBB=0 : A$="Top right" : Return 
  1623.    H4: HXBB=0 : HYBB=SYRBB/2 : A$="Middle left" : Return 
  1624.    H5: HXBB=SXRBB/2 : HYBB=SYRBB/2 : A$="Centre" : Return 
  1625.    H6: HXBB=SXRBB-1 : HYBB=SYRBB/2 : A$="Middle right" : Return 
  1626.    H7: HXBB=0 : HYBB=SYRBB-1 : A$="Bottom left" : Return 
  1627.    H8: HXBB=SXRBB/2 : HYBB=SYRBB-1 : A$="Bottom centre" : Return 
  1628.    H9: HXBB=SXRBB-1 : HYBB=SYRBB-1 : A$="Bottom right" : Return 
  1629.    _SKIP:
  1630. End Proc[A$]
  1631. Procedure _RES_MENU
  1632.    Screen 0
  1633.    If MNON=5
  1634.       For N=5 To 11 : Left$(MN$(N),1)="c" : _DISPLAY_MN[N,0] : Next 
  1635.       Left$(MN$(6+NPLANS-1),1)="C" : _DISPLAY_MN[6+NPLANS-1,1]
  1636.       A$="f" : If RES=2 : A$="F" : End If 
  1637.       Left$(MN$(5),1)=A$ : _DISPLAY_MN[5,0] : _DISPLAY_MN[5,-1]
  1638.    End If 
  1639. End Proc
  1640. Procedure _DISC_ERROR
  1641.    _INFO[">>> Disc error! Press mousekey to go on <<<",1]
  1642.    _WAIT_NOMK : Repeat : Until Mouse Key : _WAIT_NOMK
  1643.    Close 
  1644.    Resume Label 
  1645. End Proc
  1646. Procedure _FSEL[F$,T1$,T2$]
  1647.    If Chip Free>32000
  1648.       F$=Fsel$(F$,"",T1$,T2$)
  1649.    Else 
  1650.       Screen Open 7,640,24,2,Hires
  1651.       Colour 1,$FFF
  1652.       Centre ">>> Low-memory file selector! <<<"
  1653.       Centre At(,1)+"You *MUST* free some memory now!"
  1654.       Centre At(,2)+"...press any key..."
  1655.       Wait Key 
  1656.       Cls : Centre At(,0)+T1$ : Locate 0,1 : Input "Enter name >";F$
  1657.       Screen Close 7
  1658.    End If 
  1659. End Proc[F$]
  1660. Procedure _ANIM
  1661.    Dim XA(16),YA(16)
  1662.    On Error Goto _MEM
  1663.    XA=8 : If RES=2 : XA=160+8 : End If 
  1664.    YA=4 : TXA=32*8+8 : TYA=40 : TXP=40 : XAS=XA+144 : YAS=60
  1665.    _LOOSE_BOB : If Param=0 : Pop Proc : End If 
  1666.    Screen 1 : Reset Zone : _DISPLAY_BANK
  1667.    Set Paint 1 : Set Pattern 1 : Ink CLRF,0,CLRF : Clip 
  1668.    BBAR[0,0,0,XBK,SYWORK-1]
  1669.    For N=1 To 8 : XA(N)=XA+N*32-24 : YA(N)=YA+12 : XA(N+8)=XA(N) : YA(N+8)=YA(N)+48 : Next 
  1670.    For N=0 To 43 : Box XA+N*6+1,YA+2 To XA+N*6+4,YA+6 : Next 
  1671.    Screen Copy 1,XA,YA,XA+TXA,YA+9 To 1,XA,YA+38
  1672.    Draw XA,YA To XA+TXA,YA : Draw XA,YA+46 To XA+TXA,YA+46
  1673.    ANN=8 : If SYWORK>180 : ANN=16 : YAS=YAS+48 : Screen Copy 1,XA,YA,XA+TXA+4,YA+48 To 1,XA,YA+48 : End If 
  1674.    For N=ANMAX+1 To ANN : BA(N)=0 : Next 
  1675.    For N=1 To ANN : Gosub _ABOB : Next : Gosub _AASLI
  1676.    BTEXT[41," Quit ",XA+TXA-56,SYWORK-16]
  1677.    BBAR[42,XA+7,YAS,XAS-8,SYWORK-8]
  1678.    '
  1679.    Do 
  1680.       _MOUSE[1]
  1681.       If MS=1 and MK=1
  1682.          If MZ=10 : _SLSL : Clip : End If 
  1683.          If MZ=11 : _SLUP : Clip : If MK=1 : _WAIT_NOMK : End If : End If 
  1684.          If MZ>11 and MZ<20
  1685.             B=MZ-12+PBANK : N=ANMAX+1
  1686.             If B<=LBANK and N<=ANN : BA(N)=B : Gosub _ABOB : ANMAX=N : _WAIT_NOMK : End If 
  1687.          End If 
  1688.          If MZ>20 and MZ<=20+ANMAX
  1689.             Bob Off 1 : Wait Vbl 
  1690.             For N=MZ-20 To ANMAX : BA(N)=BA(N+1) : Del Bob MZ-20 : Next 
  1691.             For N=MZ-20 To ANMAX : Gosub _ABOB : Next 
  1692.             ANMAX=ANMAX-1 : _WAIT_NOMK : ANP=1 : ANC=101
  1693.          End If 
  1694.          If MZ=40 : X=MX-XAS-8 : X=Max(0,X) : X=Min(100,X) : If X<>SPA : SPA=X : Gosub _AASLI : End If : End If 
  1695.          If MZ=41 : Exit : End If 
  1696.          If MZ=42 : ANX=MX : ANY=MY : If ANMAX : Bob 1,ANX,ANY,ANP : End If : End If 
  1697.       End If 
  1698.       If ANMAX
  1699.          ANC=ANC+SPA
  1700.          If ANC>100
  1701.             ANC=ANC-100
  1702.             ANP=ANP+1 : If ANP>ANMAX : ANP=1 : End If 
  1703.             Bob 1,ANX,ANY,ANP
  1704.             Limit Bob 1,XA+8,YAS+1 To XAS-8,SYWORK-8
  1705.          End If 
  1706.       End If 
  1707.       MFLAG=MFLAG+1
  1708.    Loop 
  1709.    _BACK:
  1710.    Bob Off : Wait Vbl 
  1711.    Erase 1 : Cls 0
  1712.    If CUBB : _GET_BOB[CUBB] : End If 
  1713.    _INIT_WORK[0] : _ZOOM : _ROPTION
  1714.    Pop Proc
  1715.    _AASLI:
  1716.    Set Pattern 1 : BBAR[40,XAS,YAS,XAS+116,YAS+16]
  1717.    Set Pattern 2 : BBAR[0,XAS+SPA,YAS,XAS+16+SPA,YAS+16]
  1718.    Text XAS,YAS+32,"Speed:"+Str$(SPA)+"  "
  1719.    Return 
  1720.    _ABOB:
  1721.    Bob Off 1 : Wait Vbl 
  1722.    Set Paint 1 : Set Pattern 1
  1723.    BBAR[20+N,XA(N)-2,YA(N)-1,XA(N)+26,YA(N)+24]
  1724.    If BA(N)
  1725.       _GRAB_BOB[BA(N),N]
  1726.       _REDUCE_BOB[BA(N),XA(N),YA(N),24,24]
  1727.    End If 
  1728.    ANC=100
  1729.    Return 
  1730.    _MEM:
  1731.    _INFO[">>> Out of memory! Press mousekey to go on.<<<",1]
  1732.    _WAIT_NOMK : Repeat : Until Mouse Key : _WAIT_NOMK
  1733.    Screen 1 : Resume _BACK
  1734. End Proc
  1735. Procedure PABOUT
  1736.    XP=160*RES-160 : YP=YZM-1 : SXP=319 : SYP=92
  1737.    Screen 1 : _COPY_HIDE
  1738.    Clip 
  1739.    Set Paint 1 : Ink CLRF,0,CLRF
  1740.    Set Pattern 1 : BBAR[0,XP,YP,XP+SXP,YP+SYP]
  1741.    Text XP+8,YP+20,"AMOS Pro. Object Editor, V "+VER$
  1742.    Text XP+8,YP+40,"Design and Program by Fran�ois Lionet"
  1743.    Text XP+8,YP+50,"Graphics by A.Flockhart & D.Anderson"
  1744.    Text XP+8,YP+66,"(c) 1992 Europress Software Ltd."
  1745.    BTEXT[1," Go on ",XP+SXP-64,YP+SYP-14]
  1746.    Repeat : _MOUSE[1] : Until MS=1 and MZ=1 and MK=1
  1747.    Cls 0 : _INIT_WORK[0] : _DISPLAY_ALL : _WAIT_NOMK
  1748. End Proc
  1749. Procedure _ROPTION
  1750.    Global FMK,SMK,FMZ,SMZ,FMS,SMS,FMX,SMX,FMY,SMY
  1751.    FMK=SMK : FMZ=SMZ : FMS=SMS : FMX=SMX : FMY=SMY
  1752. End Proc
  1753. Procedure _SLUP
  1754.    Repeat 
  1755.       If MY<SSL : If PBANK>1 : PBANK=PBANK-1 : _DISPLAY_BANK : End If : End If 
  1756.       If MY>ESL : If PBANK<=LBANK-NBSP+1 : PBANK=PBANK+1 : _DISPLAY_BANK : End If : End If 
  1757.       _MOUSE[1]
  1758.    Until MK<>2
  1759. End Proc
  1760. Procedure _SLSL
  1761.    DY=MY-SSL
  1762.    Repeat 
  1763.       _MOUSE[1]
  1764.       Y=MY-YSL-DY : P=(Y*(LBANK+1))/SYSL+1
  1765.       If P>0 and P<=LBANK-NBSP+2 and P<>PBANK
  1766.          PBANK=P : _DISPLAY_BANK
  1767.       End If 
  1768.    Until MK=0
  1769. End Proc
  1770. Procedure _PALETTE
  1771.    Dim CC(3)
  1772.    XP=XPAL : YP=YPAL : SXP=22*8 : SYP=19*8
  1773.    _INFO[">>> Click with right button in palette to change background colour <<<",1] : ALERT=1
  1774.    Screen 1 : _COPY_HIDE
  1775.    OPAL$=PAL$
  1776.    Do 
  1777.       Clip 
  1778.       Get Block 3,XP,YP,SXP,SYP,0
  1779.       XC=XP+8 : YC=YP+18*8 : XB=XP+SXP-6*8
  1780.       Set Paint 1 : Ink CLRF,0,CLRF
  1781.       Set Pattern 1 : BBAR[0,XP,YP,XP+SXP-1,YP+SYP-1]
  1782.       BTEXT[0,"$   ",XB,YP+64]
  1783.       For C=0 To 15
  1784.          Text XC,YC-C*8,Hex$(C,1)-"$"
  1785.          Draw XC+8,YC-C*8-3 To XP+8+32*3,YC-C*8-3
  1786.       Next 
  1787.       CC=CLR(1)
  1788.       Do 
  1789.          _DISPLAY_MS : _DISPLAY_PAT : _ACOL[CC] : Ink CLRF,0,CLRF : Set Paint 1 : Set Pattern 1 : Clip 
  1790.          F=1 : If CC>=32 : F=2 : End If 
  1791.          CC(0)=(Colour(CC)/256)/F : CC(1)=(Colour(CC)/16 and $F)/F : CC(2)=(Colour(CC) and $F)/F
  1792.          For C=0 To 2 : Gosub _DSLI : Next 
  1793.          Ink CC,0,CLRF : Set Pattern 0 : BBAR[0,XB,YP+80,XB+4*8+4,YP+SYP-8] : Ink CLRF,0,CLRF
  1794.          BTEXT[4," Ok ",XB,YP+17] : BTEXT[5,"Undo",XB,YP+33] : BTEXT[6,"Quit",XB,YP+49]
  1795.          Set Pattern 2 : BBAR[7,XP,YP,XP+SXP-1,YP+8]
  1796.          Do 
  1797.             MS=Mouse Screen
  1798.             If MS=1
  1799.                MX=X Screen(X Mouse) : MY=Y Screen(Y Mouse) : MK=Mouse Key : MZ=Mouse Zone
  1800.                If MK<>0 and MZ<>0
  1801.                   If MZ<=3
  1802.                      C=MZ-1 : A=(YC-MY)/8
  1803.                      If CC<32 : If CC(C)<>A : CC(C)=A : Colour CC,CC(0)*256+CC(1)*16+CC(2) : Gosub _DSLI : End If : End If 
  1804.                   End If 
  1805.                   If MZ>=20
  1806.                      If MK=1
  1807.                         _GET_PALETTE : CC=MZ-20 : CLR(1)=CC : Exit 
  1808.                      Else 
  1809.                         CLRF=MZ-20 : _DISPLAY_ALL : _INIT_WORK[0] : _DISPLAY_ALL : Exit 2
  1810.                      End If 
  1811.                   End If 
  1812.                   If MZ=4 : Exit 3 : End If 
  1813.                   If MZ=5 : _SET_PALETTE : Exit : End If 
  1814.                   If MZ=6 : PAL$=OPAL$ : _SET_PALETTE : Exit 3 : End If 
  1815.                   If MZ=7
  1816.                      Get Block 4,XP,YP,SXP,SYP,0
  1817.                      DX=XP-MX : DY=YP-MY
  1818.                      While MK
  1819.                         X=MX+DX : Y=MY+DY
  1820.                         X=Max(X,XZM) : X=Min(X,XBK-SXP)
  1821.                         Y=Max(0,Y) : Y=Min(Y,SYWORK-SYP)
  1822.                         If X<>XP or Y<>YP
  1823.                            Put Block 3,XP,YP : XP=X : YP=Y
  1824.                            Get Block 3,XP,YP,SXP,SYP,0 : Put Block 4,XP,YP
  1825.                         End If 
  1826.                         MX=X Screen(1,X Mouse) : MY=Y Screen(1,Y Mouse) : MK=Mouse Key
  1827.                      Wend 
  1828.                      Put Block 3 : Del Block 4
  1829.                      Exit 2
  1830.                   End If 
  1831.                End If 
  1832.             End If 
  1833.          Loop 
  1834.          _WAIT_NOMK
  1835.       Loop 
  1836.       _WAIT_NOMK
  1837.    Loop 
  1838.    _WAIT_NOMK
  1839.    Put Block 3 : Del Block 3
  1840.    XPAL=XP : YPAL=YP
  1841.    _GET_PALETTE : _INIT_WORK[0] : _ZOOM
  1842.    Pop Proc
  1843.    _DSLI:
  1844.    X=XC+24+C*32
  1845.    Set Pattern 1 : BBAR[C+1,X,YC-16*8+1,X+16,YC]
  1846.    Set Pattern 2 : BBAR[0,X,YC-CC(C)*8-7,X+16,YC-CC(C)*8]
  1847.    Text XB+C*8+10,YP+72,Hex$(CC(C))-"$"
  1848.    BCHANGED=1
  1849.    Return 
  1850. End Proc
  1851. Procedure _SETAIR
  1852.    Dim CC(3)
  1853.    XP=XZM-1 : YP=YZM-1 : SXP=156 : SYP=88 : XC=XP+32 : YC=YP+32
  1854.    Screen 1 : _COPY_HIDE
  1855.    Clip 
  1856.    Set Paint 1 : Ink CLRF,0,CLRF
  1857.    Set Pattern 1 : BBAR[0,XP,YP,XP+SXP,YP+SYP]
  1858.    Text XP+10,YP+12,"Airbrush settings"
  1859.    Text XC,YC-4,"Power"
  1860.    Text XC,YC+24-4,"Width"
  1861.    BTEXT[3," Ok ",XP+SXP-40,YP+SYP-16]
  1862.    CC(0)=PAIR : CC(1)=(RAIR-2)*10
  1863.    For C=0 To 1 : Gosub _DSLA : Next 
  1864.    Do 
  1865.       _MOUSE[1]
  1866.       If MS=1
  1867.          If MK<>0 and MZ<>0
  1868.             If MZ<=2
  1869.                C=MZ-1 : A=MX-XC-4 : A=Max(A,0) : A=Min(A,99)
  1870.                If CC(C)<>A : CC(C)=A : Gosub _DSLA : End If 
  1871.             End If 
  1872.             If MZ=3 : Exit : End If 
  1873.          End If 
  1874.       End If 
  1875.    Loop 
  1876.    _WAIT_NOMK : _DISPLAY_ALL
  1877.    PAIR=CC(0) : RAIR=CC(1)/10+2
  1878.    Pop Proc
  1879.    _DSLA:
  1880.    Y=YC+C*24
  1881.    Set Pattern 1 : BBAR[C+1,XC,Y,XC+107,Y+8]
  1882.    Set Pattern 2 : BBAR[0,XC+CC(C),Y,XC+CC(C)+8,Y+8]
  1883.    Text XC-24,Y+Text Base,"   " : Text XC-24,Y+Text Base+1,Mid$(Str$(CC(C)+1),2)
  1884.    Return 
  1885. End Proc
  1886. Procedure _NOPDR
  1887.    If BACK : Del Block 1 : BACK=0 : End If 
  1888. End Proc
  1889. Procedure _RUNDO
  1890.    If FUNDO : _COPY_HIDE : FUNDO=0 : End If 
  1891. End Proc
  1892. Procedure _CUNDO
  1893.    If MFLAG=0 : _COPY_HIDE : FUNDO=0 : End If 
  1894. End Proc
  1895. Procedure _PICK
  1896.    _WAIT_NOMK
  1897.    K=MK
  1898.    Repeat 
  1899.       _MOUSE[0]
  1900.       If MS=1 and(MZ=1 or MZ=2)
  1901.          C=Point(XBB+MX,YBB+MY) : _ACOL[C]
  1902.       Else 
  1903.          _COORDOFF : C=-1
  1904.       End If 
  1905.    Until MK
  1906.    If C>=0 : CLR(MK)=C : _DISPLAY_MS : End If 
  1907.    _WAIT_NOMK
  1908. End Proc
  1909. Procedure _SBORD
  1910.    CPNT=1-CPNT : _DISPLAY_PAT : _WAIT_NOMK
  1911. End Proc
  1912. Procedure _SPAT
  1913.    If MK=2 : CPAT=CPAT+1 : If CPAT>34 : CPAT=0 : End If : End If 
  1914.    If MK=1 : CPAT=CPAT-1 : If CPAT<0 : CPAT=34 : End If : End If 
  1915.    _DISPLAY_PAT : _WAIT_NOMK
  1916. End Proc
  1917. Procedure _ACOL[C]
  1918.    Locate XCOO,YCOO : Print "Col";
  1919.    Locate XCOO,YCOO+1 : Print Using " ##";C : CRD=2
  1920. End Proc
  1921. Procedure _COORDOFF
  1922.    If CRD : _DISPLAY_PAT : CRD=0 : End If 
  1923. End Proc
  1924. Procedure _COLOUR
  1925.    CLR(MK)=MZ
  1926.    _DISPLAY_MS
  1927.    _WAIT_NOMK
  1928. End Proc
  1929. Procedure _XZOOM
  1930.    X=MX-XBB
  1931.    If X<XOZM
  1932.       If XOZM>=8 : XOZM=XOZM-8 : _DISPLAY_XZOOM[2] : _ZOOM : End If 
  1933.       If MK=2 : MFLAG=-1 : End If 
  1934.       Pop Proc
  1935.    End If 
  1936.    If X>XOZM+SXOZM
  1937.       If XOZM+SXOZM<SXBB : XOZM=XOZM+8 : _DISPLAY_XZOOM[2] : _ZOOM : End If 
  1938.       If MK=2 : MFLAG=-1 : End If 
  1939.       Pop Proc
  1940.    End If 
  1941.    _DISPLAY_XZOOM[0] : OZX=-1
  1942.    Repeat 
  1943.       _MOUSE[1]
  1944.       If MS=1
  1945.          If OZX<0 : OZX=MX : End If 
  1946.          DX=MX-OZX
  1947.          If Abs(DX)>=8
  1948.             XOZM=XOZM+(Abs(DX) and $FFF8)*Sgn(DX)
  1949.             _DISPLAY_XZOOM[0] : _ZOOM : OZX=MX
  1950.          End If 
  1951.       End If 
  1952.    Until MK=0
  1953.    _DISPLAY_XZOOM[2]
  1954. End Proc
  1955. Procedure _YZOOM
  1956.    Y=MY-YBB
  1957.    If Y<YOZM
  1958.       If YOZM>=8 : YOZM=YOZM-8 : _DISPLAY_YZOOM[2] : _ZOOM : End If 
  1959.       If MK=2 : MFLAG=-1 : End If 
  1960.       Pop Proc
  1961.    End If 
  1962.    If Y>YOZM+SYOZM
  1963.       If YOZM+SYOZM<SYBB : YOZM=YOZM+8 : _DISPLAY_YZOOM[2] : _ZOOM : End If 
  1964.       If MK=2 : MFLAG=-1 : End If 
  1965.       Pop Proc
  1966.    End If 
  1967.    _DISPLAY_YZOOM[0] : OZY=-1
  1968.    Repeat 
  1969.       _MOUSE[1]
  1970.       If MS=1
  1971.          If OZY<0 : OZY=MY : End If 
  1972.          DY=MY-OZY
  1973.          If DY
  1974.             YOZM=YOZM+DY : _DISPLAY_YZOOM[0] : _ZOOM : OZY=MY
  1975.          End If 
  1976.       End If 
  1977.    Until MK=0
  1978.    _DISPLAY_YZOOM[2]
  1979. End Proc
  1980. Procedure _XYSIZE
  1981.    _COPY_HIDE : _NOPDR
  1982.    OSX=SXRBB : OSY=SYRBB
  1983.    OMX=XBB+SXBB+2 : OMY=YBB+SYBB+2
  1984.    X Mouse=X Hard(OMX) : Y Mouse=Y Hard(OMY)
  1985.    Hide On : _DISPLAY_BOB[-1] : F=1
  1986.    Repeat 
  1987.       _MOUSE[1]
  1988.       If MS=1
  1989.          X=MX-XBB-SXBB-2 : DX=0 : If Abs(X)>8 : DX=Sgn(X)*16 : End If 
  1990.          DY=MY-YBB-SYBB-2
  1991.          If DX<>0 or DY<>0 or F<>0
  1992.             SX=SXRBB+DX : F=0
  1993.             If SX<16 : SX=16 : End If 
  1994.             If SX>SXMAX : SX=SXMAX : End If 
  1995.             SY=SYRBB+DY
  1996.             If SY<1 : SY=1 : End If 
  1997.             If SY>SYMAX : SY=SYMAX : End If 
  1998.             SXRBB=SX : SYRBB=SY
  1999.             If SXRBB<=SXMBB and SYRBB<=SYMBB
  2000.                SXBB=SXRBB : SYBB=SYRBB
  2001.             End If 
  2002.             If SXRBB>SXMBB and SYRBB<=SYMBB
  2003.                SXBB=SXMBB : SYBB=SYRBB
  2004.             End If 
  2005.             If SXRBB<=SXMBB and SYRBB>SYMBB
  2006.                SYBB=SYMBB : SXBB=SXRBB
  2007.             End If 
  2008.             If SXRBB>SXMBB and SYRBB>SYMBB
  2009.                SXBB=SXMBB : SYBB=SYMBB
  2010.             End If 
  2011.             Cls 0,XBB+SXBB,YBB-1 To XBB+SXMBB+5*RES,YBB+SYMBB+5
  2012.             Cls 0,XBB-1,YBB+SYBB To XBB+SXMBB+5*RES,YBB+SYMBB+5
  2013.             Ink CLRF : _DISPLAY_BOB[-1]
  2014.             Screen Copy 2,SXRBB-SXBB,SYRBB-SYBB,SXRBB,SYRBB To 1,XBB,YBB
  2015.             If DX : X Mouse=X Hard(XBB+SXBB+2) : End If 
  2016.             Y Mouse=Y Hard(YBB+SYBB+2)
  2017.             _INFO["X size:"+Str$(SXRBB)+" pixels - Y size:"+Str$(SYRBB)+" pixel(s)",1] : Screen 1
  2018.          End If 
  2019.       End If 
  2020.    Until MK=0
  2021.    _DISPLAY_BOB[0] : Show On 
  2022.    OXBB=Min(SXRBB-SXBB,OXBB) : OYBB=Min(SYRBB-SYBB,OYBB)
  2023.    Screen Copy 2,OXBB,OYBB,OXBB+SXBB,OYBB+SYBB To 1,XBB,YBB
  2024.    _CLIP : _DISPLAY_ZOOM : _ZOOM
  2025.    SX=0 : SY=0 : CHANGED=1 : ALERT=1
  2026.    If SXRBB>OSX or SYRBB>OSY
  2027.       _CLEAN_SC2
  2028.       _INFO[">>> Hidden areas erased! <<<",1] : ALERT=150
  2029.    Else 
  2030.       _INFO[">>> Enlarge "+BTYPE$+" to get hidden areas back! <<<",1] : ALERT=150
  2031.    End If 
  2032. End Proc
  2033. Procedure _SETZOOM
  2034.    _NOPDR : _RUNDO : Clip : _DISPLAY_SEP[-1]
  2035.    Repeat 
  2036.       _MOUSE[1]
  2037.       If MS=1
  2038.          If MX<>OMX
  2039.             If BACK : Put Block 1 : BACK=0 : End If 
  2040.             SXZOOM=MX-XZM-7*RES
  2041.             If SXZOOM<0 : SXZOOM=0 : End If 
  2042.             If SXZOOM>SXMZOOM : SXZOOM=SXMZOOM : End If 
  2043.             Get Block 1,XZM+SXZOOM,YZM-1,16*RES,SYWORK-4 : BACK=1
  2044.             _DISPLAY_SEP[0]
  2045.             OMX=MX
  2046.          End If 
  2047.       End If 
  2048.    Until MK=0
  2049.    SXZOOM=SXZOOM and $FFF0 : SXBZOOM=SXZOOM/RES
  2050.    If BACK : Put Block 1 : Del Block 1 : BACK=0 : End If 
  2051.    _DISPLAY_ALL
  2052. End Proc
  2053. Procedure _GRABIT
  2054.    '
  2055.    If GBRES<>RES or GBNP<>NPLANS
  2056.       If FLAG(9)
  2057.          RES=GBRES : NPLANS=GBNP
  2058.          _INIT_WORK[-1] : _DISPLAY_ALL
  2059.       End If 
  2060.    End If 
  2061.    '
  2062.    Screen Hide 0 : Screen Hide 1 : Screen Show 3 : Wait Vbl 
  2063.    If FLAG(5) : Screen 1 : Get Palette 3 : _GET_PALETTE : End If 
  2064.    '
  2065.    Screen Open 4,320,8,2,Lowres : Curs Off : Palette $F40,$FFF : Screen Display 4,,20,,
  2066.    Screen 3 : Clip : Limit Mouse : Gr Writing 2 : PDR=1 : O=0 : OMX=-1
  2067.    Ink GBNB-1,GBNB-1,GBNB-1 : Set Pattern 0 : Set Paint 0
  2068.    Repeat 
  2069.       Wait Vbl 
  2070.       MS=Mouse Screen : MK=Mouse Key
  2071.       If MY>150
  2072.          Screen Display 4,,45,,
  2073.       Else 
  2074.          Screen Display 4,,45+SYWORK,,
  2075.       End If 
  2076.       If MS=3
  2077.          MX=X Screen(X Mouse) : MY=Y Screen(Y Mouse)
  2078.          If MX<>OMX or MY<>OMY or MK<>OMK
  2079.             On PDR Gosub GB1,GB2,GB3
  2080.             OMX=MX : OMY=MY : OMK=MK
  2081.          End If 
  2082.       End If 
  2083.    Until PDR=0 or PDR=4
  2084.    If O : Gosub _BX : End If 
  2085.    '
  2086.    Screen Close 4
  2087.    '
  2088.    Screen Hide 3 : Screen Show 0 : Screen Show 1 : Wait Vbl 
  2089.    If PDR=4
  2090.       Screen 2 : Cls 0
  2091.       Screen Copy 3,X1,Y1,X2+1,Y2+1 To 2,0,0
  2092.       OXBB=0 : OYBB=0 : SXRBB=Min((SX+1+15) and $FFF0,SXMAX) : SYRBB=Min(SY+1,SYMAX)
  2093.       SXBB=Min(SXMBB,SXRBB) : SYBB=Min(SYMBB,SYRBB)
  2094.       _SET_HOTSPOT[0]
  2095.       Screen 1 : CUBB=0 : _DISPLAY_ALL : _DISPLAY_BANK : CHANGED=1
  2096.    End If 
  2097.    _LIMIT_MOUSE : _NOPDR : _WAIT_NOMK
  2098.    Pop Proc
  2099.    GB1:
  2100.    Ink GBNC-1
  2101.    If O : Gosub _BX : O=0 : End If 
  2102.    If PDR=1 : X1=MX : Y1=MY : X2=X1 : Y2=Y1 : Gosub _BX : O=1 : End If 
  2103.    Screen 4 : Centre "   X:"+Str$(X1)+" - Y:"+Str$(Y1)+"   " : Screen 3
  2104.    If MK=1 : PDR=2 : End If 
  2105.    If MK=2 : PDR=0 : End If 
  2106.    Return 
  2107.    GB2:
  2108.    If O : Gosub _BX : O=0 : End If 
  2109.    If MX>X1 and MY>Y1 : X2=MX : Y2=MY : Gosub _BX : O=1 : End If 
  2110.    Screen 4 : Centre "  X:"+Str$(X1)+" - Y:"+Str$(Y1)+" / SX:"+Str$(X2-X1+1)+" - SY:"+Str$(Y2-Y1+1)+"  " : Screen 3
  2111.    If MK=0 : PDR=3 : SX=X2-X1 : SY=Y2-Y1 : If O=0 : PDR=1 : End If : End If 
  2112.    Return 
  2113.    GB3:
  2114.    If O : Gosub _BX : O=0 : End If 
  2115.    X2=MX : Y2=MY : X1=MX-SX : Y1=MY-SY
  2116.    If X1<0 : X1=0 : X2=SX : End If 
  2117.    If Y1<0 : Y1=0 : Y2=SY : End If 
  2118.    Gosub _BX : O=1
  2119.    Screen 4 : Centre "  X:"+Str$(X1)+" - Y:"+Str$(Y1)+" / SX:"+Str$(SX+1)+" - SY:"+Str$(SY+1)+"  " : Screen 3
  2120.    If MK=1 : PDR=4 : End If 
  2121.    If MK=2 : PDR=1 : Screen 4 : Cls : Screen 3 : _WAIT_NOMK : End If 
  2122.    Return 
  2123.    _BX:
  2124.    Draw -1,Y1 To GBSX,Y1 : Draw X1,-1 To X1,GBSY
  2125.    If X2>X1 and Y2>Y1 : Draw -1,Y2 To GBSX,Y2 : Draw X2,-1 To X2,GBSY : End If 
  2126.    If X2-X1>2 and Y2-Y1>2 : Bar X1+1,Y1+1 To X2-1,Y2-1 : End If 
  2127.    Return 
  2128. End Proc
  2129. Procedure _GBLPIC
  2130.    If GBSC : Screen Close 3 : GBSC=0 : End If 
  2131.    If GBBK : Erase GBBK : GBBK=0 : End If 
  2132.    If PNAME$=""
  2133.       _FSEL["**","Please choose a picture to load","IFF file only!"] : PNAME$=Param$
  2134.    End If 
  2135.    On Error Goto _MEM
  2136.    If PNAME$<>""
  2137.       If Exist(PNAME$)
  2138.          _INFO["Loading "+PNAME$,1]
  2139.          Load Iff PNAME$,3 : Screen Hide 3 : GBSC=1
  2140.          GBSX=Screen Width : GBSY=Screen Height : GBNC=Screen Colour
  2141.          C=1 : For GBNP=1 To 8 : C=C*2 : Exit If C=GBNC : Next 
  2142.          GBRES=1 : If(Screen Mode and $8000)<>0 : GBRES=2 : End If 
  2143.       Else 
  2144.          _INFO[">>> File not found! <<<",1] : ALERT=100 : PNAME$=""
  2145.       End If 
  2146.    End If 
  2147.    _BACK: On Error 
  2148.    Pop Proc
  2149.    _MEM: _INFO[">>> Out of memory: cannot load picture! Press mousekey <<<",1]
  2150.    _WAIT_NOMK : Repeat : Until Mouse Key : _WAIT_NOMK
  2151.    PNAME$=""
  2152.    Resume _BACK
  2153. End Proc
  2154. Procedure _GRAB_FIND[C$]
  2155.    
  2156.    If Prg Under
  2157.       
  2158.       For B=1 To 512
  2159.          If Blength(B)
  2160.             If Peek$(Bstart(B)-8,8)=C$
  2161.                BB=B : Exit 
  2162.             End If 
  2163.          End If 
  2164.       Next 
  2165.       
  2166.    End If 
  2167.    
  2168. End Proc[BB]