home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 28 / amigaformatcd28.iso / -seriously_amiga- / programming / amos / lipsynclab / lipsynclab2.amos / lipsynclab2.amosSourceCode < prev    next >
AMOS Source Code  |  1998-04-23  |  17KB  |  585 lines

  1. ' LipSyncLab2, ï¿½ 1998 Steve Tiffany  
  2. ' It's a tool to assign mouth bobs & Wait times to sampled speech... 
  3. ' Writes a file in RAM called SampleMouthData.asc in this format:  
  4. ' _FILENAME: Data SampleLength,NUMMOUTHS,MouthBob,Wait,MouthBob,Wait, etc. 
  5. ' You merge that file into your program. 
  6.  
  7. 'Important!  Change value of CURRDIR$ to reflect actual location of this program.
  8. '            It's set at the top of the Globals... You may eventually want to  
  9. '            change value of SAMDIR$, in Procedure SETUP, to reflect where you 
  10. '            store your samples.  Set PROJFREQ below if using raw samples. 
  11.  
  12. Dim MOUTHBOB(200)
  13. Dim XOVER(200)
  14. Dim MN$(70)
  15. Dim DIAL$(8)
  16.  
  17. Global CURRDIR$,PROJFREQ
  18.   CURRDIR$="work:LipSyncLab/"
  19.   PROJFREQ=13982 : Rem : (only need to change PROJFREQ if working with raw samples)   
  20.  
  21. Global MOUTHBOB()
  22. Global XOVER()
  23. Global CUWAIT#,CUWAIT
  24. Global SXINTERVAL#,SXINTERVAL
  25. Global HIGHLIGHTEDX1,HIGHLIGHTEDX2
  26. Global ICONCOLNUM
  27.  
  28. Global MN$(),NMN
  29. Global YMN,MNDOWN,BPIC
  30. Global DIAL$()
  31. Global XINF,YINF,SXINF,SYINF
  32. Global MX,MY,MZ,MK
  33. Global C0,C1,C2,C3,C4,C5,C6,C7,CA,CNA,ACT
  34. Global BLOC
  35. Global ALERT
  36. Global CHANGED
  37. Global CUNAME$,CUFREQ,CULEN,CUSTART,CUEND
  38. Global XWAVE,YWAVE,SXWAVE,SYWAVE
  39. Global XSTART,XEND
  40. Global BCU
  41. Global CURRNAME$,SAMDIR$
  42. Global SLOWFLAG,MOUTHWAIT
  43.  
  44. COM$=Command Line$
  45.  
  46. C0=6 : C1=6 : C2=2 : C3=7 : C4=3 : C5=4 : C6=4 : C7=1
  47.  
  48. BCU=65502
  49. BPIC=65500 : 
  50. MNDOWN=39
  51. N=20 : Repeat : N=N+1 : Read MN$(N) : Until MN$(N)="End" : NMN=N-1 : 
  52. Data "  02384016064052_GSAM","  03384068064052_PSAM"
  53. Data "/ 04624016000000_SL","  05624104016008_DN","  06624112016008_UP"
  54. Data "/ 99000016000000_SSt","/ 99192016000000_SEnd"
  55. Data "/ 99448032176088_BNAME"
  56. Data "/ 07000120000000"
  57. Data "  09000136128008_3plus","  10000144128008_2Plus","  32000152128008_1Plus","  11000160000000","  33000176128008_1Minus","  1200018412808_2Minus","  13000192128008_3Minus"
  58. Data "  14128136016016_STM","  15144136016016_STP","  16160136000000"
  59. Data "  34128152016016_ENM","  35144152016016_ENP","  36160152000000"
  60. Data "  17128168128032_Hear"
  61. Data "  18256136064032_SLoad"
  62. Data "  19320136064032_SSave"
  63. Data "  20256168064032_SName"
  64. Data "  21320168064032_SClr"
  65. Data "  22448136064032_BLoad"
  66. Data "  23512136064032_BSave"
  67. Data "  24576136064032_BSavas"
  68. Data "  25448168064032_BClr"
  69. Data "  26512168064032_BIns"
  70. Data "  27576168064032_BDel"
  71. Data "  28384136000000"
  72. Data "  29000000000000","  30384000064016_MNQUIT","  31448000000000"
  73. Data "End"
  74.  
  75. DIAL$(1)="Free chip:"
  76. DIAL$(2)="Free fast:"
  77. DIAL$(3)=">>> Loading IFF sample <<<"
  78. DIAL$(4)=">>> Loading raw data <<<"
  79. DIAL$(5)="Error while accessing disc."
  80. DIAL$(6)="Warning, low memory state!"
  81. DIAL$(7)="Out of memory."
  82. DIAL$(8)=": cannot load more samples."
  83.  
  84. Global LMBANK
  85. LMBANK=65501
  86.  
  87. Proc SETUP
  88.  
  89. Do 
  90.    If Mouse Click=1 Then Proc CLICKHANDLER
  91. Loop 
  92.  
  93. Procedure CLICKHANDLER
  94.    XM=X Screen(X Mouse) : YM=Y Screen(Y Mouse)
  95.    If XM<1 Then XM=1
  96.    If XM>640 Then XM=640
  97.    If XM>575 and YM>182 Then Proc QUITIT : Rem : User selected "QUIT" 
  98.    If XM<448 and YM>115 : Rem : Clicked on Mouth #,pic,sounds column...  
  99.       If SXINTERVAL#=0 : Pop Proc : End If 
  100.       MOUTHNUM=((XM+1)/64)+1
  101.       MOUTHBOB(ICONCOLNUM)=MOUTHNUM
  102.       MN$=Str$(MOUTHNUM)-" "
  103.       Ink 2 : Text XOVER(ICONCOLNUM),110,MN$
  104.       If MOUTHNUM>0 : Paste Bob 158,0,MOUTHNUM : End If 
  105.    End If 
  106.  
  107. 'Box 0,37 To 638,102 : Rem:65 is y centerline? 
  108.    If YM>37 and YM<70 : SLOWFLAG=1 : _PLAYSAMPLE : End If 
  109.    If YM>69 and YM<102 : _PLAYSAMPLE : End If 
  110.    If YM<32
  111.       If XM<221
  112.          If YM<12 and XM<157 : SLOWFLAG=1 : End If 
  113.          Proc _PLAYSAMPLE
  114.       End If 
  115.       If XM>529 : Proc _LOADNEXTSAMPLE : End If 
  116.       If XM>409 and XM<530 and YM<14 : SLOWFLAG=1 : Proc _PLAYSAMPLE : End If 
  117.    End If 
  118.  
  119.    If YM>101 and YM<113 : Rem : It's on the Mouth Number bar...  
  120.       If SXINTERVAL#=0 : Pop Proc : End If 
  121.       Ink 1 : Box HIGHLIGHTEDX1,102 To HIGHLIGHTEDX2,113
  122.       YM#=YM : XM#=XM : SENSITIVITY=6 : Ink 2,3
  123.       ICONCOLNUM#=((XM#-2)/SXINTERVAL#)+1 : ICONCOLNUM=Int(ICONCOLNUM#)
  124.       If ICONCOLNUM<1 : ICONCOLNUM=1 : End If 
  125.       HIGHLIGHTEDX1=XOVER(ICONCOLNUM) : HIGHLIGHTEDX2=XOVER(ICONCOLNUM+1)
  126.          If HIGHLIGHTEDX2=0 : HIGHLIGHTEDX2=639 : End If 
  127.       Ink 5 : Box HIGHLIGHTEDX1,102 To HIGHLIGHTEDX2,113 : Ink 2
  128.  
  129.       YM=YM+MOUTHBOB(ICONCOLNUM)*SENSITIVITY
  130.       While Mouse Key=1
  131.          NEWYM=Y Screen(Y Mouse)
  132.          MOUTHNUM=-(NEWYM-YM)/SENSITIVITY : 
  133.          If MOUTHNUM>7 : MOUTHNUM=7 : End If 
  134.          If MOUTHNUM<0 : MOUTHNUM=0 : End If 
  135.          MN$=Str$(MOUTHNUM)-" "
  136.          If MN$="0" : MN$=" " : End If 
  137.          Text XOVER(ICONCOLNUM),110,MN$
  138.          If MOUTHNUM>0 : Paste Bob 158,0,MOUTHNUM : End If 
  139.          MOUTHBOB(ICONCOLNUM)=MOUTHNUM
  140.       Wend 
  141.    End If 
  142. End Proc
  143.  
  144. Procedure _LOADNEXTSAMPLE
  145.    Proc ROUTINEAPPEND
  146.    For J=1 To 200 : MOUTHBOB(J)=0 : XOVER(J)=0 : Next J
  147.    Ink 1 : Box 0,102 To 639,113 : Ink 3 : Bar 1,103 To 638,112
  148. '   F$=Fsel$("work:misc/am3/phrases28000/*") 
  149.    F$=Fsel$(SAMDIR$)
  150.    If F$<>""
  151.       _LOAD_CSAM[F$]
  152.       _DISPLAY_WAVE
  153.    End If 
  154.    SAMDIR$=Dir$
  155.    SLOWFLAG=0
  156. End Proc
  157.  
  158. Procedure _PLAYSAMPLE
  159.    If CUEND-CUSTART<513 Then Pop Proc
  160.    Gr Writing 3
  161.    If SLOWFLAG=1 Then CUFREQ=PROJFREQ/2 : MOUTHWAIT=2
  162.    Sam Raw 3,Start(BCU)+CUSTART,Max(512,CUEND-CUSTART),CUFREQ
  163.    For J=1 To CUWAIT
  164.       Draw XOVER(J),38 To XOVER(J),101
  165.  
  166.       CURRBOB=MOUTHBOB(J)
  167.       If CURRBOB=0
  168.          Wait MOUTHWAIT
  169.       Else 
  170.          Paste Bob 158,0,CURRBOB : Wait MOUTHWAIT
  171.       End If 
  172.       Draw XOVER(J),38 To XOVER(J),101
  173.    Next J
  174.    Gr Writing 1 : CUFREQ=PROJFREQ : SLOWFLAG=0 : MOUTHWAIT=1
  175.    Paste Bob 158,0,1
  176. End Proc
  177.  
  178. Procedure QUITIT
  179.    Proc ROUTINEAPPEND
  180.    Dir$="Ram:"
  181.    Erase BCU : Edit 
  182. End Proc
  183.  
  184. Procedure ROUTINEAPPEND
  185. If CUWAIT=0 Then Pop Proc
  186.    If MOUTHBOB(1)=0 Then MOUTHBOB(1)=2
  187.    NUMMOUTHS=0
  188.    For J=1 To CUWAIT
  189.       CURRBOB=MOUTHBOB(J) : If CURRBOB>0 Then Inc NUMMOUTHS
  190.    Next J
  191. 'now Nummouths is set... 
  192.  
  193.    CURRBOBDATA$=","+Str$(MOUTHBOB(1))-" " : CURRBOBWAIT=1
  194.    For J=2 To CUWAIT
  195.       CURRBOB=MOUTHBOB(J)
  196.       If CURRBOB>0
  197.          CURRBOBDATA$=CURRBOBDATA$+","+Str$(CURRBOBWAIT)-" "+","+Str$(MOUTHBOB(J))-" "
  198.          CURRBOBWAIT=1
  199.       Else 
  200.          Inc CURRBOBWAIT
  201.       End If 
  202.    Next J
  203.    CURRBOBDATA$=CURRBOBDATA$+","+Str$(CURRBOBWAIT)-" "
  204.    NUMMOUTHS$=Str$(NUMMOUTHS)-" "
  205.  
  206.    Append 1,"ram:SampleMouthData.asc"
  207.       FILENAME$="_"+CURRNAME$+": Data"+Str$(CULEN)+","
  208.       Print #1,FILENAME$;
  209.       Print #1,NUMMOUTHS$;
  210.       Print #1,CURRBOBDATA$
  211.    Close 1
  212. End Proc
  213.  
  214. '**********
  215.  
  216. Procedure _LOAD_CSAM[N$]
  217.    On Error Proc _DISC_ERROR
  218.    Resume Label _ERR
  219.    _CSAM_CLR : CUNAME$=""
  220.  
  221.    If Chip Free+Fast Free<32*1024
  222.       _INFO[">>> "+DIAL$(7)+DIAL$(8)+" <<<"] : ALERT=200 : E=-1
  223.    Else 
  224.       A=1
  225.       Do 
  226.          B=Instr(N$,":",A)
  227.          If B=0
  228.             B=Instr(N$,"/",A) : If B=0 : Exit : End If 
  229.          End If 
  230.          A=B+1
  231.       Loop 
  232.      CURRNAME$=Mid$(N$,A)
  233.       Repeat 
  234.          C$=Mid$(N$,A,1)
  235.          If(C$=".") or(C$="") : Exit : End If 
  236.          CUNAME$=CUNAME$+C$
  237.          A=A+1
  238.       Until Len(CUNAME$)>=8
  239.       Open In 1,N$
  240.       A$=Input$(1,12)
  241.       If(Left$(A$,4)="FORM") and(Right$(A$,4)="8SVX")
  242. '         _INFO[DIAL$(3)]  
  243.          Do 
  244.             A$=Input$(1,8)
  245.             PCHUNK=Pof(1) : LCHUNK=Leek(Varptr(A$)+4)
  246.             If Left$(A$,4)="VHDR"
  247.                B$=Input$(1,LCHUNK) : A=Varptr(B$)
  248.                CULEN=Leek(A)+Leek(A+4)
  249.                CUFREQ=Deek(A+12)
  250.                LCHUNK=0
  251.             End If 
  252.             If Left$(A$,4)="NAME"
  253.                B$=Input$(1,LCHUNK) : CUNAME$=""
  254.                For N=1 To 8
  255.                   C$=Mid$(B$,N,1) : If(C$<" ") or(C$>Chr$(127)) : C$=" " : End If 
  256.                   CUNAME$=CUNAME$+C$
  257.                Next 
  258.                LCHUNK=0
  259.             End If 
  260.             If Left$(A$,4)="BODY"
  261.                Exit 
  262.             End If 
  263.             If LCHUNK : Pof(1)=PCHUNK+LCHUNK : End If 
  264.          Loop 
  265.       Else : Rem: it's Raw... 
  266. '         _INFO[DIAL$(4)]  
  267.          Pof(1)=0 : CULEN=Lof(1) : CUFREQ=PROJFREQ
  268.       End If 
  269.       
  270.       If CULEN
  271.          CULEN=CULEN and $FFFFFFFE
  272.          Reserve As Chip Work BCU,CULEN
  273.          SZ=CULEN : AC=Start(BCU) : P=0
  274.          While P<SZ
  275.             L=Min(1024,SZ-P)
  276.             A$=Input$(1,L)
  277.             Copy Varptr(A$),Varptr(A$)+L To AC+P
  278.             P=P+L
  279.          Wend 
  280.          CUSTART=0 : CUEND=CULEN
  281.          E=0
  282.       End If 
  283.       
  284.    End If 
  285.    Close : Goto _END
  286.    
  287.    _ERR: E=-1 : _CSAM_CLR
  288.    _END:
  289. End Proc[E]
  290.  
  291. Procedure _CSAM_CLR
  292.    Sam Stop : Erase BCU
  293.    CUNAME$="Empty   "
  294.    CULEN=0 : CUFREQ=0 : CUSTART=0 : CUEND=0
  295.    XSTART=-1 : XEND=-1
  296.    CHANGED=0
  297. End Proc
  298. Procedure _DISPLAY_WAVE
  299.    CURRLEN=Len(CURRNAME$) : RAW$=Right$(CURRNAME$,3) : RAW$=Upper$(RAW$) : 
  300.    If RAW$="RAW" Then CURRNAME$=Left$(CURRNAME$,CURRLEN-3)
  301.    Pen 2 : Paper 6 : Locate 29,3
  302.    Print Using "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";CURRNAME$
  303.  
  304.    Cls 0,XWAVE,YWAVE-SYWAVE To XWAVE+SXWAVE+1,YWAVE+SYWAVE
  305.    XSTART=-1 : XEND=-1
  306.    If CULEN
  307.       Ink C3,C3 : Draw XWAVE,YWAVE To XWAVE+SXWAVE,YWAVE
  308.       AD=Start(BCU)
  309.       S=(CULEN*64)/SXWAVE
  310.       Plot XWAVE,YWAVE : A=0
  311.       Repeat 
  312.          P=Peek(AD+A/256)
  313.          X=XWAVE+((A/256)*SXWAVE)/CULEN
  314.          If P<128
  315.             Draw To X,YWAVE+(P*SYWAVE)/128
  316.          Else 
  317.             Draw To X,YWAVE+((P-256)*SYWAVE)/128
  318.          End If 
  319.          A=A+S
  320.       Until A>CULEN*256
  321.    End If 
  322.  
  323.    XWAITRESS=Timer
  324.    Sam Raw 3,Start(BCU)+CUSTART,Max(512,CUEND-CUSTART),CUFREQ
  325.    Repeat 
  326.       A=Sam Swapped(1) : Multi Wait 
  327.    Until A=1
  328.    NEWTIME=Timer : CUWAIT=NEWTIME-XWAITRESS
  329.  
  330. '   Print : Print "bcu=";BCU,"custart=";CUSTART,"CUEND=";CUEND 
  331. '   Print CURRNAME$,CULEN,CUFREQ 
  332. '   Print "cuwait=";CUWAIT 
  333.  
  334.    Ink 1
  335.    CUWAIT#=CUWAIT
  336.    SXINTERVAL#=638/CUWAIT#
  337.    For J=1 To CUWAIT
  338.       J#=J-1
  339.       XOVER=SXINTERVAL#*J#
  340.       Draw XOVER,103 To XOVER,112
  341.       XOVER(J)=XOVER
  342.    Next J
  343.    'SXINTERVAL=Int(SXINTERVAL#) 
  344.    HIGHLIGHTEDX1=XOVER(1) : HIGHLIGHTEDX2=XOVER(2)
  345.    Ink 5 : Box HIGHLIGHTEDX1,102 To HIGHLIGHTEDX2,113
  346.    Ink 2,3
  347.    ICONCOLNUM=1
  348. End Proc
  349.  
  350. Procedure SETUP
  351.    Shared XOFFSET,YOFFSET,SCRNWIDTH,SCRNHEIGHT
  352.    Screen Open 0,640,200,8,Hires
  353.    SCRNWIDTH=640 : SCRNHEIGHT=200 : Curs Off : Flash Off 
  354.    Proc SCRNCENTER[640,200,8]
  355.    Unpack 6 To 0
  356.    Screen Display 0,XOFFSET,YOFFSET,SCRNWIDTH,SCRNHEIGHT
  357. '   Curs Off : Flash Off 
  358. '   Load Iff "work:picture/LSLnew1to7.pic" 
  359. '   Spack 0 To 6 : End 
  360. '   Load "work:Amos_Pro/bobs/mouths9_8colorNew.abk" :  
  361.    No Mask 
  362.    Open Out 1,"ram:SampleMouthData.asc" : Close 1
  363.    XINF=8 : YINF=124 : SXINF=624 : SYINF=8
  364.    XWAVE=1 : YWAVE=70 : SXWAVE=637 : SYWAVE=32
  365.    MOUTHWAIT=1
  366.    Reserve Zone NMN
  367.  
  368.    _CSAM_CLR
  369. '   CURRDIR$=Dir$
  370.    SAMDIR$=CURRDIR$+"Samples/"
  371.    Ink C3,0
  372. End Proc
  373.  
  374. Procedure _DISPLAY_MN[N,F]
  375.    If MN$(N)<>""
  376.       If F<0
  377.          F=0 : A$=Left$(MN$(N),1) : If(A$>="A") and(A$=<"Z") : F=1 : End If 
  378.       End If 
  379.       I=Val(Mid$(MN$(N),3,2))
  380.       X=Val(Mid$(MN$(N),5,3)) : Y=Val(Mid$(MN$(N),8,3))+YMN
  381.       TX=Val(Mid$(MN$(N),11,3)) : TY=Val(Mid$(MN$(N),14,3))
  382.       If I
  383.          If F=0
  384.             If I<90
  385.                _UNPACK[I,X,Y]
  386.             Else 
  387.                G$="_D"+Mid$(Str$(I),2) : Gosub G$
  388.             End If 
  389.          Else 
  390.             If I<90
  391.                _UNPACK[I+MNDOWN,X,Y]
  392.             Else 
  393.                Screen Copy 0,X+2,Y+1,X+TX,Y+TY To 0,X,Y
  394.                Cls 0,X+TX-2,Y To X+TX,Y+TY
  395.                Cls 0,X,Y+TY-1 To X+TX,Y+TY
  396.             End If 
  397.          End If 
  398. If TX<>0 : Print "SetZone ";N,X,Y;"To";X+TX,Y+TY : End If 
  399.          If TX<>0 : Set Zone N,X,Y To X+TX,Y+TY : End If 
  400.       End If 
  401.    End If 
  402.    Pop Proc
  403.    _D99: Return 
  404. End Proc
  405. Procedure _UNPACK[N,X,Y]
  406.    Global BPIC
  407.    A=Start(BPIC)+Deek(Start(BPIC)+2*(N-1))
  408.    Unpack A,X,Y
  409. End Proc
  410. Procedure _MOUSE
  411.    Multi Wait 
  412.    MX=X Screen(X Mouse) : MY=Y Screen(Y Mouse) : MZ=Zone(MS,MX,MY)
  413.    MK=Mouse Key : If MK>3 : MK=3 : End If 
  414. End Proc
  415. Procedure _WAIT_NOMK
  416.    If FWT
  417.       Wait FWT : FWT=0
  418.    Else 
  419.       Wait Vbl : While Mouse Key : Wend 
  420.    End If 
  421. End Proc
  422. Procedure _WAIT_MK
  423.    While Inkey$<>"" : Wend 
  424.    Repeat : _MOUSE : Until Inkey$<>"" or MK<>0
  425. End Proc
  426. Procedure _INFO[A$]
  427.    Cls C1,XINF,YINF To XINF+SXINF,YINF+SYINF
  428.    Ink C3,C1
  429.    If A$=""
  430.       A$=DIAL$(1)+Str$(Chip Free)+" - "+DIAL$(2)+Str$(Fast Free)
  431.       If Chip Free+Fast Free<32*1024
  432.          A$=A$+" - "+DIAL$(6)
  433.       End If 
  434.    End If 
  435.    Text 320-Len(A$)*4,YINF+6,A$
  436. End Proc
  437. Procedure _DIALOG[A1$,A2$,F]
  438.    YY=48 : _UNPACK_DIALOG[YY,4]
  439.    Ink C3,C1
  440.    If A2$=""
  441.       Text 48,YY+22,A1$
  442.    Else 
  443.       Text 48,YY+18,A1$ : Text 48,YY+26,A2$
  444.    End If 
  445.    If F
  446.       MN$(1)="  39528052064032" : _DISPLAY_MN[1,0]
  447.    Else 
  448.       MN$(1)="  37464052064032" : MN$(2)="  38528052064032" : _DISPLAY_MN[1,0] : _DISPLAY_MN[2,0]
  449.    End If 
  450.    Wait 20 : _WAIT_NOMK
  451.    Do 
  452.       _MOUSE
  453.       If MK=1 and MZ>0 and MZ<3
  454.          _DISPLAY_MN[MZ,1] : _WAIT_NOMK : _DISPLAY_MN[MZ,0] : R=2-MZ : Exit 
  455.       End If 
  456.    Loop 
  457.    Reset Zone 1 : Reset Zone 2
  458.    _ERASE_DIALOG
  459. End Proc[R]
  460. Procedure _UNPACK_DIALOG[Y,N]
  461.    Get Block 1,16,Y-2,624,Y+N*8+9 : BLOC=1
  462.    Cls 0,30,Y-1 To 610,Y+N*8+9
  463.    _UNPACK[29,32,Y]
  464.    Screen Copy 0,48,Y,384+32,Y+16 To 0,240,Y
  465.    If N>1
  466.       Screen Copy 0,32,Y+12,608,Y+16 To 0,32,Y+4+N*8
  467.       For NN=1 To N
  468.          Screen Copy 0,32,Y+4,608,Y+12 To 0,32,Y-4+NN*8
  469.       Next 
  470.    End If 
  471.    Locate 3,Y/8+1
  472. End Proc[Y]
  473. Procedure _ERASE_DIALOG
  474.    If BLOC : Put Block 1 : Del Block 1 : BLOC=0 : End If 
  475. End Proc
  476. Procedure _DISC_ERROR
  477.    Close : Bell : _DIALOG[DIAL$(5),"",1]
  478.    Resume Label 
  479. End Proc
  480. Procedure SCRNCENTER[SCRNWIDTH,SCRNHEIGHT,NUMCOLORS]
  481.    Shared XOFFSET,YOFFSET
  482. '   NUMCOLORS=8
  483. 'If config file exists, read offsets and use them to center the screen.
  484. 'Otherwise, ask user to center the screen, take those offsets and write  
  485. 'them to a new config file in the user's S: directory or ram:...   
  486.  
  487. 'Determine correct config file name... 
  488. If SCRNWIDTH=320 or SCRNWIDTH=640
  489.    If SCRNHEIGHT=200 or SCRNHEIGHT=400
  490.       FILE$="AmosXyOffsetNTSC.config"
  491.    Else If SCRNHEIGHT=256 or SCRNHEIGHT=512
  492.       FILE$="AmosXyOffsetPAL.config"
  493.    End If 
  494. Else If SCRNWIDTH=352 or SCRNWIDTH=704
  495.    If SCRNHEIGHT=240 or SCRNHEIGHT=480
  496.       FILE$="AmosXyOverscanNTSC.config"
  497.    Else If SCRNHEIGHT=290 or SCRNHEIGHT=566
  498.       FILE$="AmosXyOverscanPAL.config"
  499.    End If 
  500. End If 
  501.  
  502. 'Check for permanent config file...
  503. SFILE$="S:"+FILE$
  504. If Exist(SFILE$)
  505.    Open In 1,SFILE$
  506.    Input #1,XOFFSET,YOFFSET
  507.    Close 1 : Pop Proc
  508. End If 
  509.  
  510. 'If no permanent config file, check Ram: for temporary one...  
  511. RFILE$="Ram:"+FILE$
  512. If Exist(RFILE$)
  513.    Open In 1,RFILE$
  514.    Input #1,XOFFSET,YOFFSET
  515.    Close 1 : Pop Proc
  516. End If 
  517.  
  518. 'If neither exists, ask user to center screen... 
  519. CENTERIT:
  520.    Pen 1 : Paper 0 : Cls 0 : Colour 1,$EEE : Hide 
  521.    Box 0,0 To SCRNWIDTH-1,SCRNHEIGHT-1
  522.    Box 0,2 To SCRNWIDTH-1,SCRNHEIGHT-3
  523.    Box 0,4 To SCRNWIDTH-1,SCRNHEIGHT-5
  524.  
  525.    Locate ,10 : Centre "Center screen with mouse.        "
  526.    If SCRNWIDTH=352 or SCRNWIDTH=704
  527.       Print 
  528.       Print : Centre "Try to show a single white line  "
  529.       Print : Centre "around each edge of the screen.  "
  530.    End If 
  531.       Print 
  532.       Print : Centre "Then click the left mouse button."
  533.       Paper 1 : Pen 2
  534. CENTERIT2:
  535.    X Mouse=190 : Y Mouse=30 : Wait 10
  536.    While Mouse Click<>1 : 
  537.       XOFFSET=X Mouse-88 : YOFFSET=Y Mouse-80
  538.       Gosub CUTXOFFSET
  539.       Screen Display 0,XOFFSET,YOFFSET,SCRNWIDTH,SCRNHEIGHT
  540.    Wend 
  541.  
  542. 'Ask user where to write config file...  
  543.    Cls 0,1,5 To SCRNWIDTH-2,SCRNHEIGHT-6 : Ink 1 : Gr Writing 0
  544.    Text 19,22,"Save centering offsets permanently."
  545.    Text 45,36,"(Write 11-byte file to S:)"
  546.    Text 19,70,"Save centering offsets temporarily."
  547.    Text 40,84,"(Write 11-byte file to Ram:)"
  548.    Text 67,126,"Proceed without saving."
  549.    Text 90,173,"Re-center screen." : Box 0,0 To 319,50
  550.    Box 0,50 To 319,100 : Box 0,100 To 319,150 : Box 0,150 To 319,199
  551.    Show On : Gr Writing 1
  552.  
  553. 'Get user's response...
  554. PICKIT:
  555.    While Mouse Click=0 : X=X Screen(X Mouse) : Y=Y Screen(Y Mouse) : Wend 
  556.    If X>319 or Y>199
  557.       Goto PICKIT
  558.    End If 
  559.    If Y<50
  560.       Open Out 1,SFILE$
  561.          Print #1,XOFFSET : Print #1,YOFFSET
  562.       Close 1 : 
  563.       Screen Close 0 : Screen Open 0,SCRNWIDTH,SCRNHEIGHT,NUMCOLORS,Hires
  564.       Flash Off : Curs Off : Cls 0 : Pop Proc
  565.    End If 
  566.    If Y<100
  567.       Open Out 1,RFILE$
  568.          Print #1,XOFFSET : Print #1,YOFFSET
  569.       Close 1 : 
  570.       Cls 0 : Pop Proc
  571.    End If 
  572.    If Y<150
  573.       Screen Close 0 : Screen Open 0,SCRNWIDTH,SCRNHEIGHT,NUMCOLORS,Hires
  574.       Flash Off : Curs Off : Cls 0 : Pop Proc
  575.    End If 
  576.    Goto CENTERIT2
  577.  
  578. CUTXOFFSET:
  579.    If XOFFSET<80 Then XOFFSET=64 : Return 
  580.    If XOFFSET<96 Then XOFFSET=80 : Return 
  581.    If XOFFSET<112 Then XOFFSET=96 : Return 
  582.    If XOFFSET<128 Then XOFFSET=112 : Return 
  583.    If XOFFSET<144 Then XOFFSET=128
  584.    Return 
  585. End Proc