home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / Amos / AmosCRAFT2Turbo.DMS / in.adf / fontgrabber / TURBOFontGrabber.AMOS / TURBOFontGrabber.amosSourceCode < prev   
Encoding:
AMOS Source Code  |  1994-03-09  |  41.2 KB  |  2,107 lines

  1. ' TURBO Font Grabber v1.0
  2. '
  3. ' Copyright ï¿½ 1994 PLAYFIELD!.  All Rights Reserved. 
  4.  
  5. 'please do not redistribute this program!
  6. 'support your developers and they'll support you with better programs
  7.  
  8. Set Buffer 16
  9. Break Off 
  10. Dim MITEMS(3),MNUMS(3),CB(254),CX(254),CW(254),CH(254),FR(31),FG(31),FB(31)
  11. Global K,SK,MK,X,Y,MPICK,MITEMS(),MNUMS(),QUIT
  12. Global FON,BON,PON,FY,BY,PY,BH,FRES,HRES,PROP
  13. Global PICW,PICH,BITX,BITY
  14. Global DEF_PICNAME$,DEF_FSAVENAME$,_SAVED
  15. Global XOFF,YOFF,XCUT,YCUT
  16. Global GMODE,GSTEP
  17. Global GGTX,GGTY,GGBX,GGBY,GGDX,GGDY
  18. Global GGB
  19. Global DEF$,NC,FW,FH,CB(),CX(),CW(),CH(),FR(),FG(),FB(),FBOX,YVIEW,FBUT
  20. Global CC,PC,PLOP,PLPC
  21. Global _CUT,CUB,CUX,CUW,CUH,CUS,CUD$
  22. Global _MTX,_MTY,_MBX,_MBY
  23. Global _MX,_MY,_MON,XR,YR,_SP
  24. _INIT
  25. _MAIN
  26. _QUIT
  27. Procedure _MAIN
  28.  QUIT=0
  29.  _QUIET
  30.  Repeat 
  31.   '                    Get input from mouse and keyboard 
  32.   MK=Mouse Key
  33.   _MCHECK
  34.   X=_MX : Y=_MY
  35.   SK=Key Shift
  36.   If SK=0 or SK=1 or SK=2 or SK=128
  37.    If SK=2
  38.     SK=1
  39.    End If 
  40.    K=Instr("lsqgpfb"+Chr$(8)+"ssss"+"xcvn",Inkey$)-Key State(70)*32
  41.    Add K,-(Key State(79)*9+Key State(78)*10+Key State(76)*11+Key State(77)*12)
  42.   Else 
  43.    _QUIET
  44.    SK=0
  45.    K=0
  46.   End If 
  47.   If K
  48.    _DOKEY
  49.   End If 
  50.   If MK=2
  51.    If Y/2<12
  52.     Proc _MENU
  53.     If MPICK
  54.      _DOMENU
  55.     End If 
  56.    Else 
  57.     If BON
  58.      If Y/2>=BY and Y/2<=(BY+BH-1)
  59.       _BRMB
  60.      End If 
  61.     End If 
  62.    End If 
  63.    _QUIET
  64.   Else 
  65.    If MK=1
  66.     If Y/2<12 and X>582
  67.      _MLMB
  68.      MC
  69.     End If 
  70.     If PON
  71.      If Y/2>=PY and Y/2<=(PY+36)
  72.       _PLMB
  73.       MC
  74.      End If 
  75.     End If 
  76.     If BON
  77.      If Y/2>=BY and Y/2<=(BY+BH-1)
  78.       _BLMB
  79.       MC
  80.      End If 
  81.     End If 
  82.     If FON
  83.      If Y/2>=FY and Y/2<=(FY+56)
  84.       _FLMB
  85.       MC
  86.      End If 
  87.     End If 
  88.     _QUIET
  89.    Else 
  90.     If BON
  91.      _FBOX
  92.      If Y/2>=BY and Y/2<=(BY+BH-1)
  93.       _BNONE
  94.      End If 
  95.     End If 
  96.    End If 
  97.   End If 
  98.   If Key State(69) Then _DOQUIT
  99.  Until QUIT
  100. End Proc
  101. Procedure _DOQUIT
  102.  If _SAVED=0
  103.   _DOREQUEST[12]
  104.   _SAVED=Param
  105.  End If 
  106.  Screen 0
  107.  QUIT=_SAVED
  108. End Proc
  109. Procedure _DOREQUEST[REQ]
  110.  Screen Open 6,640,16,16,Hires
  111.  Screen Display 6,,50+92,640,16
  112.  Curs Off : Flash Off : Cls 0
  113.  Get Icon Palette 
  114.  Paste Icon 0,0,REQ
  115.  _QUIET
  116.  DC=0 : OK=0
  117.  Repeat 
  118.   MK=Mouse Key
  119.   _MCHECK
  120.   X=_MX : Y=_MY/2
  121.   A=Instr("yn",Inkey$)
  122.   If Key Shift Then A=0
  123.   If A=2
  124.    DC=1
  125.   Else 
  126.    If A=1
  127.     DC=1 : OK=1
  128.    End If 
  129.   End If 
  130.   If A Then _QUIET
  131.   If MK=1
  132.    If Y>93 and Y<106 and X>516 and X<637
  133.     DC=1
  134.     QBUT=(X-517)/60
  135.     GAD[517+QBUT*60,2,60,12,2,1]
  136.     If QBUT=0
  137.      OK=1
  138.     End If 
  139.     _QUIET
  140.     GAD[517+QBUT*60,2,60,12,2,0]
  141.    End If 
  142.    _QUIET
  143.   Else 
  144.    If MK=2
  145.     DC=1
  146.     _QUIET
  147.    End If 
  148.   End If 
  149.  Until DC=1
  150.  Screen Close 6
  151. End Proc[OK]
  152. Procedure _DOKEY
  153.  If K=16 and SK=128 Then _NEW
  154.  If K=3 and SK=128 Then _DOQUIT
  155.  If K=1 and SK=0 Then _LOADIFF
  156.  If K=1 and SK=128 Then _LOAD
  157.  If K=2 and SK=128 Then _SAVEAS
  158.  If K=4 and SK=0 Then _GSELNORM
  159.  If K=4 and SK=128 Then _GSELGRID
  160.  If K=7 and SK=128 Then _GSELPROP
  161.  If K=6 and SK=0 Then _FON
  162.  If K=7 and SK=0 Then _BON
  163.  If K=5 and SK=0 Then _PON
  164.  If K=8 and SK=0 Then _BACKSPACE
  165.  If K=9 and SK=0 Then _LEFT
  166.  If K=10 and SK=0 Then _RIGHT
  167.  If K=9 and SK=1 Then _WAYLEFT
  168.  If K=10 and SK=1 Then _WAYRIGHT
  169.  If K=11 and SK=0 Then _MOVEUP
  170.  If K=12 and SK=0 Then _MOVEDOWN
  171.  If K=11 and SK=1 Then _VIEWUP
  172.  If K=12 and SK=1 Then _VIEWDOWN
  173.  If K=13 and SK=128 Then _CUT
  174.  If K=14 and SK=128 Then _COPY
  175.  If K=15 and SK=128 Then _PASTE
  176.  If K=32 and SK=0 Then _DELETE
  177.  _QUIET
  178. End Proc
  179. Procedure _DOMENU
  180.  If MPICK=16
  181.   _ABOUT
  182.  End If 
  183.  If MPICK=18
  184.   _NEW
  185.  End If 
  186.  If MPICK=19
  187.   _LOAD
  188.  End If 
  189.  If MPICK=20
  190.   _SAVE
  191.  End If 
  192.  If MPICK=21
  193.   _SAVEAS
  194.  End If 
  195.  If MPICK=23
  196.   _DOQUIT
  197.  End If 
  198.  If MPICK=32
  199.   _LOADIFF
  200.  End If 
  201.  If MPICK=33
  202.   _FLUSHIFF
  203.  End If 
  204.  If MPICK=35
  205.   _GETIFFPAL
  206.  End If 
  207.  If MPICK=48
  208.   _GSELNORM
  209.  End If 
  210.  If MPICK=49
  211.   _GSELGRID
  212.  End If 
  213.  If MPICK=50
  214.   _GSELPROP
  215.  End If 
  216.  If MPICK=52
  217.   _DELETE
  218.  End If 
  219.  If MPICK=54
  220.   _CUT
  221.  End If 
  222.  If MPICK=55
  223.   _COPY
  224.  End If 
  225.  If MPICK=56
  226.   _PASTE
  227.  End If 
  228.  If MPICK=64
  229.   _PON
  230.  End If 
  231.  If MPICK=65
  232.   _FON
  233.  End If 
  234.  If MPICK=66
  235.   _BON
  236.  End If 
  237.  If MPICK=68
  238.   _TESTFONT
  239.  End If 
  240. End Proc
  241. Procedure _NEW
  242.  If _SAVED=0
  243.   _DOREQUEST[12]
  244.   _SAVED=Param
  245.  End If 
  246.  If _SAVED
  247.   DEF_FSAVENAME$=""
  248.   DEF$="" : NC=0 : FW=0 : FH=0
  249.   For A=0 To 254
  250.    CB(A)=0 : CX(A)=0 : CW(A)=0
  251.   Next 
  252.   CC=0 : Erase 1
  253.   _GSELNORM
  254.   _GETIFFPAL
  255.   _SAVED=1
  256.   _FFONT
  257.   _FDEF
  258.  End If 
  259. End Proc
  260. Procedure _LOAD
  261.  CANLOAD=1
  262.  GNP=1
  263.  If NC>0
  264.   GNP=0
  265.   _DOREQUEST[13]
  266.   If Param=0
  267.    _NEW
  268.    If NC>0
  269.     CANLOAD=0
  270.    End If 
  271.    GNP=1
  272.   End If 
  273.  End If 
  274.  If CANLOAD
  275.   Show 
  276.   SUG$=""
  277.   If DEF_FSAVENAME$<>""
  278.    SUG$=DEF_FSAVENAME$+".abk"
  279.   End If 
  280.   A$=Fsel$("*.abk",SUG$,"Select a Font bank","Chip Free ="+Str$(Chip Free))
  281.   Hide 
  282.   If Len(A$)>4
  283.    FP$=Left$(A$,Len(A$)-4)
  284.    If Upper$(A$)=Upper$(FP$+".abk")
  285.     If Exist(FP$+".abk") and Exist(FP$+".fin")
  286.      Repeat 
  287.       C=Instr(FP$,":")
  288.       If C
  289.        FP$=Mid$(FP$,C+1)
  290.       Else 
  291.        C=Instr(FP$,"/")
  292.        If C
  293.         FP$=Mid$(FP$,C+1)
  294.        End If 
  295.       End If 
  296.      Until C=0
  297.      DEF_FSAVENAME$=FP$
  298.      Load(FP$+".fin"),4
  299.      R=Start(4)
  300.      MC=Deek(R)
  301.      If MC+NC<=255
  302.       Load(FP$+".abk"),1-GNP
  303.       If GNP
  304.        _GETFILEPAL
  305.       End If 
  306.       _PEEKSTRING[R+6,MC]
  307.       NEWDEF$=Param$
  308.       DEF$=DEF$+NEWDEF$
  309.       Add R,6+MC-(MC mod 2=1)
  310.       For A=0 To MC-1
  311.        CB(NC+A)=Peek(R+A*8)*256+Peek(R+A*8+1)
  312.        CH(NC+A)=Peek(R+A*8+2)*256+Peek(R+A*8+2+1)
  313.        CX(NC+A)=Peek(R+A*8+4)*256+Peek(R+A*8+4+1)
  314.        CW(NC+A)=Peek(R+A*8+6)*256+Peek(R+A*8+6+1)
  315.       Next A
  316.       Add NC,MC
  317.       _FONTWH
  318.       _FPAL
  319.       _PCOLOR
  320.       _FFONT
  321.       _FDEF
  322.      End If 
  323.      Erase 4
  324.     End If 
  325.    End If 
  326.   End If 
  327.  End If 
  328. End Proc
  329. Procedure _SAVE
  330.  If NC>0
  331.   If DEF_FSAVENAME$=""
  332.    _GETSAVENAME
  333.   End If 
  334.   CANSAVE=1
  335.   If NC<>Len(DEF$)
  336.    CANSAVE=0
  337.    _DOREQUEST[14]
  338.    If Param
  339.     DEF$=String$("�",NC)
  340.     _FDEF
  341.     CANSAVE=1
  342.    End If 
  343.   End If 
  344.   If CANSAVE
  345.    Repeat 
  346.     OK=1
  347.     If DEF_FSAVENAME$<>""
  348.      OK=0
  349.      _PERMPALETTE
  350.      ' Trap Save(DEF_FSAVENAME$+".abk"),1 
  351.      Save(DEF_FSAVENAME$+".abk"),1
  352.      If True : RemErrtrap=0 
  353.       Reserve As Data 4,6+9*NC-(NC mod 2=1)
  354.       R=Start(4)
  355.       '                 _POKESTRING[R-8,"FontInfo"]
  356.       Doke R,NC
  357.       Doke R+2,FW
  358.       Doke R+4,FH
  359.       If NC<>Len(DEF$)
  360.        DEF$=String$("�",NC)
  361.       End If 
  362.       _POKESTRING[R+6,DEF$]
  363.       Add R,6+NC-(NC mod 2=1)
  364.       For A=0 To NC-1
  365.        Poke R+A*8,CB(A)/256 : Poke R+A*8+1,CB(A) and 255
  366.        Poke R+A*8+2,CH(A)/256 : Poke R+A*8+2+1,CH(A) and 255
  367.        Poke R+A*8+4,CX(A)/256 : Poke R+A*8+4+1,CX(A) and 255
  368.        Poke R+A*8+6,CW(A)/256 : Poke R+A*8+6+1,CW(A) and 255
  369.       Next A
  370.       'Trap Save(DEF_FSAVENAME$+".fin"),4
  371.       Save(DEF_FSAVENAME$+".fin"),4
  372.       If True : RemErrtrap=0 
  373.        OK=1 : _SAVED=1
  374.       End If 
  375.       Erase 4
  376.      End If 
  377.      If OK=0
  378.       _DOREQUEST[15]
  379.       If Param=0
  380.        OK=1
  381.       Else 
  382.        _GETSAVENAME
  383.       End If 
  384.      End If 
  385.     End If 
  386.    Until OK
  387.   End If 
  388.  End If 
  389. End Proc
  390. Procedure _GETSAVENAME
  391.  Show 
  392.  SUG$=""
  393.  If DEF_FSAVENAME$<>""
  394.   SUG$=DEF_FSAVENAME$+".abk"
  395.  End If 
  396.  A$=Fsel$("*.abk",SUG$,"Select a save name (.abk)",Str$(NC)+" characters")
  397.  DEF_FSAVENAME$=""
  398.  Hide 
  399.  If Len(A$)>4
  400.   FP$=Left$(A$,Len(A$)-4)
  401.   If Upper$(A$)=Upper$(FP$+".abk")
  402.    Repeat 
  403.     C=Instr(FP$,":")
  404.     If C
  405.      FP$=Mid$(FP$,C+1)
  406.     Else 
  407.      C=Instr(FP$,"/")
  408.      If C
  409.       FP$=Mid$(FP$,C+1)
  410.      End If 
  411.     End If 
  412.    Until C=0
  413.    DEF_FSAVENAME$=FP$
  414.   End If 
  415.  End If 
  416. End Proc
  417. Procedure _SAVEAS
  418.  If NC>0
  419.   _GETSAVENAME
  420.   If DEF_FSAVENAME$<>""
  421.    _SAVE
  422.   End If 
  423.  End If 
  424. End Proc
  425. Procedure _LOADIFF
  426.  Show 
  427.  A$=Fsel$("",DEF_PICNAME$,"Select an IFF-ILBM file","Chip Free ="+Str$(Chip Free))
  428.  Hide 
  429.  OP=1
  430.  If Exist(A$)
  431.   PICNAME$=A$
  432.   Repeat 
  433.    C=Instr(PICNAME$,":")
  434.    If C
  435.     PICNAME$=Mid$(PICNAME$,C+1)
  436.    Else 
  437.     C=Instr(PICNAME$,"/")
  438.     If C
  439.      PICNAME$=Mid$(PICNAME$,C+1)
  440.     End If 
  441.    End If 
  442.   Until C=0
  443.   DEF_PICNAME$=PICNAME$
  444.   If NC=0
  445.    DEF_FSAVENAME$=PICNAME$-".iff"-".IFF"-".pic"-".PIC"-".ilbm"-".ILBM"-".bru"-".BRU"
  446.   End If 
  447.   Open In 1,A$
  448.   If Lof(1)>=36
  449.    If Input$(1,4)="FORM"
  450.     J$=Input$(1,4)
  451.     If Input$(1,4)="ILBM"
  452.      NF$=Input$(1,4)
  453.      If NF$="ANNO"
  454.       J$=Input$(1,4)
  455.       ANL=Asc(Mid$(J$,3,1))*256+Asc(Mid$(J$,4,1))
  456.       J$=Input$(1,ANL+(ANL and 1))
  457.       NF$=Input$(1,4)
  458.      End If 
  459.      If NF$="BMHD"
  460.       J$=Input$(1,4)
  461.       J$=Input$(1,20)
  462.       Close 1 : OP=0
  463.       SCW=Asc(Mid$(J$,17,1))*256+Asc(Mid$(J$,18,1))
  464.       SCH=Asc(Mid$(J$,19,1))*256+Asc(Mid$(J$,20,1))
  465.       XRES=-(SCW>=640)
  466.       YRES=-(SCH>=400)
  467.       HRES=Max(0,XRES-YRES)
  468.       BPL=Asc(Mid$(J$,9,1))
  469.       If BPL<=6-2*HRES
  470.        PICW=Max(320+HRES*320,Asc(Mid$(J$,1,1))*256+Asc(Mid$(J$,2,1)))
  471.        PICH=Max(200,Asc(Mid$(J$,3,1))*256+Asc(Mid$(J$,4,1)))
  472.        If Chip Free>=40000+PICW*PICH*6/8
  473.         If BON=0
  474.          _BON
  475.         End If 
  476.         Screen Open 3,PICW,PICH,32-16*HRES,HRES*Hires
  477.         Curs Off : Flash Off : Cls 0
  478.         Screen Display 3,128,50+BY,320+HRES*320,BH
  479.         BITX=0 : BITY=0 : Screen Offset 3,BITX,BITY
  480.         Load Iff(A$)
  481.         If NC=0
  482.          _GETFPALETTE
  483.          _FPAL
  484.          _PCOLOR
  485.         End If 
  486.        End If 
  487.       End If 
  488.      End If 
  489.     End If 
  490.    End If 
  491.   End If 
  492.   If OP
  493.    Close 1
  494.   End If 
  495.  End If 
  496.  Screen 0
  497. End Proc
  498. Procedure _FLUSHIFF
  499.  PICW=320 : PICH=200 : HRES=0
  500.  Screen Open 3,PICW,PICH,32-16*HRES,HRES*Hires
  501.  Curs Off : Flash Off : Cls 0
  502.  If BON=0
  503.   Screen Hide 3
  504.  Else 
  505.   Screen Display 3,128,50+BY,320+HRES*320,BH
  506.  End If 
  507.  BITX=0 : BITY=0 : Screen Offset 3,BITX,BITY
  508.  _PUTFPALETTE
  509.  Screen 0
  510. End Proc
  511. Procedure _GETIFFPAL
  512.  Screen 3
  513.  _GETFPALETTE
  514.  _SAVED=0
  515.  _FPAL
  516.  _PCOLOR
  517.  Screen 0
  518. End Proc
  519. Procedure _BACKSPACE
  520.  If CC>0
  521.   Dec CC
  522.   _DELETE
  523.  End If 
  524. End Proc
  525. Procedure _DELETE
  526.  If CC<NC
  527.   If CC=NC-1
  528.    Del Bob CC+1
  529.   Else 
  530.    Del Bob CC+1
  531.    For A=CC To NC-2
  532.     CB(A)=CB(A+1) : CX(A)=CX(A+1) : CW(A)=CW(A+1) : CH(A)=CH(A+1)
  533.    Next 
  534.   End If 
  535.   If Len(DEF$)>=CC+1
  536.    DEF$=Left$(DEF$,CC)+Mid$(DEF$,CC+2)
  537.   End If 
  538.   Dec NC
  539.   _SAVED=0
  540.   _FONTWH
  541.   _FFONT
  542.   _FDEF
  543.  End If 
  544. End Proc
  545. Procedure _CUT
  546.  If CC<NC
  547.   _COPY
  548.   _DELETE
  549.  End If 
  550. End Proc
  551. Procedure _COPY
  552.  If CC<NC
  553.   Screen Open 6,320,Max(8,CH(CC)),32,0
  554.   Screen Hide 6
  555.   Curs Off : Flash Off : Cls 0
  556.   Paste Bob 0,0,CC+1
  557.   CUS=16*Deek(Leek(Start(1)+2+8*CC))
  558.   Get Block 1,0,0,CUS,CH(CC)
  559.   Screen Close 6
  560.   CUD$=""
  561.   If CC<Len(DEF$)
  562.    CUD$=Mid$(DEF$,CC+1,1)
  563.   End If 
  564.   _CUT=1 : CUB=CB(CC) : CUX=CX(CC) : CUW=CW(CC) : CUH=CH(CC)
  565.  End If 
  566. End Proc
  567. Procedure _PASTE
  568.  If _CUT
  569.   If CC<NC
  570.    Ins Bob CC+1
  571.    For A=NC To CC+1 Step -1
  572.     CB(A)=CB(A-1) : CX(A)=CX(A-1) : CW(A)=CW(A-1) : CH(A)=CH(A-1)
  573.    Next 
  574.   End If 
  575.   Screen Open 6,320,Max(8,CUH),32,0
  576.   Screen Hide 6
  577.   Curs Off : Flash Off 
  578.   Put Block 1,0,0
  579.   Get Bob CC+1,0,0 To CUS,CUH
  580.   Screen Close 6
  581.   If CUD$<>""
  582.    If CC<Len(DEF$)
  583.     DEF$=Left$(DEF$,CC)+CUD$+Mid$(DEF$,CC+1)
  584.    Else 
  585.     DEF$=DEF$+CUD$
  586.    End If 
  587.   End If 
  588.   FW=Max(FW,CUW) : FH=Max(FH,CUH)
  589.   CB(CC)=CUB : CX(CC)=CUX : CW(CC)=CUW : CH(CC)=CUH
  590.   Inc NC
  591.   Inc CC
  592.   _SAVED=0
  593.   _FFONT
  594.   _FDEF
  595.  End If 
  596. End Proc
  597. Procedure _LEFT
  598.  If FON
  599.   If CC>0
  600.    Dec CC
  601.    _FFONT
  602.    _FDEF
  603.   End If 
  604.  End If 
  605. End Proc
  606. Procedure _RIGHT
  607.  If FON
  608.   If CC<NC
  609.    Inc CC
  610.    _FFONT
  611.    _FDEF
  612.   End If 
  613.  End If 
  614. End Proc
  615. Procedure _WAYLEFT
  616.  If FON
  617.   If CC>0
  618.    CC=0
  619.    _FFONT
  620.    _FDEF
  621.   End If 
  622.  End If 
  623. End Proc
  624. Procedure _WAYRIGHT
  625.  If FON
  626.   If CC<NC
  627.    CC=NC
  628.    _FFONT
  629.    _FDEF
  630.   End If 
  631.  End If 
  632. End Proc
  633. Procedure _WIDTHLEFT
  634.  If CC<NC
  635.   Dec CW(CC)
  636.   _SAVED=0
  637.   _FFONT
  638.   _FDEF
  639.  End If 
  640. End Proc
  641. Procedure _WIDTHRIGHT
  642.  If CC<NC
  643.   Inc CW(CC)
  644.   _SAVED=0
  645.   _FFONT
  646.   _FDEF
  647.  End If 
  648. End Proc
  649. Procedure _XLEFT
  650.  If CC<NC
  651.   Dec CX(CC)
  652.   Dec CW(CC)
  653.   _SAVED=0
  654.   _FFONT
  655.   _FDEF
  656.  End If 
  657. End Proc
  658. Procedure _XRIGHT
  659.  If CC<NC
  660.   Inc CX(CC)
  661.   Inc CW(CC)
  662.   _SAVED=0
  663.   _FFONT
  664.   _FDEF
  665.  End If 
  666. End Proc
  667. Procedure _MOVEUP
  668.  If FON
  669.   If CC<NC
  670.    Inc CB(CC)
  671.    _SAVED=0
  672.    _FFONT
  673.    _FDEF
  674.   End If 
  675.  End If 
  676. End Proc
  677. Procedure _MOVEDOWN
  678.  If FON
  679.   If CC<NC
  680.    Dec CB(CC)
  681.    _SAVED=0
  682.    _FFONT
  683.    _FDEF
  684.   End If 
  685.  End If 
  686. End Proc
  687. Procedure _VIEWUP
  688.  If FON
  689.   Dec YVIEW
  690.   _FFONT
  691.   _FDEF
  692.  End If 
  693. End Proc
  694. Procedure _VIEWDOWN
  695.  If FON
  696.   Inc YVIEW
  697.   _FFONT
  698.   _FDEF
  699.  End If 
  700. End Proc
  701. Procedure _FONTWH
  702.  FW=0 : FH=0
  703.  If NC>0
  704.   For A=0 To NC-1
  705.    FW=Max(FW,CW(A)) : FH=Max(FH,CH(A))
  706.   Next 
  707.  Else 
  708.   _SAVED=1
  709.  End If 
  710. End Proc
  711. Procedure _FON
  712.  If FON
  713.   Screen Close 1
  714.   Screen Close 2
  715.   FON=0
  716.   If PON*PY>FY
  717.    Add PY,-58
  718.    Screen Display 4,,50+PY,,
  719.    Screen Display 5,,50+PY+29,,
  720.   End If 
  721.   If BON*BY
  722.    Add BH,58
  723.    BITX=Max(0,Min(PICW-(320+HRES*320),BITX))
  724.    BITY=Max(0,Min(PICH-BH,BITY))
  725.    Screen Offset 3,BITX,BITY
  726.    If BON*BY>FY
  727.     Add BY,-58
  728.    End If 
  729.    If PON*PY>BY
  730.     Add PY,58
  731.     Screen Display 4,,50+PY,,
  732.     Screen Display 5,,50+PY+29,,
  733.    End If 
  734.    Screen Display 3,,50+BY,,BH
  735.   End If 
  736.   Screen 0
  737.  Else 
  738.   '                              Font description
  739.   Screen Open 1,640,16,16,Hires
  740.   FY=13+PON*38+BON*(BH+1-58) : FON=1
  741.   Screen Display 1,128,50+FY,640,16
  742.   Curs Off : Flash Off : Cls 0
  743.   Get Icon Palette 
  744.   Paste Icon 0,0,11
  745.   '                              Font display
  746.   Screen Open 2,320+FRES*320,40,32-FRES*16,FRES*Hires
  747.   Screen Display 2,128,50+FY+17,320+FRES*320,40
  748.   Curs Off : Flash Off : Cls 0
  749.   '  Set Bitmap too
  750.   If BON
  751.    Add BH,-58
  752.    If PON*PY>BON*BY
  753.     Add PY,-58
  754.     Screen Display 4,,50+PY,,
  755.     Screen Display 5,,50+PY+29,,
  756.    End If 
  757.    Screen Display 3,,50+BY,,BH
  758.   End If 
  759.   Screen 0
  760.   YVIEW=29 : FBOX=0
  761.   _FFONT
  762.   _FDEF
  763.   _FPAL
  764.   _PCOLOR
  765.  End If 
  766. End Proc
  767. Procedure _FRES
  768.  FRES=1-FRES
  769.  Screen Close 2
  770.  Screen Open 2,320+FRES*320,40,32-FRES*16,FRES*Hires
  771.  Screen Display 2,128,50+FY+17,320+FRES*320,40
  772.  Curs Off : Flash Off : Cls 0
  773.  _FFONT
  774.  _FDEF
  775.  _FPAL
  776.  _PCOLOR
  777. End Proc
  778. Procedure _FFONT
  779.  If FON
  780.   S=Screen
  781.   Screen 2
  782.   Cls 0
  783.   Ink 31
  784.    Extension_12_04CC 0,YVIEW To 319+320*FRES,YVIEW
  785.   If FON=1 and NC>0
  786.    If CC>0
  787.     A=CC-1
  788.     FDX=160+FRES*160
  789.     Repeat 
  790.      OF=FDX
  791.      Add FDX,-CW(A)-1
  792.      Dec A
  793.     Until A<0 or OF<0
  794.     Inc A
  795.     Repeat 
  796.      Paste Bob FDX+CX(A),YVIEW-CB(A),A+1
  797.      Add FDX,CW(A)+1
  798.      Inc A
  799.     Until A=CC
  800.    End If 
  801.    If CC<NC
  802.     A=CC
  803.     FDX=160+FRES*160
  804.     Paste Bob FDX+CX(A),YVIEW-CB(A),A+1
  805.     _BOX[FDX-1,YVIEW-CB(A)-1,FDX+CW(A),YVIEW-CB(A)+CH(A),31]
  806.     Add FDX,CW(A)+1
  807.     Inc A
  808.     If A<NC
  809.      Repeat 
  810.       Paste Bob FDX+CX(A),YVIEW-CB(A),A+1
  811.       Add FDX,CW(A)+1
  812.       Inc A
  813.      Until A=NC or FDX>320+FRES*320
  814.     End If 
  815.    End If 
  816.   End If 
  817.   Screen S
  818.  End If 
  819. End Proc
  820. Procedure _FBOX
  821.  If FON
  822.   S=Screen
  823.   Screen 2
  824.   If CC<NC
  825.    FDX=160+FRES*160
  826.    _BOX[FDX-1,YVIEW-CB(CC)-1,FDX+CW(CC),YVIEW-CB(CC)+CH(CC),(Timer mod 20)/15*FBOX]
  827.    Add FBOX,1,0 To 31
  828.   Else 
  829.    Ink FBOX
  830.    FDX=160+FRES*160
  831.     Extension_12_04CC FDX,20 To FDX+10,20
  832.     Extension_12_04CC FDX+7,17 To FDX+10,20
  833.     Extension_12_04CC FDX+7,23 To FDX+10,20
  834.    Add FBOX,1,0 To 31
  835.   End If 
  836.   Screen S
  837.  End If 
  838. End Proc
  839. Procedure _FPAL
  840.  S=Screen
  841.  If FON=1
  842.   Screen 2
  843.   _PUTFPALETTE
  844.  End If 
  845.  If PON=1
  846.   Screen 5
  847.   _PUTFPALETTE
  848.  End If 
  849.  Screen S
  850. End Proc
  851. Procedure _FDEF
  852.  If FON
  853.   S=Screen
  854.   Screen 1
  855.   Ink 2
  856.   Bar 463,3 To 635,12
  857.   Gr Writing 0
  858.   Ink 3
  859.   FTC=Max(Min(NC-20,CC-10),0)
  860.   Text 465,10,Mid$(DEF$,FTC+1,21)
  861.   Ink 10
  862.   PP=Min(CC,Len(DEF$))
  863.   FDS$=Mid$(DEF$+" ",PP+1,1)
  864.   Text 465+8*(PP-FTC),10,FDS$
  865.   Screen S
  866.  End If 
  867. End Proc
  868. Procedure _FDEFEDIT
  869.  Sprite Off 0
  870.  N$=DEF$
  871.  S=Screen
  872.  Screen 1
  873.  FTC=Max(Min(NC-20,CC-10),0)
  874.  EC=Min(Max(0,Min(20,(X-465)/8))+FTC,Len(N$))
  875.  OK=0
  876.  Repeat 
  877.   Ink 2
  878.   Bar 463,3 To 635,12
  879.   Gr Writing 0
  880.   Ink 4
  881.   FTC=Max(Min(Len(N$)-20,EC-10),0)
  882.   Text 465,10,Mid$(N$,FTC+1,21)
  883.   Gr Writing 1
  884.   Ink 10
  885.   FDS$=Mid$(N$+" ",EC+1,1)
  886.   Text 465+8*(EC-FTC),10,FDS$
  887.   CC=Min(NC,EC)
  888.   _FFONT
  889.   
  890.   _QUIET
  891.   Repeat 
  892.    K=Asc(Inkey$)
  893.    SK=-((Key Shift=1) or(Key Shift=2))
  894.    If SK=1 and Key State(79) Then K=Asc(Cleft$)
  895.    If SK=1 and Key State(78) Then K=Asc(Cright$)
  896.    If Key State(69) Then OK=1 : K=1
  897.    If Key State(70) and SK=0 and EC<Len(N$)
  898.     N$=Left$(N$,EC)+Mid$(N$,EC+2)
  899.     K=1
  900.    End If 
  901.    If K=8 and SK=0 and EC>0
  902.     Dec EC
  903.     N$=Left$(N$,EC)+Mid$(N$,EC+2)
  904.    End If 
  905.    If K=8 and SK=1
  906.     EC=0
  907.     N$=""
  908.    End If 
  909.    If K=13 Then DEF$=N$ : OK=1 : _SAVED=0
  910.    If K=Asc(Cleft$) and SK=0 Then EC=Max(0,EC-1)
  911.    If K=Asc(Cright$) and SK=0 Then EC=Min(Len(N$),EC+1)
  912.    If K=Asc(Cleft$) and SK=1 Then EC=0
  913.    If K=Asc(Cright$) and SK=1 Then EC=Len(N$)
  914.    If K>=32 and EC<255
  915.     N$=Left$(N$,EC)+Chr$(K)+Mid$(N$,EC+1)
  916.     Inc EC
  917.    End If 
  918.   Until K
  919.  Until OK
  920.  _FFONT
  921.  _FDEF
  922.  Screen S
  923. End Proc
  924. Procedure _FLMB
  925.  Y=Y/2-FY
  926.  If Y<16
  927.   If Y>1 and Y<15
  928.    If X>4 and X<423
  929.     FBUT=(X-5)/19
  930.     _FBUT
  931.    End If 
  932.    If X>462 and X<636
  933.     _FDEFEDIT
  934.    End If 
  935.   End If 
  936.  Else 
  937.   If Y>16
  938.    X=X/(2-FRES)
  939.    FDX=160+FRES*160
  940.    If X<FDX
  941.     _LEFT
  942.    Else 
  943.     _RIGHT
  944.    End If 
  945.   End If 
  946.  End If 
  947. End Proc
  948. Procedure _FBUT
  949.  Screen 1
  950.  GG=0
  951.  If Mid$("0 0000 00 000000 000 0",FBUT+1,1)="0" Then GG=1
  952.  If GG Then GAD[5+FBUT*19,2,19,12,2,1]
  953.  
  954.  If FBUT=0 Then _FRES
  955.  
  956.  If FBUT=2 Then _WAYLEFT
  957.  If FBUT=3 Then _LEFT
  958.  If FBUT=4 Then _RIGHT
  959.  If FBUT=5 Then _WAYRIGHT
  960.  
  961.  If FBUT=7 Then _VIEWUP
  962.  If FBUT=8 Then _VIEWDOWN
  963.  
  964.  If FBUT=10 Then _WIDTHLEFT
  965.  If FBUT=11 Then _WIDTHRIGHT
  966.  If FBUT=12 Then _XLEFT
  967.  If FBUT=13 Then _XRIGHT
  968.  If FBUT=14 Then _MOVEUP
  969.  If FBUT=15 Then _MOVEDOWN
  970.  
  971.  If FBUT=17 Then _CUT
  972.  If FBUT=18 Then _COPY
  973.  If FBUT=19 Then _PASTE
  974.  
  975.  If FBUT=21 Then _DELETE
  976.  
  977.  _QUIET
  978.  Screen 1
  979.  If GG Then GAD[5+FBUT*19,2,19,12,2,0]
  980.  Screen 0
  981. End Proc
  982. Procedure _BON
  983.  If BON
  984.   Screen Hide 3
  985.   BON=0
  986.   If FON*FY>BY
  987.    Add FY,-(BH+1)
  988.    Screen Display 1,,50+FY,,
  989.    Screen Display 2,,50+FY+17,,
  990.   End If 
  991.   If PON*PY>BY
  992.    Add PY,-(BH+1)
  993.    Screen Display 4,,50+PY,,
  994.    Screen Display 5,,50+PY+29,,
  995.   End If 
  996.   Screen 0
  997.  Else 
  998.   '  Bitmap display
  999.   Screen Show 3
  1000.   BY=13+FON*58+PON*38 : BON=1 : BH=199-BY
  1001.   BITX=0 : BITY=0
  1002.   Screen Offset 3,BITX,BITY
  1003.   Screen Display 3,128,50+BY,320+HRES*320,BH
  1004.   Screen 0
  1005.  End If 
  1006. End Proc
  1007. Procedure _BNONE
  1008.  Screen 3
  1009.  If GMODE=0
  1010.   Gr Writing 2
  1011.   _MCHECK
  1012.   _UNBUG
  1013.   _CROSSHAIR[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,BITX+X/(2-HRES),BITY+Y/2-BY]
  1014.   _MCHECK
  1015.   _CROSSHAIR[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,BITX+X/(2-HRES),BITY+Y/2-BY]
  1016.   Gr Writing 1
  1017.  End If 
  1018.  If GMODE=1
  1019.   Gr Writing 2
  1020.   _UNBUG
  1021.   If GSTEP=0
  1022.    _MCHECK
  1023.    _CROSSHAIR[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,BITX+X/(2-HRES),BITY+Y/2-BY]
  1024.    _MCHECK
  1025.    _CROSSHAIR[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,BITX+X/(2-HRES),BITY+Y/2-BY]
  1026.   Else 
  1027.    If GSTEP=1
  1028.     _MCHECK
  1029.     _FLASHBOX[GGTX,GGTY,GGBX,GGBY]
  1030.     _BASELINE[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,BITX+X/(2-HRES),BITY+Y/2-BY]
  1031.     _MCHECK
  1032.     _FLASHBOX[GGTX,GGTY,GGBX,GGBY]
  1033.     _BASELINE[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,BITX+X/(2-HRES),BITY+Y/2-BY]
  1034.    Else 
  1035.     If GSTEP=2
  1036.      _MCHECK
  1037.      TEMX=BITX+X/(2-HRES) : TEMY=BITY+Y/2-BY
  1038.      GGDX=Max(GGBX-GGTX+1,Max(TEMX-GGTX,GGBX-TEMX))
  1039.      GGDY=Max(GGBY-GGTY+1,Max(TEMY-GGTY,GGBY-TEMY))
  1040.      _CROSSHAIR[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,TEMX,TEMY]
  1041.      For TABX=-1 To 1
  1042.       For TABY=-1 To 1
  1043.        _FLASHBOX[GGTX+GGDX*TABX,GGTY+GGDY*TABY,GGBX+GGDX*TABX,GGBY+GGDY*TABY]
  1044.        If GGB<>GGTY and GGB<>GGBY
  1045.         _FLASHLINE[GGTX+GGDX*TABX,GGB+GGDY*TABY,GGBX+GGDX*TABX,GGB+GGDY*TABY]
  1046.        End If 
  1047.       Next 
  1048.      Next 
  1049.      _MCHECK
  1050.      _CROSSHAIR[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,TEMX,TEMY]
  1051.      For TABX=-1 To 1
  1052.       For TABY=-1 To 1
  1053.        _FLASHBOX[GGTX+GGDX*TABX,GGTY+GGDY*TABY,GGBX+GGDX*TABX,GGBY+GGDY*TABY]
  1054.        If GGB<>GGTY and GGB<>GGBY
  1055.         _FLASHLINE[GGTX+GGDX*TABX,GGB+GGDY*TABY,GGBX+GGDX*TABX,GGB+GGDY*TABY]
  1056.        End If 
  1057.       Next 
  1058.      Next 
  1059.     Else 
  1060.      TEMX=BITX+X/(2-HRES) : TEMY=BITY+Y/2-BY
  1061.      TSX=(TEMX-GGTX)/GGDX+(TEMX<GGTX) : TSY=(TEMY-GGTY)/GGDY+(TEMY<GGTY)
  1062.      STX=GGTX+GGDX*TSX : STY=GGTY+GGDY*TSY
  1063.      SBX=GGBX+GGDX*TSX : SBY=GGBY+GGDY*TSY
  1064.      SB=GGB+GGDY*TSY
  1065.      If TEMX<=SBX and TEMY<=SBY
  1066.       If STX>=0 and SBX<PICW and STY>=0 and SBY<PICH
  1067.        _FLASHBOX[STX,STY,SBX,SBY]
  1068.        If GGB<>GGTY and GGB<>GGBY
  1069.         _FLASHLINE[STX,SB,SBX,SB]
  1070.        End If 
  1071.       End If 
  1072.      End If 
  1073.      _CROSSHAIR[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,TEMX,TEMY]
  1074.      _MCHECK
  1075.      _CROSSHAIR[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,TEMX,TEMY]
  1076.      If TEMX<=SBX and TEMY<=SBY
  1077.       If STX>=0 and SBX<PICW and STY>=0 and SBY<PICH
  1078.        _FLASHBOX[STX,STY,SBX,SBY]
  1079.        If GGB<>GGTY and GGB<>GGBY
  1080.         _FLASHLINE[STX,SB,SBX,SB]
  1081.        End If 
  1082.       End If 
  1083.      End If 
  1084.     End If 
  1085.    End If 
  1086.   End If 
  1087.   Gr Writing 1
  1088.  End If 
  1089.  If GMODE=2
  1090.   Gr Writing 2
  1091.   _UNBUG
  1092.   If GSTEP=0
  1093.    _BASELINE[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,BITX+X/(2-HRES),BITY+Y/2-BY]
  1094.    _MCHECK
  1095.    _BASELINE[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,BITX+X/(2-HRES),BITY+Y/2-BY]
  1096.   Else 
  1097.    _CROSSHAIR[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,BITX+X/(2-HRES),BITY+Y/2-BY]
  1098.    _BASELINE[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,BITX+X/(2-HRES),GGB]
  1099.    _MCHECK
  1100.    _CROSSHAIR[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,BITX+X/(2-HRES),BITY+Y/2-BY]
  1101.    _BASELINE[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,BITX+X/(2-HRES),GGB]
  1102.   End If 
  1103.   Gr Writing 1
  1104.  End If 
  1105.  Screen 0
  1106. End Proc
  1107. Procedure _BLMB
  1108.  If GMODE=0 Then _GRAB
  1109.  If GMODE=1
  1110.   If GSTEP=0
  1111.    _GRABGRID0
  1112.   Else 
  1113.    If GSTEP=1
  1114.     _GRABGRID1
  1115.    Else 
  1116.     If GSTEP=2
  1117.      _GRABGRID2
  1118.     Else 
  1119.      _GRABGRID3
  1120.     End If 
  1121.    End If 
  1122.   End If 
  1123.  End If 
  1124.  'End If  
  1125.  If GMODE=2
  1126.   If GSTEP=0
  1127.    _GRABPROP0
  1128.   Else 
  1129.    _GRABPROP1
  1130.   End If 
  1131.  End If 
  1132. End Proc
  1133. Procedure _GRABGRID0
  1134.  HX=X : HY=Y
  1135.  TIX=BITX+X/(2-HRES) : TIY=BITY+Y/2-BY
  1136.  Screen 3
  1137.  Gr Writing 2
  1138.  _UNBUG
  1139.  X=TIX : Y=TIY
  1140.  _MON=0 : Sprite Off 0
  1141.  _MLIMIT[-100,BY*2-100,639+100,(BY+BH-1)*2+100]
  1142.  Repeat 
  1143.   MK=Mouse Key
  1144.   _MCHECK
  1145.   X=_MX/(2-HRES) : Y=_MY/2-BY
  1146.   _MX=Max(0,Min(639,_MX))
  1147.   _MY=Max(BY*2,Min((BY+BH-1)*2,_MY))
  1148.   X=Max(0,Min(PICW-1,X+BITX))
  1149.   Y=Max(0,Min(PICH-1,Y+BITY))
  1150.   BITX=Max(X-(319+320*HRES),Min(X,BITX))
  1151.   BITY=Max(Y-(BH-1),Min(Y,BITY))
  1152.   Screen Offset 3,BITX,BITY
  1153.   _CROSSHAIR[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,TIX,TIY]
  1154.   _CROSSHAIR[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,X,Y]
  1155.   _MCHECK
  1156.   _CROSSHAIR[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,TIX,TIY]
  1157.   _CROSSHAIR[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,X,Y]
  1158.  Until MK<>1
  1159.  _MLIMIT[0,0,639,397]
  1160.  _MON=1
  1161.  Gr Writing 1
  1162.  If TIX>X Then Swap TIX,X
  1163.  If TIY>Y Then Swap TIY,Y
  1164.  If MK=0
  1165.   GGTX=TIX : GGTY=TIY
  1166.   GGBX=X : GGBY=Y
  1167.   GSTEP=1 : _SP=3
  1168.  End If 
  1169.  Screen 0
  1170. End Proc
  1171. Procedure _GRABGRID1
  1172.  HX=X : HY=Y
  1173.  TIX=BITX+X/(2-HRES) : TIY=BITY+Y/2-BY
  1174.  Screen 3
  1175.  Gr Writing 2
  1176.  _UNBUG
  1177.  X=TIX : Y=TIY
  1178.  _MON=0 : Sprite Off 0
  1179.  _MLIMIT[-100,BY*2-100,639+100,(BY+BH-1)*2+100]
  1180.  Repeat 
  1181.   MK=Mouse Key
  1182.   _MCHECK
  1183.   X=_MX/(2-HRES) : Y=_MY/2-BY
  1184.   _MX=Max(0,Min(639,_MX))
  1185.   _MY=Max(BY*2,Min((BY+BH-1)*2,_MY))
  1186.   X=Max(0,Min(PICW-1,X+BITX))
  1187.   Y=Max(0,Min(PICH-1,Y+BITY))
  1188.   BITX=Max(X-(319+320*HRES),Min(X,BITX))
  1189.   BITY=Max(Y-(BH-1),Min(Y,BITY))
  1190.   Screen Offset 3,BITX,BITY
  1191.   _FLASHBOX[GGTX,GGTY,GGBX,GGBY]
  1192.   _BASELINE[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,X,Y]
  1193.   _MCHECK
  1194.   _FLASHBOX[GGTX,GGTY,GGBX,GGBY]
  1195.   _BASELINE[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,X,Y]
  1196.  Until MK<>1
  1197.  _MLIMIT[0,0,639,397]
  1198.  _MON=1
  1199.  Gr Writing 1
  1200.  If TIX>X Then Swap TIX,X
  1201.  If TIY>Y Then Swap TIY,Y
  1202.  If MK=0
  1203.   GGB=Y
  1204.   GSTEP=2 : _SP=2
  1205.  End If 
  1206.  Screen 0
  1207. End Proc
  1208. Procedure _GRABGRID2
  1209.  HX=X : HY=Y
  1210.  TIX=BITX+X/(2-HRES) : TIY=BITY+Y/2-BY
  1211.  Screen 3
  1212.  Gr Writing 2
  1213.  _UNBUG
  1214.  X=TIX : Y=TIY
  1215.  _MON=0 : Sprite Off 0
  1216.  _MLIMIT[-100,BY*2-100,639+100,(BY+BH-1)*2+100]
  1217.  Repeat 
  1218.   MK=Mouse Key
  1219.   _MCHECK
  1220.   X=_MX/(2-HRES) : Y=_MY/2-BY
  1221.   _MX=Max(0,Min(639,_MX))
  1222.   _MY=Max(BY*2,Min((BY+BH-1)*2,_MY))
  1223.   X=Max(0,Min(PICW-1,X+BITX))
  1224.   Y=Max(0,Min(PICH-1,Y+BITY))
  1225.   BITX=Max(X-(319+320*HRES),Min(X,BITX))
  1226.   BITY=Max(Y-(BH-1),Min(Y,BITY))
  1227.   Screen Offset 3,BITX,BITY
  1228.   GGDX=Max(GGBX-GGTX+1,Max(X-GGTX,GGBX-X))
  1229.   GGDY=Max(GGBY-GGTY+1,Max(Y-GGTY,GGBY-Y))
  1230.   _CROSSHAIR[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,X,Y]
  1231.   For TABX=-1 To 1
  1232.    For TABY=-1 To 1
  1233.     _FLASHBOX[GGTX+GGDX*TABX,GGTY+GGDY*TABY,GGBX+GGDX*TABX,GGBY+GGDY*TABY]
  1234.     If GGB<>GGTY and GGB<>GGBY
  1235.      _FLASHLINE[GGTX+GGDX*TABX,GGB+GGDY*TABY,GGBX+GGDX*TABX,GGB+GGDY*TABY]
  1236.     End If 
  1237.    Next 
  1238.   Next 
  1239.   _MCHECK
  1240.   _CROSSHAIR[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,X,Y]
  1241.   For TABX=-1 To 1
  1242.    For TABY=-1 To 1
  1243.     _FLASHBOX[GGTX+GGDX*TABX,GGTY+GGDY*TABY,GGBX+GGDX*TABX,GGBY+GGDY*TABY]
  1244.     If GGB<>GGTY and GGB<>GGBY
  1245.      _FLASHLINE[GGTX+GGDX*TABX,GGB+GGDY*TABY,GGBX+GGDX*TABX,GGB+GGDY*TABY]
  1246.     End If 
  1247.    Next 
  1248.   Next 
  1249.  Until MK<>1
  1250.  _MLIMIT[0,0,639,397]
  1251.  _MON=1
  1252.  Gr Writing 1
  1253.  If TIX>X Then Swap TIX,X
  1254.  If TIY>Y Then Swap TIY,Y
  1255.  If MK=0
  1256.   GSTEP=3 : _SP=1
  1257.  End If 
  1258.  Screen 0
  1259. End Proc
  1260. Procedure _GRABGRID3
  1261.  HX=X : HY=Y
  1262.  Screen 3
  1263.  Gr Writing 2
  1264.  _UNBUG
  1265.  _MON=0 : Sprite Off 0
  1266.  _MLIMIT[-100,BY*2-100,639+100,(BY+BH-1)*2+100]
  1267.  ' First test 
  1268.  MK=Mouse Key
  1269.  _MCHECK
  1270.  X=_MX/(2-HRES) : Y=_MY/2-BY
  1271.  _MX=Max(0,Min(639,_MX))
  1272.  _MY=Max(BY*2,Min((BY+BH-1)*2,_MY))
  1273.  X=Max(0,Min(PICW-1,X+BITX))
  1274.  Y=Max(0,Min(PICH-1,Y+BITY))
  1275.  BITX=Max(X-(319+320*HRES),Min(X,BITX))
  1276.  BITY=Max(Y-(BH-1),Min(Y,BITY))
  1277.  Screen Offset 3,BITX,BITY
  1278.  
  1279.  TSX=(X-GGTX)/GGDX+(X<GGTX) : TSY=(Y-GGTY)/GGDY+(Y<GGTY)
  1280.  STX=GGTX+GGDX*TSX : STY=GGTY+GGDY*TSY
  1281.  SBX=GGBX+GGDX*TSX : SBY=GGBY+GGDY*TSY
  1282.  SB=GGB+GGDY*TSY
  1283.  SCHECK=0
  1284.  If X<=SBX and Y<=SBY
  1285.   If STX>=0 and SBX<PICW and STY>=0 and SBY<PICH
  1286.    SCHECK=1
  1287.   End If 
  1288.  End If 
  1289.  If SCHECK
  1290.   FTSX=TSX : FTSY=TSY
  1291.   Repeat 
  1292.    MK=Mouse Key
  1293.    _MCHECK
  1294.    X=_MX/(2-HRES) : Y=_MY/2-BY
  1295.    _MX=Max(0,Min(639,_MX))
  1296.    _MY=Max(BY*2,Min((BY+BH-1)*2,_MY))
  1297.    X=Max(0,Min(PICW-1,X+BITX))
  1298.    Y=Max(0,Min(PICH-1,Y+BITY))
  1299.    BITX=Max(X-(319+320*HRES),Min(X,BITX))
  1300.    BITY=Max(Y-(BH-1),Min(Y,BITY))
  1301.    Screen Offset 3,BITX,BITY
  1302.    
  1303.    TSX=(X-GGTX)/GGDX+(X<GGTX) : TSY=(Y-GGTY)/GGDY+(Y<GGTY)
  1304.    STX=GGTX+GGDX*TSX : STY=GGTY+GGDY*TSY
  1305.    SBX=GGBX+GGDX*TSX : SBY=GGBY+GGDY*TSY
  1306.    SB=GGB+GGDY*TSY
  1307.    SCHECK=0
  1308.    _CROSSHAIR[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,X,Y]
  1309.    If X<=SBX and Y<=SBY
  1310.     If STX>=0 and SBX<PICW and STY>=0 and SBY<PICH
  1311.      For LTSY=FTSY To TSY Step Sgn(TSY-FTSY) or 1
  1312.       For LTSX=FTSX To TSX Step Sgn(TSX-FTSX) or 1
  1313.        LSTX=GGTX+GGDX*LTSX : LSTY=GGTY+GGDY*LTSY
  1314.        LSBX=GGBX+GGDX*LTSX : LSBY=GGBY+GGDY*LTSY
  1315.        LSB=GGB+GGDY*LTSY
  1316.        SCHECK=1
  1317.        _FLASHBOX[LSTX,LSTY,LSBX,LSBY]
  1318.        If GGB<>GGTY and GGB<>GGBY
  1319.         _FLASHLINE[LSTX,LSB,LSBX,LSB]
  1320.        End If 
  1321.       Next 
  1322.      Next 
  1323.     End If 
  1324.    End If 
  1325.    _MCHECK
  1326.    _CROSSHAIR[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,X,Y]
  1327.    If X<=SBX and Y<=SBY
  1328.     If STX>=0 and SBX<PICW and STY>=0 and SBY<PICH
  1329.      For LTSY=FTSY To TSY Step Sgn(TSY-FTSY) or 1
  1330.       For LTSX=FTSX To TSX Step Sgn(TSX-FTSX) or 1
  1331.        LSTX=GGTX+GGDX*LTSX : LSTY=GGTY+GGDY*LTSY
  1332.        LSBX=GGBX+GGDX*LTSX : LSBY=GGBY+GGDY*LTSY
  1333.        LSB=GGB+GGDY*LTSY
  1334.        SCHECK=1
  1335.        _FLASHBOX[LSTX,LSTY,LSBX,LSBY]
  1336.        If GGB<>GGTY and GGB<>GGBY
  1337.         _FLASHLINE[LSTX,LSB,LSBX,LSB]
  1338.        End If 
  1339.       Next 
  1340.      Next 
  1341.     End If 
  1342.    End If 
  1343.   Until MK<>1
  1344.   _MLIMIT[0,0,639,397]
  1345.   _MON=1
  1346.   If MK=0 and SCHECK=1
  1347.    If FTSY>TSY
  1348.     Swap FTSY,TSY
  1349.    End If 
  1350.    If FTSX>TSX
  1351.     Swap FTSX,TSX
  1352.    End If 
  1353.    If NC+((TSY-FTSY)+1)*((TSX-FTSX)+1)<256
  1354.     For LTSY=FTSY To TSY Step Sgn(TSY-FTSY) or 1
  1355.      For LTSX=FTSX To TSX Step Sgn(TSX-FTSX) or 1
  1356.       TIX=GGTX+GGDX*LTSX : TIY=GGTY+GGDY*LTSY
  1357.       X=GGBX+GGDX*LTSX : Y=GGBY+GGDY*LTSY
  1358.       SB=GGB+GGDY*LTSY
  1359.       If CC<NC
  1360.        Ins Bob CC+1
  1361.        For A=NC To CC+1 Step -1
  1362.         CB(A)=CB(A-1) : CX(A)=CX(A-1) : CW(A)=CW(A-1) : CH(A)=CH(A-1)
  1363.        Next 
  1364.       End If 
  1365.       _GRABCUT[TIX,TIY,X,Y]
  1366.       Get Bob CC+1,TIX+XOFF,TIY+YOFF To X-XCUT+1,Y-YCUT+1
  1367.       CB(CC)=SB-TIY-YOFF : CX(CC)=XOFF : CW(CC)=X-TIX+1 : CH(CC)=Y-TIY-YCUT-YOFF+1
  1368.       FW=Max(FW,CW(CC)) : FH=Max(FH,CH(CC))
  1369.       If CC<Len(DEF$)
  1370.        DEF$=Left$(DEF$,CC)+"?"+Mid$(DEF$,CC+1)
  1371.       Else 
  1372.        DEF$=DEF$+"?"
  1373.       End If 
  1374.       Inc NC
  1375.       Inc CC
  1376.       _SAVED=0
  1377.      Next 
  1378.     Next 
  1379.     _FFONT
  1380.     _FDEF
  1381.    End If 
  1382.   End If 
  1383.  End If 
  1384.  _MLIMIT[0,0,639,397]
  1385.  _MON=1
  1386.  Gr Writing 1
  1387.  Screen 0
  1388. End Proc
  1389. Procedure _GRABPROP0
  1390.  HX=X : HY=Y
  1391.  TIX=BITX+X/(2-HRES) : TIY=BITY+Y/2-BY
  1392.  Screen 3
  1393.  Gr Writing 2
  1394.  _UNBUG
  1395.  X=TIX : Y=TIY
  1396.  _MON=0 : Sprite Off 0
  1397.  Repeat 
  1398.   MK=Mouse Key
  1399.   _MCHECK
  1400.   X=_MX/(2-HRES) : Y=_MY/2-BY
  1401.   _MX=Max(0,Min(639,_MX))
  1402.   _MY=Max(BY*2,Min((BY+BH-1)*2,_MY))
  1403.   X=Max(0,Min(PICW-1,X+BITX))
  1404.   Y=Max(0,Min(PICH-1,Y+BITY))
  1405.   BITX=Max(X-(319+320*HRES),Min(X,BITX))
  1406.   BITY=Max(Y-(BH-1),Min(Y,BITY))
  1407.   Screen Offset 3,BITX,BITY
  1408.   _BASELINE[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,X,Y]
  1409.   Wait 1
  1410.   _BASELINE[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,X,Y]
  1411.  Until MK<>1
  1412.  _MLIMIT[0,0,639,397]
  1413.  _MON=1
  1414.  Gr Writing 1
  1415.  If MK=0
  1416.   GGB=Y
  1417.   GSTEP=1
  1418.   _SP=1
  1419.  End If 
  1420.  Screen 0
  1421. End Proc
  1422. Procedure _GRABPROP1
  1423.  HX=X : HY=Y
  1424.  TIX=BITX+X/(2-HRES) : TIY=BITY+Y/2-BY
  1425.  Screen 3
  1426.  Gr Writing 2
  1427.  _UNBUG
  1428.  X=TIX : Y=TIY
  1429.  _MON=0 : Sprite Off 0
  1430.  _MLIMIT[-100,BY*2-100,639+100,(BY+BH-1)*2+100]
  1431.  Repeat 
  1432.   MK=Mouse Key
  1433.   _MCHECK
  1434.   X=_MX/(2-HRES) : Y=_MY/2-BY
  1435.   _MX=Max(0,Min(639,_MX))
  1436.   _MY=Max(BY*2,Min((BY+BH-1)*2,_MY))
  1437.   X=Max(0,Min(PICW-1,X+BITX))
  1438.   Y=Max(0,Min(PICH-1,Y+BITY))
  1439.   BITX=Max(X-(319+320*HRES),Min(X,BITX))
  1440.   BITY=Max(Y-(BH-1),Min(Y,BITY))
  1441.   Screen Offset 3,BITX,BITY
  1442.   _CROSSHAIR[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,TIX,TIY]
  1443.   _CROSSHAIR[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,X,Y]
  1444.   _BASELINE[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,X,GGB]
  1445.   _MCHECK
  1446.   _CROSSHAIR[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,TIX,TIY]
  1447.   _CROSSHAIR[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,X,Y]
  1448.   _BASELINE[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,X,GGB]
  1449.  Until MK<>1
  1450.  _MLIMIT[0,0,639,397]
  1451.  _MON=1
  1452.  Gr Writing 1
  1453.  If TIX>X Then Swap TIX,X
  1454.  If TIY>Y Then Swap TIY,Y
  1455.  If MK=0 and NC<255
  1456.   If CC<NC
  1457.    Ins Bob CC+1
  1458.    For A=NC To CC+1 Step -1
  1459.     CB(A)=CB(A-1) : CX(A)=CX(A-1) : CW(A)=CW(A-1) : CH(A)=CH(A-1)
  1460.    Next 
  1461.   End If 
  1462.   _GRABCUT[TIX,TIY,X,Y]
  1463.   Add TIX,XOFF : Add TIY,YOFF : Add X,-XCUT : Add Y,-YCUT
  1464.   Get Bob CC+1,TIX,TIY To X+1,Y+1
  1465.   CB(CC)=GGB-TIY : CX(CC)=0 : CW(CC)=X-TIX+1 : CH(CC)=Y-TIY+1
  1466.   FW=Max(FW,CW(CC)) : FH=Max(FH,CH(CC))
  1467.   If CC<Len(DEF$)
  1468.    DEF$=Left$(DEF$,CC)+"?"+Mid$(DEF$,CC+1)
  1469.   Else 
  1470.    DEF$=DEF$+"?"
  1471.   End If 
  1472.   Inc NC
  1473.   Inc CC
  1474.   _SAVED=0
  1475.   _FFONT
  1476.   _FDEF
  1477.  End If 
  1478.  Screen 0
  1479. End Proc
  1480. Procedure _GRAB
  1481.  HX=X : HY=Y
  1482.  TIX=BITX+X/(2-HRES) : TIY=BITY+Y/2-BY
  1483.  Screen 3
  1484.  Gr Writing 2
  1485.  _UNBUG
  1486.  X=TIX : Y=TIY
  1487.  _MON=0 : Sprite Off 0
  1488.  _MLIMIT[-100,BY*2-100,639+100,(BY+BH-1)*2+100]
  1489.  Repeat 
  1490.   MK=Mouse Key
  1491.   _MCHECK
  1492.   X=_MX/(2-HRES) : Y=_MY/2-BY
  1493.   _MX=Max(0,Min(639,_MX))
  1494.   _MY=Max(BY*2,Min((BY+BH-1)*2,_MY))
  1495.   X=Max(0,Min(PICW-1,X+BITX))
  1496.   Y=Max(0,Min(PICH-1,Y+BITY))
  1497.   BITX=Max(X-(319+320*HRES),Min(X,BITX))
  1498.   BITY=Max(Y-(BH-1),Min(Y,BITY))
  1499.   Screen Offset 3,BITX,BITY
  1500.   _CROSSHAIR[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,TIX,TIY]
  1501.   _CROSSHAIR[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,X,Y]
  1502.   _MCHECK
  1503.   _CROSSHAIR[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,TIX,TIY]
  1504.   _CROSSHAIR[BITX,BITY,BITX+319+320*HRES,BITY+BH-1,X,Y]
  1505.  Until MK<>1
  1506.  _MLIMIT[0,0,639,397]
  1507.  _MON=1
  1508.  Gr Writing 1
  1509.  If TIX>X Then Swap TIX,X
  1510.  If TIY>Y Then Swap TIY,Y
  1511.  If MK=0 and NC<255
  1512.   If CC<NC
  1513.    Ins Bob CC+1
  1514.    For A=NC To CC+1 Step -1
  1515.     CB(A)=CB(A-1) : CX(A)=CX(A-1) : CW(A)=CW(A-1) : CH(A)=CH(A-1)
  1516.    Next 
  1517.   End If 
  1518.   _GRABCUT[TIX,TIY,X,Y]
  1519.   Get Bob CC+1,TIX+XOFF,TIY+YOFF To X-XCUT+1,Y-YCUT+1
  1520.   CB(CC)=Y-TIY-YOFF : CX(CC)=XOFF : CW(CC)=X-TIX+1 : CH(CC)=Y-TIY-YCUT-YOFF+1
  1521.   FW=Max(FW,CW(CC)) : FH=Max(FH,CH(CC))
  1522.   If CC<Len(DEF$)
  1523.    DEF$=Left$(DEF$,CC)+"?"+Mid$(DEF$,CC+1)
  1524.   Else 
  1525.    DEF$=DEF$+"?"
  1526.   End If 
  1527.   Inc NC
  1528.   Inc CC
  1529.   _SAVED=0
  1530.   _FFONT
  1531.   _FDEF
  1532.  End If 
  1533.  Screen 0
  1534. End Proc
  1535. Procedure _BRMB
  1536.  HX=X : HY=Y
  1537.  _MLIMIT[0,0,(PICW-(320+HRES*320))*(2-HRES)+1-HRES,(PICH-BH)*2+1]
  1538.  _MX=BITX*(2-HRES) : _MY=BITY*2 : _MON=0 : Sprite Off 0
  1539.  Repeat 
  1540.   Wait 1
  1541.   MK=Mouse Key
  1542.   _MCHECK
  1543.   X=_MX : Y=_MY
  1544.   BITX=X/(2-HRES)
  1545.   BITY=Y/2
  1546.   Screen Offset 3,BITX,BITY
  1547.  Until MK<2
  1548.  _MINIT
  1549.  _MX=HX : _MY=HY : _MON=1
  1550. End Proc
  1551. Procedure _GSELNORM
  1552.  _SP=1 : GMODE=0
  1553. End Proc
  1554. Procedure _GSELGRID
  1555.  _SP=2 : GMODE=1 : GSTEP=0
  1556. End Proc
  1557. Procedure _GSELPROP
  1558.  _SP=3 : GMODE=2 : GSTEP=0
  1559. End Proc
  1560. Procedure _PON
  1561.  If PON
  1562.   Screen Close 4
  1563.   Screen Close 5
  1564.   PON=0
  1565.   If FON*FY>PY
  1566.    Add FY,-38
  1567.    Screen Display 1,,50+FY,,
  1568.    Screen Display 2,,50+FY+17,,
  1569.   End If 
  1570.   If BON*BY
  1571.    Add BH,38
  1572.    BITX=Max(0,Min(PICW-(320+HRES*320),BITX))
  1573.    BITY=Max(0,Min(PICH-BH,BITY))
  1574.    Screen Offset 3,BITX,BITY
  1575.    If BON*BY>PY
  1576.     Add BY,-38
  1577.    End If 
  1578.    If FON*FY>BY
  1579.     Add FY,38
  1580.     Screen Display 1,,50+FY,,
  1581.     Screen Display 2,,50+FY+17,,
  1582.    End If 
  1583.    Screen Display 3,,50+BY,,BH
  1584.   End If 
  1585.   Screen 0
  1586.  Else 
  1587.   '  Palette Editor
  1588.   Screen Open 4,640,28,16,Hires
  1589.   PY=13+FON*58+BON*(BH+1-38) : PON=1
  1590.   Screen Display 4,128,50+PY,640,28
  1591.   Curs Off : Flash Off : Cls 0
  1592.   Get Icon Palette 
  1593.   Paste Icon 0,0,7
  1594.   '  Palette 
  1595.   Screen Open 5,320,8,32,0
  1596.   Screen Display 5,128,50+PY+29,320,8
  1597.   Curs Off : Flash Off : Cls 0
  1598.   Get Palette 3
  1599.   '  Set Bitmap too
  1600.   If BON
  1601.    Add BH,-38
  1602.    If FON*FY>BON*BY
  1603.     Add FY,-38
  1604.     Screen Display 1,,50+FY,,
  1605.     Screen Display 2,,50+FY+17,,
  1606.    End If 
  1607.    Screen Display 3,,50+BY,,BH
  1608.   End If 
  1609.   _PCOLOR
  1610.   _FPAL
  1611.   _PCOLOR
  1612.   Screen 0
  1613.  End If 
  1614. End Proc
  1615. Procedure _PLMB
  1616.  S=Screen
  1617.  Screen 4
  1618.  Y=Y/2-PY
  1619.  If Y>13 and Y<26 and X>2 and X<156
  1620.   PBUT=(X-3)/51
  1621.   
  1622.   GAD[3+PBUT*51,14,51,12,2,1]
  1623.   If PBUT=0
  1624.    _PSPREAD
  1625.   End If 
  1626.   If PBUT=1
  1627.    _PCOPY
  1628.   End If 
  1629.   If PBUT=2
  1630.    _PEX
  1631.   End If 
  1632.   _QUIET
  1633.   GAD[3+PBUT*51,14,51,12,2,0]
  1634.   
  1635.  Else 
  1636.   If X>443 and X<636 and Y>1 and Y<26
  1637.    _PALTER
  1638.   Else 
  1639.    If Y>28
  1640.     _PSELECT
  1641.    End If 
  1642.   End If 
  1643.  End If 
  1644.  Screen S
  1645. End Proc
  1646. Procedure _PSELECT
  1647.  PC=X/20
  1648.  If PLOP=1 and PC<>PLPC
  1649.   For PCS=PC To PLPC Step Sgn(PLPC-PC)
  1650.    FR(PCS)=FR(PC)+((FR(PLPC)-FR(PC))*(PCS-PC))/(PLPC-PC)
  1651.    FG(PCS)=FG(PC)+((FG(PLPC)-FG(PC))*(PCS-PC))/(PLPC-PC)
  1652.    FB(PCS)=FB(PC)+((FB(PLPC)-FB(PC))*(PCS-PC))/(PLPC-PC)
  1653.   Next 
  1654.   _FPAL
  1655.  End If 
  1656.  If PLOP=2
  1657.   FR(PC)=FR(PLPC)
  1658.   FG(PC)=FG(PLPC)
  1659.   FB(PC)=FB(PLPC)
  1660.   _FPAL
  1661.  End If 
  1662.  If PLOP=3
  1663.   Swap FR(PC),FR(PLPC)
  1664.   Swap FG(PC),FG(PLPC)
  1665.   Swap FB(PC),FB(PLPC)
  1666.   _FPAL
  1667.  End If 
  1668.  _PCOLOR
  1669. End Proc
  1670. Procedure _PSPREAD
  1671.  PLOP=1 : PLPC=PC
  1672. End Proc
  1673. Procedure _PCOPY
  1674.  PLOP=2 : PLPC=PC
  1675. End Proc
  1676. Procedure _PEX
  1677.  PLOP=3 : PLPC=PC
  1678. End Proc
  1679. Procedure _PALTER
  1680.  PSL=(Y-2)/8
  1681.  CV=(X-444)/12
  1682.  If PSL=0 Then N=FR(PC)
  1683.  If PSL=1 Then N=FG(PC)
  1684.  If PSL=2 Then N=FB(PC)
  1685.  If N=CV
  1686.   Repeat 
  1687.    _MCHECK
  1688.    X=_MX : Y=_MY : MK=Mouse Key
  1689.    Ink 2
  1690.    Gr Locate 444+CV*12,3+PSL*8
  1691.     Extension_12_01B0 11,5
  1692.    CV=Max(0,Min(15,(X-444)/12))
  1693.    Paste Icon 444+CV*12,3+PSL*8,8
  1694.   Until MK<>1
  1695.   If MK=2
  1696.    CV=N
  1697.   End If 
  1698.  Else 
  1699.   CV=N+Sgn(CV-N)
  1700.  End If 
  1701.  If PSL=0 Then FR(PC)=CV
  1702.  If PSL=1 Then FG(PC)=CV
  1703.  If PSL=2 Then FB(PC)=CV
  1704.  _FPAL
  1705.  _PCOLOR
  1706. End Proc
  1707. Procedure _PCOLOR
  1708.  If PON
  1709.   S=Screen
  1710.   Screen 5
  1711.   Paste Icon 0,0,9
  1712.   Ink -(PC=0)
  1713.   Gr Locate PC*10,0
  1714.    Extension_12_01B0 9,7
  1715.   Ink PC
  1716.    Extension_12_0172 1,1
  1717.    Extension_12_01B0 7,5
  1718.   Screen 4
  1719.   Ink 2
  1720.   For SC=0 To 2
  1721.    Gr Locate 444,3+SC*8
  1722.     Extension_12_01B0 191,5
  1723.    SCC=-(SC=0)*FR(PC)-(SC=1)*FG(PC)-(SC=2)*FB(PC)
  1724.    Paste Icon 444+SCC*12,3+SC*8,8
  1725.   Next 
  1726.   Screen S
  1727.   PLOP=0
  1728.  End If 
  1729. End Proc
  1730. Procedure _ABOUT
  1731.  Sprite Off 0
  1732.  Paste Icon 0,12,10
  1733.  Screen Display 0,,,640,63
  1734.  Repeat 
  1735.   _MCHECK
  1736.   MK=Mouse Key
  1737.  Until MK
  1738.  Screen Display 0,,,640,12
  1739.  Bar 0,12 To 640,111
  1740. End Proc
  1741. Procedure _MENU
  1742.  MPICK=0 : ACTIVE=0
  1743.  Paste Icon 0,0,2
  1744.  Screen To Front 0
  1745.  Repeat 
  1746.   MK=Mouse Key
  1747.   _MCHECK
  1748.   X=_MX : Y=_MY/2
  1749.   If Y<12 and X>=7 and X<=426
  1750.    NEWACTIVE=(X-7)/105+1
  1751.    If ACTIVE<>NEWACTIVE
  1752.     If ACTIVE
  1753.      GAD[7+(ACTIVE-1)*105,0,105,12,2,1]
  1754.     End If 
  1755.     ACTIVE=NEWACTIVE
  1756.     GAD[7+(ACTIVE-1)*105,0,105,12,2,0]
  1757.     MPICK=0
  1758.     Ink 0 : Bar 0,12 To 640,111
  1759.     Paste Icon 7+(ACTIVE-1)*105,12,ACTIVE+2
  1760.     Screen Display 0,,,640,16+MNUMS(ACTIVE-1)*12
  1761.    Else 
  1762.     If MPICK/16=ACTIVE
  1763.      GAD[AX,14+(MPICK-ACTIVE*16)*12,310,12,2,1]
  1764.      MPICK=0
  1765.     End If 
  1766.    End If 
  1767.   Else 
  1768.    If ACTIVE
  1769.     C=1
  1770.     AX=10+(ACTIVE-1)*105
  1771.     If X>=AX and X<=AX+309 and Y>=14 and Y<=139
  1772.      YCOM=(Y-14)/12
  1773.      SYCOM=2^YCOM
  1774.      If SYCOM and MITEMS(ACTIVE-1)
  1775.       NEWMPICK=ACTIVE*16+YCOM
  1776.       C=0
  1777.       If MPICK<>NEWMPICK
  1778.        If MPICK/16=ACTIVE
  1779.         GAD[AX,14+(MPICK-ACTIVE*16)*12,310,12,2,1]
  1780.        End If 
  1781.        MPICK=NEWMPICK
  1782.        GAD[AX,14+YCOM*12,310,12,2,0]
  1783.       End If 
  1784.      End If 
  1785.     End If 
  1786.     If C=1 and(MPICK/16=ACTIVE)
  1787.      GAD[AX,14+(MPICK-ACTIVE*16)*12,310,12,2,1]
  1788.      MPICK=0
  1789.     End If 
  1790.    End If 
  1791.   End If 
  1792.  Until MK<2
  1793.  Screen Display 0,,,640,12
  1794.  Ink 0 : Bar 0,12 To 640,111
  1795.  Paste Icon 0,0,1
  1796. End Proc
  1797. Procedure _MLMB
  1798.  PFB=(X-583)/19
  1799.  GAD[583+PFB*19,0,19,12,2,1]
  1800.  If PFB=0
  1801.   _PON
  1802.  Else 
  1803.   If PFB=1
  1804.    _FON
  1805.   Else 
  1806.    If PFB=2
  1807.     _BON
  1808.    End If 
  1809.   End If 
  1810.  End If 
  1811.  _QUIET
  1812.  GAD[583+PFB*19,0,19,12,2,0]
  1813. End Proc
  1814. Procedure _QUIT
  1815.  If FON Then Screen Close 1 : Screen Close 2
  1816.  If PON Then Screen Close 4 : Screen Close 5
  1817.  Screen Close 3
  1818.  Screen Close 7
  1819.  Screen Close 0
  1820.  Wait 5
  1821.  Show 
  1822.  Erase 1
  1823.  Bank Swap 1,3
  1824.  Edit 
  1825. End Proc
  1826. Procedure _INIT
  1827.  ' If Leek(Start(1)-20)<>106 Then Bell : Wait 30 : Edit 
  1828.  Bank Swap 1,3
  1829.  
  1830.  No Icon Mask 
  1831.  Make Icon Mask 8
  1832.  
  1833.  For A=0 To 3 : Read MITEMS(A),MNUMS(A) : Next 
  1834.  Screen Open 7,320,200,2,0
  1835.  Curs Off : Flash Off : Cls 0
  1836.  Screen Display 7,128,50,320,200
  1837.  Screen Open 0,640,124,16,Hires
  1838.  Curs Off : Flash Off : Cls 0
  1839.  Get Icon Palette 
  1840.  Screen Display 0,128,50,640,12
  1841.  _MINIT
  1842.  Hide : _MON=1
  1843.  Shift Down 6,4,9,1
  1844.  Paste Icon 0,0,1
  1845.  
  1846.  PICW=320 : PICH=200 : HRES=0
  1847.  DEFPICNAME$=""
  1848.  DEF$="" : NC=0 : FW=0 : FH=0
  1849.  For A=0 To 254
  1850.   CB(A)=0 : CX(A)=0 : CW(A)=0
  1851.  Next 
  1852.  CC=0
  1853.  _CUT=0
  1854.  _SAVED=1
  1855.  _GSELNORM
  1856.  
  1857.  Screen Open 3,PICW,PICH,32-HRES*16,HRES*Hires
  1858.  Curs Off : Flash Off : Cls 1
  1859.  A=$888
  1860.  Palette 0,$36,$6A,$9F,A,A,A,A,A,A,A,A,A,A,A,A,A,,,,A,A,A,A,A,A,A,A,A,A,A,A
  1861.  _GETFPALETTE
  1862.  Screen Hide 3
  1863.  Screen 0
  1864.  
  1865.  _BON
  1866.  _FON
  1867.  
  1868.  PC=0 : PLOP=0 : PLPC=0 : GMODE=0 : GSTEP=0
  1869.  
  1870.  MENUDATA:
  1871.  Data 189,8,11,4,471,9,23,5
  1872. End Proc
  1873. Procedure GAD[X1,Y1,X2,Y2,C,DN]
  1874.  X2=X1+X2-1 : Y2=Y1+Y2-1
  1875.  Ink C+1-DN*2
  1876.   Extension_12_04CC X1,Y2-1 To X1,Y1 : Extension_12_04CC X1,Y1 To X2-1,Y1
  1877.  Ink C-1+DN*2
  1878.   Extension_12_04CC X2,Y1+1 To X2,Y2 : Extension_12_04CC X2,Y2 To X1+1,Y2
  1879. End Proc
  1880. Procedure _QUIET
  1881.  TEM=_MON
  1882.  _MON=0
  1883.  Sprite Off 0
  1884.  Repeat 
  1885.   _MCHECK
  1886.   MK=Mouse Key
  1887.   K=Asc(Inkey$)-Key State(70)-Key State(65)-Key State(69)
  1888.  Until MK=0 and K=0
  1889.  _MON=TEM
  1890. End Proc
  1891. Procedure _CROSSHAIR[X1,Y1,X2,Y2,XI,YI]
  1892.  Draw X1,YI To X2,YI
  1893.  Draw XI,Y1 To XI,Y2
  1894. End Proc
  1895. Procedure _BASELINE[X1,Y1,X2,Y2,XI,YI]
  1896.  Draw X1,YI To X2,YI
  1897. End Proc
  1898. Procedure _FLASHBOX[X1,Y1,X2,Y2]
  1899.  Draw X1,Y1 To X2,Y1
  1900.  Draw To X2,Y2
  1901.  Draw To X1,Y2
  1902.  Draw To X1,Y1
  1903. End Proc
  1904. Procedure _FLASHLINE[X1,Y1,X2,Y2]
  1905.  Plot X1,Y1
  1906.  Draw X1,Y1 To X2,Y2
  1907. End Proc
  1908. Procedure _UNBUG
  1909.  A= Extension_12_044C(0,0)
  1910.  Draw 0,0 To 0,0
  1911.   Extension_12_036E 0,0,A
  1912. End Proc
  1913. Procedure _MINIT
  1914.  Limit Mouse 128,50 To 128+319,50+199
  1915.  XR=Peek($DFF00B) : YR=Peek($DFF00A)
  1916.  _MX=320 : _MY=200
  1917.  _MLIMIT[0,0,639,397]
  1918. End Proc
  1919. Procedure _MCHECK
  1920.  WX=Peek($DFF00B)-XR
  1921.  If WX<-128 Then Add WX,256
  1922.  If WX>127 Then Add WX,-256
  1923.  WY=Peek($DFF00A)-YR
  1924.  If WY<-128 Then Add WY,256
  1925.  If WY>127 Then Add WY,-256
  1926.  XR=Peek($DFF00B) : YR=Peek($DFF00A)
  1927.  DX=WX
  1928.  DY=WY
  1929.  _MX=Max(_MTX,Min(_MBX,_MX+DX))
  1930.  _MY=Max(_MTY,Min(_MBY,_MY+DY))
  1931.  Bank Swap 1,3
  1932.  Sprite 0,128+_MX/2,50+_MY/2,_MON*_SP
  1933.  Multi Wait 
  1934.  Bank Swap 1,3
  1935. End Proc
  1936. Procedure _MLIMIT[X1,Y1,X2,Y2]
  1937.  _MTX=X1 : _MTY=Y1
  1938.  _MBX=X2 : _MBY=Y2
  1939. End Proc
  1940. Procedure _BOX[X1,Y1,X2,Y2,C]
  1941.  Ink C
  1942.   Extension_12_04CC X1,Y1 To X2,Y1 : Extension_12_04CC X2,Y1 To X2,Y2
  1943.   Extension_12_04CC X2,Y2 To X1,Y2 : Extension_12_04CC X1,Y2 To X1,Y1
  1944. End Proc
  1945. Procedure _GETFPALETTE
  1946.  For A=0 To 31
  1947.   CA=Colour(A)
  1948.   FR(A)=(CA and $F00)/$100
  1949.   FG(A)=(CA and $F0)/$10
  1950.   FB(A)=(CA and $F)
  1951.  Next 
  1952. End Proc
  1953. Procedure _PUTFPALETTE
  1954.  For A=0 To 31
  1955.   Colour A,FR(A)*$100+FG(A)*$10+FB(A)*$1
  1956.  Next 
  1957. End Proc
  1958. Procedure _POKESTRING[LOC,S$]
  1959.  For SL=1 To Len(S$)
  1960.   Poke LOC+SL-1,Asc(Mid$(S$,SL,1))
  1961.  Next 
  1962. End Proc
  1963. Procedure _PEEKSTRING[LOC,SL]
  1964.  S$=""
  1965.  For SLC=1 To SL
  1966.   S$=S$+Chr$(Peek(LOC+SLC-1))
  1967.  Next 
  1968. End Proc[S$]
  1969. Procedure _PERMPALETTE
  1970.  PS=Start(1)+2+Length(1)*8
  1971.  For A=0 To 31
  1972.   Doke PS+A*2,FR(A)*$100+FG(A)*$10+FB(A)*$1
  1973.  Next 
  1974. End Proc
  1975. Procedure _GETFILEPAL
  1976.  PS=Start(1)+2+Length(1)*8
  1977.  For A=0 To 31
  1978.   CA=Deek(PS+A*2)
  1979.   FR(A)=(CA and $F00)/$100
  1980.   FG(A)=(CA and $F0)/$10
  1981.   FB(A)=(CA and $F)
  1982.  Next 
  1983. End Proc
  1984. Procedure _GRABCUT[X1,Y1,X2,Y2]
  1985.  XOFF=0 : YOFF=0 : XCUT=0 : YCUT=0
  1986.  
  1987.  ' Left 
  1988.  T=0 : Repeat 
  1989.   If X1<X2
  1990.    For A=Y1 To Y2
  1991.     Add T,-(Point(X1,A)>0)
  1992.    Next 
  1993.    If T=0
  1994.     Inc X1
  1995.     Inc XOFF
  1996.    End If 
  1997.   Else 
  1998.    T=1
  1999.   End If 
  2000.  Until T
  2001.  
  2002.  ' Top  
  2003.  T=0 : Repeat 
  2004.   If Y1<Y2
  2005.    For A=X1 To X2
  2006.     Add T,-(Point(A,Y1)>0)
  2007.    Next 
  2008.    If T=0
  2009.     Inc Y1
  2010.     Inc YOFF
  2011.    End If 
  2012.   Else 
  2013.    T=1
  2014.   End If 
  2015.  Until T
  2016.  
  2017.  ' Right
  2018.  T=0 : Repeat 
  2019.   If X1<X2
  2020.    For A=Y1 To Y2
  2021.     Add T,-(Point(X2,A)>0)
  2022.    Next 
  2023.    If T=0
  2024.     Dec X2
  2025.     Inc XCUT
  2026.    End If 
  2027.   Else 
  2028.    T=1
  2029.   End If 
  2030.  Until T
  2031.  
  2032.  ' Bottom 
  2033.  T=0 : Repeat 
  2034.   If Y1<Y2
  2035.    For A=X1 To X2
  2036.     Add T,-(Point(A,Y2)>0)
  2037.    Next 
  2038.    If T=0
  2039.     Dec Y2
  2040.     Inc YCUT
  2041.    End If 
  2042.   Else 
  2043.    T=1
  2044.   End If 
  2045.  Until T
  2046.  Ink Rnd(31)
  2047. End Proc
  2048. Procedure MC
  2049.  X=0 : Y=0 : MK=0
  2050. End Proc
  2051. Procedure F_TEXT[XO,YO,S$]
  2052.  XC=XO
  2053.  For A=1 To Len(S$)
  2054.   CH=-1
  2055.   B=0
  2056.   Repeat 
  2057.    If Mid$(DEF$,B+1,1)=Mid$(S$,A,1) Then CH=B
  2058.    Inc B
  2059.   Until B=NC or CH>=0
  2060.   If CH>=0
  2061.    Paste Bob XC+CX(CH),YO-CB(CH),CH+1
  2062.    Add XC,CW(CH)+1
  2063.   End If 
  2064.  Next 
  2065. End Proc
  2066. Procedure F_TEXT_WIDTH[S$]
  2067.  WIDTH=0
  2068.  For A=1 To Len(S$)
  2069.   CH=-1
  2070.   B=0
  2071.   Repeat 
  2072.    If Mid$(DEF$,B+1,1)=Mid$(S$,A,1) Then CH=B
  2073.    Inc B
  2074.   Until B=NC or CH>=0
  2075.   If CH>=0
  2076.    Add WIDTH,CW(CH)+1
  2077.   End If 
  2078.  Next 
  2079. End Proc[WIDTH]
  2080. Procedure F_TEXT_CENTRE[XO,YO,S$]
  2081.  F_TEXT_WIDTH[S$]
  2082.  F_TEXT[XO-Param/2,YO,S$]
  2083. End Proc
  2084. Procedure _TESTFONT
  2085.  If NC>0
  2086.   Sprite Off 0
  2087.   Screen Open 6,320+FRES*320,200,32-16*FRES,FRES*Hires
  2088.   Screen Display 6,128,50,320+FRES*320,200
  2089.   Curs Off : Flash Off : Cls 0
  2090.   _PUTFPALETTE
  2091.   YYY=100+FH/2
  2092.   F_TEXT_CENTRE[160+FRES*160,YYY-FH*2-2,"ABCDEFGHIJKLM"]
  2093.   F_TEXT_CENTRE[160+FRES*160,YYY-FH-1,"NOPQRSTUVWXYZ"]
  2094.   F_TEXT_CENTRE[160+FRES*160,YYY,"0123456789.!?"]
  2095.   F_TEXT_CENTRE[160+FRES*160,YYY+FH+1,"FONT TEST SCREEN"]
  2096.   F_TEXT_CENTRE[160+FRES*160,YYY+FH*2+2,"abcdefghijklm"]
  2097.   F_TEXT_CENTRE[160+FRES*160,YYY+FH*3+3,"nopqrstuvwxyz"]
  2098.   'fh=font height
  2099.   '   X=0 : Y=YY+FH*3+3
  2100.   'put typing test mode here, although this is ok for now. 
  2101.   Repeat 
  2102.    _MCHECK
  2103.   Until Mouse Key
  2104.   Screen Close 6
  2105.   Screen 0
  2106.  End If 
  2107. End Proc