home *** CD-ROM | disk | FTP | other *** search
/ AMOS PD CD / amospdcd.iso / 451-475 / apd454 / u-file.amos / u-file.amosSourceCode < prev   
AMOS Source Code  |  1992-12-05  |  63KB  |  1,809 lines

  1. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  2. '                                                                           '
  3. '  File Name :  U-File.AMOS                                                 '
  4. '        Date:  03/10/92                                                    '
  5. '  Written by:  Tony Swanwick                                               '
  6. '                                                                           '
  7. '                   ...oooOOO  COPYRIGHT NOTICE  OOOooo...                  '
  8. '                                                                           '
  9. ' This AMOS program is release  into the  Public Domain under the following '
  10. ' conditions. No  fee shall  be  charged  for its  distribution beyond  the '
  11. ' normal  cost of disk  duplication.  Other AMOS   Programmers   can   copy '
  12. ' procedures from this source program,  for use within their own creations, '
  13. ' but the MODIFICATION and RE-RELEASE  of this program by anyone other than '
  14. ' the author will be seen as a breach of copyright.                         '
  15. '                                                                           '
  16. '           All rights are reserved by the author, Tony Swanwick.           '
  17. '                                                                           '
  18. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  19. '
  20. Set Buffer 50 : Z#=0.0
  21. Dim PK$(2,256),C(4),NUM(100)
  22. Global A,ABOUTBANK,AF,AGAIN,BE,BF,BL,BLACK,BLOCKE,BLOCKF,BLOCKS,BLUE,BP,BS
  23. Global CB,CF,CHECK$,CI,CLF,CLOCK,C(),CROSS,CX,CY
  24. Global D$,DEBUG,DEVICE$,DF,DISPSCRN,EDSCRN,EF,FFLG,FILEBANK,F$
  25. Global HF$,HICOL,HM,HP,IBF,INSERT,K$,LINE$,LOCK
  26. Global MBL,MCH,MCL,MCX,MCY,MC1,MC2,MC3,MENFLG,MF,MSB,M1,M2,M3
  27. Global NAC,NB,NUM,NUM$,NUM(),OCF,OCI
  28. Global P$,PASTE,PB,PBF,PD,PF,PIC$,PICK,PK,PK$(),PM,PNTER,PREFPATH$
  29. Global PSAMOS$,PSDEV$,PSIFF$,PX,PY
  30. Global Q$,QUICKPATH$,RED
  31. Global SBANK,SCRNBANK,SHAPEBANK,SOF,SX,SY
  32. Global TEMPBANK,TEMPSCRN,TL,VERSION$,WHITE,X0,Y0,X1,Y1
  33. '
  34. SOF=0 : D$=Dir$ : DEBUG=0 : LOCK=False : VERSION$="1.2c"
  35. Goto L_COLD_START
  36. '
  37. L_LOOP:
  38.    P_SCREEN_XY
  39.    If Mouse Key=2 Then Goto L_MOUSE_KEY2
  40.    If Mouse Key=1 Then E=0 : Goto L_MOUSE_KEY
  41.    If K$="" Then K$=Inkey$
  42.    If K$<>"" Then Goto L_KEYS
  43. If BF<1 Then Goto L_LOOP
  44. '
  45.    If Mouse Key=0 and CF=0 Then P_BOB_XY
  46.    P_CURSOR_FLASH
  47. Goto L_LOOP
  48. '
  49. L_MOUSE_KEY:
  50.    If E=0 and SX>605 and SY>185 and SX<629 and SY<193 Then E=1 : P_ABOUT_U_FILE
  51.    If E=0 and SX>339 and SY>177 and SX<385 and SY<191 Then E=1 : P_AGAIN
  52.    If E=0 and SX>53 and SY>177 and SX<99 and SY<191 Then E=1 : P_BRIGHT_ADJUST
  53.    If E=0 and SX>7 and SY>177 and SX<53 and SY<191 Then E=1 : P_COLOUR_ADJUST
  54.    If E=0 and SX<23 and SY>2 and SY<13 Then E=1 : P_ABORT
  55.    If E=0 and SX>385 and SY>177 and SX<431 and SY<191 Then E=1 : P_HELP
  56.    If E=0 and SX>615 and SY>2 and SY<13 Then E=1 : P_WORKBENCH
  57. If E=1 or BF<1 Then Goto L_LOOP
  58. '
  59.    If E=0 and SX>339 and SY>177 and SX<385 and SY<191 Then E=1 : P_AGAIN
  60.    If E=0 and SX>607 and SY>25 and SX<633 and SY<172 Then E=1 : P_BAR_POSITION
  61.    If E=0 and SX>613 and SY>15 and SX<625 and SY<23 Then E=1 : P_BLOCK_PREVIOUS
  62.    If E=0 and SX>613 and SY>173 and SX<625 and SY<181 Then E=1 : P_BLOCK_NEXT
  63.    If E=0 and SX>77 and SY>27 and SX<599 and SY<170 Then E=1 : P_CURS_XY
  64.    If E=0 and SX>101 and SY>177 and SX<151 and SY<191 Then E=1 : P_DISP_ON
  65.    If E=0 and SX>3 and SY>13 and SX<485 and SY<23 Then E=1 : P_FILE_SPEC
  66.    If E=0 and SX>151 and SY>177 and SX<199 and SY<191 Then E=1 : P_FIRST
  67.    If E=0 and SX>247 and SY>177 and SX<293 and SY<191 Then E=1 : P_LAST
  68.    If E=0 and SY>191 Then E=1 : P_LINE_NEXT
  69.    If E=0 and SY<4 Then E=1 : P_LINE_PREVIOUS
  70.    If E=0 and SX>293 and SY>177 and SX<339 and SY<191 Then E=1 : P_NEXT
  71.    If E=0 and SX>199 and SY>177 and SX<247 and SY<191 Then E=1 : P_UNDO
  72.    MSB=1
  73. Goto L_LOOP
  74. '
  75. L_MOUSE_KEY2:
  76.    Wait Vbl : If Mouse Key<>2 Then Goto L_LOOP
  77.    If DF=1 Then P_DISP_OFF
  78.    If IBF=1 Then MF=PNTER : IBF=0
  79.    If PBF=1 Then MF=PNTER : PBF=0
  80.    If BLOCKF>1 Then MF=PNTER : BLOCKF=1
  81.    Change Mouse MF : P_MOUSE_UP : Menu On 
  82. Goto L_LOOP
  83. '
  84. L_KEYS:
  85.    SC=Scancode : If DEBUG=1 Then Text 444,21,Str$(SC)+" "
  86.    If(Key Shift and 8)=8 Then Goto L_CONTROL_KEYS
  87.    If SC=69 Then SC=-1 : K$="" : P_ABORT
  88.    If SC=95 Then SC=-1 : K$="" : P_HELP
  89. If BF<1 Then K$="" : Goto L_LOOP
  90.    If SC=65 Then SC=100 : P_UNDO
  91.    If SC<68 Then Goto L_TEXT_LEFT
  92.    If SC=76 Then P_CURS_UP
  93.    If SC=77 Then P_CURS_DOWN
  94.    If SC=78 Then P_CURS_RIGHT
  95.    If SC=79 Then P_CURS_LEFT
  96.    MSB=1 : P_QUICK_STATUS
  97.    Wait 1 : K$=Inkey$ : If K$<>"" Then Goto L_KEYS
  98. Goto L_LOOP
  99. '
  100. ' Insert text to the left of the screen in HEX.
  101. '
  102. L_TEXT_LEFT:
  103.    If OCF=2 Then Goto L_TEXT_RIGHT
  104.    A=Asc(Upper$(K$)) : If(A<65 or A>70) and(A<48 or A>57) Then Goto L_NULL
  105.    If A>64 Then A=A-55 Else A=A-48
  106.    PK=Peek(BS+CB)
  107.    If MSB=1
  108.       A=A*16 : PK=(PK and $F)+A : MSB=0
  109.    Else 
  110.       PK=(PK and $F0)+A : MSB=1
  111.    End If : A=PK : PK=BS+CB : P_POKE
  112.    PK=BS+BP+(CY*16) : P_PEEK_LINE
  113.    P_BOB_OFF : Ink WHITE,BLACK : Text TL,34+(CY*9),LINE$ : K$=""
  114.    If BLOCKF=1 Then Ink HICOL : P_BLOCK_ON
  115.    If MSB=1 Then P_CURS_RIGHT
  116.    P_BOB_XY
  117.    K$="" : P_QUICK_STATUS
  118. Goto L_LOOP
  119. '
  120. L_NULL:
  121.    K$="" : MSB=1 : P_CURS_RIGHT
  122.    P_QUICK_STATUS
  123. Goto L_LOOP
  124. '
  125. ' Insert text to the right of the screen in ASCII. 
  126. '
  127. L_TEXT_RIGHT:
  128.    A=Asc(K$) : PK=BS+CB : P_POKE
  129.    PK=BS+BP+(CY*16) : P_PEEK_LINE
  130.    P_BOB_OFF : Ink WHITE,BLACK : Text TL,34+(CY*9),LINE$ : K$=""
  131.    If BLOCKF=1 Then Ink HICOL : P_BLOCK_ON
  132.    OCX=CX : Inc CX : A=BL-BP-CX-(CY*16) : If A<1 Then CX=OCX
  133.    If CX>15 Then CX=0 : OCY=CY : Inc CY
  134.    A=BL-BP-CX-(CY*16) : If A<1 Then CY=OCY
  135.    If CY>15 Then CY=15 : P_LINE_NEXT
  136.    P_BOB_XY
  137.    K$="" : P_QUICK_STATUS
  138. Goto L_LOOP
  139. '
  140. ' ***** Fast Procedures *****  
  141. '
  142. Procedure P_BLOCK_ON
  143.    Screen EDSCRN : E=0 : XL=74 : XR=469 : Y=27 : IL=16 : IX=24 : IY=9
  144.    ZL=16*(BLOCKS/16) : ZU=16*(BLOCKE/16)
  145.    For L=BP To(BP+(15*IL)) Step IL
  146.       If E=1 Then Exit 
  147.       If L=ZL Then X0=XL+((BLOCKS-ZL)*IX) : X1=458 : X2=XR+((BLOCKS-ZL)*8) : X3=599 : If(BLOCKE-ZL)<16 Then X1=XL+((BLOCKE-ZL+1)*IX) : X3=XR+((BLOCKE-ZL+1)*8)+3 : E=1
  148.       If L=ZL Then Box X0,Y To X1,Y+9 : Box X2,Y To X3,Y+9 : Goto L_EXIT
  149.       If L>ZL and L<ZU Then Box XL,Y To 458,Y+9 : Box XR,Y To 599,Y+9
  150.       If L=ZU Then X0=XL : X1=X0+((BLOCKE-ZU+1)*IX) : X2=XR : X3=XR+((BLOCKE-ZU+1)*8)+3 : Box X0,Y To X1,Y+9 : Box X2,Y To X3,Y+9 : E=1
  151. L_EXIT:
  152.       Y=Y+IY
  153.    Next L
  154. End Proc
  155. Procedure P_BLOCK_CB
  156. ' Change the block pointers so as to display bite CB, and position 
  157. ' the cursor at CB.
  158. '
  159.    ZA=CB/256 : BP=ZA*256 : PB=1+ZA
  160.    CY=(CB-BP)/16 : CX=CB-BP-(CY*16)
  161.    If CX<0 Then CX=15 : CY=CY-1
  162. End Proc
  163. Procedure P_BOB_XY
  164.    If AF=0 Then P_ANIM_ON
  165.    CF=OCF : Wait Vbl : Bob 1,75+(CX*24),26+(CY*9), : Bob 2,469+(CX*8),26+(CY*9),
  166. End Proc
  167. Procedure P_CLEAR_LIST
  168.    Screen EDSCRN : P_BOB_OFF : CF=0 : Ink BLACK : Bar 6,26 To 599,171 : Ink WHITE
  169. End Proc
  170. Procedure P_COPY_LOAD
  171.    If CF>0 Then P_BOB_OFF : CF=0
  172.    Screen Copy TEMPSCRN,0,0,594,145 To EDSCRN,TL,26
  173. End Proc
  174. Procedure P_COPY_SAVE
  175.    If CF>0 Then P_BOB_OFF : CF=0
  176.    Screen Copy EDSCRN,TL,26,601,171 To TEMPSCRN,0,0
  177. End Proc
  178. Procedure P_CURSOR_FLASH
  179.    Timer=0 : A$="" : T=8 : If OCF=1
  180.       Bob 1,,300,
  181.       While Timer<T and Mouse Key=0 and(A$="") : A$=Inkey$ : P_SCREEN_XY : Wend 
  182.       Timer=0 : Bob 1,75+(CX*24),26+(CY*9),1
  183.       While Timer<T and Mouse Key=0 and(A$="") : A$=Inkey$ : P_SCREEN_XY : Wend 
  184.    Else 
  185.       Bob 2,,300,
  186.       While Timer<T and Mouse Key=0 and(A$="") : A$=Inkey$ : P_SCREEN_XY : Wend 
  187.       Timer=0 : Bob 2,469+(CX*8),26+(CY*9),5
  188.       While Timer<T and Mouse Key=0 and(A$="") : A$=Inkey$ : P_SCREEN_XY : Wend 
  189.    End If : If A$<>"" Then K$=A$
  190. End Proc
  191. Procedure P_CURS_XY
  192. ' Position cursor at mouse position. 
  193. '
  194.    If BF=0 Then Pop Proc
  195.    Menu Off 
  196. L_J0:
  197.    If SX<462
  198.       CX=(SX-74)/24 : CY=(SY-28)/9 : CF=1
  199.    Else 
  200.       CX=(SX-470)/8 : CY=(SY-28)/9 : CF=2
  201.    End If 
  202.    CX=Max(CX,0) : CX=Min(CX,15) : CY=Max(CY,0) : CY=Min(CY,15)
  203.    A=BL-BP-CX-(CY*16) : If A<1 Then CX=OCX : CY=OCY
  204.    OCF=CF : P_BOB_XY : P_QUICK_STATUS : P_SCREEN_XY
  205. '
  206. ' Check for double click block end definition. 
  207. '
  208.    If Mouse Key=3 Then Goto L_BITE_BLOCK
  209.    If Mouse Key<>0 Then Goto L_J0
  210. '
  211. ' Mouse keys released. 
  212. '
  213.    If PBF=1 Then P_PASTE : Goto L_EXIT
  214.    If IBF=1 Then P_INSERT : Goto L_EXIT
  215.    If BLOCKF>1 Then Goto L_BLOCK
  216.    A=BP+CX+(CY*16)
  217.    If A=BLOCKE Then P_BLOCKE : P_MOUSE_UP : Pop Proc
  218.    If A=BLOCKS Then P_BLOCKS : P_MOUSE_UP : Pop Proc
  219.    Goto L_EXIT
  220. '
  221. ' Complete a block start or end. 
  222. '
  223. L_BLOCK:
  224.    MCX=SX : MCY=SY : P_CLOCK_ON : Change Mouse PNTER : A=BP+CX+(CY*16)
  225.    If BLOCKF=2 Then BLOCKS=A : If BLOCKE=-1 Then BLOCKE=A
  226.    If BLOCKF=3 Then BLOCKE=A : If BLOCKS=-1 Then BLOCKS=A
  227.    BLOCKF=1 : If BLOCKS>BLOCKE Then BLOCKF=0 : BLOCKS=-1 : BLOCKE=-1
  228.    CLF=1 : P_WRITE_LINES
  229.    MF=PNTER : P_CLOCK_OFF
  230. L_EXIT:
  231.    If DF=0 Then Menu On 
  232.    P_MOUSE_UP : Pop Proc
  233. '
  234. ' Complete a random block. 
  235. '  
  236. L_BITE_BLOCK:
  237.    MCX=SX : MCY=SY : P_CLOCK_ON : A=BP+CX+(CY*16)
  238.    If BLOCKF=0 Then BLOCKE=A : BLOCKS=A
  239.    BLOCKF=1 : BLOCKS=Min(A,BLOCKS) : BLOCKE=Max(BLOCKE,A)
  240.    CLF=1 : P_WRITE_LINES
  241.    P_CLOCK_OFF : Goto L_EXIT
  242. End Proc
  243. Procedure P_DISP_VAL
  244.    ZADD=BS+CB : ZPK=Peek(ZADD) : ZCHAR$=Chr$(ZPK) : If ZPK<32 or ZPK>127 Then ZCHAR$=Chr$(NAC)
  245.    ZF=0 : If ZADD=((ZADD/2)*2) Then ZF=1
  246.    ZDEC$=Right$(("000"+Str$(ZPK)-" "),3) : ZHEX$=Hex$(ZPK,2)-"$" : ZBIN$=Bin$(ZPK,8)-"%"
  247.    ZWORD$="----" : ZWDEC$="--,---" : ZLW$="--------" : ZLWD$=" --,---,---,---"
  248.    If ZF=1
  249.       ZW=Deek(ZADD) : ZWORD$=Hex$(ZW,4)-"$" : ZWDEC$=Right$(("     "+Str$(ZW)-" "),5) : ZWDEC$=Left$(ZWDEC$,2)+","+Right$(ZWDEC$,3)
  250.       ZL=Leek(ZADD) : ZLW$=Hex$(ZL,8)-"$" : ZLWD$=Str$(ZL) : ZLWD$=Right$("           "+ZLWD$-" ",12) : ZLWD$=Left$(ZLWD$,3)+","+Mid$(ZLWD$,4,3)+","+Mid$(ZLWD$,7,3)+","+Right$(ZLWD$,3)
  251.    End If 
  252.    Z$="   "+ZCHAR$+"    "+ZDEC$+"    "+ZHEX$+"  "+ZBIN$+"   "+ZWORD$+"   "+ZWDEC$+"   "+ZLW$+"  "+ZLWD$
  253.    Screen DISPSCRN : Ink WHITE,BLACK : Text 4,24,Z$ : Screen EDSCRN
  254. End Proc
  255. Procedure P_DISP_Y
  256.    ZY=SY+80 : If ZY>249 Then ZY=249
  257.    Screen Display DISPSCRN,,ZY,,
  258. End Proc
  259. Procedure P_FORCE_Q_TO_ASCII
  260.    Z$="" : If Q$="" Then Pop Proc
  261.    For ZL=1 To Len(Q$)
  262.       ZA=Asc(Mid$(Q$,ZL,1)) : If ZA<32 or ZA>127 Then ZA=NAC
  263.       Z$=Z$+Chr$(ZA)
  264.    Next ZL : Q$=Z$
  265. End Proc
  266. Procedure P_LINE_NEXT
  267.    If BF<1 Then Bell : Wait 20 : Pop Proc
  268.    OBLOCKF=BLOCKF : P_BOB_OFF : If BLOCKF>0 Then Ink 0 : P_BLOCK_ON
  269. L_J0:
  270.    If BP>=BL-256 Then Bell : Wait 20 : Goto L_EXIT
  271.    A=BP+16 : If A<BE Then BP=A Else Pop Proc
  272.    PB=1+(BP/256) : P_QUICK_STATUS
  273.    P_SCROLL_BAR
  274.    P_COPY_SAVE
  275.    Screen Copy TEMPSCRN,0,9,594,145 To EDSCRN,7,26
  276. '
  277.    PK=BS+BP+240 : P_PEEK_LINE
  278.    Ink WHITE,BLACK : Text 7,169,LINE$
  279.    If Mouse Key=1 Then Goto L_J0
  280. '
  281. L_EXIT:
  282.    BLOCKF=OBLOCKF : If BLOCKF>0 Then Ink HICOL : P_BLOCK_ON
  283.    P_BOB_XY
  284. End Proc
  285. Procedure P_LINE_PREVIOUS
  286.    If BF<1 Then Bell : Wait 20 : Pop Proc
  287.    OBLOCKF=BLOCKF : P_BOB_OFF : If BLOCKF>0 Then Ink 0 : P_BLOCK_ON
  288.    ZDF=DF : If DF=1 Then DF=0 : Screen Display DISPSCRN,,44,,
  289. L_J0:
  290.    If BP<1 Then Bell : Wait 20 : Goto L_EXIT
  291.    BP=BP-16 : If BP<0 Then BP=0
  292.    PB=1+(BP/256) : P_QUICK_STATUS
  293.    P_SCROLL_BAR
  294.    P_COPY_SAVE
  295.    Screen Copy TEMPSCRN,0,0,594,136 To EDSCRN,7,35
  296. '
  297.    PK=BS+BP : P_PEEK_LINE
  298.    Ink WHITE,BLACK : Text 7,34,LINE$ : If ZDF=1 Then P_DISP_VAL
  299.    If Mouse Key=1 Then Goto L_J0
  300. '
  301. L_EXIT:
  302.    BLOCKF=OBLOCKF : If BLOCKF>0 Then Ink HICOL : P_BLOCK_ON
  303.    P_BOB_XY : P_MOUSE_UP : If ZDF=1 Then P_DISP_ON
  304. End Proc
  305. Procedure P_PEEK_LINE
  306.    T$=" " : LINE$=Right$(("00000000"+(Hex$(PK-BS)-"$")),7)+"  "
  307.    For B=PK To PK+15
  308.       A=Peek(B) : H$=Right$(("0"+(Hex$(A)-"$")),2) : If A<32 or A>127 Then A=NAC
  309.       If B>BE Then H$="--" : A=127
  310.       LINE$=LINE$+H$+" " : T$=T$+Chr$(A)
  311.    Next B : LINE$=LINE$+T$
  312. End Proc
  313. Procedure P_POKE
  314.    Inc PF : If PF>256 Then PF=1
  315.    Inc PM : If PM>256 Then PM=256
  316.    PK$(0,PF)="P" : PK$(1,PF)=Str$(PK) : PK$(2,PF)=Str$(Peek(PK)) : Poke PK,A
  317. End Proc
  318. Procedure P_SCREEN_XY
  319.    SX=X Screen(EDSCRN,X Mouse) : SY=Y Screen(EDSCRN,Y Mouse) : If DF=1 Then P_DISP_Y
  320.    If DEBUG=0 Then Pop Proc
  321.    Ink WHITE,BLACK : X=370 : Y=11 : A$="SX="+(Str$(SX)-" ")+" SY="+(Str$(SY)-" ")+"  " : Text X,Y,A$
  322. End Proc
  323. Procedure P_SCROLL_BAR
  324.    If BF<1 Then Pop Proc
  325.    X0=609 : Y0=26 : X1=630 : Y1=171 : YL=Y1-Y0+1
  326.    Ink BLACK : Bar X0,Y0 To X1,Y1 : B=256*(1+((BL-1)/256))
  327.    A=Y0 : Y0=A+((YL*BP)/B) : Y1=A+((YL*(BP+255))/B) : Ink WHITE : If Y1>171 Then Y1=171
  328.    If Y0<>Y1
  329.        Bar X0,Y0 To X1,Y1
  330.    Else 
  331.       Draw X0,Y0 To X1,Y1
  332.    End If 
  333. End Proc
  334. Procedure P_QUICK_STATUS
  335.    Ink WHITE,BLUE : Text 524,192,Space$(9) : Text 550,19,Space$(7)
  336.    PB=1+(BP/256) : Z=0 : While Z=0 and BF>0
  337.       Z=1 : CB=BP+CX+(CY*16)
  338.       Ink WHITE,BLACK : Text 524,192,Str$(PB)+" " : Text 550,19,Str$(CB)-" "
  339.       If DF>0 Then P_DISP_VAL
  340.    Wend 
  341. End Proc
  342. Procedure P_WRITE_LINES
  343.    Screen TEMPSCRN : Cls 0 : Ink WHITE,BLACK : X=0 : Y=8 : IY=9 : IL=16
  344.    For L=BP To(BP+(15*IL)) Step IL
  345.       PK=L+BS : P_PEEK_LINE
  346.       Text X,Y,LINE$ : Y=Y+IY
  347.    Next L : If CLF=1 Then CLF=0 : P_CLEAR_LIST
  348.    Screen EDSCRN : P_COPY_LOAD
  349.    If BLOCKF<1 Then Pop Proc
  350.    Ink HICOL : P_BLOCK_ON
  351. End Proc
  352. '
  353. ' ***** Key Procedures *****   
  354. '
  355. '
  356. Procedure P_CURS_DOWN
  357.    OCY=CY : Inc CY : A=BL-BP-CX-(CY*16) : If A<1 Then CY=OCY
  358.    If CY>15 Then CY=15 : P_LINE_NEXT
  359.    P_BOB_XY
  360. End Proc
  361. Procedure P_CURS_LEFT
  362.    S=(Key Shift and 3) : If S>0 Then CF=1 : OCF=1 : Pop Proc
  363.    If CB=0 Then Pop Proc
  364.    Dec CX : If CX<0 Then CX=15 : Dec CY
  365.    If CY<0 Then CY=0 : P_LINE_PREVIOUS
  366.    P_BOB_XY
  367. End Proc
  368. Procedure P_CURS_RIGHT
  369.    S=(Key Shift and 3) : If S>0 Then CF=2 : OCF=2 : Pop Proc
  370.    OCX=CX : Inc CX : A=BL-BP-CX-(CY*16) : If A<1 Then CX=OCX
  371.    If CX>15 Then CX=0 : OCY=CY : Inc CY
  372.    A=BL-BP-CX-(CY*16) : If A<1 Then CY=OCY
  373.    If CY>15 Then CY=15 : P_LINE_NEXT
  374.    P_BOB_XY
  375. End Proc
  376. Procedure P_CURS_UP
  377.    If CB=0 Then Pop Proc
  378.    Dec CY : If CY<0 Then CY=0 : P_LINE_PREVIOUS
  379.    P_BOB_XY
  380. End Proc
  381. '
  382. L_CONTROL_KEYS:
  383.    If SC=37 Then P_HELP
  384. If BF<1 Then K$="" : SC=-1 : Goto L_LOOP
  385. '
  386.    If SC=22 Then P_UNDO
  387.    If SC=32 Then P_AGAIN
  388.    If SC=35 Then P_FIRST
  389.    If SC=40 Then P_LAST
  390.    If SC=54 Then P_NEXT
  391.    K$="" : SC=-1
  392. Goto L_LOOP
  393. '
  394. ' ***** Menu Procedures *****  
  395. '
  396. Procedure P_BLOCK
  397.    A=Free : If AGAIN=False Then M1=Choice(1) : M2=Choice(2)
  398.    If M2=12 Then Goto L_EXIT
  399.    If M2=8 Then P_BLOCK_INPUT : Goto L_EXIT
  400.    If M2=13 Then P_BLOCK_ZAP : Goto L_EXIT
  401.    If BF<1 Then EF=1 : P_ERROR : Goto L_EXIT
  402.    On M2 Proc P_BLOCK_ALL,P_BLOCKS,P_BLOCKE,P_BLOCK_OFF,P_BLOCK_FILL,P_BLOCK_APPEND,P_BLOCK_CUT,P_BLOCK_INPUT,P_BLOCK_INSERT,P_BLOCK_PASTE,P_BLOCK_STORE,P_NULL,P_BLOCK_ZAP
  403. L_EXIT:
  404.    AGAIN=False : On Menu On : P_MOUSE_UP
  405. End Proc
  406. Procedure P_BLOCK_ALL
  407.    PX=X Mouse : PY=Y Mouse : MCX=268 : MCY=100 : P_CLOCK_ON
  408.    BLOCKS=0 : BLOCKE=BL-1 : BLOCKF=1
  409.    CLF=1 : P_WRITE_LINES : P_CLOCK_OFF
  410. End Proc
  411. Procedure P_BLOCK_APPEND
  412.    If BF<1 Then EF=1 : P_ERROR : Pop Proc
  413.    If MBL<1 Then EF=9 : P_ERROR : Pop Proc
  414.    PX=X Mouse : PY=Y Mouse : MCX=268 : MCY=100 : P_CLOCK_ON
  415.    Q$="Extend This File By Appending M-Block?" : P_YES_NO
  416.    If Q$="N" Then P_PROMPT_OFF : Pop Proc
  417.    ZL=BL+MBL : Erase TEMPBANK : Reserve As Data TEMPBANK,ZL : ZS=Start(TEMPBANK)
  418.    Copy BS,BS+BL To ZS : ZM=Start(SBANK) : Copy ZM,ZM+MBL To ZS+BL
  419. '
  420.    Swap FILEBANK,TEMPBANK : Erase TEMPBANK
  421.    BS=Start(FILEBANK) : BL=ZL : BE=BS+BL-1
  422.    If CB>BL-1 Then Z=(BL-1)/256 : BP=Z*256 : PB=1+Z : P_SCROLL_BAR
  423.    CY=(BL-BP)/16 : CX=BL-BP-(CY*16)-1 : CF=0
  424.    If CX<0 Then CX=15 : CY=CY-1
  425. '
  426.    NB=1+((BL-1)/256) : BLOCKF=0 : BLOCKE=-1 : BLOCKS=-1 : P_PROMPT_OFF
  427. End Proc
  428. Procedure P_BLOCK_CUT
  429.    If BLOCKF<>1 Then EF=4 : P_ERROR : Pop Proc
  430.    PX=X Mouse : PY=Y Mouse : MCX=268 : MCY=100 : P_CLOCK_ON
  431.    MBL=BLOCKE-BLOCKS+1 : Erase SBANK : Reserve As Work SBANK,MBL
  432.    ZS=BS+BLOCKS : ZF=ZS+MBL-1 : ZT=Start(SBANK) : Copy ZS,ZF+1 To ZT
  433. '
  434.    ZFL=BL : If MBL=ZFL Then P_CLOCK_OFF : EF=5 : P_ERROR : Pop Proc
  435.    ZL=ZFL-MBL : Erase TEMPBANK : Reserve As Work TEMPBANK,ZL
  436.    ZTS=Start(TEMPBANK) : ZTE=ZTS+ZL-1
  437.    If BLOCKS=0
  438.       ZS=BS+BLOCKE+1 : ZF=BE : Copy ZS,ZF+1 To ZTS
  439.    End If 
  440.    If BLOCKS>0 and BLOCKE<BL-1
  441.       ZS=BS : ZF=ZS+BLOCKS-1 : Copy ZS,ZF+1 To ZTS
  442.       ZT=ZTS+(ZF-ZS+1)
  443.       ZS=BS+BLOCKE+1 : ZF=BE : Copy ZS,ZF+1 To ZT
  444.    End If 
  445.    If BLOCKE=BL-1
  446.       ZS=BS : ZF=BS+BLOCKS-1 : ZT=Start(TEMPBANK) : Copy ZS,ZF+1 To ZT
  447.    End If 
  448.    Swap FILEBANK,TEMPBANK : Erase TEMPBANK
  449.    BS=Start(FILEBANK) : BL=ZL : BE=BS+BL-1
  450. '
  451.    If CB>BL-1 Then Z=(BL-1)/256 : BP=Z*256 : PB=1+Z : P_SCROLL_BAR
  452.    CY=(BL-BP)/16 : CX=BL-BP-(CY*16)-1 : CF=0
  453.    If CX<0 Then CX=15 : CY=CY-1
  454. '
  455.    NB=1+((BL-1)/256) : BLOCKF=0 : BLOCKE=-1 : BLOCKS=-1 : P_PROMPT_OFF
  456. End Proc
  457. Procedure P_BLOCKE
  458.    MF=PICK : Change Mouse MF : BLOCKF=3 : Menu Off 
  459. End Proc
  460. Procedure P_BLOCK_FILL
  461.    If BLOCKF<>1 Then EF=4 : P_ERROR : Pop Proc
  462.    If AGAIN=False Then M3=Choice(3)
  463.    A=Free : If M3<3 Then NUM=1 : NUM(1)=0 : If M3=2 Then NUM(1)=$FF
  464.    If M3<3 Then Goto L_FILL
  465.    If M3=3 Then Goto L_VARIABLE
  466.    If M3=4 Then Goto L_M_BLOCK
  467.    If M3=5 Then Goto L_SEARCH_STRING
  468. '
  469. L_M_BLOCK:
  470.    If MBL=0 Then EF=9 : P_ERROR : Pop Proc
  471.    NUM=Min(MBL,100) : ZPK=Start(SBANK)
  472.    For ZL=1 To NUM
  473.       NUM(ZL)=Peek(ZPK) : Inc ZPK
  474.    Next ZL : Goto L_FILL
  475. '
  476. L_SEARCH_STRING:
  477.    If HF$="" Then EF=12 : P_ERROR : Pop Proc
  478.    NUM=Len(HF$) : NUM=Min(NUM,100)
  479.    For ZL=1 To NUM
  480.       NUM(ZL)=Asc(Mid$(HF$,ZL,1))
  481.    Next ZL : Goto L_FILL
  482. '
  483. L_VARIABLE:
  484.    P_CLEAR_LIST
  485.    PX=X Mouse : PY=Y Mouse : Put Key HF$ : Z$="    " : ZX=0 : ZY=7
  486.    Restore L_DATA : Read ZA$
  487.    While ZA$<>""
  488.       Locate ZX,ZY : Centre ZA$+Z$ : Inc ZY : Read ZA$
  489.    Wend 
  490.    Q$="" : P_QUESTION
  491.    If Q$="" Then Goto L_EXIT
  492. '
  493. ' Evaluate a string of numbers 
  494.    NUM$=Q$ : P_GET_NUMBERS
  495.    If NUM=0 Then EF=10 : P_ERROR : Goto L_EXIT
  496.    Goto L_FILL
  497. '
  498. L_FILL:
  499.    PX=X Mouse : PY=Y Mouse : MCX=268 : MCY=100 : P_CLOCK_ON : ZN=1
  500.    For L=BS+BLOCKS To BS+BLOCKE
  501.       Poke L,NUM(ZN) : Inc ZN : If ZN>NUM Then ZN=1
  502.    Next L
  503. '
  504. L_EXIT:
  505.    PD=0 : P_PROMPT_OFF
  506. '
  507. L_DATA:
  508.    Data "HiLi Block Fill Values"
  509.    Data " "
  510.    Data "Enter values  for the fill process. These can be"
  511.    Data "bytes, words, or long-words; in decimal, hex, or"
  512.    Data "binary as  denoted  by their  prefix. These are;"
  513.    Data "w-Word, l-Long, $-Hex,  %-Binary.    Decimal  is"
  514.    Data "assumed if no other prefix is given.            "
  515.    Data ""
  516. End Proc
  517. Procedure P_BLOCK_INPUT
  518.    P_CLEAR_LIST
  519.    PX=X Mouse : PY=Y Mouse : Z$="    " : ZX=0 : ZY=7
  520.    Restore L_DATA : Read ZA$
  521.    While ZA$<>""
  522.       Locate ZX,ZY : Centre ZA$+Z$ : Inc ZY : Read ZA$
  523.    Wend 
  524.    Q$="" : P_QUESTION
  525.    If Q$="" Then Goto L_EXIT
  526. '
  527. ' Evaluate a string of numbers 
  528. '  
  529.    NUM$=Q$ : P_GET_NUMBERS
  530.    If NUM=0 Then EF=10 : P_ERROR : Goto L_EXIT
  531. '
  532. ' Set M=Block values.
  533.    PX=X Mouse : PY=Y Mouse : MCX=268 : MCY=100 : P_CLOCK_ON
  534.    MBL=NUM : Erase SBANK : Reserve As Work SBANK,MBL : ZPK=Start(SBANK)
  535.    For ZL=1 To NUM
  536.       Poke ZPK,NUM(ZL) : Inc ZPK
  537.    Next ZL
  538. '
  539. L_EXIT:
  540.    PD=0 : P_PROMPT_OFF
  541. '
  542. L_DATA:
  543.    Data "Define M-Block Values Directly"
  544.    Data " "
  545.    Data "Enter any values  for this process. These can be"
  546.    Data "bytes, words, or long-words; in decimal, hex, or"
  547.    Data "binary as  denoted  by their  prefix. These are;"
  548.    Data "w-Word, l-Long, $-Hex,  %-Binary.    Decimal  is"
  549.    Data "assumed if no other prefix is given.            "
  550.    Data ""
  551. End Proc
  552. Procedure P_BLOCK_INSERT
  553.    If MBL=0 Then EF=9 : P_ERROR : Pop Proc
  554.    MF=INSERT : Change Mouse MF : IBF=1 : Menu Off 
  555. End Proc
  556. Procedure P_BLOCK_OFF
  557.    If BLOCKF=0 Then Bell : Pop Proc
  558.    PX=X Mouse : PY=Y Mouse : MCX=268 : MCY=100 : P_CLOCK_ON
  559.    BLOCKS=-1 : BLOCKE=-1 : BLOCKF=0
  560.    CLF=1 : P_WRITE_LINES : P_CLOCK_OFF
  561. End Proc
  562. Procedure P_BLOCK_PASTE
  563.    If MBL=0 Then EF=9 : P_ERROR : Pop Proc
  564.    MF=PASTE : Change Mouse MF : PBF=1 : Menu Off 
  565. End Proc
  566. Procedure P_BLOCKS
  567.    MF=PICK : Change Mouse MF : BLOCKF=2 : Menu Off 
  568. End Proc
  569. Procedure P_BLOCK_STORE
  570.    If BLOCKF<>1 Then EF=4 : P_ERROR : Pop Proc
  571.    PX=X Mouse : PY=Y Mouse : MCX=268 : MCY=100 : P_CLOCK_ON
  572.    MBL=BLOCKE-BLOCKS+1 : Erase SBANK : Reserve As Work SBANK,MBL
  573.    ZS=BS+BLOCKS : ZF=ZS+MBL-1 : ZT=Start(SBANK) : Copy ZS,ZF+1 To ZT
  574.    BLOCKS=-1 : BLOCKE=-1 : BLOCKF=0 : P_PROMPT_OFF
  575. End Proc
  576. Procedure P_BLOCK_ZAP
  577.    If MBL=0 Then Bell : Pop Proc
  578.    Q$="Erase M-Block Store?" : P_YES_NO
  579.    If Q$="Y" Then MBL=0 : Erase SBANK
  580.    PD=0 : P_PROMPT_OFF
  581. End Proc
  582. Procedure P_DISK
  583.    A=Free : If AGAIN=False Then M1=Choice(1) : M2=Choice(2)
  584.    If M2=14 Then P_ABORT
  585.    On M2 Proc P_D_APPEND,P_D_LOAD_MBLOCK,P_D_LOAD,P_D_MERGE,P_D_QUICK_L,P_D_QUICK_S,P_D_SAVE,P_D_SAVE_AS,P_D_SAVE_HILI,P_D_SAVE_MBLOCK,P_D_MKDIR,P_D_KILL
  586.    AGAIN=False : On Menu On : P_MOUSE_UP
  587. End Proc
  588. Procedure P_D_APPEND
  589.    P_FADE_OUT : Z$=Fsel$("","","Append A Disk File","")
  590.    If Z$="" Then P_FADE_IN : Pop Proc
  591.    If Exist(Z$)=0 Then P_FADE_IN : EF=7 : P_ERROR : Pop Proc
  592. '
  593.    If BL=0 Then F$=Z$
  594.    P$="Appending <"+Left$(Z$,40)+">" : P_PROMPT : P_FADE_IN
  595.    PX=167 : PY=87 : Open In 1,Z$ : ZL=Lof(1) : Close 1
  596.    Erase TEMPBANK : Reserve As Data TEMPBANK,BL+ZL : ZS=Start(TEMPBANK)
  597.    If BL>0 Then Copy BS,BS+BL To ZS
  598.    Bload Z$,ZS+BL : Swap FILEBANK,TEMPBANK
  599.    Erase TEMPBANK : BS=Start(FILEBANK) : BL=BL+ZL : BE=BS+BL-1
  600.    BF=1 : PB=1 : NB=1+((BL-1)/256)
  601. '  
  602.    BP=0 : BLOCKE=-1 : BLOCKF=0 : BLOCKS=-1 : PF=0 : PM=0
  603.    CB=0 : CF=0 : OCF=2 : CX=0 : CY=0 : K$="" : Clear Key 
  604.    P_STATUS
  605.    P_SCROLL_BAR
  606.    MF=PNTER : P_PROMPT_OFF
  607. End Proc
  608. Procedure P_D_KILL
  609.    P_FADE_OUT : Z$=Fsel$("","","Kill A Disk File","")
  610.    If Z$="" Then P_FADE_IN : Pop Proc
  611.    If Exist(Z$)=0 Then P_FADE_IN : EF=7 : P_ERROR : Pop Proc
  612. '
  613.    P$="Deleting <"+Z$+">" : P_PROMPT : P_FADE_IN
  614.    Kill Z$ : MF=PNTER : P_PROMPT_OFF
  615. End Proc
  616. Procedure P_D_LOAD
  617.    P_FADE_OUT : Z$=Fsel$("","","Load A Disk File","")
  618.    If Z$="" Then P_FADE_IN : Pop Proc
  619.    If Exist(Z$)=0 Then P_FADE_IN : EF=7 : P_ERROR : Pop Proc
  620. '
  621.    F$=Z$ : P$="Loading <"+F$+">" : P_PROMPT : P_FADE_IN
  622.    PX=167 : PY=87 : Open In 1,F$ : BL=Lof(1) : Close 1
  623.    B=FILEBANK : Erase B : Reserve As Data B,BL
  624.    BF=1 : PB=1 : NB=1+((BL-1)/256)
  625.    Bload F$,B : BS=Start(B) : BE=BS+BL-1
  626. '  
  627.    BP=0 : BLOCKE=-1 : BLOCKF=0 : BLOCKS=-1 : PF=0 : PM=0
  628.    CB=0 : CF=0 : OCF=2 : CX=0 : CY=0 : K$="" : Clear Key 
  629.    P_SCROLL_BAR
  630.    MF=PNTER : P_PROMPT_OFF
  631. End Proc
  632. Procedure P_D_LOAD_MBLOCK
  633.    P_FADE_OUT : Z$=Fsel$("","","Load A File Into M-Block","")
  634.    If Z$="" Then P_FADE_IN : Pop Proc
  635.    If Exist(Z$)=0 Then P_FADE_IN : EF=7 : P_ERROR : Pop Proc
  636. '
  637.    P$="Loading <"+Left$(Z$,40)+"> Into M-Block" : P_PROMPT : P_FADE_IN
  638.    PX=167 : PY=87 : Open In 1,Z$ : MBL=Lof(1) : Close 1
  639.    Erase SBANK : Reserve As Data SBANK,MBL
  640.    Bload Z$,SBANK : P_STATUS
  641.    MF=PNTER : P_PROMPT_OFF
  642. End Proc
  643. Procedure P_D_MERGE
  644.    P_FADE_OUT : Z$=Fsel$("","","Merge A Disk File At","Current Cursor Position")
  645.    If Z$="" Then P_FADE_IN : Pop Proc
  646.    If Exist(Z$)=0 Then P_FADE_IN : EF=7 : P_ERROR : Pop Proc
  647. '
  648.    If BL=0 Then F$=Z$
  649.    P$="Merging <"+Left$(Z$,40)+">" : P_PROMPT : P_FADE_IN
  650.    PX=167 : PY=87 : Open In 1,Z$ : ZL=Lof(1) : Close 1
  651.    Erase TEMPBANK : Reserve As Data TEMPBANK,BL+ZL : ZS=Start(TEMPBANK)
  652. '
  653.    If BL>0 and CB>0 Then Copy BS,BS+CB To ZS
  654.    Bload Z$,ZS+CB
  655.    If BL>0 Then Copy BS+CB,BS+BL To ZS+CB+ZL
  656.    Swap FILEBANK,TEMPBANK
  657.    Erase TEMPBANK : BS=Start(FILEBANK) : BL=BL+ZL : BE=BS+BL-1
  658.    BF=1 : PB=1 : NB=1+((BL-1)/256)
  659. '  
  660.    BP=0 : BLOCKE=-1 : BLOCKF=0 : BLOCKS=-1 : PF=0 : PM=0
  661.    CB=0 : CF=0 : OCF=2 : CX=0 : CY=0 : K$="" : Clear Key 
  662.    P_STATUS
  663.    P_SCROLL_BAR
  664.    MF=PNTER : P_PROMPT_OFF
  665. End Proc
  666. Procedure P_D_MKDIR
  667.    P_CLEAR_LIST
  668.    PX=X Mouse : PY=Y Mouse : Z$="    " : ZX=0 : ZY=9
  669.    Restore L_DATA : Read ZA$
  670.    While ZA$<>""
  671.       Pen WHITE : Locate ZX,ZY : Centre ZA$+Z$ : Inc ZY : Read ZA$
  672.    Wend 
  673.    Q$="" : P_QUESTION
  674.    If Q$="" Then P_PROMPT_OFF : Pop Proc
  675.    P$="Creating Directory <"+Q$+">" : P_PROMPT
  676.    On Error Goto L_ERROR : Mkdir Q$ : Goto L_EXIT
  677. L_ERROR:
  678.    EF=8 : P_ERROR
  679.    Resume Next 
  680. L_EXIT:
  681.    P_PROMPT_OFF
  682. L_DATA:
  683.    Data "Make A New Directory"
  684.    Data " "
  685.    Data "Enter The Full Pathname For Your New Directory;"
  686.    Data "(Enter A NULL String To Abort This Process)"
  687.    Data ""
  688. End Proc
  689. Procedure P_D_QUICK_L
  690.    If Exist(QUICKPATH$)=False Then EF=2 : P_ERROR : Pop Proc
  691.    If AGAIN=False Then M3=Choice(3)
  692.    ZF$=QUICKPATH$+"U-File"+Str$(M3-1)-" " : ZA$=ZF$+".Name"
  693.    If Exist(ZA$)=False Then EF=3 : P_ERROR : Pop Proc
  694. '
  695.    Open In 1,ZA$
  696.       Line Input #1,ZN$
  697.       Input #1,BP : Input #1,BLOCKE : Input #1,BLOCKF : Input #1,BLOCKS
  698.       Input #1,CB : Input #1,CF : Input #1,OCF
  699.       Input #1,CX : Input #1,CY
  700.    Close 1
  701.    ZA$=ZF$+".Data" : If Exist(ZA$)=0 Then P_RESET : Pop Proc
  702. '
  703.    F$=ZN$ : P_BOB_OFF : P$="Loading <"+F$+">" : P_PROMPT
  704.    PX=167 : PY=87 : Open In 1,ZA$ : BL=Lof(1) : Close 1
  705.    B=FILEBANK : Erase B : Reserve As Data B,BL
  706.    BF=1 : PB=1 : PF=0 : PM=0 : NB=1+((BL-1)/256) : K$="" : Clear Key 
  707.    Bload ZA$,B : BS=Start(B) : BE=BS+BL-1
  708. '  
  709.    P_STATUS
  710.    P_SCROLL_BAR
  711.    MF=PNTER : P_PROMPT_OFF
  712.    P_BOB_XY
  713. End Proc
  714. Procedure P_D_QUICK_S
  715.    If BF<1 Then EF=1 : P_ERROR : Pop Proc
  716.    If Exist(QUICKPATH$)=0 Then EF=2 : P_ERROR : Pop Proc
  717.    If AGAIN=False Then M3=Choice(3)-1
  718.    ZF$=QUICKPATH$+"U-File"+Str$(M3)-" " : ZA$=ZF$+".Data"
  719.    If Exist(ZA$) Then Q$="File Already Exists. Replace?" : P_YES_NO
  720.    If Q$="N" Then Goto L_EXIT
  721.    Bsave ZA$,BS To BS+BL
  722.    ZA$=ZF$+".Name" : P$="Saving Filename To "+ZA$ : P_PROMPT
  723.    Open Out 1,ZA$
  724.       Print #1,F$
  725.       Print #1,BP : Print #1,BLOCKE : Print #1,BLOCKF : Print #1,BLOCKS
  726.       Print #1,CB : Print #1,CF : Print #1,OCF
  727.       Print #1,CX : Print #1,CY
  728.    Close 1
  729. L_EXIT:
  730.    MF=PNTER : P_PROMPT_OFF
  731. End Proc
  732. Procedure P_D_SAVE
  733.    If BF<1 Then EF=1 : P_ERROR : Pop Proc
  734.    If MENFLG=True Then Menu Off 
  735.    If Exist(F$) Then Q$="File Already Exists. Replace?" : P_YES_NO
  736.    If Q$="N" Then Goto L_EXIT
  737.    P$="Saving <"+F$+">" : P_PROMPT
  738.    Bsave F$,BS To BS+BL
  739. L_EXIT:
  740.    MF=PNTER : P_PROMPT_OFF
  741. End Proc
  742. Procedure P_D_SAVE_AS
  743.    If BF<1 Then EF=1 : P_ERROR : Pop Proc
  744.    P_FADE_OUT : Z$=Fsel$("","","Save File As...","")
  745.    If Z$="" Then P_FADE_IN : Pop Proc
  746.    If Exist(Z$) Then Q$="File Already Exists. Replace?" : P_YES_NO
  747.    If Q$="N" Then Goto L_EXIT
  748.    F$=Z$ : P$="Saving <"+Left$(F$,40)+">  " : P_PROMPT
  749.    Bsave F$,BS To BS+BL
  750. L_EXIT:
  751.    P_PROMPT_OFF
  752. End Proc
  753. Procedure P_D_SAVE_HILI
  754.    If BF<1 Then EF=1 : P_ERROR : Pop Proc
  755.    If BLOCKF<>1 Then EF=4 : P_ERROR : Pop Proc
  756.    P_FADE_OUT : Z$=Fsel$("","","Save HiLi As File...","")
  757.    If Z$="" Then P_FADE_IN : Pop Proc
  758.    If Exist(Z$) Then Q$="File Already Exists. Replace?" : P_YES_NO
  759.    If Q$="N" Then Goto L_EXIT
  760.    P$="Saving HiLi As <"+Left$(Z$,40)+">  " : P_PROMPT
  761.    Bsave Z$,BS+BLOCKS To BS+BLOCKE-BLOCKS+1
  762. L_EXIT:
  763.    P_PROMPT_OFF
  764. End Proc
  765. Procedure P_D_SAVE_MBLOCK
  766.    If MBL<1 Then EF=9 : P_ERROR : Pop Proc
  767.    P_FADE_OUT : Z$=Fsel$("","","Save M-Block As File...","")
  768.    If Z$="" Then P_FADE_IN : Pop Proc
  769.    If Exist(Z$) Then Q$="File Already Exists. Replace?" : P_YES_NO
  770.    If Q$="N" Then Goto L_EXIT
  771.    P$="Saving M-Block As <"+Left$(Z$,40)+">  " : P_PROMPT
  772.    ZS=Start(SBANK) : Bsave Z$,ZS To ZS+MBL
  773. L_EXIT:
  774.    P_PROMPT_OFF
  775. End Proc
  776. Procedure P_FIND
  777.    A=Free : If AGAIN=False Then M1=Choice(1) : M2=Choice(2)
  778.    If BF<1 Then EF=1 : P_ERROR : Goto L_EXIT
  779.    On M2 Proc P_FIND_CURRENT,P_FIND_HILI,P_FIND_MBLOCK,P_FIND_AMOS,P_FIND_DEVS,P_FIND_IFF,P_FIND_CASE,P_FIND_TEXT
  780. L_EXIT:
  781.    AGAIN=False : On Menu On 
  782. End Proc
  783. Procedure P_FIND_AMOS
  784.    If AGAIN=False Then M3=Choice(3)
  785.    HF$=Mid$(PSAMOS$,1+((M3-1)*5),4) : HP=BS : P_HUNT
  786. End Proc
  787. Procedure P_FIND_CASE
  788.    If HF$="" Then EF=12 : P_ERROR : Pop Proc
  789.    A=Free : If AGAIN=False Then M3=Choice(3)
  790.    If M3=1 Then Goto L_IGNORE
  791.    If M3=2 Then HF$=Lower$(HF$)
  792.    If M3=3 Then HF$=Upper$(HF$)
  793.    HP=BS : P_HUNT : Pop Proc
  794. '
  795. L_IGNORE:
  796.    HP=BS : P_HUNT_IGNORE
  797. End Proc
  798. Procedure P_FIND_CURRENT
  799.    If HF$="" Then EF=12 : P_ERROR : Pop Proc
  800.    HP=BS : P_HUNT
  801. End Proc
  802. Procedure P_FIND_DEVS
  803.    If AGAIN=False Then M3=Choice(3)
  804.    HF$=Mid$(PSDEV$,1+((M3-1)*6),5)-" " : HP=BS : P_HUNT
  805. End Proc
  806. Procedure P_FIND_HILI
  807.    If BLOCKF<>1 Then EF=4 : P_ERROR : Pop Proc
  808.    ZPK=BS+BLOCKS : ZN=BLOCKE-BLOCKS+1 : HF$="" : Q$="Y"
  809.    If ZN>256 Then ZN=256 : Q$="String Restricted To 256 Characters. Continue?" : P_YES_NO
  810.    If Q$="N" Then P_PROMPT_OFF : Pop Proc
  811.    HF$=Space$(ZN) : Copy ZPK,ZPK+ZN To Varptr(HF$)
  812.    HP=BS : P_HUNT
  813. End Proc
  814. Procedure P_FIND_IFF
  815.    If AGAIN=False Then M3=Choice(3)
  816.    HF$=Mid$(PSIFF$,1+((M3-1)*5),4) : HP=BS : P_HUNT
  817. End Proc
  818. Procedure P_FIND_MBLOCK
  819.    If MBL=0 Then EF=9 : P_ERROR : Pop Proc
  820.    ZPK=Start(SBANK) : ZN=MBL : HF$="" : Q$="Y"
  821.    If ZN>256 Then ZN=256 : Q$="String Restricted To 256 Characters. Continue?" : P_YES_NO
  822.    If Q$="N" Then P_PROMPT_OFF : Pop Proc
  823.    HF$=Space$(ZN) : Copy ZPK,ZPK+ZN To Varptr(HF$)
  824.    HP=BS : P_HUNT
  825. End Proc
  826. Procedure P_FIND_TEXT
  827.    P_CLEAR_LIST
  828.    PX=X Mouse : PY=Y Mouse : Z$="    " : ZX=0 : ZY=10
  829.    Restore L_DATA : Read ZA$
  830.    While ZA$<>""
  831.       Locate ZX,ZY : Centre ZA$+Z$ : Inc ZY : Read ZA$
  832.    Wend 
  833.    Q$=HF$ : P_FORCE_Q_TO_ASCII
  834.    Z$="--- Previous Had Binary ---"
  835.    If Q$<>HF$ Then Q$=Z$
  836.    P_QUESTION
  837.    If Q$="" Then P_PROMPT_OFF : P_LIMIT_OFF : Pop Proc
  838.    HF$=Q$ : HP=BS : P_HUNT
  839. L_DATA:
  840.    Data "Text String Search"
  841.    Data " "
  842.    Data "Input A Text String For The Search Process."
  843.    Data "(A NUll String Will Terminate The Search)"
  844.    Data ""
  845. End Proc
  846. Procedure P_HUNT
  847.    HM=0 : Q$=Left$(HF$,30) : P_FORCE_Q_TO_ASCII
  848.    ZZ$=Q$ : P$="Searching For <"+ZZ$+">" : P_PROMPT
  849.    ZL=Len(HF$) : F=Hunt(HP To BE+1,HF$)
  850.    If F=0
  851.       HP=BE : Bell : P$="Could Not Find <"+ZZ$+">" : P_PROMPT
  852.    Else 
  853.       HP=F : CB=F-BS : P_BLOCK_CB
  854.       BLOCKS=CB : BLOCKE=CB+ZL-1 : BLOCKF=1
  855.       CF=2 : OCF=2 : PD=0 : P_SCROLL_BAR
  856.    End If : PD=0 : P_PROMPT_OFF
  857. End Proc
  858. Procedure P_HUNT_IGNORE
  859.    HM=1 : Q$=Left$(HF$,30) : P_FORCE_Q_TO_ASCII
  860.    ZZ$=Q$ : P$="Searching For Any Case <"+ZZ$+">" : P_PROMPT
  861. '
  862. ' ASCII case range is Upper 65-90 and Lower 97-122 
  863. '
  864.    Z$="" : ZA=1 : ZM=Len(HF$) : ZM$=Space$(ZM)
  865. ' Find first ASCII character in HF$  
  866.    ZE=0
  867.    Do 
  868.       If ZA>ZM Then ZE=2 : Exit 
  869.       Z=Asc(Mid$(HF$,ZA,1))
  870.       If Z<65 or(Z>90 and Z<97) or Z>122
  871.          Z$=Z$+Chr$(Z) : Inc ZA
  872.       Else 
  873.          ZE=1
  874.       End If 
  875.       If ZE=1 Then Exit 
  876.    Loop 
  877. '  
  878.    If ZE=2 Then Goto L_NO_ASCII
  879.    Z$=Z$+Chr$(Z) : Clear Key 
  880. L_TRY_UPPER:
  881.    ZF$=Upper$(Z$) : ZU=Hunt(HP To BE+1,ZF$)
  882. '
  883. L_TRY_LOWER:
  884.    ZF$=Lower$(Z$) : ZL=Hunt(HP To BE+1,ZF$)
  885.    F=0 : If ZU>0 and(ZU<ZL or ZL=0) Then F=ZU : Goto L_CHECK_MATCH
  886.    If ZL>0 and(ZL<ZU or ZU=0) Then F=ZL : Goto L_CHECK_MATCH
  887.    Goto L_EXIT
  888. '
  889. L_CHECK_MATCH:
  890.    Copy F,F+ZM To Varptr(ZM$)
  891.    If Lower$(HF$)=Lower$(ZM$) Then Goto L_EXIT
  892.    If Upper$(HF$)=Upper$(ZM$) Then Goto L_EXIT
  893.    If Inkey$<>"" Then F=0 : Clear Key : Goto L_EXIT
  894.    HP=F+1 : If HP<BE-ZM+1 Then Goto L_TRY_UPPER
  895.    Goto L_EXIT
  896. '
  897. L_NO_ASCII:
  898.    F=Hunt(HP To BE+1,HF$) : Goto L_EXIT
  899. '
  900. L_EXIT:
  901.    If F=0
  902.       HP=BE : Bell : P$="Could Not Find <"+ZZ$+">" : P_PROMPT
  903.    Else 
  904.       HP=F : CB=F-BS : P_BLOCK_CB
  905.       BLOCKS=CB : BLOCKE=CB+Len(HF$)-1 : BLOCKF=1
  906.       CF=2 : OCF=2 : PD=0 : P_SCROLL_BAR
  907.    End If : P_PROMPT_OFF
  908. End Proc
  909. Procedure P_SETUP
  910.    A=Free : If AGAIN=False Then M1=Choice(1) : M2=Choice(2)
  911.    On M2 Proc P_S_FILE_LEN,P_S_ASCII,P_S_PREF,P_S_QUICK,P_S_DEBUG,P_NULL,P_Q_RESET
  912.    AGAIN=False : On Menu On 
  913. End Proc
  914. Procedure P_S_ASCII
  915.    A=Free : If AGAIN=False Then M3=Choice(3)
  916.    If M3=1 Then NAC=Asc(" ")
  917.    If M3=2 Then NAC=127
  918.    If M3=3 Then NAC=Asc(".")
  919.    If M3=4 Then NAC=Asc("#")
  920.    If M3=5 Then NAC=Asc("_")
  921.    PX=X Mouse : PY=Y Mouse : MCX=268 : MCY=100 : P_CLOCK_ON : P_PROMPT_OFF
  922. End Proc
  923. Procedure P_S_DEBUG
  924.    If DEBUG=0
  925.       DEBUG=1 : Break On 
  926.    Else 
  927.       DEBUG=0 : Break Off : Ink WHITE,BLUE : Text 370,11,Space$(15)
  928.    End If 
  929. End Proc
  930. Procedure P_S_FILE_LEN
  931.    P_CLEAR_LIST
  932.    PX=X Mouse : PY=Y Mouse : Z$="   " : ZX=0 : ZY=7
  933.    Restore L_DATA : Read ZA$
  934.    While ZA$<>""
  935.       Locate ZX,ZY : Centre ZA$+Z$ : Inc ZY : Read ZA$
  936.    Wend 
  937.    Q$=Str$(BL)-" " : P_QUESTION
  938.    ZV=Val(Q$) : If(Q$="") or ZV=0 or ZV=BL Then P_PROMPT_OFF : Pop Proc
  939.    If BL=0 Then BL=ZV : Erase FILEBANK : Reserve As Data FILEBANK,BL : F$="RAM:New.File" : Goto L_COMPLETE
  940.    If BL>ZV Then Q$="Loss of data will occur. Continue?" : P_YES_NO
  941.    If Q$="N" Then P_PROMPT_OFF : Pop Proc
  942.    Erase TEMPBANK : Reserve As Data TEMPBANK,ZV : ZS=Start(TEMPBANK)
  943.    ZC=Min(ZV,BL) : Copy BS,BS+ZC To ZS
  944.    Swap FILEBANK,TEMPBANK : Erase TEMPBANK : BL=ZV
  945. '
  946. L_COMPLETE:
  947.    BF=1 : PB=1 : NB=1+((BL-1)/256)
  948.    BS=Start(FILEBANK) : BE=BS+BL-1
  949.    BP=0 : BLOCKE=-1 : BLOCKF=0 : BLOCKS=-1 : PF=0 : PM=0
  950.    CB=0 : CF=0 : OCF=2 : CX=0 : CY=0 : K$="" : Clear Key 
  951.    P_SCROLL_BAR
  952.    P_PROMPT_OFF
  953. L_DATA:
  954.    Data "Define The File Length"
  955.    Data " "
  956.    Data "Input the new length for the current file.  If a file has not"
  957.    Data "been loaded then an empty file will be created, and a default"
  958.    Data "Filename of  'RAM:New.File'  assumed.  An input length=0 will"
  959.    Data "abort this  process.  If the new length  is shorter  than the"
  960.    Data "previous length then you will be asked to confirm the change."
  961.    Data ""
  962. End Proc
  963. Procedure P_S_PREF
  964.    A=Free : If AGAIN=False Then M3=Choice(3)
  965.    On M3 Proc P_S_PREF_LOAD,P_S_PREF_SAVE,P_S_PREF_PATH
  966. End Proc
  967. Procedure P_S_PREF_LOAD
  968.    ZE=1
  969.    For ZL=1 To Len(CHECK$)-4 Step 5
  970.       ZD$=Mid$(CHECK$,ZL,4)-" "+"U-File.Pref" : If Exist(ZD$) Then ZE=0 : Exit 
  971.    Next ZL : If ZE=1 and SOF=2 Then EF=6 : P_ERROR
  972.    If ZE=1 Then Pop Proc
  973. '
  974. L_LOAD:
  975.    If SOF=2 Then P$="Loading Preferences <"+ZD$+">" : P_PROMPT
  976.    Open In 1,ZD$
  977.    Input #1,CI
  978.    For L=0 To 3 : Input #1,C(L) : Next L : P_BRIGHT_SET
  979.    Input #1,NAC
  980.    Line Input #1,QUICKPATH$
  981.    Close 1 : MF=PNTER : If SOF=2 Then P_PROMPT_OFF
  982. End Proc
  983. Procedure P_S_PREF_PATH
  984.    M4=Choice(4) : Z$=Mid$(CHECK$,1+(M4-1)*5,4)-" "
  985.    If Exist(Z$)=False Then EF=13 : P_ERROR : Pop Proc
  986.    PREFPATH$=Z$
  987.    P$="Preference Path Set To <"+Z$+">" : P_PROMPT
  988.    P_PROMPT_OFF
  989. End Proc
  990. Procedure P_S_PREF_SAVE
  991.    If Exist(PREFPATH$)=False Then EF=13 : P_ERROR : Pop Proc
  992.    P$="Saving Preferences <"+PREFPATH$+"U-File.Pref>" : P_PROMPT
  993.    Open Out 1,PREFPATH$+"U-File.Pref"
  994.    Print #1,CI
  995.    For L=0 To 3 : Print #1,C(L) : Next L
  996.    Print #1,NAC
  997.    Print #1,QUICKPATH$
  998.    Close 1 : MF=PNTER : P_PROMPT_OFF
  999. End Proc
  1000. Procedure P_S_QUICK
  1001.    A=Free : If AGAIN=False Then M3=Choice(3)
  1002.    On M3 Proc P_S_QUICK_CLR,P_S_QUICK_PATH
  1003. End Proc
  1004. Procedure P_S_QUICK_CLR
  1005.    A=Free : If AGAIN=False Then M4=Choice(4)
  1006.    If M4=5 Then Pop Proc
  1007.    If M4=6 Then P_S_QUICK_CLR_ALL : Pop Proc
  1008. '
  1009.    Z$=QUICKPATH$+"U-File"+Str$(M4-1)-" "
  1010.    P$="Deleting Quick Disk File <"+Z$+">" : P_PROMPT
  1011.    ZF$=Z$+".Name" : If Exist(ZF$) Then Kill ZF$
  1012.    ZF$=Z$+".Data" : If Exist(ZF$) Then Kill ZF$
  1013.    P_PROMPT_OFF
  1014. End Proc
  1015. Procedure P_S_QUICK_CLR_ALL
  1016.    P$="Deleting All Quick Disk Files" : P_PROMPT
  1017.    For ZL=0 To 3
  1018.       Z$=QUICKPATH$+"U-File"+Str$(ZL)-" "
  1019.       ZF$=Z$+".Name" : If Exist(ZF$) Then Kill ZF$
  1020.       ZF$=Z$+".Data" : If Exist(ZF$) Then Kill ZF$
  1021.    Next ZL : If SOF>1 Then P_PROMPT_OFF
  1022. End Proc
  1023. Procedure P_S_QUICK_PATH
  1024.    M4=Choice(4) : Z$=Mid$(CHECK$,1+(M4-1)*5,4)-" "
  1025.    If Exist(Z$)=False Then EF=13 : P_ERROR : Pop Proc
  1026.    QUICKPATH$=Z$
  1027.    P$="Quick Disk Path Set To <"+Z$+">" : P_PROMPT
  1028.    P_PROMPT_OFF
  1029. End Proc
  1030. Procedure P_OPEN_MENU
  1031.    Pen MCH : Paper MCL : Menu Del : AGAIN=False
  1032. '
  1033.    M=1 : I=1
  1034.    Menu$(M)="(ss0)  Disk I/O  "
  1035.    Menu$(M,I)="(ss0) Append A File   " : Inc I
  1036.    Menu$(M,I)="(ss0) Load M-Block    " : Inc I
  1037.    Menu$(M,I)="(ss0) Load New File   " : Inc I
  1038.    Menu$(M,I)="(ss0) Merge  A File   " : Inc I
  1039.    Menu$(M,I)="(ss0) Quick Load" : U=1
  1040.    Menu$(M,I,U)="(ss0) U-File0 " : Inc U
  1041.    If LOCK
  1042.       Menu$(M,I,U)="(ss4) U-File1" : Menu Inactive(M,I,U) : Inc U
  1043.       Menu$(M,I,U)=" U-File2" : Menu Inactive(M,I,U) : Inc U
  1044.       Menu$(M,I,U)=" U-File3" : Menu Inactive(M,I,U)
  1045.    Else 
  1046.       Menu$(M,I,U)="(ss0) U-File1 " : Inc U
  1047.       Menu$(M,I,U)=" U-File2 " : Inc U
  1048.       Menu$(M,I,U)=" U-File3 "
  1049.    End If : Inc I
  1050.    Menu$(M,I)="(ss0) Quick Save" : U=1
  1051.    Menu$(M,I,U)="(ss0) U-File0 " : Inc U
  1052.    If LOCK
  1053.       Menu$(M,I,U)="(ss4) U-File1" : Menu Inactive(M,I,U) : Inc U
  1054.       Menu$(M,I,U)=" U-File2" : Menu Inactive(M,I,U) : Inc U
  1055.       Menu$(M,I,U)=" U-File3" : Menu Inactive(M,I,U)
  1056.    Else 
  1057.       Menu$(M,I,U)="(ss0) U-File1 " : Inc U
  1058.       Menu$(M,I,U)=" U-File2 " : Inc U
  1059.       Menu$(M,I,U)=" U-File3 "
  1060.    End If : Inc I
  1061.    If LOCK
  1062.       Menu$(M,I)="(ss4) Save This File" : Menu Inactive(M,I) : Inc I
  1063.       Menu$(M,I)=" Save File As.." : Menu Inactive(M,I) : Inc I
  1064.       Menu$(M,I)=" Save HiLi As.." : Menu Inactive(M,I) : Inc I
  1065.       Menu$(M,I)=" Save M-Block.." : Menu Inactive(M,I) : Inc I
  1066.    Else 
  1067.       Menu$(M,I)=" Save This File  " : Inc I
  1068.       Menu$(M,I)=" Save File As..  " : Inc I
  1069.       Menu$(M,I)=" Save HiLi As..  " : Inc I
  1070.       Menu$(M,I)=" Save M-Block..  " : Inc I
  1071.    End If 
  1072.    Menu$(M,I)="(ss0) Make Directory  " : Inc I
  1073.    Menu$(M,I)="(ss0) Delete A File   " : Inc I
  1074.    Menu$(M,I)="(ss0)-----------------" : Inc I
  1075.    Menu$(M,I)="(ss0) Quit U-File     " : Inc I
  1076. '
  1077.    M=2 : I=1
  1078.    Menu$(M)="(ss0)  Mem-Blocks  "
  1079.    Menu$(M,I)=" All Bites HiLi  " : Inc I
  1080.    Menu$(M,I)=" HiLi Start---]  " : Inc I
  1081.    Menu$(M,I)=" HiLi [-----End  " : Inc I
  1082.    Menu$(M,I)=" HiLi Off        " : Inc I
  1083.    Menu$(M,I)=" Fill HiLi" : V=1
  1084.    Menu$(M,I,V)=" Byte = $00    " : Inc V
  1085.    Menu$(M,I,V)=" Byte = $FF    " : Inc V
  1086.    Menu$(M,I,V)=" Input Values? " : Inc V
  1087.    Menu$(M,I,V)=" From M-Block  " : Inc V
  1088.    Menu$(M,I,V)=" From Search$  " : Inc I
  1089.    Menu$(M,I)=" Append M-Block  " : Inc I
  1090.    Menu$(M,I)=" Cut    M-Block  " : Inc I
  1091.    Menu$(M,I)=" Input  M-Block? " : Inc I
  1092.    Menu$(M,I)=" Insert M-Block  " : Inc I
  1093.    Menu$(M,I)=" Paste  M-Block  " : Inc I
  1094.    Menu$(M,I)=" Store  M-Block  " : Inc I
  1095.    Menu$(M,I)="-----------------" : Inc I
  1096.    Menu$(M,I)=" Zap!   M-Block  " : Inc I
  1097. '
  1098.    M=3 : I=1
  1099.    Menu$(M)="(ss0)  Search For  "
  1100.    Menu$(M,I)=" Current Seq.  " : Inc I
  1101.    Menu$(M,I)=" HiLi Block    " : Inc I
  1102.    Menu$(M,I)=" M-Block Seq.  " : Inc I
  1103.    Menu$(M,I)=" Preset AMOS" : U=1
  1104.    ZL=Len(PSAMOS$) : ZN=ZL/5 : ZP=1
  1105.    For Z=1 To ZN
  1106.       Z$=Mid$(PSAMOS$,ZP,4) : ZP=ZP+5 : Z$=" "+Z$+" "
  1107.       Menu$(M,I,U)=Z$ : Inc U
  1108.    Next Z : Inc I
  1109.    Menu$(M,I)=" Preset Devs" : U=1
  1110.    ZL=Len(PSDEV$) : ZN=ZL/6 : ZP=1
  1111.    For Z=1 To ZN
  1112.       Z$=Mid$(PSDEV$,ZP,6) : ZP=ZP+6 : Z$=" "+Z$
  1113.       Menu$(M,I,U)=Z$ : Inc U
  1114.    Next Z : Inc I
  1115.    Menu$(M,I)=" Preset  IFF" : U=1
  1116.    ZL=Len(PSIFF$) : ZN=ZL/5 : ZP=1
  1117.    For Z=1 To ZN
  1118.       Z$=Mid$(PSIFF$,ZP,4) : ZP=ZP+5 : Z$=" "+Z$+" "
  1119.       Menu$(M,I,U)=Z$ : Inc U
  1120.    Next Z : Inc I
  1121.    Menu$(M,I)=" Set Case" : U=1
  1122.    Menu$(M,I,U)=" IgNoRe CaSe " : Inc U
  1123.    Menu$(M,I,U)=" lower  case " : Inc U
  1124.    Menu$(M,I,U)=" UPPER  CASE " : Inc I
  1125.    Menu$(M,I)=" Text String?  " : Inc I
  1126. '
  1127.    M=4 : I=1
  1128.    Menu$(M)="(ss0)  Set-Up  "
  1129.    Menu$(M,I)=" File Length  " : Inc I
  1130.    Menu$(M,I)=" non-ASCII" : U=1
  1131.    Menu$(M,I,U)=" Blank { } " : Inc U
  1132.    Menu$(M,I,U)=" Block {"+Chr$(127)+"} " : Inc U
  1133.    Menu$(M,I,U)=" Dot   {.} " : Inc U
  1134.    Menu$(M,I,U)=" Hash  {#} " : Inc U
  1135.    Menu$(M,I,U)=" Undl  {_} " : Inc I
  1136.    Menu$(M,I)=" Preferences" : U=1
  1137.    Menu$(M,I,U)=" Load Settings " : Inc U
  1138.    Menu$(M,I,U)=" Save Settings " : Inc U
  1139.    Menu$(M,I,U)=" Path.." : A=1
  1140.    ZL=Len(CHECK$) : ZN=ZL/5 : ZP=1
  1141.    For Z=1 To ZN
  1142.       Z$=Mid$(CHECK$,ZP,4) : ZP=ZP+5 : Z$=" "+Z$+" "
  1143.       Menu$(M,I,U,A)=Z$ : Inc A
  1144.    Next Z : Inc I
  1145.    Menu$(M,I)=" Quick Disk" : U=1
  1146.    Menu$(M,I,U)=" Clear" : A=1
  1147.    Menu$(M,I,U,A)=" U-File0   " : Inc A
  1148.    Menu$(M,I,U,A)=" U-File1   " : Inc A
  1149.    Menu$(M,I,U,A)=" U-File2   " : Inc A
  1150.    Menu$(M,I,U,A)=" U-File3   " : Inc A
  1151.    Menu$(M,I,U,A)="-----------" : Inc A
  1152.    Menu$(M,I,U,A)=" All Files " : Inc U
  1153.    Menu$(M,I,U)=" Path" : A=1
  1154.    ZL=Len(CHECK$) : ZN=ZL/5 : ZP=1
  1155.    For Z=1 To ZN
  1156.       Z$=Mid$(CHECK$,ZP,4) : ZP=ZP+5 : Z$=" "+Z$+" "
  1157.       Menu$(M,I,U,A)=Z$ : Inc A
  1158.    Next Z : Inc I
  1159.    Menu$(M,I)=" Toggle X,Y   " : Inc I
  1160.    Menu$(M,I)="--------------" : Inc I
  1161.    Menu$(M,I)=" Reset U-File " : Inc I
  1162. '
  1163.    M=5 : I=1
  1164.    Menu$(M)="(ss4)  CTRL Key Help  "
  1165.    Menu$(M,I)="                " : Inc I
  1166.    Menu$(M,I)=" Again Menu  ^A  " : Inc I
  1167.    Menu$(M,I)=" First Byte  ^F  " : Inc I
  1168.    Menu$(M,I)=" Help Page   ^H  " : Inc I
  1169.    Menu$(M,I)=" Last Byte   ^L  " : Inc I
  1170.    Menu$(M,I)=" Next Search ^N  " : Inc I
  1171.    Menu$(M,I)=" Undo Last   ^U  " : Inc I
  1172. '
  1173.    Menu On : MENFLG=True
  1174. End Proc
  1175. '
  1176. ' ***** Procedures ***** 
  1177. '
  1178. Procedure P_ABORT
  1179.    Q$="Exit U-File?" : P_YES_NO
  1180.    If Q$="Y"
  1181.       P_EXIT
  1182.    Else 
  1183.       PD=0 : P_PROMPT_OFF
  1184.    End If 
  1185. End Proc
  1186. Procedure P_ABOUT_U_FILE
  1187.    If MENFLG=True Then Menu Off 
  1188.    Limit Mouse 209,87 To 360,212 : X Mouse=344 : Y Mouse=188 : Show On 
  1189.    If SOF=2 Then P_CLEAR_LIST : Unpack ABOUTBANK
  1190.    If LOCK=True Then Paste Bob 260,119,21
  1191.    P_MOUSE_UP
  1192.    While Mouse Key=0
  1193.       P_SCREEN_XY
  1194.    Wend : If SOF=2 Then Hide On : PX=280 : PY=160 : PD=0 : P_PROMPT_OFF
  1195.    SOF=2 : X Mouse=280 : Y Mouse=160 : P_LIMIT_OFF : P_MOUSE_UP
  1196.    If MENFLG=True Then Menu On 
  1197. End Proc
  1198. Procedure P_AGAIN
  1199.    AGAIN=True
  1200.    On M1 Proc P_DISK,P_BLOCK,P_FIND,P_SETUP
  1201.    P_MOUSE_UP
  1202. End Proc
  1203. Procedure P_ANIM_OFF
  1204.    Anim Off : Wait Vbl : AF=0
  1205. End Proc
  1206. Procedure P_ANIM_ON
  1207.    P_BOB_OFF : Bob 1,0,300,1 : Bob 2,0,300,5
  1208.    Channel 1 To Bob 1 : Channel 2 To Bob 2
  1209.    Amal 1,"A 0,(1,4)(2,4)(3,4)(4,4)" : Amal 2,"A 0,(5,4)(6,4)(7,4)(8,4)"
  1210.    Amal On 1 : Amal On 2 : AF=1
  1211. End Proc
  1212. Procedure P_BAR_POSITION
  1213.    MCX=594 : MCY=184 : P_MOUSE_LOCK : P_CLOCK_ON
  1214.    B=256*(1+((BL-1)/256))
  1215.    Y0=26 : Y1=171 : YL=Y1-Y0+1 : Y=SY-Y0 : BP=256*(((Y*B)/YL)/256)
  1216.    E=0 : PB=1+(BP/256) : CB=BP+CX+(CY*16) : If CB>BL-1 Then CB=BL-1 : E=1
  1217.    If E=1 Then CY=(BL-BP)/16 : CX=BL-BP-(CY*16)-1 : CF=0 : If CX<0 Then CX=15 : CY=CY-1
  1218.    P_STATUS : P_SCROLL_BAR
  1219.    CLF=1 : P_WRITE_LINES : P_CLOCK_OFF : P_LIMIT_OFF
  1220. End Proc
  1221. Procedure P_BELL
  1222.    Play 61,8 : Play 61,0
  1223. End Proc
  1224. Procedure P_BLOCK_NEXT
  1225.    If BP>=BL-256 Then Bell : Wait 20 : Pop Proc
  1226.    A=BP+256 : If A<BE Then BP=A Else Pop Proc
  1227.    E=0 : PB=1+(BP/256) : CB=BP+CX+(CY*16) : If CB>BL-1 Then CB=BL-1 : E=1
  1228.    If E=1 Then CY=(BL-BP)/16 : CX=BL-BP-(CY*16)-1 : CF=0 : If CX<0 Then CX=15 : CY=CY-1
  1229.    P_STATUS
  1230.    MCX=594 : MCY=184 : P_MOUSE_LOCK : P_CLOCK_ON : P_SCROLL_BAR
  1231.    CLF=1 : P_WRITE_LINES
  1232.    P_CLOCK_OFF: P_LIMIT_OFF
  1233. End Proc
  1234. Procedure P_BLOCK_PREVIOUS
  1235.    If BP<1 Then Bell : Wait 20 : Pop Proc
  1236.    BP=BP-256 : If BP<0 Then BP=0
  1237.    PB=1+(BP/256) : P_STATUS
  1238.    MCX=594 : MCY=184 : P_MOUSE_LOCK : P_CLOCK_ON : P_SCROLL_BAR
  1239.    CLF=1 : P_WRITE_LINES
  1240.    P_CLOCK_OFF: P_LIMIT_OFF
  1241. End Proc
  1242. Procedure P_BRIGHT_ADJUST
  1243.    PX=X Mouse : PY=Y Mouse : MCX=76 : MCY=199 : Hide On : P_CLOCK_ON
  1244. L_J0:
  1245.    CI=((SX-16)*15)/84 : CI=Max(CI,4) : CI=Min(CI,15)
  1246.    P_BRIGHT_SET
  1247.    P_SCREEN_XY
  1248.    If Mouse Key<>0 Then Goto L_J0
  1249.    Wait Vbl : P_CLOCK_OFF : X Mouse=PX : Y Mouse=PY : Show On 
  1250. End Proc
  1251. Procedure P_BRIGHT_COL
  1252. ' Set screen colours to brightness 
  1253.    ZC0=C(0) : ZC1=C(1) : ZC2=C(2) : ZC3=C(3)
  1254.    Z0=((ZC0 and 15)*CI)/15 : Z1=(((ZC0/16) and 15)*CI)/15 : Z2=(((ZC0/256) and 15)*CI)/15
  1255.    Colour 0,Z0+(Z1*16)+(Z2*256)
  1256.    Z0=((ZC1 and 15)*CI)/15 : Z1=(((ZC1/16) and 15)*CI)/15 : Z2=(((ZC1/256) and 15)*CI)/15
  1257.    Colour 1,Z0+(Z1*16)+(Z2*256)
  1258.    Z0=((ZC2 and 15)*CI)/15 : Z1=(((ZC2/16) and 15)*CI)/15 : Z2=(((ZC2/256) and 15)*CI)/15
  1259.    Colour 2,Z0+(Z1*16)+(Z2*256)
  1260.    Z0=((ZC3 and 15)*CI)/15 : Z1=(((ZC3/16) and 15)*CI)/15 : Z2=(((ZC3/256) and 15)*CI)/15
  1261.    Colour 3,Z0+(Z1*16)+(Z2*256) : P_COLOUR_BACK
  1262. End Proc
  1263. Procedure P_BRIGHT_SET
  1264. ' Set screen colours to brightness 
  1265.    P_BRIGHT_COL
  1266. '
  1267. ' Set Mouse colours
  1268.    If CI<15
  1269.       Colour MC1,C(1) : Colour MC2,C(2) : Colour MC3,C(3)
  1270.    Else 
  1271.       ZC=C(1) : Z0=(((ZC and 15)+1) and 15) : Z1=((((ZC/16) and 15)+1) and 15) : Z2=((((ZC/256) and 15)+1) and 15) : Colour MC1,Z0+(Z1*16)+(Z2*256)
  1272.       ZC=C(2) : Z0=(((ZC and 15)+1) and 15) : Z1=((((ZC/16) and 15)+1) and 15) : Z2=((((ZC/256) and 15)+1) and 15) : Colour MC2,Z0+(Z1*16)+(Z2*256)
  1273.       ZC=C(3) : Z0=(((ZC and 15)+1) and 15) : Z1=((((ZC/16) and 15)+1) and 15) : Z2=((((ZC/256) and 15)+1) and 15) : Colour MC3,Z0+(Z1*16)+(Z2*256)
  1274.    End If 
  1275. '  
  1276. ' Set Menu colours 
  1277.    ZB=0 : MCH=1 : ZD=45 : MCL=0
  1278.    ZC=C(0) : Z0=(ZC and 15) : Z1=((ZC/16) and 15) : Z2=((ZC/256) and 15)
  1279.    ZC=Z0+Z1+Z2 : If ZC>ZB Then ZB=ZC : MCH=0
  1280.    If ZC<ZD Then ZD=ZC : MCL=0
  1281.    ZC=C(1) : Z0=(ZC and 15) : Z1=((ZC/16) and 15) : Z2=((ZC/256) and 15)
  1282.    ZC=Z0+Z1+Z2 : If ZC>ZB Then ZB=ZC : MCH=1
  1283.    If ZC<ZD Then ZD=ZC : MCL=1
  1284.    ZC=C(2) : Z0=(ZC and 15) : Z1=((ZC/16) and 15) : Z2=((ZC/256) and 15)
  1285.    ZC=Z0+Z1+Z2 : If ZC>ZB Then ZB=ZC : MCH=2
  1286.    If ZC<ZD Then ZD=ZC : MCL=2
  1287.    ZC=C(3) : Z0=(ZC and 15) : Z1=((ZC/16) and 15) : Z2=((ZC/256) and 15)
  1288.    ZC=Z0+Z1+Z2 : If ZC>ZB Then ZB=ZC : MCH=3
  1289.    If ZC<ZD Then ZD=ZC : MCL=3
  1290. End Proc
  1291. Procedure P_BOB_OFF
  1292.    Bob Off : Wait Vbl : AF=0
  1293. End Proc
  1294. Procedure P_CLOCK_OFF
  1295.    Bob Off 3 : Wait Vbl 
  1296. End Proc
  1297. Procedure P_CLOCK_ON
  1298.    P_BOB_OFF : Wait Vbl : Bob 3,MCX,MCY,13 : Channel 3 To Bob 3
  1299.    Amal 3,"A 0,(10,8)(11,8)(12,8)(13,8)(14,8)(15,8)(16,8)(17,8)"
  1300.    Amal On 3
  1301. End Proc
  1302. Procedure P_CLOSE_SCREENS
  1303.    While Screen>-1 : Screen Close Screen : Wend 
  1304.    Bob Off : Close Editor : Hide On : Wait Vbl 
  1305. End Proc
  1306. Procedure P_COLOUR_ADJUST
  1307.    ZDF=DF : If DF=1 Then P_DISP_OFF
  1308.    Menu Off : Change Mouse PNTER : P_CLEAR_LIST
  1309.    MCX=30 : MCY=199 : P_CLOCK_ON
  1310.    ZX=206 : ZY=61 : Paste Bob ZX,ZY,9 : Limit Mouse 235,112 To 325,180
  1311.    ZC0=C(0) : ZC1=C(1) : ZC2=C(2) : ZC3=C(3)
  1312.    ZC=0 : Z=1 : ZX0=267 : Reserve Zone 4
  1313.    Set Zone 1,222,67 To 388,79 : Set Zone 2,262,83 To 386,109
  1314.    Set Zone 3,296,113 To 322,125 : Set Zone 4,328,113 To 386,125
  1315. '
  1316. L_J0:
  1317.    ZP=ZC+1 : If ZP>3 Then ZP=0
  1318.    Ink ZC : Bar 223,114 To 290,124
  1319. L_J1:
  1320.    ZH=C(ZC) : Z0=(ZH and 15) : Z1=((ZH/16) and 15) : Z2=((ZH/256) and 15)
  1321.    Ink ZP,ZC : ZV$=Hex$(ZH,3)-" "-"$" : Text 244,122,ZV$
  1322.    Ink BLACK : Bar ZX0,84 To 386,88 : Bar ZX0,94 To 386,98 : Bar ZX0,104 To 386,108 : Ink RED
  1323.    If Z2>0 Then ZX1=ZX0+(Z2*8) : Bar ZX0,84 To ZX1,88
  1324.    If Z1>0 Then ZX1=ZX0+(Z1*8) : Bar ZX0,94 To ZX1,98
  1325.    If Z0>0 Then ZX1=ZX0+(Z0*8) : Bar ZX0,104 To ZX1,108
  1326.    Wait Vbl : If Z=1 Then P_MOUSE_UP
  1327.    P_SCREEN_XY
  1328. '
  1329. L_J2:
  1330.    While Mouse Key=0
  1331.       P_SCREEN_XY
  1332.    Wend : Z=Mouse Zone : If Z=0 Then Goto L_J2
  1333.    If Z=2 Then Goto L_ADJUST
  1334.    If Z=3 Then Goto L_EXIT
  1335.    If Z=4 Then Goto L_CANCEL
  1336. '
  1337. L_COL_SELECT:
  1338.    ZC=(SX-222)/42 : Goto L_J0
  1339. '
  1340. L_ADJUST:
  1341.    ZY=(SY-82)/10 : ZV=(SX-260)/8 : ZV=Min(ZV,15) : ZV=Max(ZV,0)
  1342.    If ZY=0 Then Z2=ZV
  1343.    If ZY=1 Then Z1=ZV
  1344.    If ZY=2 Then Z0=ZV
  1345.    ZV=Z0+(Z1*16)+(Z2*256) : C(ZC)=ZV : P_BRIGHT_SET
  1346.    Goto L_J1
  1347. '
  1348. L_CANCEL:
  1349.    C(0)=ZC0 : C(1)=ZC1 : C(2)=ZC2 : C(3)=ZC3 : P_BRIGHT_SET
  1350. '
  1351. L_EXIT:
  1352.    Hide On : P_OPEN_MENU
  1353.    If BF=1
  1354.       CLF=1 : P_WRITE_LINES
  1355.    Else 
  1356.       P_CLEAR_LIST
  1357.       P_OPEN_STATEMENT
  1358.    End If : Reserve Zone : If ZDF=1 Then P_DISP_ON
  1359.    P_LIMIT_OFF : P_CLOCK_OFF : Show On : If ZDF=0 Then Menu On 
  1360. End Proc
  1361. Procedure P_COLOUR_BACK
  1362.    ZC=Colour(0) : Colour Back ZC
  1363.    If DF=0
  1364.       Screen To Front EDSCRN
  1365.    Else 
  1366.       Screen DISPSCRN : Get Palette EDSCRN
  1367.       Screen To Front DISPSCRN : Screen EDSCRN
  1368.    End If 
  1369. End Proc
  1370. Procedure P_DEFAULTS
  1371.    ABOUTBANK=6
  1372.    AF=0 : AGAIN=False
  1373.    BF=0 : BL=0 : BLACK=0 : BLOCKE=-1 : BLOCKF=0 : BLOCKS=-1 : BLUE=2
  1374.    CB=0 : CF=0 : CI=15 : CLF=0 : CLOCK=3 : CROSS=2 : CX=-20 : CY=-20
  1375.    CHECK$="C:   DF0: DF1: HD0: HD1: L:   RAM: S:   SYS: "
  1376.    DISPSCRN=2 : DF=0 : EDSCRN=0 : FFLG=0 : FILEBANK=2 : F$=""
  1377.    HF$="" : HICOL=3 : HM=0 : HP=0 : IBF=0 : INSERT=23 : K$=""
  1378.    MCH=1 : MCL=0 : MC1=17 : MC2=18 : MC3=19 : MDOKE=25 : MENFLG=0
  1379.    MLOKE=26 : MF=1 : MPOKE=24 : MSB=1 : NAC=46 : OCF=2
  1380.    PASTE=22 : PBF=0 : PD=100 : PF=0 : PICK=21 : PM=0 : PNTER=1
  1381.    PREFPATH$="DF1:"
  1382.    PSAMOS$="Amal AmBk AmBs AmIc AmSp Chip Pac. Musi Samp Work "
  1383.    PSDEV$="C:    CON:  DEVS: DF0:  DF1:  DF2:  DF3:  HD0:  HD1:  JH0:  JH1:  L:    LIBS: NIL:  PAR:  PRT:  RAM:  S:    SER:  SYS:  "
  1384.    PSIFF$="AMSC BMHD BODY CAMG CAT  CCRT CMAP CRNG DEST FORM FTXT GRAB ILBM LIST PICS PICT PROP SPRT TEXT "
  1385.    QUICKPATH$="RAM:" : RED=3 : SBANK=4 : SCRNBANK=3 : SHAPEBANK=1
  1386.    TEMPBANK=5 : TEMPSCRN=1 : TL=7 : WHITE=1 : Clear Key 
  1387. End Proc
  1388. Procedure P_DISP_OFF
  1389.    DF=0 : Screen Hide DISPSCRN : Screen EDSCRN : P_MOUSE_UP : Menu On 
  1390. End Proc
  1391. Procedure P_DISP_ON
  1392.    Screen DISPSCRN : Get Palette EDSCRN : Ink BLACK : Bar 4,2 To 634,29
  1393.    Z$=" Char.  Dec.  Hex.   Bin.      Word___Dec.     L-Word___________L-Dec."
  1394.    Ink RED,BLACK : Text 4,12,Z$ : Menu Off : DF=1 : P_DISP_Y : P_DISP_VAL
  1395.    Screen Show DISPSCRN : Screen To Front DISPSCRN : Screen EDSCRN
  1396.    P_MOUSE_UP
  1397. End Proc
  1398. Procedure P_ERROR
  1399.    If MENFLG=True Then Menu Off 
  1400.    ZX=X Mouse : ZY=Y Mouse : Limit Mouse 278,196 To 278,196 : Show On 
  1401.    A=-1 : Restore L_DATA : Change Mouse PNTER
  1402.    While EF<>A : Read A,E$ : Wend 
  1403.    P_CLEAR_LIST
  1404.    Z$="    " : Pen WHITE : Locate 0,10 : Centre "- ERROR! -"+Z$
  1405.    Locate 0,12 : Centre E$+Z$
  1406.    Locate 0,16 : Centre "[ CLICK ]"+Z$
  1407.    P_BELL
  1408.    P_MOUSE_UP
  1409.    P_MOUSE_DOWN
  1410.    P_MOUSE_UP : Hide On : MCX=300 : MCY=150 : P_CLOCK_ON
  1411.    If BF=1
  1412.       CLF=1 : P_WRITE_LINES
  1413.    Else 
  1414.       P_CLEAR_LIST
  1415.       P_OPEN_STATEMENT
  1416.    End If : P_CLOCK_OFF : P_LIMIT_OFF
  1417.    X Mouse=ZX : Y Mouse=ZY : Show On : If MENFLG=True Then Menu On 
  1418. L_DATA:
  1419.    Data 1,"No File Has Been Loaded Into Memory"
  1420.    Data 2,"QUICK DISK Device Not Available"
  1421.    Data 3,"File Not Found On QUICK DISK Device"
  1422.    Data 4,"A HiLi Block Has Not Been Defined"
  1423.    Data 5,"You Can't Cut The Whole File"
  1424.    Data 6,"Can't Find Preferences <"+D$+"FileEd.Pref>"
  1425.    Data 7,"File Not Found In Current Path"
  1426.    Data 8,"Disk I/O Error"
  1427.    Data 9,"A HiLi Block Has Not Been Stored As An M-Block"
  1428.    Data 10,"Could Not Evaluate Numbers"
  1429.    Data 11,"Can't Undo Past First 'DO' Record."
  1430.    Data 12,"A Search String Has Not Been Defined."
  1431.    Data 13,"Device Does Not Exist."
  1432. End Proc
  1433. Procedure P_FADE_OUT
  1434.    If MENFLG=True Then Menu Off 
  1435.    OCI=CI : PX=X Mouse : PY=Y Mouse : Hide On : FFLG=True
  1436.    For CI=CI To 0 Step -1
  1437.       P_BRIGHT_COL : Wait 2
  1438.    Next CI : Screen Hide EDSCRN : X Mouse=280 : Y Mouse=170 : Show On : Wait Vbl 
  1439. End Proc
  1440. Procedure P_FADE_IN
  1441.    If FFLG=False Then Pop Proc
  1442.    Hide On : Screen Show EDSCRN
  1443.    For CI=0 To OCI
  1444.       P_BRIGHT_COL : Wait 2
  1445.    Next CI : X Mouse=PX : Y Mouse=PY : Show On : Wait Vbl : FFLG=False
  1446. End Proc
  1447. Procedure P_FILE_SPEC
  1448. ' Change the current file pathname. The existing pathname is pushed  
  1449. ' into the keyboard buffer before asking the question. 
  1450. '
  1451.    P_CLEAR_LIST
  1452.    PX=X Mouse : PY=Y Mouse : Put Key HF$ : Z$="    " : ZX=0 : ZY=10
  1453.    Restore L_DATA : Read ZA$
  1454.    While ZA$<>""
  1455.       Locate ZX,ZY : Centre ZA$+Z$ : Inc ZY : Read ZA$
  1456.    Wend 
  1457.    Q$=F$ : P_QUESTION
  1458.    If Q$="" Then P_PROMPT_OFF : P_LIMIT_OFF : Pop Proc
  1459.    F$=Q$ : P_PROMPT_OFF
  1460.    P_STATUS
  1461. L_DATA:
  1462.    Data "Change File Specification"
  1463.    Data " "
  1464.    Data "Enter The Full Pathname For This File;    "
  1465.    Data ""
  1466. End Proc
  1467. Procedure P_FIRST
  1468.    PX=X Mouse : PY=Y Mouse : MCX=176 : MCY=199 : Hide On : P_CLOCK_ON
  1469.    If BLOCKF>0 and CB>BLOCKS and BLOCKS>=0
  1470.       CB=BLOCKS : P_BLOCK_CB
  1471.    Else 
  1472.       PB=1 : BP=0 : CX=0 : CY=0 : CB=0
  1473.    End If : If DF>0 Then P_DISP_VAL
  1474.    CF=0 : P_SCROLL_BAR : PD=0 : P_PROMPT_OFF : P_MOUSE_UP
  1475. End Proc
  1476. Procedure P_GET_NUMBERS
  1477. ' This routine converts NUM$ to upper case and then does a search
  1478. ' through it for various input data types. 
  1479. '
  1480.    NUM=0 : NUM$=Upper$(NUM$) : If Len(NUM$)=Len(NUM$-",") Then Goto L_LAST
  1481. L_J0:
  1482.    ZP=Instr(NUM$,",") : If ZP=0 Then Goto L_LAST
  1483.    ZL$=Left$(NUM$,ZP-1) : ZL=Len(NUM$) : If ZP=ZL Then NUM$=ZL$ : Goto L_LAST
  1484.    NUM$=Right$(NUM$,ZL-ZP) : Gosub L_EVAL
  1485.    Goto L_J0
  1486. '
  1487. L_LAST:
  1488.    ZL$=NUM$ : Gosub L_EVAL
  1489.    Goto L_EXIT
  1490. '
  1491. L_EVAL:
  1492.    ZN=1 : If Left$(ZL$,1)="W" Then ZN=2 : ZL$=ZL$-"W"
  1493.    If Left$(ZL$,1)="L" Then ZN=4 : ZL$=ZL$-"L"
  1494.    ZV=Val(ZL$) : If ZN=1 Then Inc NUM : NUM(NUM)=ZV : Return 
  1495.    If ZN=2 Then ZL=(ZV and 255) : ZU=((ZV/256) and 255) : NUM(NUM+1)=ZU : NUM(NUM+2)=ZL : NUM=NUM+ZN : Return 
  1496.    If ZN=4 and ZV>0 Then Z3=(ZV and 255) : Z2=((ZV/256) and 255) : Z1=((ZV/65536) and 255) : Z0=((ZV/16777216) and 255) : NUM(NUM+1)=Z0 : NUM(NUM+2)=Z1 : NUM(NUM+3)=Z2 : NUM(NUM+4)=Z3 : NUM=NUM+ZN : Return 
  1497.    If ZN=4 and ZV<0 Then ZL$=Hex$(ZV,8)-"$" : NUM(NUM+4)=Val("$"+Right$(ZL$,2)) : NUM(NUM+3)=Val("$"+Mid$(ZL$,5,2)) : NUM(NUM+2)=Val("$"+Mid$(ZL$,3,2)) : NUM(NUM+1)=Val("$"+Left$(ZL$,2)) : NUM=NUM+ZN : Return 
  1498.    Bell : Return 
  1499. L_EXIT:
  1500. End Proc
  1501. Procedure P_HELP
  1502.    P_CLEAR_LIST
  1503.    X Mouse=275 : Y Mouse=212 : PX=X Mouse : PY=Y Mouse : P_MOUSE_LOCK
  1504.    Z$="    " : ZX=0 : ZY=4 : Restore L_DATA : Read ZI,ZA$
  1505.    While ZA$<>""
  1506.       Locate ZX,ZY : Pen ZI : Centre ZA$+Z$ : Inc ZY : Read ZI,ZA$
  1507.    Wend : Ink WHITE : P_MOUSE_UP
  1508. L_EXIT:
  1509.    P_MOUSE_DOWN : Hide On : P_PROMPT_OFF : P_MOUSE_UP
  1510. L_DATA:
  1511.    Data 1,"U-File Help"
  1512.    Data 1," "
  1513.    Data 3,"To get the most from this program you should follow the Tutorial"
  1514.    Data 3,"provided on the source disk. Control key functions are displayed"
  1515.    Data 3,"in the  right most column of the menu.  Non-Amos users should be"
  1516.    Data 3,"aware that if you invoke the Workbench gadget,  then to get back"
  1517.    Data 3,"to  U-File you  must press  both the 'AMIGA' and 'A' keys at the"
  1518.    Data 3,"same time.                                                      "
  1519.    Data 1," "
  1520.    Data 1," "
  1521.    Data 1,"REMEMBER!"
  1522.    Data 1," "
  1523.    Data 3,"Always use a back-up copy of the file you are modifying to avoid"
  1524.    Data 3,"any unnecessary corruption to valued disk programs.             "
  1525.    Data 1," "
  1526.    Data 3,"[ Click ]"
  1527.    Data 1,""
  1528. End Proc
  1529. Procedure P_INSERT
  1530.    IBF=0 : ZLS=MBL : If ZLS=0 Then EF=9 : P_ERROR : Pop Proc
  1531.    PX=X Mouse : PY=Y Mouse : Hide On : MCX=268 : MCY=100 : P_CLOCK_ON
  1532.    ZLT=ZLS+BL : Reserve As Work TEMPBANK,ZLT
  1533.    ZCB=BP+CX+(CY*16) : ZSS=Start(SBANK) : ZTS=Start(TEMPBANK)
  1534.    If ZCB=0
  1535.       ZS=ZSS : ZF=ZS+ZLS-1 : Copy ZS,ZF+1 To ZTS
  1536.       ZS=BS : ZF=ZS+BL-1 : ZT=ZTS+ZLS : Copy ZS,ZF+1 To ZT
  1537.    End If 
  1538.    If ZCB>0
  1539.       ZS=BS : ZF=BS+ZCB-1 : Copy ZS,ZF+1 To ZTS
  1540.       ZS=ZSS : ZF=ZS+ZLS-1 : ZT=ZTS+ZCB : Copy ZS,ZF+1 To ZT
  1541.       ZS=BS+ZCB : ZF=BS+BL-1 : ZT=ZTS+ZLS+ZCB : Copy ZS,ZF+1 To ZT
  1542.    End If 
  1543.    Swap FILEBANK,TEMPBANK : Erase TEMPBANK : BS=Start(FILEBANK)
  1544.    BL=ZLT : BE=BS+BL-1 : NB=1+((BL-1)/256) : P_STATUS
  1545.    MF=PNTER : PD=0 : P_PROMPT_OFF : P_CLOCK_OFF
  1546. End Proc
  1547. Procedure P_LAST
  1548.    PX=X Mouse : PY=Y Mouse : MCX=272 : MCY=199 : Hide On : P_CLOCK_ON
  1549.    If BLOCKF>0 and CB<BLOCKE and BLOCKE>=0
  1550.       CB=BLOCKE : P_BLOCK_CB
  1551.    Else 
  1552.       CB=BE-BS : P_BLOCK_CB
  1553.    End If : If DF>0 Then P_DISP_VAL
  1554.    CF=0 : P_SCROLL_BAR : PD=0 : P_PROMPT_OFF : P_MOUSE_UP
  1555. End Proc
  1556. Procedure P_LIMIT_OFF
  1557.    Limit Mouse 128,50 To 444,255
  1558. End Proc
  1559. Procedure P_MOUSE_DOWN
  1560.    While Mouse Key=0 : Wend 
  1561. End Proc
  1562. Procedure P_MOUSE_LOCK
  1563. ' Lock the mouse to the current screen position. 
  1564. ' Use before going to Workbench. 
  1565. '
  1566.    ZX=X Mouse : ZY=Y Mouse : Limit Mouse ZX,ZY To ZX,ZY
  1567. End Proc
  1568. Procedure P_MOUSE_UP
  1569.    While Mouse Key<>0 : Wend 
  1570. End Proc
  1571. Procedure P_NEXT
  1572.    If HP>=BE or(HF$="") Then Bell : P_MOUSE_UP : Pop Proc
  1573.    Inc HP : If HM=0 Then P_HUNT : Pop Proc
  1574.    P_HUNT_IGNORE
  1575. End Proc
  1576. Procedure P_NULL
  1577. End Proc
  1578. Procedure P_OPEN_SCREENS
  1579.    PIC$="df0:U-File.IFF" : If Exist(PIC$)=0 Then PIC$="df1:U-File.IFF"
  1580.    If Length(SCRNBANK)>0
  1581.       Unpack SCRNBANK To EDSCRN
  1582.    Else 
  1583.       Load Iff PIC$,EDSCRN : Flash Off : Curs Off 
  1584.       Spack EDSCRN To SCRNBANK
  1585.    End If : Screen Hide EDSCRN : Screen Display EDSCRN,,50,,
  1586.    For L=0 To 3 : C(L)=Colour(L) : Next L
  1587.    Z$="U-File V"+VERSION$ : X=320-(Len(Z$)*4) : Y=12
  1588.    Gr Writing 0 : Ink BLACK : Text X,Y,Z$ : Ink WHITE : Text X-1,Y-1,Z$ : Gr Writing 1
  1589.    Screen Open TEMPSCRN,640,256,2,Hires : Flash Off : Curs Off : Screen Hide TEMPSCRN
  1590.    Screen Open DISPSCRN,640,32,4,Hires : Flash Off : Curs Off : Screen Hide DISPSCRN
  1591.    Screen EDSCRN : Screen Copy EDSCRN,0,200,640,232 To DISPSCRN,0,0
  1592.    Ink BLACK : Bar 0,198 To 639,231
  1593.    If SOF=0
  1594.       Spack EDSCRN To ABOUTBANK,162,37,464,162 : SOF=1
  1595.    Else 
  1596.       DEBUG=0 : P_CLEAR_LIST
  1597.    End If 
  1598.    If Mouse Key=0 Then P_S_PREF_LOAD
  1599.    P_BRIGHT_SET : Screen Show EDSCRN : P_COLOUR_BACK
  1600.    SHAPE$="df0:U-File.abk" : If Exist(SHAPE$)=0 Then SHAPE$="df1:U-File.abk"
  1601.    If Length(SHAPEBANK)=0
  1602.       Load SHAPE$,SHAPEBANK
  1603.    End If 
  1604.    Set Bob 1,0,%111111,%11001010 : Set Bob 2,0,%111111,%11001010 : Make Mask 
  1605. End Proc
  1606. Procedure P_OPEN_STATEMENT
  1607.    A$="Start by loading a file using the MENU.    "
  1608.    Locate 0,12 : Pen WHITE : Paper BLACK : Centre A$
  1609. End Proc
  1610. Procedure P_PASTE
  1611.    PBF=0 : ZL=MBL : If ZL=0 Then EF=9 : P_ERROR : Pop Proc
  1612.    ZCB=BP+CX+(CY*16) : If(BL-ZCB+1)<ZL Then ZL=BL-ZCB+1 : Bell : If ZL<1 Then Pop Proc
  1613.    PX=X Mouse : PY=Y Mouse : Hide On : MCX=268 : MCY=100 : P_CLOCK_ON
  1614.    ZS=Start(SBANK) : ZF=ZS+ZL-1 : ZT=BS+ZCB : Copy ZS,ZF+1 To ZT
  1615.    MF=PNTER : PD=0 : P_PROMPT_OFF : P_CLOCK_OFF
  1616. End Proc
  1617. Procedure P_PROMPT
  1618.    If SOF=0 Then Pop Proc
  1619.    PX=X Mouse : PY=Y Mouse : Hide On : P_CLEAR_LIST
  1620.    Pen WHITE : Paper BLACK : Ink WHITE,BLACK : Locate 0,12 : Centre P$+"    " : Timer=0
  1621.    MCX=300 : MCY=120 : P_CLOCK_ON : If FFLG=True Then P_FADE_IN
  1622. End Proc
  1623. Procedure P_PROMPT_OFF
  1624.    If SOF=0 Then Pop Proc
  1625.    While Timer<PD : Wend : PD=50
  1626.    If BF=1
  1627.       CLF=1 : P_WRITE_LINES
  1628.    Else 
  1629.       P_CLEAR_LIST
  1630.       P_OPEN_STATEMENT
  1631.    End If : P_STATUS
  1632.    Change Mouse MF : P_LIMIT_OFF
  1633.    P_CLOCK_OFF : X Mouse=PX : Y Mouse=PY : Show On : If MENFLG=True and DF=False Then Menu On 
  1634. End Proc
  1635. Procedure P_QUESTION
  1636.    MCX=594 : MCY=184 : P_MOUSE_LOCK : P_CLOCK_ON : Hide On 
  1637.    Ink WHITE : Box 66,122 To 556,161
  1638.    Paper BLACK : Wind Open 1,95,126,58,4 : Clw : Clear Key 
  1639.    If FFLG=True Then P_FADE_IN
  1640.    Pen WHITE : Put Key Left$(Q$,63) : Line Input "? ";Q$ : Curs Off 
  1641.    Wind Close : Show On : P_LIMIT_OFF : P_CLOCK_OFF
  1642. End Proc
  1643. Procedure P_Q_RESET
  1644.    Q$="Restart U-File?" : P_YES_NO
  1645.    If Q$="Y"
  1646.       P_RESET
  1647.    Else 
  1648.       PD=0 : P_PROMPT_OFF
  1649.    End If 
  1650. End Proc
  1651. Procedure P_RESET
  1652.    Clear Key : Menu Off : P_ANIM_OFF : Bob Off : Wait Vbl 
  1653.    P_DEFAULTS
  1654.    P_CLOSE_SCREENS
  1655.    P_OPEN_SCREENS
  1656.    If SOF=1 Then P_ABOUT_U_FILE
  1657.    P_CLEAR_LIST
  1658.    P_OPEN_MENU
  1659.    P_OPEN_STATEMENT
  1660.    P_STATUS
  1661.    P_LIMIT_OFF
  1662.    On Menu Proc P_DISK,P_BLOCK,P_FIND,P_SETUP
  1663.    On Menu On 
  1664.    Change Mouse MF : X Mouse=280 : Y Mouse=160 : Show On 
  1665.    P_ANIM_ON
  1666.    P_MOUSE_UP
  1667. End Proc
  1668. Procedure P_STATUS
  1669.    Screen EDSCRN : Z=50 : Ink WHITE,BLUE : Text 80,21,Space$(Z)
  1670.    If F$<>"" Then Z$=" "+Left$(F$,Z-2)+" " : Ink WHITE,BLACK : Text 80,21,Z$
  1671. '
  1672.    Ink WHITE,BLUE : Text 550,10,Space$(7) : Text 550,19,Space$(7)
  1673.    Text 524,181,Space$(9) : Text 524,192,Space$(9) : Text 80,10,Space$(16)
  1674.    Ink WHITE,BLACK : If MBL>0 Then Text 80,10,Str$(MBL)+" "
  1675.    If BF>0
  1676.       CB=BP+CX+(CY*16) : Text 550,10,Str$(BL)-" " : Text 550,19,Str$(CB)-" "
  1677.       Text 524,181,Str$(NB)+" "
  1678.       Text 524,192,Str$(PB)+" "
  1679.    End If 
  1680. End Proc
  1681. Procedure P_UNDO
  1682. L_J0:
  1683.    If PM<1 Then Clear Key : EF=11 : P_ERROR : P_MOUSE_UP : Pop Proc
  1684.    Z$=PK$(0,PF)
  1685.    If Z$="P"
  1686.       A=Val(PK$(2,PF)) : PK=Val(PK$(1,PF)) : Poke PK,A
  1687.    End If 
  1688.    PK$(0,PF)="" : PK$(1,PF)="" : PK$(2,PF)=""
  1689.    Dec PF : Dec PM : If PF<1 Then PF=256
  1690. '
  1691.    ZB=PK-BS : CY=(ZB-BP)/16 : CX=ZB-BP-(CY*16) : OCF=2
  1692.    If ZB<BP or ZB>BP+255
  1693.       CB=ZB : P_BLOCK_CB
  1694.       P_SCROLL_BAR : CLF=1 : P_WRITE_LINES
  1695.    Else 
  1696.       PK=BS+BP+(CY*16) : P_PEEK_LINE
  1697.       P_BOB_OFF : Wait Vbl : Ink WHITE,BLACK : Text 7,34+(CY*9),LINE$ : K$=""
  1698.    End If 
  1699.    If BLOCKF=1 Then Ink HICOL : P_BLOCK_ON
  1700.    P_BOB_XY : P_QUICK_STATUS : If Mouse Key<>0 Then Goto L_J0
  1701. End Proc
  1702. Procedure P_WORKBENCH
  1703.    Anim Freeze : Menu Off : P_MOUSE_LOCK : Amos To Back 
  1704.    While Amos Here=False
  1705.       Multi Wait 
  1706.    Wend : P_LIMIT_OFF : Menu On : If AF=1 Then Anim On 
  1707. End Proc
  1708. Procedure P_YES_NO
  1709.    If SOF=0 Then Pop Proc
  1710.    MF=PNTER : Change Mouse MF : Show On 
  1711.    MCX=594 : MCY=184 : P_CLOCK_ON : P_CLEAR_LIST
  1712.    Pen WHITE : Locate 0,10 : Centre Q$+"    "
  1713.    Locate 32,14 : Print Border$(" NO --- YES ",1)
  1714.    X Mouse=275 : Y Mouse=169 : Limit Mouse 255,158 To 304,172
  1715.    If FFLG=True Then P_FADE_IN
  1716.    P_MOUSE_UP
  1717.    While Mouse Key=0 : P_SCREEN_XY : Wend : Hide On 
  1718.    PX=X Mouse : PY=Y Mouse : Q$="N" : If SX>300 Then Q$="Y"
  1719. End Proc
  1720. '
  1721. '  
  1722. '
  1723. L_COLD_START:
  1724.    P_RESET
  1725.    If DEBUG=False Then Break Off 
  1726. Goto L_LOOP
  1727. '
  1728. Procedure P_EXIT
  1729.    Q$="Delete All Quick Disk Files On <"+QUICKPATH$+">?" : P_YES_NO
  1730.    If Q$="Y" Then P_S_QUICK_CLR_ALL
  1731.    Erase ABOUTBANK : Erase FILEBANK : Erase SBANK : Erase TEMPBANK
  1732.    P_BOB_OFF
  1733.    Default : Edit 
  1734. End Proc
  1735. '  
  1736. '  Variable: 
  1737. '
  1738. ' A                Any 
  1739. ' ABOUTBANK        Bank storing About screen 
  1740. ' AF               Amal flag 
  1741. ' AGAIN            Again menu option flag  
  1742. ' BE               Bank end address  
  1743. ' BF               Bank Flag, BF=0 Empty 
  1744. ' BL               Bank length 
  1745. ' BLOCKE           Block end address 
  1746. ' BLOCKF           Block flag  
  1747. ' BLOCKS           Block start address 
  1748. ' BP               Block Bite pointer
  1749. ' BS               Bank start address
  1750. ' C()              Colour array
  1751. ' CB               Current bite
  1752. ' CF               Cursor flag 
  1753. ' CHECK$           Device check list 
  1754. ' CI               Colour light intensity
  1755. ' CLF              Clear list flag 
  1756. ' CX,CY            Cursor x,y
  1757. ' D$               Directory Root string 
  1758. ' DF               Display values flag 
  1759. ' DEVICE$          Device pathname for checking  
  1760. ' DISPSCRN         Value display screen  
  1761. ' EF               Error flag  
  1762. ' FFLG             Fade out active flag  
  1763. ' FILEBANK         Mem bank used for temp file 
  1764. ' F$               Filespec string 
  1765. ' HF$              Hunt for string 
  1766. ' HICOL            Highlight block colour
  1767. ' HM               Hunt mode flag
  1768. ' HP               Hunt pointer
  1769. ' IBF              Insert block flag   
  1770. ' LINE$            Peeked line string
  1771. ' LOCK             Lock flag for Beta release
  1772. ' Mn               Menu choice number
  1773. ' MBL              M-block length (SBANK)
  1774. ' MCX,MCY          Mouse clock x,y 
  1775. ' MENFLG           Menu on flag
  1776. ' MF               Mouse flag
  1777. ' MCH,MCL          Menu High and Low colours 
  1778. ' MCn              Mouse colour registers  
  1779. ' MSB              Edit MSB flag 
  1780. ' NAC              Non-ASCII character default 
  1781. ' NB               No. 256 Bite Blocks 
  1782. ' NUM              NUmber of numbers in NUM$ 
  1783. ' NUM$             Number string to evaluate 
  1784. ' NUM()            NUmbers from NUM$ 
  1785. ' OCF              Old cursor flag 
  1786. ' OCI              Old light intensity 
  1787. ' P$               Prompt message string 
  1788. ' PB               Present Bite block pointer
  1789. ' PBF              Paste block flag
  1790. ' PD               Prompt delay in 1/50's  
  1791. ' PF               Poke array pointer  
  1792. ' PK               Peek address pointer
  1793. ' PK$()            Poke, Doke, Loke array values 
  1794. ' PM               Poke Max pointer
  1795. ' PREFPATH$        Pathname for preferences
  1796. ' PSAMOS$          Preset search string for AMOS 
  1797. ' PSDEV$           Preset search string for Devices  
  1798. ' PSIFF$           Preset search string for IFF
  1799. ' PX,PY            Prompt old mouse x,y
  1800. ' Q$               Question string 
  1801. ' QUICKPATH$       Quick Disk pathname 
  1802. ' SBANK            Mem bank used for block saved data
  1803. ' SCRNBANK         Mem bank used for packed screen 
  1804. ' SHAPEBANK        Mem bank used for bobs  
  1805. ' SOF              Screen open flag  
  1806. ' SX,SY            Mouse x,y 
  1807. ' TEMPBANK         Mem bank used for block cut/insert
  1808. ' TL               Text left x position
  1809. '