home *** CD-ROM | disk | FTP | other *** search
/ AMOS PD CD / amospdcd.iso / 501-525 / apd520 / hexeditor / hexed.amos / hexed.amosSourceCode < prev    next >
AMOS Source Code  |  1991-01-02  |  31KB  |  1,147 lines

  1. Set Buffer 96
  2. Break Off 
  3. Close Editor : Show On 
  4. On Error Proc ERRHANDLER
  5. Resume Label HERE
  6. DRW$="DF0:" : Rem  **** default search path ****     
  7. HERE:
  8. INITALISE
  9. Global DRW$,NAME$,CHANGED,EXTRA,XC,YC
  10. HELP
  11. Do 
  12.    If Choice
  13.       On Choice(1) Proc CHKMENU1,CHKMENU2
  14.    End If 
  15.    If Length(6)<>2
  16.       CURS[XC,YC]
  17.    End If 
  18. Loop 
  19. Procedure ERRHANDLER
  20.    If Errn=94 : Resume Next : End If 
  21.    If Errn=97
  22.       REQUEST["File Does Not Exist","Select Cancel To Continue",1]
  23.       Resume Next 
  24.    End If 
  25.    If Errn=84
  26.       REQUEST["Disk is Write Protected","",1]
  27.    Else 
  28.       REQUEST["Error number"+Str$(Errn),"Select Cancel to Continue",1]
  29.    End If 
  30.    Resume Next 
  31. End Proc
  32. Procedure FILEREQ[A$,M]
  33.    On Error Proc ERRHANDLER
  34.    Dim G$(128),F$(6)
  35.    DEFDRW$=DRW$
  36.    Colour Back $68F
  37.    Unpack 7 To 2
  38.    Screen Display 2,128,50,576,208
  39.    Palette $68F,$FEE,$FFF,$F00,$C,0,$333,$900
  40.    Colour 17,$F00 : Colour 18,$FCC : Colour 19,0
  41.    Curs Off : Flash Off 
  42.    Ink 4
  43.    Bar 0,0 To 8,1
  44.    Bar 0,0 To 3,8
  45.    Ink 0
  46.    Bar 572,0 To 640,208
  47.    Reserve Zone 52
  48.    Ink 5,0
  49.    Pen 5 : Paper 0
  50.    If M=0 Then REQ$="LOAD" : REQ=40 Else REQ$="SAVE" : REQ=33
  51.    Set Dir 30,""
  52.    Get Rom Fonts 
  53.    Set Font 1
  54.    Set Text 2
  55.    Text(((62-Len(A$))/2)*8)+10,14,A$
  56.    For T=1 To 5
  57.       F$(T)=""
  58.    Next 
  59.    F$(0)="DF0:"
  60.    If Exist("df1:") : F$(1)="DF1:" : End If 
  61.    If Exist("df2:") : F$(2)="DF2:" : End If 
  62.    If Exist("df3:") : F$(3)="DF3:" : End If 
  63.    If Exist("dh0:") : F$(4)="DH0:" : End If 
  64.    If Exist("dh1:") : F$(5)="DH1:" : End If 
  65.    Gosub STZONES
  66.    Gosub SEARCH
  67.    MNLOP:
  68.    TEMP=-1
  69.    Do 
  70.       K$=Inkey$ : SC=Scancode : KS=Key Shift : MZ=Mouse Zone : MK=Mouse Key
  71.       If SC=69 and KS=0 : OUT$="" : Goto OUT : End If 
  72.       If(MK=1 and MZ=5) or(SC=51 and(KS=16 or KS=32)) : OUT$="" : Goto OUT : End If 
  73.       If(MZ=1 and MK=1) or(SC=34 and(KS=16 or KS=32))
  74.          If FILE$<>""
  75.             REQUEST["WARNING:  It is NOT possible","to get back a deleted file",0]
  76.             If Param=1
  77.                If Exist(DRW$+FILE$) : Kill DRW$+FILE$
  78.                   Gosub SEARCH : Goto MNLOP
  79.                Else 
  80.                   REQUEST["File Does Not","Exist",0]
  81.                End If 
  82.             End If 
  83.          End If 
  84.       End If 
  85.       If MZ>7 and MZ<14 and MK=1
  86.          If MZ<12
  87.             DRW$="DF"+(Str$(MZ-8)-" ")+":"
  88.          End If 
  89.          If MZ=12 or MZ=13
  90.             DRW$="DH"+(Str$(MZ-12)-" ")+":"
  91.          End If 
  92.          FILE$=""
  93.          Gosub SEARCH : Goto MNLOP
  94.       End If 
  95.       If MK=1 and MZ=6
  96.          If FILE$<>""
  97.             OUT$=DRW$+FILE$
  98.          Else 
  99.             OUT$=""
  100.          End If 
  101.          Goto OUT
  102.       End If 
  103.       If(MZ=4 and MK=1) or(SC=25 and(KS=16 or KS=32))
  104.          If DRW$<>""
  105.             For T=Len(DRW$)-1 To 0 Step -1
  106.                If Mid$(DRW$,T,1)="/"
  107.                   DRW$=Left$(DRW$,T)
  108.                   Exit 
  109.                End If 
  110.                If Mid$(DRW$,T,1)=":"
  111.                   DRW$=Left$(DRW$,T)
  112.                   Exit 
  113.                End If 
  114.             Next 
  115.             If T<1 : DRW$="" : End If 
  116.             FILE$="" : TEMP$=""
  117.             Gosub SEARCH : Goto MNLOP
  118.          End If 
  119.       End If 
  120.       If SC=77 : Inc POS : End If 
  121.       If SC=76 : Dec POS : End If 
  122.       If MZ=2 or MZ=3
  123.          If MK=1
  124.             If MZ=2 : Dec POS : End If 
  125.             If MZ=3 : Inc POS : End If 
  126.             Wait 7
  127.          End If 
  128.       End If 
  129.       If SC=78 : POS=POS+16 : End If 
  130.       If SC=79 : POS=POS-16 : End If 
  131.       If MZ>19 and MZ<52 : POS=MZ-20 : End If 
  132.       If POS>31 : OS=OS+16 : POS=POS-16 : Gosub RELIST : Goto MNLOP : End If 
  133.       If POS<0 and OS>15 : OS=OS-16 : POS=POS+16 : Gosub RELIST : Goto MNLOP : End If 
  134.       If POS>FLAG-OS-1 : POS=FLAG-OS-1 : End If 
  135.       If POS<0 : POS=0 : End If 
  136.       If POS<>TEMP
  137.          If TEMP>-1
  138.             X1=15 : Y1=3
  139.             If TEMP>15
  140.                X1=42 : Y1=-13
  141.             End If 
  142.             Locate X1,TEMP+Y1
  143.             Print Left$(G$(TEMP+OS),26)
  144.          End If 
  145.          X1=15 : Y1=3
  146.          If POS>15
  147.             X1=42 : Y1=-13
  148.          End If 
  149.          Locate X1,POS+Y1
  150.          Pen 2 : Paper 4 : TEMP=POS
  151.          Print Left$(G$(POS+OS),26)
  152.          TEMP$=G$(POS+OS)
  153.          Pen 5 : Paper 0
  154.       End If 
  155.       If EDLIN>0
  156.          If(MZ<>7 and MK=1) or SC=67 or SC=68
  157.             EDLIN=0
  158.             Text 165,168,Left$(DRW$+FILE$+Space$(48),48)
  159.             If Asc(Right$(ALL$,1))=58 or Asc(Right$(ALL$,1))=47
  160.                DRW$=ALL$ : Gosub SEARCH : Goto MNLOP
  161.             End If 
  162.             If SC=67 or SC=68
  163.                OUT$=DRW$+FILE$ : Goto OUT
  164.             End If 
  165.          End If 
  166.       End If 
  167.       If(Mouse Click=1 and Mouse Zone>19) or Asc(K$)=13
  168.          If FILE$<>Left$(TEMP$,Instr(TEMP$,"  ")-1)
  169.             If Left$(TEMP$,5)="(Dir)"
  170.                DRW$=DRW$+Mid$(TEMP$,7,Instr(TEMP$,"  ")-7)+"/"
  171.                FILE$="" : TEMP$=""
  172.                Gosub SEARCH : Goto MNLOP
  173.             Else 
  174.                FILE$=Left$(TEMP$,Instr(TEMP$,"  ")-1)
  175.             End If 
  176.          Else 
  177.             If FILE$<>""
  178.                OUT$=DRW$+FILE$
  179.             End If 
  180.             Goto OUT
  181.          End If 
  182.          Text 165,168,Left$(DRW$+FILE$+Space$(48),48)
  183.       End If 
  184.       If SC=REQ
  185.          If KS=16 or KS=32
  186.             OUT$=DRW$+FILE$ : Goto OUT
  187.          End If 
  188.       End If 
  189.       If(MZ=7 and MK=1) or EDLIN>0 or(SC=35 and(KS=16 or KS=32))
  190.          ALL$=DRW$+FILE$ : EDLIN=1
  191.          If Instr("`1234567890-=\~!@#$%^&*()_+|qwertyuiop[]{}asdfghjkl;':zxcvbnm,./<>? ",Lower$(K$))=0 : K$="" : End If 
  192.          ALL$=ALL$+K$
  193.          If SC=65 : ALL$=Left$(ALL$,Len(ALL$)-1) : End If 
  194.          Text 165,168,ALL$+"  "
  195.          Ink 3 : Bar 165+(8*Len(ALL$)),162 To 166+(8*Len(ALL$)),169 : Ink 5
  196.          For T=Len(ALL$) To 0 Step -1
  197.             If Mid$(ALL$,T,1)="/"
  198.                DRW$=Left$(ALL$,T)
  199.                Exit 
  200.             End If 
  201.             If Mid$(ALL$,T,1)=":"
  202.                DRW$=Left$(ALL$,T)
  203.                Exit 
  204.             End If 
  205.          Next 
  206.          If T<1 : DRW$="" : End If 
  207.          FILE$=Right$(ALL$,Len(ALL$)-T)
  208.       End If 
  209.    Loop 
  210.    SEARCH:
  211.    CHKDSK[DRW$]
  212.    If Param=0 : DRW$=DEFDRW$ : Pop : Goto MNLOP : End If 
  213.    FILE$=""
  214.    Change Mouse 5
  215.    FLAG=0 : OS=0 : POS=0
  216.    Ink 0 : Bar 114,22 To 550,152 : Ink 5,0
  217.    Text 165,168,Left$(DRW$+FILE$+Space$(48),48)
  218.    G$(0)=Dir First$(DRW$)
  219.    For T=0 To 128
  220.       If T>0
  221.          G$(T)=Dir Next$
  222.       End If 
  223.       Gosub CONVERT
  224.       If G$(T)="" : If FLAG=0 : FLAG=T : End If : End If 
  225.    Next 
  226.    Gosub RELIST
  227.    Change Mouse 4
  228.    Return 
  229.    CONVERT:
  230.    If G$(T)<>""
  231.       If Left$(G$(T),1)="*"
  232.          G$(T)="(Dir) "+Mid$(G$(T),2,30)
  233.       Else 
  234.          G$(T)=Mid$(G$(T),2,29)
  235.       End If 
  236.    End If 
  237.    Return 
  238.    RELIST:
  239.    Ink 0 : Bar 114,22 To 550,152 : Ink 5,0
  240.    Reserve Zone 
  241.    Gosub STZONES
  242.    X1=15 : Y1=3
  243.    For T=20 To 51
  244.       If T+OS<FLAG+20
  245.          If G$(T+OS-20)<>""
  246.             Print At(X1,Y1);Zone$(Left$(G$(T+OS-20),26),T)
  247.             Inc Y1
  248.          End If 
  249.          If Y1>18 : X1=42 : Y1=3 : End If 
  250.       End If 
  251.    Next 
  252.    Return 
  253.    STZONES:
  254.    Set Font 1 : Set Text 2
  255.    Reserve Zone 52
  256.    Set Zone 1,20,24 To 98,40
  257.    Set Zone 2,50,57 To 98,74
  258.    Set Zone 3,50,82 To 98,99
  259.    Set Zone 4,18,109 To 98,125
  260.    Set Zone 5,18,133 To 98,149
  261.    Set Zone 6,18,157 To 98,173 : Text 38,168,REQ$
  262.    Set Zone 7,118,158 To 552,174
  263.    N=0
  264.    For T=0 To 5
  265.       If F$(T)<>""
  266.          If N=0 : X=28 : X1=88 : End If 
  267.          If N=1 : X=118 : X1=188 : End If 
  268.          If N=2 : X=208 : X1=276 : End If 
  269.          If N=3 : X=296 : X1=364 : End If 
  270.          If N=4 : X=386 : X1=454 : End If 
  271.          If N=5 : X=476 : X1=544 : End If 
  272.          Text X+16,189,F$(T)
  273.          Set Zone T+8,X,179 To X1,194
  274.          Inc N
  275.       End If 
  276.    Next 
  277.    Set Font 2
  278.    Return 
  279.    OUT:
  280.    For X=0 To 127
  281.       If Upper$(Left$(G$(X),25))=Upper$(Left$("(Dir) "+FILE$+Space$(19),25))
  282.          DRW$=OUT$+"/" : Gosub SEARCH : Goto MNLOP
  283.       End If 
  284.    Next 
  285.    If Asc(Right$(OUT$,1))=58 or Asc(Right$(OUT$,1))=47
  286.       OUT$=""
  287.    End If 
  288.    Screen Close 2
  289. End Proc[OUT$]
  290. Procedure HEXPRINT
  291.    On Error Proc ERRHANDLER
  292.    If NAME$<>""
  293.       REQUEST["Print Hex and ASCII","Please Set Paper To Top Of Form",0]
  294.       If Param=0 : Pop Proc : End If 
  295.       MSG["****** Press Esc To Abort Printing ******"]
  296.       Lprint "Name. ";NAME$
  297.       Lprint "File Size. ";Length(6)-EXTRA
  298.       Lprint 
  299.       For X1=0 To(Length(6)-EXTRA)/16
  300.          If Inkey$=Chr$(27) : Lprint "" : Pop Proc : End If 
  301.          Gosub CALC3
  302.       Next 
  303.    Else 
  304.       REQUEST["File Must","Be Loaded First",1]
  305.    End If 
  306.    MSG["|"]
  307.    Lprint : Lprint 
  308.    Pop Proc
  309.    CALC3:
  310.    A$=""
  311.    Lprint Right$("00000"+Str$(X1)-" ",6);"  ";
  312.    For Y1=0 To 15
  313.       B=Start(6)+(16*X1)+Y1
  314.       BYTE=Peek(B)
  315.       If B<Start(6)+Length(6)
  316.          Lprint Hex$(BYTE,2)-"$"+" ";
  317.          A$=A$+Chr$(BYTE)
  318.       Else 
  319.          A$=A$+" "
  320.          Lprint "   ";
  321.       End If 
  322.       Pen 1
  323.       If Y1=3 or Y1=7 or Y1=11
  324.          Lprint "  ";
  325.       End If 
  326.    Next 
  327.    FILTER2[A$]
  328.    Lprint "  ";Param$;
  329.    Return 
  330. End Proc
  331. Procedure TEXPRINT
  332.    On Error Proc ERRHANDLER
  333.    If NAME$<>""
  334.       REQUEST["Print ASCII (Unformatted)","Please Set Paper To Top Of Form",0]
  335.       If Param=0 : Pop Proc : End If 
  336.       MSG["****** Press Esc To Abort Printing ******"]
  337.       Lprint "Name. ";NAME$
  338.       Lprint "File Size. ";Length(6)-EXTRA
  339.       Lprint 
  340.       For X1=0 To(Length(6)-EXTRA)
  341.          If Inkey$=Chr$(27) : Lprint "" : Pop Proc : End If 
  342.          FILTER2[Chr$(Peek(Start(6)+X1))]
  343.          Lprint Param$;
  344.       Next 
  345.    Else 
  346.       REQUEST["File Must","Be Loaded First",1]
  347.    End If 
  348.    MSG["|"]
  349. End Proc
  350. Procedure FTEXPRINT
  351.    On Error Proc ERRHANDLER
  352.    If NAME$<>""
  353.       REQUEST["Print ASCII (Formatted)","Please Set Paper To Top Of Form",0]
  354.       If Param=0 : Pop Proc : End If 
  355.       MSG["****** Press Esc To Abort Printing ******"]
  356.       For X1=0 To(Length(6)-EXTRA)
  357.          BYTE$=Chr$(Peek(Start(6)+X1))
  358.          If Instr(" `1234567890-=\~!@#$%^&*()_+|qwertyuiop{}[]asdfghjkl;':zxcvbnm,./<>?"+Chr$(34)+Chr$(13)+Chr$(10),Lower$(BYTE$))=0 : BYTE$="" : End If 
  359.          If Inkey$=Chr$(27) : Lprint "" : Pop Proc : End If 
  360.          If BYTE$=Chr$(10) : Lprint Chr$(13); : End If 
  361.          If BYTE$<>""
  362.             If TEMP$=""
  363.                Lprint 
  364.             End If 
  365.          End If 
  366.          Lprint BYTE$;
  367.          TEMP$=BYTE$
  368.       Next 
  369.    Else 
  370.       REQUEST["File Must","Be Loaded First",1]
  371.    End If 
  372.    MSG["|"]
  373. End Proc
  374. Procedure CURS[X,Y]
  375.    Shared OFFSET
  376.    On Error Proc ERRHANDLER
  377.    If Windon=1 : Wind Close : End If 
  378.    Paper 0
  379.    Wind Open 1,8,16,80,29,0
  380.    Window 2 : Curs Off 
  381.    Paper 4
  382.    Window 1 : Curs Off 
  383.    Paper 0 : Clw 
  384.    MAIN:
  385.    Window 2
  386.    Pen 3
  387.    Print At(37,0);Left$(NAME$+Space$(25),25);
  388.    Print At(69,);Left$(Str$(Length(6)-EXTRA)-" "+Space$(9),10)
  389.    Window 1
  390.    Pen 1
  391.    Set Curs 192,192,192,192,192,192,192,192
  392.    FRE=Free
  393.    If OFFSET<0 Then OFFSET=0
  394.    If OFFSET>Length(6)/16-27 Then OFFSET=Length(6)/16-27
  395.    Clw : Curs Off 
  396.    For X1=Length(6)-EXTRA To Length(6)
  397.       If Peek(X1+Start(6))>0 : EXTRA=Length(6)-X1-1 : End If 
  398.    Next 
  399.    For X1=0 To 27
  400.       Gosub CALC
  401.    Next 
  402.    MSG["|"]
  403.    If X>63
  404.       ACURS[X,Y]
  405.       Wind Close 
  406.       Pop Proc
  407.    End If 
  408.    Dec X1
  409.    Do 
  410.       Curs On 
  411.       If Choice
  412.          On Choice(1) Proc CHKMENU1,CHKMENU2
  413.          Exit 
  414.       End If 
  415.       K$=Inkey$ : SC=Scancode : KS=Key Shift
  416.       If K$=Chr$(27)
  417.          ACURS[64,Y]
  418.          Wind Close 
  419.          Pop Proc
  420.       End If 
  421.       If SC=0
  422.          If COUNT>300
  423.             MSG["|"]
  424.             COUNT=0
  425.          Else 
  426.             Inc COUNT
  427.          End If 
  428.       Else 
  429.          MSG["|"]
  430.       End If 
  431.       If SC=78 : Inc X : End If 
  432.       If SC=79
  433.          Dec X
  434.          If X<8
  435.             Dec Y : X=60
  436.          End If 
  437.          If X=10 or X=13 or X=16 or X=24 or X=27 or X=30 or X=38 or X=41 or X=44 or X=52 or X=55 or X=58
  438.             Dec X
  439.          End If 
  440.          If X=21 or X=35 or X=49
  441.             X=X-3
  442.          End If 
  443.       End If 
  444.       If SC=77
  445.          Curs Off 
  446.          If KS=8
  447.             OFFSET=Length(6)/16
  448.             Goto MAIN
  449.          End If 
  450.          If KS=16 or KS=32
  451.             OFFSET=OFFSET+28
  452.             Goto MAIN
  453.          End If 
  454.          If KS=64 or KS=128
  455.             OFFSET=OFFSET+280
  456.             Goto MAIN
  457.          End If 
  458.          Inc Y : Clear Key 
  459.       End If 
  460.       If SC=76
  461.          Curs Off 
  462.          If KS=8
  463.             OFFSET=0
  464.             Goto MAIN
  465.          End If 
  466.          If KS=16 or KS=32
  467.             OFFSET=OFFSET-28
  468.             Goto MAIN
  469.          End If 
  470.          If KS=64 or KS=128
  471.             OFFSET=OFFSET-280
  472.             Goto MAIN
  473.          End If 
  474.          Dec Y : Clear Key 
  475.       End If 
  476.       If Mouse Key=1
  477.          XC=X Text((X Mouse-111)*2) : YC=Y Text(Y Mouse-40)
  478.          If XC>63 and XC<80
  479.             ACURS[XC,YC]
  480.             Wind Close 
  481.             Pop Proc
  482.          End If 
  483.          If XC>7 and XC<61
  484.             X=XC : Y=YC
  485.          End If 
  486.       End If 
  487.       If SC=70 and(KS=16 or KS=32) and EXTRA>0
  488.          TELL["How Many Bytes To Insert ?"]
  489.          If Param=0 : Goto MAIN : End If 
  490.          NO=Param : MSG["****** Inserting Byte(s) ******"]
  491.          If NO>EXTRA : NO=EXTRA : End If 
  492.          For X1=Start(6)+Length(6) To BYTE+NO Step -1
  493.             Poke X1,Peek(X1-NO)
  494.          Next 
  495.          For X1=0 To NO-1
  496.             Poke BYTE+X1,0
  497.          Next 
  498.          Clear Key : CHANGED=1
  499.          EXTRA=EXTRA-NO
  500.          Goto MAIN
  501.       End If 
  502.       If SC=70 and KS=0
  503.          TELL["How Many Bytes To Delete ?"]
  504.          If Param=0 : Goto MAIN : End If 
  505.          NO=Param : MSG["****** Deleting Byte(s) ******"]
  506.          If NO>Length(6)-EXTRA : NO=Length(6)-EXTRA : End If 
  507.          For X1=BYTE To Start(6)+Length(6)
  508.             Poke X1,Peek(X1+NO)
  509.          Next 
  510.          For X1=Start(6)+Length(6)-NO To Start(6)+Length(6)
  511.             Poke X1,0
  512.          Next 
  513.          Clear Key : CHANGED=1
  514.          EXTRA=EXTRA+NO
  515.          Goto MAIN
  516.       End If 
  517.       If Y<0 : Y=0
  518.          OFFSET=OFFSET-28
  519.          If OFFSET>-28
  520.             Locate 0,27 : Print Space$(80);
  521.             Locate 0,0
  522.             Vscroll 1
  523.             Gosub CALC
  524.             OFFSET=OFFSET+27
  525.          Else 
  526.             OFFSET=OFFSET+28
  527.             MSG["******** Start Of File ********"]
  528.          End If 
  529.       End If 
  530.       If K$=Chr$(13) or(KS=69 and SC=0) : Goto MAIN : End If 
  531.       If X<9 : X=8 : B=1 : P=0 : End If 
  532.       If X=9 : B=2 : P=0 : End If 
  533.       If X=10 or X=11 : B=1 : X=11 : P=1 : End If 
  534.       If X=12 : P=1 : B=2 : End If 
  535.       If X=13 or X=14 : B=1 : X=14 : P=2 : End If 
  536.       If X=15 : P=2 : B=2 : End If 
  537.       If X=16 or X=17 : B=1 : X=17 : P=3 : End If 
  538.       If X=18 : P=3 : B=2 : End If 
  539.       If X>18 and X<23 : X=22 : B=1 : P=4 : End If 
  540.       If X=23 : P=4 : B=2 : End If 
  541.       If X=24 or X=25 : B=1 : X=25 : P=5 : End If 
  542.       If X=26 : P=5 : B=2 : End If 
  543.       If X=27 or X=28 : B=1 : X=28 : P=6 : End If 
  544.       If X=29 : P=6 : B=2 : End If 
  545.       If X=30 or X=31 : B=1 : X=31 : P=7 : End If 
  546.       If X=32 : P=7 : B=2 : End If 
  547.       If X>32 and X<37 : B=1 : X=36 : P=8 : End If 
  548.       If X=37 : P=8 : B=2 : End If 
  549.       If X=38 or X=39 : B=1 : X=39 : P=9 : End If 
  550.       If X=40 : P=9 : B=2 : End If 
  551.       If X=41 or X=42 : B=1 : X=42 : P=10 : End If 
  552.       If X=43 : P=10 : B=2 : End If 
  553.       If X=44 or X=45 : B=1 : X=45 : P=11 : End If 
  554.       If X=46 : P=11 : B=2 : End If 
  555.       If X>46 and X<51 : B=1 : X=50 : P=12 : End If 
  556.       If X=51 : P=12 : B=2 : End If 
  557.       If X=52 or X=53 : B=1 : X=53 : P=13 : End If 
  558.       If X=54 : P=13 : B=2 : End If 
  559.       If X=55 or X=56 : B=1 : X=56 : P=14 : End If 
  560.       If X=57 : P=14 : B=2 : End If 
  561.       If X=58 or X=59 : B=1 : X=59 : P=15 : End If 
  562.       If X=60 : P=15 : B=2 : End If 
  563.       If X>60
  564.          If Y>26
  565.             Y=27
  566.          End If 
  567.          X=8 : P=0 : Inc Y
  568.       End If 
  569.       If Y>27 and(SC=77 or(TEMP>0 and X=8))
  570.          OFFSET=OFFSET+1 : Y=27
  571.          If OFFSET<Length(6)/16-27
  572.             Locate 0,28 : Print Space$(80);
  573.             Locate 0,27
  574.             Gosub CALC
  575.          Else 
  576.             Dec OFFSET
  577.             MSG["******** End Of File ********"]
  578.          End If 
  579.       End If 
  580.       Locate X,Y
  581.       BYTE=Start(6)+(OFFSET*16)+(Y*16)+P
  582.       If Y<0 : Y=0 : End If 
  583.       If Instr("1234567890ABCDEF",Upper$(K$))=0 : K$="" : End If 
  584.       K$=Upper$(K$)
  585.       If K$<>""
  586.          If BYTE>=Start(6) and BYTE<Start(6)+Length(6)
  587.             CHANGED=1
  588.             If B=1
  589.                B1$=Right$(Hex$(Peek(BYTE),2),1)
  590.                Poke BYTE,Val("$"+K$+B1$)
  591.                B1$=Chr$(Val("$"+K$+B1$))
  592.                FILTER[B1$]
  593.                Curs Off 
  594.                Locate P+64,Y
  595.                Print Param$;
  596.                Curs On 
  597.                B1$=""
  598.             End If 
  599.             If B=2
  600.                B1$=Left$(Hex$(Peek(BYTE),2)-"$",1)
  601.                Poke BYTE,Val("$"+B1$+K$)
  602.                B1$=Chr$(Val("$"+B1$+K$))
  603.                FILTER[B1$]
  604.                Curs Off 
  605.                Locate P+64,Y
  606.                Print Param$;
  607.                Curs On 
  608.                B1$=""
  609.             End If 
  610.          End If 
  611.          CHANGED=1
  612.          Locate X,Y
  613.          Print K$;
  614.          Inc X
  615.          Locate X,Y
  616.       End If 
  617.       TEMP=SC
  618.    Loop 
  619.    Wind Close 
  620.    Pop Proc
  621.    CALC:
  622.    A$=""
  623.    Print Right$("00000"+Str$(X1+OFFSET)-" ",6);"  ";
  624.    For Y1=0 To 15
  625.       B=Start(6)+(16*X1)+Y1+(OFFSET*16)
  626.       BYTE=Peek(B)
  627.       If B>=Start(6)+Length(6)-EXTRA Then Pen 7 Else Pen 1
  628.       If B<Start(6)+Length(6)
  629.          Print Hex$(BYTE,2)-"$"+" ";
  630.          A$=A$+Chr$(BYTE)
  631.       Else 
  632.          A$=A$+" "
  633.          Print "   ";
  634.       End If 
  635.       Pen 1
  636.       If Y1=3 or Y1=7 or Y1=11
  637.          Print "  ";
  638.       End If 
  639.    Next 
  640.    FILTER[A$]
  641.    Print "  ";Param$;
  642.    Return 
  643. End Proc
  644. Procedure ACURS[X,Y]
  645.    On Error Proc ERRHANDLER
  646.    Shared OFFSET
  647.    MSG[Space$(20)+"ASCII Editing"+Space$(20)]
  648.    X1=27
  649.    Do 
  650.       Curs On 
  651.       If Choice
  652.          On Choice(1) Proc CHKMENU1,CHKMENU2
  653.          Exit 
  654.       End If 
  655.       K$=Inkey$ : SC=Scancode : KS=Key Shift
  656.       If K$=Chr$(27) : XC=8 : YC=Y : Exit : End If 
  657.       BYTE=Start(6)+(OFFSET*16)+(Y*16)+(X-64)
  658.       If SC=70 and(KS=16 or KS=32) and EXTRA>0
  659.          TELL["How Many Bytes To Insert ?"]
  660.          If Param=0 : Goto MAIN : End If 
  661.          NO=Param : MSG["****** Inserting Byte(s) ******"]
  662.          If NO>EXTRA : NO=EXTRA : End If 
  663.          For X1=Start(6)+Length(6) To BYTE+NO Step -1
  664.             Poke X1,Peek(X1-NO)
  665.          Next 
  666.          For X1=0 To NO-1
  667.             Poke BYTE+X1,0
  668.          Next 
  669.          Clear Key : CHANGED=1
  670.          EXTRA=EXTRA-NO
  671.          Goto MAIN2
  672.       End If 
  673.       If SC=70 and KS=0
  674.          TELL["How Many Bytes To Delete ?"]
  675.          If Param=0 : Goto MAIN : End If 
  676.          NO=Param : MSG["****** Deleting Byte(s) ******"]
  677.          If NO>Length(6)-EXTRA : NO=Length(6)-EXTRA : End If 
  678.          For X1=BYTE To Start(6)+Length(6)
  679.             Poke X1,Peek(X1+NO)
  680.          Next 
  681.          For X1=Start(6)+Length(6)-NO To Start(6)+Length(6)
  682.             Poke X1,0
  683.          Next 
  684.          Clear Key : CHANGED=1
  685.          EXTRA=EXTRA+NO
  686.          Goto MAIN2
  687.       End If 
  688.       If SC=0
  689.          If COUNT>500
  690.             MSG["|"]
  691.             COUNT=0
  692.          Else 
  693.             Inc COUNT
  694.          End If 
  695.       Else 
  696.          MSG["|"]
  697.       End If 
  698.       If SC=78 : Inc X : End If 
  699.       If SC=79
  700.          Dec X
  701.          If X<64
  702.             Dec Y : X=79
  703.             If Y<0
  704.                Y=0 : X=63
  705.             End If 
  706.          End If 
  707.       End If 
  708.       If SC=77
  709.          Curs Off 
  710.          If KS=8
  711.             OFFSET=Length(6)/16
  712.             Goto MAIN2
  713.          End If 
  714.          If KS=16 or KS=32
  715.             OFFSET=OFFSET+28
  716.             Goto MAIN2
  717.          End If 
  718.          If KS=64 or KS=128
  719.             OFFSET=OFFSET+280
  720.             Goto MAIN2
  721.          End If 
  722.          Inc Y : Clear Key 
  723.       End If 
  724.       If SC=76
  725.          Curs Off 
  726.          If KS=8
  727.             OFFSET=0
  728.             Goto MAIN2
  729.          End If 
  730.          If KS=16 or KS=32
  731.             OFFSET=OFFSET-28
  732.             Goto MAIN2
  733.          End If 
  734.          If KS=64 or KS=128
  735.             OFFSET=OFFSET-280
  736.             Goto MAIN2
  737.          End If 
  738.          Dec Y : Clear Key 
  739.       End If 
  740.       If X<64 : X=79 : Dec Y : End If 
  741.       If X>79
  742.          X=64 : Inc Y
  743.       End If 
  744.       If Y<0 : Y=0
  745.          OFFSET=OFFSET-28
  746.          If OFFSET>-28
  747.             Locate 0,27 : Print Space$(80);
  748.             Locate 0,0
  749.             Vscroll 1
  750.             Gosub CALC2
  751.             OFFSET=OFFSET+27
  752.          Else 
  753.             OFFSET=OFFSET+28
  754.             MSG["******** Start Of File ********"]
  755.          End If 
  756.       End If 
  757.       If Y>27 and(SC=77 or(TEMP>0 and X=64))
  758.          Inc OFFSET : Y=27
  759.          If OFFSET<Length(6)/16-27
  760.             Locate 0,28 : Print Space$(80);
  761.             Locate 0,27
  762.             Gosub CALC2
  763.          Else 
  764.             Dec OFFSET
  765.             MSG["******** End Of File ********"]
  766.          End If 
  767.       End If 
  768.       Locate X,Y
  769.       If Mouse Key=1
  770.          XC=X Text((X Mouse-111)*2) : YC=Y Text(Y Mouse-40)
  771.          If XC>63 and XC<80
  772.             X=XC : Y=YC
  773.          End If 
  774.          If XC>7 and XC<61
  775.             Pop Proc
  776.          End If 
  777.       End If 
  778.       If Instr(" `1234567890-=\~!@#$%^&*()_+|qwertyuiop[]{}asdfghjkl;:'zxcvbnm,./<>?"+Chr$(34)+Chr$(13),Lower$(K$))=0 : K$="" : End If 
  779.       If KS>7 : K$="" : End If 
  780.       If K$<>""
  781.          If K$=Chr$(13)
  782.             Print Chr$(186)
  783.          Else 
  784.             Print K$;
  785.          End If 
  786.          CHANGED=1
  787.          Inc X
  788.          Poke Start(6)+(OFFSET*16)+(Y*16)+(X-65),Asc(K$)
  789.       End If 
  790.       TEMP=SC
  791.    Loop 
  792.    Pop Proc
  793.    CALC2:
  794.    A$=""
  795.    Print Right$("00000"+Str$(X1+OFFSET)-" ",6);"  ";
  796.    For Y1=0 To 15
  797.       B=Start(6)+(16*X1)+Y1+(OFFSET*16)
  798.       BYTE=Peek(B)
  799.       If B>=Start(6)+Length(6)-EXTRA Then Pen 7 Else Pen 1
  800.       If B<Start(6)+Length(6)
  801.          Print Hex$(BYTE,2)-"$"+" ";
  802.          A$=A$+Chr$(BYTE)
  803.       Else 
  804.          A$=A$+" "
  805.          Print "   ";
  806.       End If 
  807.       Pen 1
  808.       If Y1=3 or Y1=7 or Y1=11
  809.          Print "  ";
  810.       End If 
  811.    Next 
  812.    FILTER[A$]
  813.    Print "  ";Param$;
  814.    Return 
  815.    MAIN2:
  816.    XC=X : YC=Y
  817. End Proc
  818. Procedure TELL[A$]
  819.    Window 2
  820.    Pen 2
  821.    Set Curs 192,192,192,192,192,192,192,192
  822.    Locate 24,1
  823.    Print A$;
  824.    Do 
  825.       K$=Inkey$ : SC=Scancode
  826.       Exit If K$=Chr$(13)
  827.       If Instr("1234567890",K$)=0 Then K$=""
  828.       O$=O$+K$
  829.       Wait 5
  830.       If SC=65 Then O$=Left$(O$,Len(O$)-1) : Print Cleft$;" ";
  831.       Curs Off 
  832.       Locate 51,1 : Print O$;
  833.       Curs On 
  834.    Loop 
  835.    Curs Off 
  836.    Window 1
  837.    MSG["|"]
  838. End Proc[Val(O$)]
  839. Procedure MSG[A$]
  840.    Window 2
  841.    Pen 2
  842.    Locate 0,1
  843.    If A$="|" : A$=Space$(79) : End If 
  844.    Centre A$
  845.    Window 1
  846. End Proc
  847. Procedure CHKDSK[FIL$]
  848.    EX=1
  849.    DF0:
  850.    If Upper$(FIL$)="DF0:"
  851.       If Not Exist("df0:")
  852.          REQUEST["No Disk In","Drive df0:",1]
  853.          EX=Param
  854.          If EX=0 : Goto EXTCHK : End If 
  855.       End If 
  856.       If Exist("df0:")
  857.          Goto EXTCHK
  858.       Else 
  859.          Goto DF0
  860.       End If 
  861.    End If 
  862.    DF1:
  863.    If Upper$(FIL$)="DF1:"
  864.       If Not Exist("df1:")
  865.          REQUEST["No Disk In","Drive df1:",1]
  866.          EX=Param
  867.          If EX=0 : Goto EXTCHK : End If 
  868.       End If 
  869.       If Exist("df1:")
  870.          Goto EXTCHK
  871.       Else 
  872.          Goto DF1
  873.       End If 
  874.    End If 
  875.    If FIL$="" Then FIL$=" "
  876.    FILE:
  877.    If Not Exist(FIL$)
  878.       REQUEST["Path Or File Not Found","Select Cancel To Continue",1]
  879.       EX=Param
  880.       If EX=0 : Goto EXTCHK : End If 
  881.       If Exist(FIL$)
  882.          Goto EXTCHK
  883.       Else 
  884.          Goto FILE
  885.       End If 
  886.    End If 
  887.    EXTCHK: If EX<>0 Then EX=1
  888. End Proc[EX]
  889. Procedure REQUEST[A$,B$,R]
  890.    Screen Open 1,320,96,8,Hires
  891.    Screen Display 1,200,110,,
  892.    Get Palette 0
  893.    Flash Off : Curs Off : Paper 0
  894.    Cls 0
  895.    Border 0,7,2
  896.    Reserve Zone 3
  897.    Clear Key 
  898.    If R=1 Then C$=" Cancel " : R$=" Retry  " : CK$="C" : RK$="R"
  899.    If R=0 Then C$=" Abort  " : R$=" Continue " : CK$="A" : RK$="C"
  900.    Border ,1,2
  901.    Wind Open 11,0,0,37,12,1
  902.    Pen 1 : Paper 2 : Clw : Curs Off 
  903.    Print " ";
  904.    Print Border$("         System Interupt        ",1)
  905.    Cdown : Cdown : Cdown 
  906.    Centre Left$(A$,34)
  907.    Cdown 
  908.    Centre Left$(B$,34)
  909.    PR: Pen 1
  910.    Locate 2,8 : Print Border$(Zone$(R$,1),1)
  911.    Locate 24,8 : Print Border$(Zone$(C$,2),1)
  912.    Pen 3
  913.    Locate 3,8 : Print Mid$(R$,2,1)
  914.    Locate 25,8 : Print Mid$(C$,2,1)
  915.    Do 
  916.       If B$="Drive df0:" Then Gosub CHKDF0
  917.       If B$="Drive df1:" Then Gosub CHKDF1
  918.       MZ=Mouse Zone
  919.       If MZ=1
  920.          Locate 2,8 : Print Border$(R$,1)
  921.          Repeat : Gosub KECHK
  922.             If Mouse Key=1 : Goto RELOP : End If 
  923.          Until Mouse Zone<>1
  924.          Goto PR
  925.       End If 
  926.       If MZ=2
  927.          Locate 24,8 : Print Border$(C$,1)
  928.          Repeat : Gosub KECHK
  929.             If Mouse Key=1 : Goto CALOP : End If 
  930.          Until Mouse Zone<>2
  931.          Goto PR
  932.       End If 
  933.       Gosub KECHK
  934.    Loop 
  935.    CHKDF0:
  936.    If Exist("df0:") Then Pop : Goto RELOP
  937.    Return 
  938.    CHKDF1:
  939.    If Exist("df1:") Then Pop : Goto RELOP
  940.    Return 
  941.    KECHK: K$=Upper$(Inkey$)
  942.    If K$=Chr$(13) : Pop : Goto RELOP : End If 
  943.    If K$=CK$ : Pop : Goto CALOP : End If 
  944.    If K$=RK$ : Pop : Goto RELOP : End If 
  945.    Return 
  946.    CALOP: E=-1
  947.    RELOP: E=E+1
  948.    Wind Close 
  949.    Screen Close 1
  950. End Proc[E]
  951. Procedure INITALISE
  952.    If Screen>-1
  953.       Screen Close Screen
  954.    End If 
  955.    Colour Back $68F
  956.    Screen Open 0,640,260,8,Hires
  957.    Screen Display 0,120,40,,
  958.    Change Mouse 4
  959.    DEFMENU
  960.    Palette $68F,0,$FFF,$F00,$C,$888,$333,$900
  961.    Colour 17,$F00 : Colour 18,$FCC : Colour 19,0
  962.    Flash Off 
  963.    Border 0,7,2
  964.    Wind Open 2,8,0,80,2,0
  965.    Curs Off : Cls 0
  966.    Paper 0
  967.    Wind Open 1,8,16,80,29,0
  968.    Curs Off 
  969.    Window 2
  970.    Paper 4
  971.    Limit Mouse 112,40 To 430,295
  972.    Pen 2 : Clw 
  973.    Print " < HexEd   V 1.1 >              FILE.                           SIZE.";
  974.    Key Speed 20,5
  975.    Reserve As Work 6,1
  976. End Proc
  977. Procedure GTFILE[NME$]
  978.    On Error Proc ERRHANDLER
  979.    Shared OFFSET
  980.    CHKDSK["df0:"]
  981.    CHKDSK[NME$]
  982.    If Param=0 Then Pop Proc
  983.    If CHANGED=1
  984.       REQUEST["File Has Not Been Saved","Do You Want To Discard Changes",0]
  985.       If Param=0 : Pop Proc : End If 
  986.    End If 
  987.    Open In 1,NME$
  988.    EXTRA=128
  989.    X=Lof(1)
  990.    If X<433
  991.       EXTRA=446-X
  992.    End If 
  993.    X=X+EXTRA
  994.    Close 1
  995.    MSG["**** Loading "+NME$+" ****"]
  996.    Erase 6
  997.    Reserve As Work 6,X
  998.    Bload NME$,6
  999.    OFFSET=0 : CHANGED=0
  1000. End Proc
  1001. Procedure PTFILE[NME$]
  1002.    On Error Proc ERRHANDLER
  1003.    CHKDSK["df0:"]
  1004.    If Param=0 Then Pop Proc
  1005.    If NME$<>""
  1006.       MSG["**** Saving "+NME$+" ****"]
  1007.       Bsave NME$,Start(6) To Start(6)+Length(6)-EXTRA
  1008.       CHANGED=0
  1009.       MSG["|"]
  1010.    End If 
  1011. End Proc
  1012. Procedure HELP
  1013.    Screen Open 1,576,224,8,Hires
  1014.    Screen Display 1,128,48,,
  1015.    Get Palette 0
  1016.    Flash Off : Curs Off : Paper 0
  1017.    Cls 0
  1018.    Clear Key 
  1019.    Border ,1,2
  1020.    Wind Open 10,0,0,68,28,1
  1021.    Pen 1 : Paper 2 : Clw : Curs Off 
  1022.    Print " ";
  1023.    Print Border$(" HexEd. Version 1.1     - INSTRUCTIONS -        M. Warren. 1991 ",1)
  1024.    Cdown : Cdown 
  1025.    Print "  EDITING KEYS -"
  1026.    Print At(7,);"Cursor keys         - Move around file (One character)"
  1027.    Print At(7,);"Cntrl + Cursor keys - To top or bottom of file"
  1028.    Print At(7,);"Alt + Cursor keys   - Up or down one page (28 lines)"
  1029.    Print At(7,);"Amiga + Cursor keys - Up or down 10 pages"
  1030.    Print At(7,);"Esc Key             - Switch between Hex & ASCII editing "
  1031.    Print At(7,);"Del Key   (Delete)  - Enter number of bytes to delete"
  1032.    Print At(7,);"Alt + Del (Insert)  - Enter number of bytes to insert"
  1033.    Print At(7,);"NOTE: Insert & Delete should be used carefully" : Print 
  1034.    Print "  MENU SHORCUTS -"
  1035.    Print At(7,);"F1. Load file            F6. Print Hex & ASCII"
  1036.    Print At(7,);"F2. Save file            F7. Print Unformatted ASCII"
  1037.    Print At(7,);"F3. Save file as...      F8. Print Formatted ASCII"
  1038.    Print At(7,);"F10. Quit program        NOTE: File must be standard"
  1039.    Print At(7,);"Help. This requestor           ASCII to format properly"
  1040.    Print : Print "  FILE REQUESTOR -"
  1041.    Print At(7,);"All Functions may use the mouse or keyboard"
  1042.    Print At(7,);"For LOAD, FILE, DELETE etc. use Alt + first letter"
  1043.    Cdown : Centre "< Click Mouse To Continue >"
  1044.    Do 
  1045.       K$=Inkey$
  1046.       Exit If K$<>""
  1047.       Exit If Mouse Key
  1048.    Loop 
  1049.    Wind Close 
  1050.    Screen Close 1
  1051. End Proc
  1052. Procedure FILTER[ST$]
  1053.    If ST$="" Then ST$=" "
  1054.    TX$="`1234567890-=\qwertyuiop[]asdfghjkl;'zxcvbnm,./ !~@#$%^&*()_+|{}:<>?"+Chr$(34)
  1055.    For X=1 To Len(ST$)
  1056.       TEMP$=Mid$(ST$,X,1)
  1057.       If Instr(TX$,Lower$(TEMP$))=0 Then TEMP$=Chr$(186)
  1058.       OUT$=OUT$+TEMP$
  1059.    Next 
  1060. End Proc[OUT$]
  1061. Procedure FILTER2[ST$]
  1062.    If ST$="" Then ST$=" "
  1063.    TX$="`1234567890-=\qwertyuiop[]asdfghjkl;'zxcvbnm,./ !~@#$%^&*()_+|{}:<>?"+Chr$(34)
  1064.    For X=1 To Len(ST$)
  1065.       TEMP$=Mid$(ST$,X,1)
  1066.       If Instr(TX$,Lower$(TEMP$))=0 Then TEMP$="."
  1067.       OUT$=OUT$+TEMP$
  1068.    Next 
  1069. End Proc[OUT$]
  1070. Procedure CHKMENU1
  1071.    Menu Off 
  1072.    If Choice(1)=1
  1073.       If Choice(2)=2
  1074.          CHKDSK[NAME$]
  1075.          If Param=1 : PTFILE[NAME$] : End If 
  1076.       End If 
  1077.       If Choice(2)=3
  1078.          CHKDSK["df0:"]
  1079.          If Param=1
  1080.             FILEREQ["<<< SAVE FILE AS >>>",1]
  1081.             NME$=Param$
  1082.             If NME$<>"" : PTFILE[NME$] : NAME$=NME$ : End If 
  1083.          End If 
  1084.       End If 
  1085.       If Choice(2)=5
  1086.          REQUEST["Are You Sure","You Want To Quit",0]
  1087.          E=Param
  1088.          If E=1
  1089.             If CHANGED>0
  1090.                REQUEST["File Has Been Modified","Are You Sure",0]
  1091.                E=Param
  1092.             End If 
  1093.          End If 
  1094.          If E=1 : Run "MenuProgram" : End If 
  1095.       End If 
  1096.       If Choice(2)=4
  1097.          HELP
  1098.       End If 
  1099.       If Choice(2)=1
  1100.          FILEREQ["<<< LOAD FILE >>>",0]
  1101.          NME$=Param$
  1102.          If NME$<>""
  1103.             NAME$=NME$
  1104.             GTFILE[NAME$]
  1105.          End If 
  1106.       End If 
  1107.    End If 
  1108.    Clear Key 
  1109.    Menu On 
  1110. End Proc
  1111. Procedure CHKMENU2
  1112.    Menu Off 
  1113.    If Choice(1)=2
  1114.       If Choice(2)=1
  1115.          HEXPRINT
  1116.       End If 
  1117.       If Choice(2)=2
  1118.          TEXPRINT
  1119.       End If 
  1120.       If Choice(2)=3
  1121.          FTEXPRINT
  1122.       End If 
  1123.    End If 
  1124.    Clear Key 
  1125.    Menu On 
  1126. End Proc
  1127. Procedure DEFMENU
  1128.    Menu$(1)="System  "
  1129.    Menu$(1,1)="Load File...... F1      "
  1130.    Menu$(1,2)="Save File...... F2      "
  1131.    Menu$(1,3)="Save as........ F3      "
  1132.    Menu$(1,4)="About.......... Help    "
  1133.    Menu$(1,5)="Quit........... F10     "
  1134.    Menu$(2)="Print  "
  1135.    Menu$(2,1)="Print HEXADECIMAL....... F6 "
  1136.    Menu$(2,2)="Print ASCII Unformated.. F7 "
  1137.    Menu$(2,3)="Print ASCII Formated.... F8 "
  1138.    Menu On 
  1139.    Menu Key(1,1) To 80
  1140.    Menu Key(1,2) To 81
  1141.    Menu Key(1,3) To 82
  1142.    Menu Key(1,4) To 95
  1143.    Menu Key(1,5) To 89
  1144.    Menu Key(2,1) To 85
  1145.    Menu Key(2,2) To 86
  1146.    Menu Key(2,3) To 87
  1147. End Proc