' Doc Disk Engine
' ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
' cODED bY ßudda/NFA 
' StARtEd : 15/06/1995    *With A Short Break In-between !!!*  
' FiNiSHed: v1.1 30/06/1995  
'           v1.4 13/07/1995  
'           v1.5 27/01/1996
Set Buffer 50
Data "$VER:nFA dISK mENU v1.5"

' NOTE: Requires commands from a selection of extensions!


' ***** REMOVE WHEN FINISHED ***** 
Command Line$="003"
Dir$="SNC-003:"
' ******************************** 




' -- Progam Init. -- 
Load "Docs_Disk.abk"
Resource Bank 15
Proc SET_ENVIRONMENT
Hide On 
Proc COM

Global MENU_BAR$,ISSUE$,SND,TVS,ITEMS,PNT
Global PAGE,PAGES,LINE,PAGE_LINES,TLINES,INDEX,RAW,BACK_COL
Global XTRA_MEM,S_MESS,SCR_C,SCR$

If Fast Free>0 Then XTRA_MEM=1
INDEX=True : Rem Index Toggle 
If Exist(Dir$+"Data_Filez/Prefs."+ISSUE$)=True
   Proc PREFS[1]
Else 
   If Ntsc=0 : Rem TV System  
      TVS=0
   Else 
      TVS=1
   End If 
   SND=1 : Rem Music Toggle 
   RAW=Rnd(3) : Rem Font   
   BACK_COL=Rnd(3)+1 : Rem Text Screen Palette No.  
   PNT=Rnd(4) : Rem Pointer
End If 

Proc NFA
Proc _GET_MUSIC
Proc _LOAD_CONFIG
Dim FIL$(ITEMS)
Global FIL$()
Wait 100
Proc _MAKE_INDEX
Fade 5
Wait 55

' ** DISPLAY TITLE Picture(S) ** 
If Exist(Dir$+"Data_Filez/Title."+ISSUE$)=True
   _FADE_IN[Dir$+"Data_Filez/Title."+ISSUE$,7]
   If Exist(Dir$+"Data_Filez/Title2."+ISSUE$)=True
      Wait 70
      Fade 5
      Wait 55
      _FADE_IN[Dir$+"Data_Filez/Title2."+ISSUE$,7]
   End If 
   Wait 100
   Fade 5
   Wait 55
End If 

Proc _PROGS
Screen Close 5
Proc _SCREEN_SETUP
Proc _MENU_BAR_SETUP
Proc _REFRESH_BAR
Proc TV
Show On 
Limit Mouse 128,50 To 440,280
_LOAD_TEXT[Dir$+"Data_Filez/_index."+ISSUE$]
If Param=True
   _PROCESS_TEXT
   Timer=0
   _READ_ALL_ABOUT_IT
End If 
SHUT_DOWN

' -- Engine Set-Up --
Procedure COM
   ISSUE$=Left$(Command Line$,3)-" "
   If Len(ISSUE$)<3
      Bell 
   End If 
End Proc
Procedure SET_ENVIRONMENT
   Amos Lock 
   Break Off 
   Request Wb 
   Trap Screen Close 0
   A$=Dir$+"c/viewer"
   Reserve As Work 166,File Length(A$)
   Bload A$,Start(166)
   Bsave "RAM:Viewer",Start(166) To Bank End(166)
   Erase Temp 
End Proc
Procedure _SCREEN_SETUP
   ' -- Text Display Screen --
   Screen Open 0,640,184,8,Hires
   Screen Display 0,,99,,
   Flash Off 
   Load Iff Dir$+"Data_Filez/Back."+ISSUE$
   Palette ,$FFF,,$FFF,$F60,$FFF,$D50,$FFF
   Gosub MPC
   Change Mouse 8+PNT
   
   ' -- Button Panel -- 
   Load Dir$+"Data_Filez/Buttons."+ISSUE$,15
   Resource Screen Open 1,640,52,0
   Screen Display 1,,45,,
   Flash Off 
   Cls 0
   Gosub MPC
   Gr Writing 0
   
   ' -- Bottom Bar 4 Timer --   
   Screen Open 4,640,15,2,Hires
   Screen Display 4,,285,,
   Palette $68B,$448
   Gosub MPC
   Set Rainbow 1,1,16,"","",""
   Rainbow 1,0,288,16
   Restore RD
   For RC=0 To 7
      Read CVA
      Rain(1,RC)=CVA
   Next RC
   Cls 0
   Proc _COLOUR[BACK_COL]
   Pop Proc
   
   RD: Data $113,$124,$124,$235,$236,$247,$257,$358,$369,$333,$733,$373,$773,$337,$737,$377,$0,$EC8,$C60,$EA0,$27F,$49D,$5AE,$ADF,$BDF,$CEF,$FFF,$408,$A0E,$E0E,$E08,$EEE
   MPC:
   Colour 17,$0
   Colour 18,$477
   Colour 19,$FFF
   Return 
End Proc
Procedure _GET_MUSIC
   Erase 3
   If Exist(Dir$+"Data_Filez/tune."+ISSUE$)=True
      MUS$=Dir$+"Data_Filez/Tune."+ISSUE$
      Trap Reserve As Data 3,File Length(MUS$)
      Trap Bload MUS$,Start(3)
      If Errtrap
         SND=0
      Else 
         Proc _PPDECRUNCH[3,6]
         Bsave "ram:tune",Start(3) To Bank End(3)
         Erase 3
         St Load "ram:tune",3
         Kill "ram:tune"
         St Play 3
      End If 
      If SND=0
         St Pause On 
      End If 
   End If 
End Proc
Procedure _PROGS
   MENU_BAR$="BAse 0,0;"
   MENU_BAR$=MENU_BAR$+"UNpack 0,0,2;UNpack 0,16,1;"
   MENU_BAR$=MENU_BAR$+"BUtton 1,12,18,85,13,0,0,1;[UNpack 0,BP,3;][BReturn 0;NW;] KY 128 23+,0;" : Rem INDEX
   MENU_BAR$=MENU_BAR$+"BUtton 2,108,18,85,13,0,0,1;[UNpack 0,0BP+,9;][BReturn 0;NW;] KY 128 76+,0;" : Rem LINE UP
   MENU_BAR$=MENU_BAR$+"BUtton 3,204,18,85,13,0,0,1;[UNpack 0,0BP+,11;][BReturn 0;NW;] KY 128 76+,0;KY 128 76+,1;" : Rem PAGE UP
   MENU_BAR$=MENU_BAR$+"BUtton 4,356,18,85,13,0,0,1;[UNpack 0,0BP+,13;][BReturn 0;NW;] KY 128 20+,0;" : Rem TOP
   MENU_BAR$=MENU_BAR$+"BUtton 5,452,18,85,13,0,0,1;[UNpack 0,0BP+,7;][BReturn 0;NW;] KY 128 51+,0;" : Rem COLOUR 
   MENU_BAR$=MENU_BAR$+"BUtton 6,548,18,85,13,0,0,1;[UNpack 0,0BP+,8;][BReturn 0;NW;] KY 128 35+,0;" : Rem  FONT
   MENU_BAR$=MENU_BAR$+"BUtton 7,12,33,85,13,0,0,1;[UNpack 0,0BP+,4;][BReturn 0;NW;] KY 128 95+,0;" : Rem HELP 
   MENU_BAR$=MENU_BAR$+"BUtton 8,108,33,85,13,0,0,1;[UNpack 0,0BP+,10;][BReturn 0;NW;] KY 128 77+,0;" : Rem LINE DOWN
   MENU_BAR$=MENU_BAR$+"BUtton 9,204,33,85,13,0,0,1;[UNpack 0,0BP+,12;][BReturn 0;NW;] KY 128 77+,0;KY 128 77+,1;" : Rem PAGE DOWN
   MENU_BAR$=MENU_BAR$+"BUtton 10,356,33,85,13,0,0,1;[UNpack 0,0BP+,14;][BReturn 0;NW;] KY 128 53+,0;" : Rem BOTTOM 
   MENU_BAR$=MENU_BAR$+"BUtton 11,452,33,85,13,0,0,1;[UNpack 0,0BP+,5;][BReturn 0;NW;] KY 128 66+,0;" : Rem POINTER
   MENU_BAR$=MENU_BAR$+"BUtton 12,548,33,85,13,0,0,1;[UNpack 0,0BP+,6;][BReturn 0;NW;] KY 128 25+,0;" : Rem PRINT
   MENU_BAR$=MENU_BAR$+"BUtton 13,288,37,64,13,"+Str$(SND)+",0,1;[UNpack 0,0,15BP+;][] KY 128 55+,0;" : Rem MUSIC
   MENU_BAR$=MENU_BAR$+"EXit;"
End Proc
Procedure _MENU_BAR_SETUP
   Screen 1
   CUL1$="(IN 1,1:IN 2,4)"
   CUL2$="(IN 1,4:IN 2,1)"
   Menu$(1)=CUL1$+" mENu ØþeRå7¿øn "
   Menu$(1,1)=CUL1$+"Reset Timer  F08","ReSeT TiMeR  F08" : Menu Key(1,1) To 87
   Menu$(1,2)=CUL1$+"Scroller     F09","SCRºLLER     F09" : Menu Key(1,2) To 88
   Menu$(1,3)=CUL1$+"Exit To DOS  F10","EXiT Tº DºS  F10" : Menu Key(1,3) To 89
   Menu$(2)=CUL2$+" SUpPøR7             "
   Menu$(2,1)=CUL2$+"Display Mode      F01","DiSPLAY MºDe      F01" : Menu Key(2,1) To 80
   Menu$(2,2)=CUL2$+"Load Preferences  F02","LºAD PReFeReNCeS  F02" : Menu Key(2,2) To 81
   Menu$(2,3)=CUL2$+"Save Preferences  F03","SAVe PReFeReNCeS  F03" : Menu Key(2,3) To 82
   Menu$(3)=CUL1$+" Pø¡NTeRs   "
   Menu$(3,1)=CUL1$+" Mouse     1"," MºUSe     1"
   Menu$(3,2)=CUL1$+" Skiny     2"," SKiNY     2"
   Menu$(3,3)=CUL1$+" Metal     3"," MeTAL     3"
   Menu$(3,4)=CUL1$+" Dumps     4"," DUMPS     4"
   Menu$(3,5)=CUL1$+" Standard  5"," STANDARD  5"
   Set Menu(3,1) To 2,6
   For K=1 To 5 : Menu Key(3,K) To Str$(K)-" " : Next K
   Menu$(4)=CUL2$+" FøNt$     "
   Menu$(4,1)=CUL2$+" Micro    6"," MiCRº    6"
   Menu$(4,2)=CUL2$+" Western  7"," WeSTeRN  7"
   Menu$(4,3)=CUL2$+" Hoodlum  8"," HººDLUM  8"
   Menu$(4,4)=CUL2$+" Topaz    9"," TºPAZ    9"
   For K=1 To 4 : Menu Key(4,K) To Str$(K+5)-" " : Next K
   Menu$(5)=CUL1$+" CºLøuRS     "
   Menu$(5,1)=CUL1$+" Blimp Blues "," BLiMP BLUeS "
   Menu$(5,2)=CUL1$+" Pig Pinks   "," PiG PiNKS   "
   Menu$(5,3)=CUL1$+" Gay Green   "," GAY GReeN   "
   Menu$(5,4)=CUL1$+" Major Grey  "," MAJºR GReY  "
   Menu Base 0,3
   For MN=1 To 5 : Menu Static(MN,1) : Next MN
   Menu On 
   
   Dialog Open 1,MENU_BAR$
   XXX=Dialog Run(1)
   
   ' -- Music VU Meters --    
   VM$="Jump E;A:"
   VM$=VM$+"If Vu(R1)>60 then Jump E;"
   VM$=VM$+"If Vu(R1)>55 then Jump D;"
   VM$=VM$+"If Vu(R1)>35 then Jump C;"
   VM$=VM$+"Jump A;"
   VM$=VM$+"C:Anim 1,(3,3)(4,3);Jump A;"
   VM$=VM$+"D:Anim 1,(2,3)(3,3)(4,3);Jump A;"
   VM$=VM$+"E:Anim 1,(1,3)(2,3)(3,3)(4,3);Jump A;"
   
   Bob 0,295,19,1
   Bob 1,308,19,1
   Bob 2,322,19,1
   Bob 3,335,19,1
   
   For BO=0 To 3
      Channel BO To Bob BO
      Amal BO,VM$
      Amal On BO
      Amreg(BO,1)=BO
   Next BO
   
   ' ** Scrolling Text Message ** 
   _SCROLLING$=Dir$+"data_filez/scroll."+ISSUE$
   Reserve As Data 200,File Length(_SCROLLING$)
   Bload _SCROLLING$,200
   _PPDECRUNCH[200,201]
   SCR$=Peek$(Start(200),Length(200),Chr$(10))
   S_MESS=1
   SCR_C=1
   
   Set Rainbow 3,3,20,"","",""
   Rainbow 3,0,62,20
   Restore RDATAR
   For RC=0 To 19
      Read CVA
      Rain(3,RC)=CVA
   Next RC
   View 
   RDATAR:
   Data $EEE,$EDE,$DDE,$DCE,$CCD,$CBD,$CAD,$BAD,$A8C,$97B,$86B,$85A,$75A,$74A,$639,$629,$529,$519,$418,$408,$408
End Proc
Procedure _REFRESH_BAR
   SC=Screen
   Trap Screen 1
   If Errtrap<>0 Then Pop Proc
   
   CHIPSET=Gfxcall(-888)
   If CHIPSET=$F Then CHIP$="AGA"
   If CHIPSET=$3 Then CHIP$="ECS"
   If CHIPSET=$0 Then CHIP$="OCS"
   
   If TVS=0 Then TV$="PAL" Else TV$="NTSC"
   
   If Math Info=0 Then FPU$="nOnE!" Else FPU$="MC68"+(Str$(Math Info)-" ")
   
   Resource Unpack 2,0,0
   Ink 1,0
   Gr Centre 10,"CHIPSET:"+CHIP$+"·TV:"+TV$+"·CHIP MEM:"+(Str$(Chip Free/1024)-" ")+"K FAST MEM:"+(Str$(Fast Free/1024)-" ")+"K·CPU:680"+(Str$(Cpu Info)-" ")+"·FPU:"+FPU$
   Screen SC
End Proc
Procedure PREFS[S]
   PRE$=Dir$+"Data_Filez/Prefs."+ISSUE$
   
   ' save 
   If S=0
      Trap Open Out 1,PRE$
      If Errtrap<>0 : Pop Proc : End If 
      Print #1,TVS
      Print #1,SND
      Print #1,RAW
      Print #1,BACK_COL
      Print #1,PNT
      Print #1,"nFA dISK mENU pREFERENCES fILE v1.0"
      Close 1
   End If 
   
   'load
   If S=1 and Exist(PRE$)=True
      Open In 1,PRE$
      Input #1,TVS
      Input #1,SND
      Input #1,RAW
      Input #1,BACK_COL
      Input #1,PNT
      Close 1
   End If 
End Proc
Procedure _TIMER
   SC=Screen
   Screen 4
   T=Timer/50 : M=T/60 : S=T mod 60
   Ink 1,0
   TI$=Right$("00"+Mid$(Str$(H),2),2)+":"+Right$("00"+Mid$(Str$(M),2),2)+":"+Right$("00"+Mid$(Str$(S),2),2)
   _NFATEXT[TI$,0,4,Phybase(0),1]
   Screen SC
End Proc
Procedure SHUT_DOWN
   ' -- Stop Scrolling Message And Clear Memory --
   Every Off : Erase 200
   Hide On 
   
   ' -- Stop Music And Clear Memory 
   St Stop : Erase 3
   
   ' -- Blank Main Text Screen To White 
   Screen To Front 0
   Screen 0
   Fade 6,$FFF,$FFF,$FFF,$FFF,$FFF,$FFF,$FFF,$FFF,$FFF
   Wait 80
   
   ' -- Move Screens Out --   
   Rainbow Del 1
   For SD=99 To 120 Step 2
      Screen Display 0,,SD,,
      Wait Vbl 
   Next SD
   Screen Close 4
   Rainbow Del 3
   For SD=120 To -80 Step -3
      Screen Display 0,,SD,,
      Wait Vbl 
   Next SD
   Screen Close 1
   For SD=-80 To -150 Step -3
      Screen Display 0,,SD,,
      Wait Vbl 
   Next SD
   
   ' -- Back Into PAL --
   Doke $DFF1DC,32
   Dialog Close 1
   Screen Close 0
   
   ' -- Give AMOS Freedom Again 
   Amos Unlock 
   Break On 
   Request On 
   
   ' -- Clear Temp File 
   Kill "ram:Viewer"
   
   ' -- Wipe Any Offending Memory banks 
   Erase 15
   End 
End Proc
Procedure _PPDECRUNCH[SOURCE,PART_TIME]
   ' The crunched file is un-packed into PART_TIME bank (temp)  
   ' and then copied back to original SOURCE bank.
   If Peek$(Start(SOURCE),4)="PP20"
      Reserve As Work PART_TIME,Jd Ppfind Mem(Bank End(SOURCE))
      Jd Ppdecrunch Start(SOURCE),Bank End(SOURCE),Start(PART_TIME)
      Erase SOURCE
      Reserve As Data SOURCE,Length(PART_TIME)
      Copy Start(PART_TIME),Bank End(PART_TIME) To Start(SOURCE)
      Erase Temp 
   End If 
End Proc
Procedure _LOAD_CONFIG
   CF$=Dir$+"Data_Filez/_loaders."+ISSUE$
   Reserve As Data 7,File Length(CF$)
   Bload CF$,7
   
   ' -- Work Out How Many Files In Index -- 
   POSITION=Start(7) : ITEMS=0
   Do 
      Exit If POSITION>=Bank End(7)
      LI_EN=Hunt(POSITION To Bank End(7),Chr$(10))
      A$=Peek$(POSITION,POSITION-LI_EN,Chr$(10))
      Exit If LI_EN=Bank End(7) or LI_EN=0
      POSITION=LI_EN+1
      Inc ITEMS
   Loop 
End Proc
Procedure _MAKE_INDEX
   POS=Start(7)
   For I=0 To ITEMS
      A$=Peek$(POS,Bank End(7),Chr$(10))
      If A$>""
         FIL$(I)=Peek$(POS,Bank End(7),Chr$(10))
         Add POS,Len(FIL$(I))+1
      Else 
         Inc POS
      End If 
   Next I
   Erase 7
End Proc
Procedure _NFATEXT[T$,X,Y,PLANE,FT]
   Areg(0)=PLANE+(Y*80)+X
   Areg(1)=Varptr(T$)
   Areg(2)=Start(9)+(2048*FT)
   Dreg(0)=0
   Dreg(1)=0
   Dreg(2)=Len(T$)
   Call Start(8)
End Proc
Procedure _HIGHLIGHT[_NEXT,LAST]
   SC=Screen
   Screen 0
   If LAST<>-1
      Fill Phybase(2)+((LAST)*8*80)-80 To Phybase(2)+((LAST)*8*80)+(8*80),$0
   End If 
   If _NEXT<>-1
      Fill Phybase(2)+((_NEXT)*8*80)-80 To Phybase(2)+((_NEXT)*8*80)+(8*80),$FFFFFFFF
   End If 
   Screen SC
End Proc
Procedure _COLOUR[OPT]
   Restore "CUL"+(Str$(OPT)-" ")
   
   Read C0,C2
   Screen 0
   Colour 0,C0
   Colour 2,C2
   
   Screen 4
   Colour 0,C2
   
   Screen 1
   Colour 0,C2
   
   CUL1: Data $448,$68B : Rem Blue   
   CUL2: Data $858,$A7A : Rem Purple/Pink
   CUL3: Data $253,$485 : Rem Green
   CUL4: Data $444,$777 : Rem Grey     
End Proc
Procedure _FADE_IN[FILE$,SPEED]
   Screen Open 5,320,256,2,Lowres : Flash Off : Curs Off 
   Screen Open 6,320,256,2,Lowres : Flash Off : Curs Off 
   Auto View Off 
   Load Iff FILE$,5
   C0LOURS=Screen Colour
   Screen 6
   Get Palette(5)
   Screen 5
   For Z=0 To C0LOURS-1
      Colour Z,0
   Next 
   Screen To Front 5
   Auto View On 
   View 
   Fade SPEED To 6
   Wait SPEED*15
   Screen Close 6
End Proc
Procedure NFA
   ' -- Zoom In NFA Logo -- 
   Erase 2
   Load Iff Dir$+"data_filez/logo."+ISSUE$,4
   Get Icon 4,1,0,0 To Screen Width(4),Screen Height(4)
   Screen Close 4
   Multi No 
   IX=X Icon(1)*16
   Screen Open 7,320,200,32,Lowres
   Cls 0
   Paste Icon 1,1,1
   Screen Open 5,320,200,Screen Colour,Lowres
   Flash Off : Get Icon Palette 
   Cls 0
   
   X1=(Screen Width/2)-(IX/2)
   Y1=(Screen Height/2)-(Y Icon(1)/2)
   
   Screen 7
   For S=30 To 2 Step -1
      For A=0 To IX+1 Step S
         For B=0 To Y Icon(1)+1 Step S
            C=F Point(A,B)
            Ink C,0
            Bar A+100,B+100 To(A+100)+S-1,(B+100)+S-1
         Next 
      Next 
      Screen Copy 7,100,100,100+IX,100+Y Icon(1) To 5,X1,Y1
      Vbl Wait 180
   Next S
   Screen 5
   Paste Icon X1,Y1,1
   
   Screen Close 7
   Multi Yes 
   Erase 2
End Proc
Procedure TV
   ' -- Change Screen Mode --     
   If TVS=0
      ' * PAL
      Doke $DFF1DC,32
      Trap Screen Display 4,,285,,
      Trap Screen Display 0,,99,,184
   Else 
      ' * NTSC 
      Doke $DFF1DC,0
      Trap Screen Display 4,,235,,
      Trap Screen Display 0,,99,,134
   End If 
   
   Proc _REFRESH_BAR
End Proc
Procedure SCROL
   SC=Screen
   Screen 4
   Blit Left 4,80,3 To 640,14,-1
   Add SCR_C,1,1 To 8
   If SCR_C=8
      _NFATEXT[Mid$(SCR$,S_MESS,1),79,3,Phybase(0),0]
      Inc S_MESS
   End If 
   If S_MESS=Len(SCR$) Then S_MESS=1
   Screen SC
   Every On 
End Proc
Procedure REQUEST[MESS$,BUT$]
   Screen Open 3,640,60,4,Hires
   Screen Hide 3
   Palette $0,$0,$0,$0
   Colour 17,$0
   Colour 18,$477
   Colour 19,$FFF
   Flash Off 
   Curs Off 
   Cls 0
   Ink 3,2
   
   ' ---------------------------------------- draw shadowed box (centred) 
   LKJ=X Graphic((Len(MESS$)+4)/2)
   BXC=320-LKJ
   SHAD_BOX[BXC,0,BXC+(LKJ*2),60]
   Gr Centre 20,MESS$
   
   ' ---------------------------------------- make button(s)  
   _DOBO=Instr(BUT$,"|")
   If _DOBO<>0
      BUTTON1$=Left$(BUT$,_DOBO-1)
      BUTTON2$=Mid$(BUT$,_DOBO+1,Len(BUT$))
   Else 
      BUTTON1$=BUT$
      BUTTON2$=BUT$
   End If 
   
   WD_OF_BUTTON=317-(BXC+10)
   Reserve Zone 2
   Set Zone 1,BXC+5,40 To 317,55
   SHAD_BOX[BXC+5,40,317,55]
   Text BXC+10+(WD_OF_BUTTON/2)-(X Graphic(Len(BUTTON1$))/2),50,BUTTON1$
   Set Zone 2,323,40 To BXC+(LKJ*2)-5,55
   SHAD_BOX[323,40,BXC+(LKJ*2)-5,55]
   Text 323+5+(WD_OF_BUTTON/2)-(X Graphic(Len(BUTTON2$))/2),50,BUTTON2$
   
   Fade 5 To 0,%111
   Screen Show 3
   For HH=0 To 60 Step 2
      Screen Display 3,128,150-SIIPY,640,HH
      Inc HH
      Inc SIIPY
      Wait Vbl 
   Next HH
   
   Repeat 
      MZ=Mouse Zone
      KBA$=Inkey$
   Until(MZ>0 and Mouse Key>0) or(KBA$=Chr$(13) or KBA$=Chr$(27))
   
   If KBA$=Chr$(13) Then MZ=1
   If KBA$=Chr$(27) Then MZ=2
   
   Fade 5
   For HH=60 To 0 Step -2
      Screen Display 3,128,150-SIIPY,640,HH
      Dec HH
      Dec SIIPY
      Wait Vbl 
   Next HH
   Screen Close 3
End Proc[MZ]
Procedure SHAD_BOX[X1,Y1,X2,Y2]
   Ink 2 : Bar X1,Y1 To X2,Y2
   Ink 1 : Bar X1,Y1 To X2,Y1+1
           Bar X1,Y1 To X1+2,Y2
   Ink 3 : Bar X1,Y2-2 To X2,Y2
           Bar X2-2,Y1 To X2,Y2
End Proc
Procedure DELAY[SWITCH]
   If SWITCH=True Then Menu Off : Dialog Freeze 1
   If SWITCH=False Then Menu On : Dialog Unfreeze 1
End Proc

' -- Text Handling --
Procedure _LOAD_TEXT[FILE$]
   If Exist(FILE$)=True
      Reserve As Work 5,File Length(FILE$)
      RES=True
      Bload FILE$,5
      Proc _PPDECRUNCH[5,6]
   Else 
      RES=False
   End If 
End Proc[RES]
Procedure _PROCESS_TEXT
   POS=Start(5) : TLINES=0
   Do 
      Exit If POS>=Bank End(5)
      H=Hunt(POS To Bank End(5),Chr$(10))
      Exit If H=0 or H=Bank End(5)
      Inc TLINES
      POS=H+1
   Loop 
   
   Reserve As Work 6,(TLINES+2)*80
   POS=Start(5)
   For LINE=1 To TLINES
      H=Hunt(POS To Start(5)+Length(5),Chr$(10))
      TL=1+(H-POS)
      If TL>0 Then Copy POS,POS+TL To Start(6)+(LINE*80)
      POS=H+1
   Next LINE
   Erase 5
   
   PAGE_LINES=22
   PAGE=1
   PAGES=LINES/PAGE_LINES
   If PAGES*PAGE_LINES<>LINES Then Inc PAGES
End Proc
Procedure _READ_ALL_ABOUT_IT
   REDO:
   ST=0
   If PAGE_LINES>TLINES Then PAGE_LINES=TLINES
   BM=2
   LAST=-1
   
   Screen 0
   
   For LINE=ST To PAGE_LINES
      TXT_VIEW[Phybase(0)+((LINE)*8*80),Start(6)+(LINE*80),RAW]
   Next LINE
   PIX_HIGH=Screen Height
   PIX_WIDE=Screen Width/8
   LAYER_0=Phybase(0)
   
   If XTRA_MEM=1 Then Every 4 Proc SCROL
   Do 
      BT=Dialog(1)
      OD=PAGE_LINES
      
      ' -- Up A Line --
      If BT=2 and ST>=1
         Screen 0 : Dec ST : Dec PAGE_LINES
         Wait Vbl 
         _HIGHLIGHT[-1,LAST]
         Copy LAYER_0,LAYER_0+(PIX_WIDE*PIX_HIGH)-(PIX_WIDE*8) To LAYER_0+(PIX_WIDE*8)
         TXT_VIEW[Phybase(0),Start(6)+(ST*80),RAW]
      End If 
      
      ' -- Down A Line --
      If BT=8 and PAGE_LINES<TLINES+1
         Screen 0 : Inc ST : Inc PAGE_LINES
         Wait Vbl 
         _HIGHLIGHT[-1,LAST]
         Copy LAYER_0+(PIX_WIDE*8),LAYER_0+(PIX_WIDE*PIX_HIGH) To LAYER_0
         TXT_VIEW[Phybase(0)+((PIX_HIGH-8)*80),Start(6)+(PAGE_LINES*80),RAW]
      End If 
      
      ' -- Up A Page --
      If BT=3
         Screen 0
         L=0
         ST=Max(ST-22,0)
         PAGE_LINES=Min(ST+22,TLINES)
         _HIGHLIGHT[-1,LAST]
         For LINE=ST To PAGE_LINES
            TXT_VIEW[Phybase(0)+((L)*8*80),Start(6)+(LINE*80),RAW]
            Inc L
         Next LINE
      End If 
      
      ' -- Top --
      If BT=4
         Screen 0
         L=0
         ST=0
         PAGE_LINES=Min(ST+22,TLINES)
         _HIGHLIGHT[-1,LAST]
         For LINE=ST To PAGE_LINES
            TXT_VIEW[Phybase(0)+((L)*8*80),Start(6)+(LINE*80),RAW]
            Inc L
         Next LINE
      End If 
      
      ' -- Down A Page --
      If BT=9
         Screen 0 : L=0
         PAGE_LINES=Min(PAGE_LINES+22,TLINES+1)
         ST=Max(PAGE_LINES-22,0)
         _HIGHLIGHT[-1,LAST]
         For LINE=ST To PAGE_LINES
            TXT_VIEW[Phybase(0)+((L)*8*80),Start(6)+(LINE*80),RAW]
            Inc L
         Next LINE
      End If 
      
      ' -- Bottom -- 
      If BT=10
         Screen 0
         PAGE_LINES=TLINES+1 : L=0
         ST=Max(PAGE_LINES-22,0)
         _HIGHLIGHT[-1,LAST]
         For LINE=ST To PAGE_LINES
            TXT_VIEW[Phybase(0)+((L)*8*80),Start(6)+(LINE*80),RAW]
            Inc L
         Next LINE
      End If 
      
      ' -- Toggle Music -- 
      If BT=13
         Bchg 0,SND
         If SND=0
            St Pause On 
         Else 
            St Pause Off 
         End If 
      End If 
      
      ' -- Colour Change --
      If BT=5
         DELAY[True]
         Add BACK_COL,1,1 To 4
         _COLOUR[BACK_COL]
         Wait 3
         DELAY[False]
      End If 
      
      ' -- Change Font --
      If BT=6
         DELAY[True]
         Add RAW,1,0 To 3
         SF_NW:
         PAGE_LINES=22
         PAGE=1
         Wait 3
         DELAY[False]
         Goto REDO
      End If 
      
      ' -- Pointer Change -- 
      If BT=11
         DELAY[True]
         Add PNT,1,0 To 4
         Change Mouse 8+PNT
         Wait 3
         DELAY[False]
      End If 
      
      '******************************* 
      ' -- Check Pull-Down Menus --
      If Choice=True
         
         ' -- Reset Timer --
         If Choice(1)=1
            If Choice(2)=1
               Timer=0
               Proc _TIMER
            End If 
            
            ' -- Scroller Off/On --
            If Choice(2)=2
               Bchg 0,XTRA_MEM
               If XTRA_MEM=1
                  Every 4 Proc SCROL
               Else 
                  Every Off 
               End If 
            End If 
            
            ' -- Quit -- 
            If Choice(2)=3
               Dialog Freeze 1
               Menu Off 
               REQUEST["Are you SURE you wish to EXIT?","YEAH|NO!"]
               If Param=1 : Pop Proc : End If 
               Dialog Unfreeze 1
               Menu On 
            End If 
         End If 
         
         If Choice(1)=2
            ' -- Toggle TV --  
            If Choice(2)=1
               Bchg 0,TVS
               Proc TV
               Wait 3
            End If 
            
            ' -- Load Prefs -- 
            If Choice(2)=2
               Proc PREFS[1]
               Proc TV
               If SND=0
                  St Pause On 
                  Dialog Update 1,13,0
               Else 
                  St Pause Off 
                  Dialog Update 1,13,1
               End If 
               Proc _COLOUR[BACK_COL]
               Change Mouse 8+PNT
               Goto SF_NW
            End If 
            
            ' -- Save Prefs -- 
            If Choice(2)=3
               Proc PREFS[0]
            End If 
         End If 
         
         ' -- Choose Pointer -- 
         If Choice(1)=3
            For PN=1 To 5
               If Choice(2)=PN : Change Mouse 7+PN : PNT=PN : Exit : End If 
            Next PN
         End If 
         
         ' -- Choose Font --
         If Choice(1)=4
            For FT=1 To 4
               If Choice(2)=FT : RAW=FT-1 : Goto SF_NW : End If 
            Next FT
         End If 
         
         ' -- Choose Colour --
         If Choice(1)=5
            For CC=1 To 4
               If Choice(2)=CC : BACK_COL=CC : Proc _COLOUR[BACK_COL] : Exit : End If 
            Next CC
         End If 
      End If 
      '******************************* 
      
      ' -- Print Text -- 
      If BT=12
         Proc JUST_A_PINT_PLEASE
      End If 
      
      ' -- Return To Index --
      If BT=1 and INDEX=False
         INDEX=True
         _LOAD_TEXT[Dir$+"Data_Filez/_index."+ISSUE$]
         _PROCESS_TEXT
         WIPE_DA_ARSE[1]
         Goto REDO
      End If 
      
      ' -- Help -- 
      If BT=7
         If Exist(Dir$+"data_filez/help.txt")=True
            INDEX=False
            _HIGHLIGHT[-1,LAST]
            _LOAD_TEXT[Dir$+"data_filez/help.txt"]
            _PROCESS_TEXT
            WIPE_DA_ARSE[0]
            Goto REDO
         End If 
      End If 
      
      ' -- Index Selection --      
      If INDEX=True
         If Scin(X Mouse,Y Mouse)=0
            MUS_Y=(Y Mouse-97)/8
            OVER=MUS_Y+ST-1
            If(MUS_Y>-1 and MUS_Y<23) and(OVER>0 and OVER<=ITEMS) and MUS_Y<>LAST
               If FIL$(OVER)>""
                  _HIGHLIGHT[MUS_Y,LAST]
                  LAST=MUS_Y
               Else 
                  _HIGHLIGHT[-1,LAST]
               End If 
            End If 
            If MUS_Y=LAST and LAST<>-1
               _HIGHLIGHT[MUS_Y,-1]
            End If 
            If OVER>ITEMS
               _HIGHLIGHT[-1,LAST]
            End If 
            
            If Mouse Key=1
               CHOSEN=MUS_Y+ST-1
               If CHOSEN>0 and CHOSEN<=ITEMS
                  TY$=Lower$(Right$(FIL$(CHOSEN),3))
                  
                  ' *** Ascii File 
                  If TY$="txt" or TY$="asc" or TY$="doc"
                     DELAY[True]
                     _HIGHLIGHT[-1,LAST]
                     _LOAD_TEXT[Dir$+FIL$(CHOSEN)]
                     If Param=True
                        INDEX=False
                        _PROCESS_TEXT
                        WIPE_DA_ARSE[0]
                        DELAY[False]
                        Goto REDO
                     Else 
                        REQUEST["Unable To Load Text File","oKAY"]
                     End If 
                     DELAY[False]
                  End If 
                  
                  ' *** Binary Executable
                  If TY$="exe"
                     If Exist(FIL$(CHOSEN))=True
                        St Pause On 
                        Every Off 
                        Dialog Freeze 
                        Exec "Run "+Dir$+FIL$(CHOSEN)
                        Wait 200
                        Repeat : Until Amos Here=True
                        Dialog Unfreeze 
                        If SND=1 : St Pause Off : End If 
                        If XTRA_MEM=1
                           Every 4 Proc SCROL
                        Else 
                           Every Off 
                        End If 
                     Else 
                        REQUEST["Unable To Load Executable File","oKAY"]
                     End If 
                  End If 
                  
                  ' *** Picture Viewer 
                  If TY$="pic"
                     If Exist("RAM:Viewer")=True
                        If Exist(FIL$(CHOSEN))=True
                           Bset 6,$BFEE01
                           Every Off 
                           Dialog Freeze 
                           Amos To Back 
                           Exec "RAM:Viewer >NIL: "+Dir$+FIL$(CHOSEN)
                           Amos To Front 
                           Dialog Unfreeze 
                           Bclr 6,$BFEE01
                           If XTRA_MEM=1
                              Every 4 Proc SCROL
                           Else 
                              Every Off 
                           End If 
                        Else 
                           REQUEST["Unable To LOAD Picture","oKAY"]
                        End If 
                     Else 
                        REQUEST["Unable To Find Viewer","oKAY"]
                     End If 
                  End If 
                  
                  ' *** Tracker Music Module 
                  If TY$="mod" or TY$=ISSUE$
                     If Exist(FIL$(CHOSEN))=True
                        St Stop 
                        Amal Freeze 
                        Erase 3
                        St Load Dir$+FIL$(CHOSEN),3
                        St Play 3
                        Amal On 
                        If SND=0 : St Pause On : End If 
                        Proc _REFRESH_BAR
                     Else 
                        REQUEST["Unable To LOAD Tracker Music Module","oKAY"]
                     End If 
                  End If 
               End If 
            End If 
         End If 
      End If 
      Proc _TIMER
      Wait Vbl 
   Loop 
End Proc
Procedure TXT_VIEW[POS,LOC,FT]
   Areg(0)=POS
   Areg(1)=LOC
   Areg(2)=Start(9)+(FT*2048)
   Dreg(0)=0 : Dreg(1)=0
   Dreg(2)=80
   Call Start(8)
End Proc
Procedure JUST_A_PINT_PLEASE
   ' -- Dumps A Bank Of Text To Printer --
   Printer Abort 
   Trap Printer Open 
   If Errtrap=0
      If Printer Online=True and Printer Check=True
         Jd Prt Shade 0
         Printer Out Start(6),Length(6)
         Clear Key 
         RESULT=True
         While Printer Check=False
            If Key State(69)=True or Mouse Key=2
               Printer Abort 
               REQUEST["Printer STOPPED!!!","I Know"]
               Exit 1
            End If 
            If Printer Error<>0
               REQUEST["A Printer Error Has Occured!","GaSP!"]
               Exit 1
            End If 
            Proc _TIMER
         Wend 
      Else 
         REQUEST["Printer Not Responding - Check Cables/Switch(!)/Paper","sORTED"]
      End If 
      Printer Close 
   Else 
      REQUEST["Unable To Open Printer.device You Silly Sod!","OOpS!"]
   End If 
End Proc
Procedure WIPE_DA_ARSE[W]
   Screen 0
   If W=0
      For YY=0 To 185
         Fill Phybase(0) To Phybase(0)+(80*YY),0
      Next YY
   End If 
   If W=1
      For YY=184 To 0 Step -1
         Fill Phybase(0)+(80*YY) To Phybase(0)+(80*185),0
      Next YY
   End If 
End Proc
