Author Topic: Updating XE, my old file editor/viewer project  (Read 4385 times)

0 Members and 1 Guest are viewing this topic.

Offline Dav

  • Forum Resident
  • Posts: 792
    • View Profile
Updating XE, my old file editor/viewer project
« on: February 15, 2021, 09:53:10 am »
This is an update to one of my old projects, first made in Qbasic.  It's a file editor/viewer.  I don't think its ever been posted at this forum.  I mostly use XE for peeking inside EXE/DLL files to read stuff, but you can use it to patch bytes too.  Removed windows API only code, it should work in linux now.  Got rid of DEG SEG/POKE stuff.  Added file select routine.  Cleaned up old style code a lot. Still need to remove all the Gosubs, and other things.

Load a file, press ENTER to switch viewing modes for it. Navigate through it with arrows, page up/down, home/end.  Press M for menu.  You can damage files with this, so be careful and use at your own risk only...

- Dav

Code: QB64: [Select]
  1. '============
  2. 'XE.BAS v1.11
  3. '============
  4. 'A simple File editor/viewer.
  5. 'Coded by Dav, FEB/2021 with QB64-GL v1.4.
  6. '
  7. '==========================================================================
  8. '* * * *          USE THIS PROGRAM AT YOUR OWN RISK ONLY!!          * * * *
  9. '==========================================================================
  10. '
  11. ' New in XE v1.11:
  12. ' ~~~~~~~~~~~~~~~
  13. '
  14. ' * FIXED: Changed DEF SEG/POKE to PRINT calls - using _CONTROLCHR OFF now.
  15. ' * FIXED: Removed Windows API calls to let XE compile on other Platforms
  16. ' * ADDED: Now uses a FileSelect box, instead of having to type filename.
  17. ' * FIXED: Shows long file name at top, instead of the short 8.3 filename.
  18. ' * FIXED: Cleaned up code vastly to make it seem like a human wrote it.
  19. '          (Still a lot more to do...)
  20. '
  21. ' THINGS TO DO:
  22. '                  Add HEX Searching too.
  23. '                  Add TEXT view for reading text files?
  24. '                  Add a Create File option?
  25. '                  Add (I) Info - Display File Information
  26. '                  Add a File Copy to location...
  27. '                      ...or more file manager like stuff
  28. '                  Highlight found text when searching
  29. '
  30. '==========================================================================
  31. '
  32. ' ABOUT:
  33. ' ~~~~~
  34. '
  35. ' XE is a simple Binary File Editor (also called a HEX editor) that lets
  36. ' you view and edit raw data bytes of a file.  With XE you can peek inside
  37. ' EXE/DLL files and see what information they may contain.  XE also has the
  38. ' capacity to change bytes by either typing in ASCII characters or entering
  39. ' the HEX value for each byte.  XE was first coded in Qbasic - now in QB64.
  40. '
  41. ' Since the very nature of XE is to alter file data you should always use
  42. ' EXTREME caution when editing any file - AND ALWAYS MAKE A BACKUP FIRST!
  43. '
  44. '==========================================================================
  45. '
  46. ' HOW TO USE:
  47. ' ~~~~~~~~~~
  48. '
  49. ' XE accepts command line arguments.  You can drag/drop a file onto XE.
  50. ' If you don't specify a filename on startup, XE will ask you for one.
  51. '
  52. ' There are TWO ways to View & Edit files - in HEX (default) or ASCII mode.
  53. '
  54. ' Files are first opened in HEX mode displaying 2 windows of data.  The
  55. ' right window shows the charaters while the larger left window shows HEX
  56. ' values for them. HEX mode is best for patching and is the only way to
  57. ' edit the HEX values of bytes.
  58. '
  59. '
  60. ' Pressing ENTER switches to ASCII (non-HEX) mode, showing a larger page
  61. ' of raw data bytes - the ASCII chracter data only.  This mode is best for
  62. ' skimming through files faster.  ENTER toggles view modes back and forth.
  63. '
  64. ' While viewing a file you can browse through the file using the ARROWS,
  65. ' PAGEUP/DOWN, HOME and the END keys.
  66. '
  67. ' The currently opened filename is shown with full path in the title bar.
  68. ' and just filename is displayed in the FILE: area just below title bar.
  69. '
  70. ' While viewing a file, press E to enter into EDIT mode and begin editing
  71. ' bytes at the current position. If you're in HEX mode (2 windows), you can
  72. ' edit bytes either by typing characters on the right side or entering HEX
  73. ' values on the left window.  Press TAB to switch windows to edit in.
  74. ' Press ESC to save or disgard changes and to exit editing mode.
  75. '
  76. ' Press M for a complete MENU listing all of the Key COMMANDS.
  77. '
  78. '==========================================================================
  79. '
  80. ' COMMAND:
  81. ' ~~~~~~~~
  82. '
  83. '         E  =  Enters EDIT MODE. Only the displayed bytes can be edited.
  84. '
  85. '       TAB  =  Switchs panes (the cursor) while editing in HEX mode.
  86. '
  87. '         S  =  Searches file for a string starting at the current byte.
  88. '               A Match-Case option is available.  A high beep alerts you
  89. '               when match is found. A Low beep sounds when EOF reached.
  90. '
  91. '         N  =  Finds NEXT Match after a do a string search.
  92. '
  93. '         F  =  Toggles FILTERING of all non-standard-text characters.
  94. '               A flashing "F" is at the top-left corner when FILTER ON.
  95. '
  96. '         G  =  GOTO a certain byte position (number) in the file.
  97. '
  98. '         L  =  GOTO a specified location (Hex value) of the file.
  99. '
  100. '     ENTER  =  Toggles HEX and ASCII view modes.  The ASCII mode lets
  101. '               you browse more data per page.  You can EDIT in both
  102. '               modes but can only enter in HEX vaules in HEX mode.
  103. '
  104. '       ESC  =  EXITS out of editing mode, and also EXITS the program.
  105. '
  106. ' ALT+ENTER  =  Toggle FULLSCREEN/WINDOWED mode of the XE program.
  107. '
  108. '==========================================================================
  109. '==========================================================================
  110.  
  111.  
  112. '==========================================================================
  113. 'SETUP SCREEN MODE
  114. '=================
  115.  
  116. SCREEN Pete: WIDTH 80, 25 'Use Screen mode 0, aka the Pete...
  117. DO UNTIL _SCREENEXISTS: LOOP 'Be sure window exists before calling _TITLE
  118. _CONTROLCHR OFF 'Printing all 255 characters on screen, so this is needed.
  119.  
  120. _TITLE "XE v1.11" 'Everything has a name
  121.  
  122.  
  123. '==========================================================================
  124. 'LOAD FILE
  125. '=========
  126.  
  127. CLS , 1: COLOR 1, 15
  128. LOCATE 1, 1: PRINT STRING$(80, 32);
  129. LOCATE 1, 1: PRINT " Load file...";
  130.  
  131.     File$ = FileSelect$(5, 10, 15, 55, "*.*")
  132.     IF File$ = "" THEN
  133.         PRINT "No file selected."
  134.         END
  135.     END IF
  136.     File$ = COMMAND$
  137.  
  138. IF _FILEEXISTS(File$) = 0 THEN
  139.     COLOR 7, 0: CLS
  140.     PRINT "XE v1.11 - Binary file editor."
  141.     PRINT
  142.     PRINT File$; " not found!"
  143.     END
  144.  
  145. File$ = LTRIM$(RTRIM$(File$)) 'trim off any spaces is any...
  146. FullFileName$ = File$ 'make a copy For TITLE/OPEN to use...
  147.  
  148. 'If filename+path too long for display, strip off path
  149. IF LEN(File$) > 70 THEN
  150.     ts$ = ""
  151.     FOR q = LEN(File$) TO 1 STEP -1
  152.         t$ = MID$(File$, q, 1)
  153.         IF t$ = "/" OR t$ = "\" THEN EXIT FOR
  154.         ts$ = t$ + ts$
  155.     NEXT
  156.     File$ = ts$
  157.     'If filename too long, shorten it for display
  158.     IF LEN(File$) > 70 THEN
  159.         File$ = MID$(File$, 1, 67) + "..."
  160.     END IF
  161.  
  162. '==========================================================================
  163. 'OPEN FILE
  164. '=========
  165.  
  166. OPEN FullFileName$ FOR BINARY AS 7
  167.  
  168. _TITLE "XE v1.11 - " + FullFileName$
  169.  
  170. DisplayView% = 1 'Default to 2-PANE view
  171.  
  172. ByteLocation& = 1
  173. IF DisplayView% = 1 THEN
  174.     BufferSize% = (16 * 23)
  175.     BufferSize% = (79 * 23)
  176. IF BufferSize% > LOF(7) THEN BufferSize% = LOF(7)
  177.  
  178.  
  179. '==========================================================================
  180. 'DISPLAY FILE
  181. '============
  182.  
  183. COLOR 15, 1: CLS: LOCATE 1, 1, 0
  184.  
  185.     SEEK #7, ByteLocation&
  186.  
  187.     PageOfData$ = INPUT$(BufferSize%, 7)
  188.  
  189.     'If dual pane mode....
  190.     IF DisplayView% = 1 THEN
  191.         IF LEN(PageOfData$) < (16 * 23) THEN
  192.             PageFlag% = 1: PageLimit% = LEN(PageOfData$)
  193.             PageOfData$ = PageOfData$ + STRING$(16 * 23 - LEN(PageOfData$), CHR$(0))
  194.         END IF
  195.         'show right side
  196.         y% = 3: x% = 63
  197.         FOR c% = 1 TO LEN(PageOfData$)
  198.             CurrentByte% = ASC(MID$(PageOfData$, c%, 1))
  199.             'show a . instead of a null (looks better to me)
  200.             IF CurrentByte% = 0 THEN CurrentByte% = 46
  201.             IF Filter% = 1 THEN
  202.                 SELECT CASE CurrentByte%
  203.                     CASE 0 TO 31, 123 TO 255: CurrentByte% = 32
  204.                 END SELECT
  205.             END IF
  206.             LOCATE y%, x%: PRINT CHR$(CurrentByte%);
  207.             x% = x% + 1: IF x% = 79 THEN x% = 63: y% = y% + 1
  208.         NEXT
  209.         'show left side
  210.         y% = 3: x% = 15
  211.         FOR c% = 1 TO LEN(PageOfData$)
  212.             CurrentByte% = ASC(MID$(PageOfData$, c%, 1))
  213.             CurrentByte$ = HEX$(CurrentByte%): IF LEN(CurrentByte$) = 1 THEN CurrentByte$ = "0" + CurrentByte$
  214.             LOCATE y%, x%: PRINT CurrentByte$; " ";
  215.             x% = x% + 3: IF x% >= 62 THEN x% = 15: y% = y% + 1
  216.         NEXT
  217.     ELSE
  218.         'One page display, Full view
  219.         'Adjust data size used
  220.         IF LEN(PageOfData$) < (79 * 23) THEN 'Enough to fill screen?
  221.             PageFlag% = 1: PageLimit% = LEN(PageOfData$) 'No? Mark this and pad
  222.             PageOfData$ = PageOfData$ + SPACE$(79 * 23 - LEN(PageOfData$)) 'data with spaces.
  223.         END IF
  224.         y% = 3: x% = 1 'Screen location where data begins displaying
  225.         FOR c% = 1 TO LEN(PageOfData$) 'Show all the bytes.
  226.             CurrentByte% = ASC(MID$(PageOfData$, c%, 1)) 'Check the ASCII value.
  227.             IF Filter% = 1 THEN 'If Filter is turned on,
  228.                 SELECT CASE CurrentByte% 'changes these values to spaces
  229.                     CASE 0 TO 32, 123 TO 255: CurrentByte% = 32
  230.                 END SELECT
  231.             END IF
  232.             LOCATE y%, x%: PRINT CHR$(CurrentByte%);
  233.             'This line calculates when to go to next row.
  234.             x% = x% + 1: IF x% = 80 THEN x% = 1: y% = y% + 1
  235.         NEXT
  236.     END IF
  237.  
  238.     GOSUB DrawTopBar 'update viewing info at top
  239.  
  240.     'Get user input
  241.     DO
  242.  
  243.         DO UNTIL L$ <> "": L$ = INKEY$: LOOP
  244.         K$ = L$: L$ = ""
  245.  
  246.         GOSUB DrawTopBar
  247.         SELECT CASE UCASE$(K$)
  248.             CASE CHR$(27): EXIT DO
  249.             CASE "M": GOSUB Menu:
  250.             CASE "N"
  251.                 IF s$ <> "" THEN
  252.                     GOSUB Search
  253.                     GOSUB DrawTopBar
  254.                 END IF
  255.             CASE "E"
  256.                 IF DisplayView% = 1 THEN
  257.                     GOSUB EditRightSide
  258.                 ELSE
  259.                     GOSUB EditFullView
  260.                 END IF
  261.                 GOSUB DrawTopBar
  262.             CASE "F"
  263.                 IF Filter% = 0 THEN Filter% = 1 ELSE Filter% = 0
  264.             CASE "G"
  265.                 LOCATE 1, 1: PRINT STRING$(80 * 3, 32);
  266.                 LOCATE 1, 3: PRINT "TOTAL BYTES>"; LOF(7)
  267.                 INPUT "  GOTO BYTE# > ", GotoByte$
  268.                 IF GotoByte$ <> "" THEN
  269.                     TMP$ = ""
  270.                     FOR m% = 1 TO LEN(GotoByte$)
  271.                         G$ = MID$(GotoByte$, m%, 1) 'to numerical vales
  272.                         SELECT CASE ASC(G$)
  273.                             CASE 48 TO 57: TMP$ = TMP$ + G$
  274.                         END SELECT
  275.                     NEXT: GotoByte$ = TMP$
  276.                     IF VAL(GotoByte$) < 1 THEN GotoByte$ = "1"
  277.                     IF VAL(GotoByte$) > LOF(7) THEN GotoByte$ = STR$(LOF(7))
  278.                     IF GotoByte$ <> "" THEN ByteLocation& = 0 + VAL(GotoByte$)
  279.                 END IF
  280.             CASE "L"
  281.                 LOCATE 1, 1: PRINT STRING$(80 * 3, 32);
  282.                 LOCATE 1, 3: 'PRINT "TOTAL BYTES>"; LOF(7)
  283.                 INPUT "  GOTO HEX LOCATION-> ", GotoByte$
  284.                 IF GotoByte$ <> "" THEN
  285.                     GotoByte$ = "&H" + GotoByte$
  286.                     IF VAL(GotoByte$) < 1 THEN GotoByte$ = "1"
  287.                     IF VAL(GotoByte$) > LOF(7) THEN GotoByte$ = STR$(LOF(7))
  288.                     IF GotoByte$ <> "" THEN ByteLocation& = 0 + VAL(GotoByte$)
  289.                 END IF
  290.             CASE "S": s$ = ""
  291.                 LOCATE 1, 1: PRINT STRING$(80 * 3, 32);
  292.                 LOCATE 1, 3: INPUT "Search for> ", s$
  293.                 IF s$ <> "" THEN
  294.                     PRINT "  CASE sensitive (Y/N)? ";
  295.                     I$ = INPUT$(1): I$ = UCASE$(I$)
  296.                     IF I$ = "Y" THEN CaseOn% = 1 ELSE CaseOn% = 0
  297.                     GOSUB Search
  298.                 END IF
  299.                 GOSUB DrawTopBar
  300.             CASE CHR$(13)
  301.                 IF DisplayView% = 1 THEN
  302.                     DisplayView% = 0
  303.                     BufferSize% = (79 * 23)
  304.                 ELSE
  305.                     DisplayView% = 1
  306.                     BufferSize% = (16 * 23)
  307.                 END IF
  308.                 GOSUB DrawTopBar
  309.             CASE CHR$(0) + CHR$(72)
  310.                 IF DisplayView% = 1 THEN
  311.                     IF ByteLocation& > 15 THEN ByteLocation& = ByteLocation& - 16
  312.                 ELSE
  313.                     IF ByteLocation& > 78 THEN ByteLocation& = ByteLocation& - 79
  314.                 END IF
  315.             CASE CHR$(0) + CHR$(80)
  316.                 IF DisplayView% = 1 THEN
  317.                     IF ByteLocation& < LOF(7) - 15 THEN ByteLocation& = ByteLocation& + 16
  318.                 ELSE
  319.                     IF ByteLocation& < LOF(7) - 78 THEN ByteLocation& = ByteLocation& + 79
  320.                 END IF
  321.             CASE CHR$(0) + CHR$(73): ByteLocation& = ByteLocation& - BufferSize%: IF ByteLocation& < 1 THEN ByteLocation& = 1
  322.             CASE CHR$(0) + CHR$(81): IF ByteLocation& < LOF(7) - BufferSize% THEN ByteLocation& = ByteLocation& + BufferSize%
  323.             CASE CHR$(0) + CHR$(71): ByteLocation& = 1
  324.             CASE CHR$(0) + CHR$(79): IF NOT EOF(7) THEN ByteLocation& = LOF(7) - BufferSize%
  325.         END SELECT
  326.     LOOP UNTIL K$ <> ""
  327. LOOP UNTIL K$ = CHR$(27)
  328.  
  329.  
  330.  
  331. '==========================================================================
  332. '                              GOSUB ROUTINES
  333. '==========================================================================
  334.  
  335.  
  336. '==========================================================================
  337. Search:
  338. '======
  339.  
  340.     DO
  341.         B$ = INPUT$(BufferSize%, 7): ByteLocation& = ByteLocation& + BufferSize%
  342.         IF CaseOn% = 0 THEN B$ = UCASE$(B$): s$ = UCASE$(s$)
  343.         d$ = INKEY$: IF d$ <> "" THEN EXIT DO
  344.         IF INSTR(1, B$, s$) THEN SOUND 4000, .5: EXIT DO
  345.     LOOP UNTIL INSTR(1, B$, s$) OR EOF(7)
  346.     IF EOF(7) THEN SOUND 2000, 1: SOUND 1000, 1
  347.     ByteLocation& = ByteLocation& - LEN(s$)
  348.  
  349.  
  350. '==========================================================================
  351. EditRightSide: 'Editing Right side info in dual pane mode
  352. '============
  353.  
  354. Pane% = 1
  355.  
  356. x% = 63: IF rightx% THEN y% = CSRLIN ELSE y% = 3
  357. leftx% = 15
  358.  
  359. test% = POS(0)
  360.  
  361. IF test% = 15 OR test% = 16 THEN x% = 63: leftx% = 15
  362. IF test% = 18 OR test% = 19 THEN x% = 64: leftx% = 18
  363. IF test% = 21 OR test% = 22 THEN x% = 65: leftx% = 21
  364. IF test% = 24 OR test% = 25 THEN x% = 66: leftx% = 24
  365. IF test% = 27 OR test% = 28 THEN x% = 67: leftx% = 27
  366. IF test% = 30 OR test% = 31 THEN x% = 68: leftx% = 30
  367. IF test% = 33 OR test% = 34 THEN x% = 69: leftx% = 33
  368. IF test% = 36 OR test% = 37 THEN x% = 70: leftx% = 36
  369. IF test% = 39 OR test% = 40 THEN x% = 71: leftx% = 39
  370. IF test% = 42 OR test% = 43 THEN x% = 72: leftx% = 42
  371. IF test% = 45 OR test% = 46 THEN x% = 73: leftx% = 45
  372. IF test% = 48 OR test% = 49 THEN x% = 74: leftx% = 48
  373. IF test% = 51 OR test% = 52 THEN x% = 75: leftx% = 51
  374. IF test% = 54 OR test% = 55 THEN x% = 76: leftx% = 54
  375. IF test% = 57 OR test% = 58 THEN x% = 77: leftx% = 57
  376. IF test% = 60 OR test% = 61 THEN x% = 78: leftx% = 60
  377.  
  378. GOSUB DrawEditBar:
  379.  
  380. LOCATE y%, x%, 1, 1, 30
  381.  
  382.     DO
  383.         E$ = INKEY$
  384.         IF E$ <> "" THEN
  385.             SELECT CASE E$
  386.                 CASE CHR$(9)
  387.                     IF Pane% = 1 THEN
  388.                         Pane% = 2: GOTO EditLeftSide
  389.                     ELSE
  390.                         Pane% = 1: GOTO EditRightSide
  391.                     END IF
  392.                 CASE CHR$(27): EXIT DO
  393.                 CASE CHR$(0) + CHR$(72): IF y% > 3 THEN y% = y% - 1
  394.                 CASE CHR$(0) + CHR$(80): IF y% < 25 THEN y% = y% + 1
  395.                 CASE CHR$(0) + CHR$(75): IF x% > 63 THEN x% = x% - 1: leftx% = leftx% - 3
  396.                 CASE CHR$(0) + CHR$(77): IF x% < 78 THEN x% = x% + 1: leftx% = leftx% + 3
  397.                 CASE CHR$(0) + CHR$(73), CHR$(0) + CHR$(71): y% = 3
  398.                 CASE CHR$(0) + CHR$(81), CHR$(0) + CHR$(79): y% = 25
  399.                 CASE ELSE
  400.                     IF (ByteLocation& + ((y% - 3) * 16 + x% - 1) - 62) <= LOF(7) AND E$ <> CHR$(8) THEN
  401.                         changes% = 1
  402.                         'new color for changed bytes...
  403.                         COLOR 1, 15: LOCATE y%, x%: PRINT " ";
  404.                         LOCATE y%, leftx%
  405.                         CurrentByte$ = HEX$(ASC(E$)): IF LEN(CurrentByte$) = 1 THEN CurrentByte$ = "0" + CurrentByte$
  406.                         PRINT CurrentByte$;
  407.                         LOCATE y%, x%: PRINT E$;
  408.                         MID$(PageOfData$, ((y% - 3) * 16 + x% * 1) - 62) = E$
  409.                         IF x% < 78 THEN x% = x% + 1: leftx% = leftx% + 3 'skip space
  410.                     END IF
  411.             END SELECT
  412.         END IF
  413.     LOOP UNTIL E$ <> ""
  414.     LOCATE y%, x%
  415. LOOP UNTIL E$ = CHR$(27)
  416.  
  417. '==========================================================================
  418. SaveChanges:
  419. '===========
  420.  
  421. IF changes% = 1 THEN
  422.     SOUND 4500, .2: COLOR 15, 4: LOCATE , , 0
  423.     LOCATE 10, 29: PRINT CHR$(201); STRING$(21, 205); CHR$(187);
  424.     LOCATE 11, 29: PRINT CHR$(186); " Save Changes (Y/N)? "; CHR$(186);
  425.     LOCATE 12, 29: PRINT CHR$(200); STRING$(21, 205); CHR$(188);
  426.     N$ = INPUT$(1): COLOR 15, 1
  427.     IF UCASE$(N$) = "Y" THEN
  428.         IF PageFlag% = 1 THEN PageOfData$ = LEFT$(PageOfData$, PageLimit%)
  429.         PUT #7, ByteLocation&, PageOfData$:
  430.     END IF
  431. COLOR 15, 1: CLS: LOCATE 1, 1, 0
  432.  
  433.  
  434. '==========================================================================
  435. EditLeftSide: 'Editing Left side info in dual pane mode
  436. '===========
  437.  
  438. COLOR 1, 7
  439. x% = 15: 'y% = 3
  440. rightx% = 63
  441.  
  442. test% = POS(0)
  443. IF test% = 63 THEN x% = 15: rightx% = 63
  444. IF test% = 64 THEN x% = 18: rightx% = 64
  445. IF test% = 65 THEN x% = 21: rightx% = 65
  446. IF test% = 66 THEN x% = 24: rightx% = 66
  447. IF test% = 67 THEN x% = 27: rightx% = 67
  448. IF test% = 68 THEN x% = 30: rightx% = 68
  449. IF test% = 69 THEN x% = 33: rightx% = 69
  450. IF test% = 70 THEN x% = 36: rightx% = 70
  451. IF test% = 71 THEN x% = 39: rightx% = 71
  452. IF test% = 72 THEN x% = 42: rightx% = 72
  453. IF test% = 73 THEN x% = 45: rightx% = 73
  454. IF test% = 74 THEN x% = 48: rightx% = 74
  455. IF test% = 75 THEN x% = 51: rightx% = 75
  456. IF test% = 76 THEN x% = 54: rightx% = 76
  457. IF test% = 77 THEN x% = 57: rightx% = 77
  458. IF test% = 78 THEN x% = 60: rightx% = 78
  459.  
  460. GOSUB DrawEditBar:
  461.  
  462. LOCATE y%, x%, 1, 1, 30
  463.  
  464.     DO
  465.         E$ = INKEY$
  466.         IF E$ <> "" THEN
  467.             SELECT CASE E$
  468.                 CASE CHR$(9)
  469.                     IF Pane% = 1 THEN
  470.                         Pane% = 2: GOTO EditLeftSide
  471.                     ELSE
  472.                         Pane% = 1: GOTO EditRightSide
  473.                     END IF
  474.                 CASE CHR$(27): EXIT DO
  475.                 CASE CHR$(0) + CHR$(72): IF y% > 3 THEN y% = y% - 1
  476.                 CASE CHR$(0) + CHR$(80): IF y% < 25 THEN y% = y% + 1
  477.                 CASE CHR$(0) + CHR$(75) 'right arrow....
  478.                     IF x% > 15 THEN
  479.                         SELECT CASE x%
  480.                             CASE 17, 18, 20, 21, 23, 24, 26, 27, 29, 30, 32, 33, 35, 36, 38, 39, 41, 42, 44, 45, 47, 48, 50, 51, 53, 54, 56, 57, 59, 60, 62, 63
  481.                                 x% = x% - 2
  482.                                 rightx% = rightx% - 1
  483.                             CASE ELSE: x% = x% - 1
  484.                         END SELECT
  485.                     END IF
  486.  
  487.                 CASE CHR$(0) + CHR$(77)
  488.                     IF x% < 61 THEN
  489.                         SELECT CASE x%
  490.                             CASE 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 34, 35, 37, 38, 40, 41, 43, 44, 46, 47, 49, 50, 52, 53, 55, 56, 58, 59, 61, 62
  491.                                 x% = x% + 2
  492.                                 rightx% = rightx% + 1
  493.                             CASE ELSE: x% = x% + 1
  494.                         END SELECT
  495.                     END IF
  496.  
  497.                 CASE CHR$(0) + CHR$(73), CHR$(0) + CHR$(71): y% = 3
  498.                 CASE CHR$(0) + CHR$(81), CHR$(0) + CHR$(79): y% = 25
  499.                 CASE ELSE
  500.                     IF (ByteLocation& + ((y% - 3) * 16 + rightx% - 1) - 62) <= LOF(7) AND E$ <> CHR$(8) THEN
  501.                         SELECT CASE UCASE$(E$)
  502.                             CASE "A", "B", "C", "D", "E", "F", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"
  503.                                 E$ = UCASE$(E$)
  504.                                 changes% = 1
  505.                                 COLOR 1, 15: LOCATE y%, x%: PRINT " ";
  506.                                 LOCATE y%, x%: PRINT E$;
  507.                                 IF x% < 62 THEN
  508.  
  509.                                     SELECT CASE x%
  510.                                         CASE 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 34, 35, 37, 38, 40, 41, 43, 44, 46, 47, 49, 50, 52, 53, 55, 56, 58, 59, 61, 62
  511.                                             e2$ = CHR$(VAL("&H" + CHR$(SCREEN(y%, x% - 1)) + CHR$(SCREEN(y%, x%))))
  512.                                             'reflect changes on right panel
  513.                                             COLOR 1, 15: LOCATE y%, rightx%: PRINT " ";
  514.                                             LOCATE y%, rightx%: PRINT e2$;
  515.                                             MID$(PageOfData$, ((y% - 3) * 16 + rightx% * 1) - 62) = e2$
  516.                                             'dont advance cursor if at last place
  517.                                             IF x% < 61 THEN
  518.                                                 rightx% = rightx% + 1
  519.                                                 x% = x% + 2
  520.                                             END IF
  521.                                         CASE ELSE: x% = x% + 1
  522.                                     END SELECT
  523.                                 END IF
  524.                         END SELECT
  525.  
  526.                     END IF
  527.             END SELECT
  528.         END IF
  529.     LOOP UNTIL E$ <> ""
  530.     LOCATE y%, x%
  531. LOOP UNTIL E$ = CHR$(27)
  532.  
  533. GOTO SaveChanges:
  534.  
  535.  
  536. '==========================================================================
  537. EditFullView: 'Editing file in full display mode (one pane)
  538. '===========
  539.  
  540. COLOR 1, 7
  541. x% = 1: y% = 3
  542. changes% = 0
  543.  
  544. GOSUB DrawEditBar
  545.  
  546. LOCATE 3, 1, 1, 1, 30
  547.  
  548.     DO
  549.         E$ = INKEY$
  550.         IF E$ <> "" THEN
  551.             SELECT CASE E$
  552.                 CASE CHR$(27): EXIT DO
  553.                 CASE CHR$(0) + CHR$(72): IF y% > 3 THEN y% = y% - 1
  554.                 CASE CHR$(0) + CHR$(80): IF y% < 25 THEN y% = y% + 1
  555.                 CASE CHR$(0) + CHR$(75): IF x% > 1 THEN x% = x% - 1
  556.                 CASE CHR$(0) + CHR$(77): IF x% < 79 THEN x% = x% + 1
  557.                 CASE CHR$(0) + CHR$(73), CHR$(0) + CHR$(71): y% = 3
  558.                 CASE CHR$(0) + CHR$(81), CHR$(0) + CHR$(79): y% = 25
  559.                 CASE ELSE
  560.                     IF (ByteLocation& + (y% - 3) * 79 + x% - 1) <= LOF(7) AND E$ <> CHR$(8) THEN
  561.                         changes% = 1
  562.                         'new color for changed bytes
  563.                         COLOR 1, 15: LOCATE y%, x%: PRINT " ";
  564.                         LOCATE y%, x%: PRINT E$;
  565.                         MID$(PageOfData$, (y% - 3) * 79 + x% * 1) = E$
  566.                         IF x% < 79 THEN x% = x% + 1
  567.                     END IF
  568.             END SELECT
  569.         END IF
  570.     LOOP UNTIL E$ <> ""
  571.     GOSUB DrawEditBar
  572.     LOCATE y%, x%
  573. LOOP UNTIL E$ = CHR$(27)
  574.  
  575. GOTO SaveChanges:
  576.  
  577. '==========================================================================
  578. DrawEditBar:
  579. '===========
  580.  
  581. IF DisplayView% = 1 THEN
  582.     LOCATE 1, 1:
  583.     COLOR 31, 4: PRINT "  EDIT MODE: ";
  584.     COLOR 15, 4
  585.     PRINT " Press TAB to switch editing sides "; CHR$(179); " Arrows move cursor "; CHR$(179); " ESC=Exit ";
  586.     LOCATE 1, 1
  587.     COLOR 31, 4: PRINT " EDIT MODE ";
  588.     COLOR 15, 4
  589.     PRINT CHR$(179); " Arrows move cursor "; CHR$(179); " ESC=Exit "; CHR$(179);
  590.     LOCATE 1, 45: PRINT STRING$(35, " ");
  591.  
  592.     LOCATE 1, 46
  593.     CurrentByte& = ByteLocation& + (y% - 3) * 79 + x% - 1
  594.     CurrentValue% = ASC(MID$(PageOfData$, (y% - 3) * 79 + x% * 1, 1))
  595.     IF CurrentByte& > LOF(7) THEN
  596.         PRINT SPACE$(9); "PAST END OF FILE";
  597.     ELSE
  598.         PRINT "Byte:"; LTRIM$(STR$(CurrentByte&));
  599.         PRINT ", ASC:"; LTRIM$(STR$(CurrentValue%));
  600.         PRINT ", HEX:"; RTRIM$(HEX$(CurrentValue%));
  601.     END IF
  602.  
  603. '==========================================================================
  604. DrawTopBar:
  605. '============
  606.  
  607. COLOR 1, 15
  608. LOCATE 1, 1: PRINT STRING$(80, 32);
  609. LOCATE 2, 1: PRINT STRING$(80, 32);
  610.  
  611. LOCATE 1, 1
  612. IF Filter% = 1 THEN
  613.     COLOR 30, 4: PRINT "F";: COLOR 1, 15
  614.     PRINT " ";
  615.  
  616. PRINT "FILE: "; File$;
  617.  
  618. LOCATE 2, 2:
  619. PRINT "Total Bytes:"; LOF(7);
  620. EC& = ByteLocation& + BufferSize%: IF EC& > LOF(7) THEN EC& = LOF(7)
  621. PRINT CHR$(179); " Viewing Bytes:"; RTRIM$(STR$(ByteLocation&)); "-"; LTRIM$(STR$(EC&));
  622. LOCATE 1, 71: PRINT " M = Menu";
  623. COLOR 15, 1
  624. 'Draw bar on right side of screen
  625. FOR d% = 3 TO 25
  626.     LOCATE d%, 80: PRINT CHR$(176);
  627.  
  628. IF DisplayView% = 1 THEN
  629.     'Draw lines down screen
  630.     FOR d% = 3 TO 25
  631.         LOCATE d%, 79: PRINT CHR$(179);
  632.         LOCATE d%, 62: PRINT CHR$(179);
  633.         'add space around numbers...
  634.         '(full screen messes it...)
  635.         LOCATE d%, 13: PRINT " " + CHR$(179);
  636.         LOCATE d%, 1: PRINT CHR$(179) + " ";
  637.     NEXT
  638.  
  639.     'Draw location
  640.     FOR d% = 3 TO 25
  641.         LOCATE d%, 3
  642.         nm$ = HEX$(ByteLocation& - 32 + (d% * 16))
  643.         IF LEN(nm$) = 9 THEN nm$ = "0" + nm$
  644.         IF LEN(nm$) = 8 THEN nm$ = "00" + nm$
  645.         IF LEN(nm$) = 7 THEN nm$ = "000" + nm$
  646.         IF LEN(nm$) = 6 THEN nm$ = "0000" + nm$
  647.         IF LEN(nm$) = 5 THEN nm$ = "00000" + nm$
  648.         IF LEN(nm$) = 4 THEN nm$ = "000000" + nm$
  649.         IF LEN(nm$) = 3 THEN nm$ = "0000000" + nm$
  650.         IF LEN(nm$) = 2 THEN nm$ = "00000000" + nm$
  651.         IF LEN(nm$) = 1 THEN nm$ = "000000000" + nm$
  652.         PRINT nm$;
  653.     NEXT
  654.  
  655. Marker% = CINT(ByteLocation& / LOF(7) * 22)
  656. LOCATE Marker% + 3, 80: PRINT CHR$(178);
  657.  
  658. '==========================================================================
  659. Menu:
  660. '========
  661.  
  662. SOUND 4500, .2: COLOR 15, 0: LOCATE , , 0
  663. LOCATE 5, 24: PRINT CHR$(201); STRING$(34, 205); CHR$(187);
  664. FOR m = 6 TO 20
  665.     LOCATE m, 24: PRINT CHR$(186); SPACE$(34); CHR$(186);
  666. LOCATE 21, 24: PRINT CHR$(200); STRING$(34, 205); CHR$(188);
  667.  
  668. LOCATE 6, 26: PRINT "Use the arrow keys, page up/down";
  669. LOCATE 7, 26: PRINT "and Home/End keys to navigate.";
  670. LOCATE 9, 26: PRINT "E = Enter into file editing mode";
  671. LOCATE 10, 26: PRINT "F = Toggles the filter ON or OFF";
  672. LOCATE 11, 26: PRINT "G = Goto a certain byte position";
  673. LOCATE 12, 26: PRINT "L = Goto a certain HEX location";
  674. LOCATE 13, 26: PRINT "S = Searches for string in file";
  675. LOCATE 14, 26: PRINT "N = Find next match after search";
  676. LOCATE 16, 26: PRINT "ENTER = Toggle HEX/ASCII modes";
  677. LOCATE 17, 26: PRINT "TAB   = switch window (HEX mode)";
  678. LOCATE 18, 26: PRINT "ESC   = EXITS this program";
  679. LOCATE 20, 26: PRINT "ALT+ENTER for full screen window";
  680. Pause$ = INPUT$(1)
  681. COLOR 15, 1: CLS: LOCATE 1, 1, 0
  682.  
  683.  
  684. '==========================================================================
  685. '                           FUNCTIONS/SUBS
  686. '==========================================================================
  687.  
  688. FUNCTION FileSelect$ (y, x, y2, x2, Filespec$)
  689.  
  690.     '=== save original place of cursor
  691.     origy = CSRLIN: origx = POS(1)
  692.  
  693.     '=== save colors
  694.     fg& = _DEFAULTCOLOR
  695.     bg& = _BACKGROUNDCOLOR
  696.  
  697.     '=== Save whole screen
  698.     DIM scr1 AS _MEM, scr2 AS _MEM
  699.     scr1 = _MEMIMAGE(0): scr2 = _MEMNEW(scr1.SIZE)
  700.     _MEMCOPY scr1, scr1.OFFSET, scr1.SIZE TO scr2, scr2.OFFSET
  701.  
  702.     loadagain:
  703.  
  704.     top = 0
  705.     selection = 0
  706.  
  707.     IF INSTR(_OS$, "LINUX") THEN
  708.         SHELL _HIDE "find . -type d > $_TeMP_FILE_LIST"
  709.     ELSE
  710.         SHELL _HIDE "dir /b /A:D > $_TeMP_FILE_LIST"
  711.     END IF
  712.  
  713.     'get list...
  714.     REDIM FileNames$(5000) 'space for 5000 filenames
  715.  
  716.     'only show the ".." if not at root dir
  717.     IF LEN(_CWD$) <> 3 THEN
  718.         FileNames$(0) = ".."
  719.         LineCount = 1
  720.     ELSE
  721.         LineCount = 0
  722.     END IF
  723.  
  724.     FF = FREEFILE
  725.     OPEN "$_TeMP_FILE_LIST" FOR INPUT AS #FF
  726.  
  727.     WHILE ((LineCount < UBOUND(FileNames$)) AND (NOT EOF(FF)))
  728.         LINE INPUT #FF, rl$
  729.         FileNames$(LineCount) = "[" + rl$ + "]"
  730.         LineCount = LineCount + 1
  731.     WEND
  732.     CLOSE #FF
  733.  
  734.     'KILL "$_TeMP_FILE_LIST"
  735.     IF INSTR(_OS$, "LINUX") THEN
  736.         SHELL _HIDE "rm $_TeMP_FILE_LIST"
  737.         SHELL _HIDE "find . -type f " + CHR$(34) + Filespec$ + CHR$(34) + " > $_TeMP_FILE_LIST"
  738.     ELSE
  739.         SHELL _HIDE "del $_TeMP_FILE_LIST"
  740.         SHELL _HIDE "dir /b /A:-D " + Filespec$ + " > $_TeMP_FILE_LIST"
  741.     END IF
  742.  
  743.     FF = FREEFILE
  744.     OPEN "$_TeMP_FILE_LIST" FOR INPUT AS #FF
  745.     WHILE ((LineCount < UBOUND(FileNames$)) AND (NOT EOF(FF)))
  746.         LINE INPUT #FF, rl$
  747.         'skip the temp file...
  748.         IF rl$ <> "$_TeMP_FILE_LIST" THEN
  749.             FileNames$(LineCount) = rl$
  750.             LineCount = LineCount + 1
  751.         END IF
  752.     WEND
  753.     CLOSE #FF
  754.  
  755.     'KILL "$_TeMP_FILE_LIST"
  756.     IF INSTR(_OS$, "LINUX") THEN
  757.         SHELL _HIDE "rm $_TeMP_FILE_LIST"
  758.     ELSE
  759.         SHELL _HIDE "del $_TeMP_FILE_LIST"
  760.     END IF
  761.  
  762.  
  763.     'draw a box
  764.     COLOR _RGB(100, 100, 255)
  765.     FOR l = 0 TO y2 + 1
  766.         LOCATE y + l, x: PRINT STRING$(x2 + 4, CHR$(219));
  767.     NEXT
  768.  
  769.     'show current working dir
  770.     COLOR _RGB(255, 255, 255), _RGB(100, 100, 255)
  771.     CurDir$ = _CWD$
  772.     'Shorten it is too long, for display purposes
  773.     IF LEN(CurDir$) > x2 - x THEN
  774.         CurDir$ = MID$(CurDir$, 1, x2 - x - 3) + "..."
  775.     END IF
  776.     LOCATE y, x + 2: PRINT CurDir$;
  777.  
  778.     DO
  779.  
  780.         FOR l = 0 TO (y2 - 1)
  781.             LOCATE (y + 1) + l, (x + 2)
  782.             IF l + top = selection THEN
  783.                 COLOR _RGB(0, 0, 64), _RGB(255, 255, 255) 'selected line
  784.             ELSE
  785.  
  786.                 COLOR _RGB(255, 255, 255), _RGB(0, 0, 64) 'regular
  787.  
  788.                 'directories get a different color...
  789.                 IF MID$(FileNames$(top + l), 1, 1) = "[" THEN
  790.                     COLOR _RGB(255, 255, 0), _RGB(0, 0, 64)
  791.                 END IF
  792.             END IF
  793.             PRINT LEFT$(FileNames$(top + l) + STRING$(x2, " "), x2);
  794.         NEXT
  795.  
  796.         k$ = INKEY$
  797.         SELECT CASE k$
  798.             CASE IS = CHR$(0) + CHR$(72) 'Up arrow
  799.                 IF selection > 0 THEN selection = selection - 1
  800.                 IF selection < top THEN top = selection
  801.             CASE IS = CHR$(0) + CHR$(80) 'Down Arrow
  802.                 IF selection < (LineCount - 1) THEN selection = selection + 1
  803.                 IF selection > (top + (y2 - 2)) THEN top = selection - y2 + 1
  804.             CASE IS = CHR$(0) + CHR$(73) 'Page up
  805.                 top = top - y2
  806.                 selection = selection - y2
  807.                 IF top < 0 THEN top = 0
  808.                 IF selection < 0 THEN selection = 0
  809.             CASE IS = CHR$(0) + CHR$(81) 'Page Down
  810.                 top = top + y2
  811.                 selection = selection + y2
  812.                 IF top >= LineCount - y2 THEN top = LineCount - y2
  813.                 IF top < 0 THEN top = 0
  814.                 IF selection >= LineCount THEN selection = LineCount - 1
  815.             CASE IS = CHR$(0) + CHR$(71) 'Home
  816.                 top = 0: selection = 0
  817.             CASE IS = CHR$(0) + CHR$(79) 'End
  818.                 selection = LineCount - 1
  819.                 top = selection - y2 + 1
  820.                 IF top < 0 THEN top = 0
  821.             CASE IS = CHR$(27) ' ESC cancels
  822.                 FileSelect$ = ""
  823.                 EXIT DO
  824.             CASE IS = CHR$(13) 'Enter
  825.                 'go up one dir
  826.                 IF RTRIM$(FileNames$(selection)) = ".." THEN
  827.                     cd$ = _CWD$
  828.                     cd$ = LEFT$(cd$, _INSTRREV(cd$, "\"))
  829.                     CHDIR cd$
  830.                     ERASE FileNames$
  831.                     GOTO loadagain
  832.                 END IF
  833.                 'see if directory
  834.                 test$ = RTRIM$(FileNames$(selection))
  835.                 IF LEFT$(test$, 1) = "[" THEN
  836.                     test$ = MID$(test$, 2, LEN(test$) - 2)
  837.                     CHDIR test$
  838.                     ERASE FileNames$
  839.                     GOTO loadagain
  840.                 ELSE
  841.                     IF RIGHT$(_CWD$, 1) = "\" THEN
  842.                         C$ = _CWD$
  843.                     ELSE
  844.                         C$ = _CWD$ + "\"
  845.                     END IF
  846.                     FileSelect$ = C$ + RTRIM$(FileNames$(selection))
  847.                     EXIT DO
  848.                 END IF
  849.         END SELECT
  850.     LOOP
  851.  
  852.     _KEYCLEAR
  853.  
  854.     '=== Restore the whole screen
  855.     _MEMCOPY scr2, scr2.OFFSET, scr2.SIZE TO scr1, scr1.OFFSET
  856.     _MEMFREE scr1: _MEMFREE scr2
  857.  
  858.     '=== restore original y,x
  859.     LOCATE origy, origx
  860.  
  861.     COLOR fg&, bg&
  862.  
  863.  

 
xe-1.jpg

 
xe-2.jpg



Offline bplus

  • Global Moderator
  • Forum Resident
  • Posts: 8053
  • b = b + ...
    • View Profile
Re: Updating XE, my old file editor/viewer project
« Reply #1 on: February 15, 2021, 11:43:20 am »
@Dav,

Thanks for this, it is just the right sized I've been looking out for. I will check it ASAP.

Notepad++ has been doing well serving my needs, even for making Data Entry Forms, but I can't tailor it with my own code or yours or anybody else with a good idea.

Offline Dav

  • Forum Resident
  • Posts: 792
    • View Profile
Re: Updating XE, my old file editor/viewer project
« Reply #2 on: February 15, 2021, 01:40:52 pm »
Thanks.  There's a better hex editor made in QB64 out there, by eoredson, and it can create files.  I don't have a link to it, but you may could look for that if you're interested.

Edit: Found it on the forum.  It's here:
https://www.qb64.org/forum/index.php?topic=2024.0

- Dav
« Last Edit: February 15, 2021, 01:43:41 pm by Dav »

Offline bplus

  • Global Moderator
  • Forum Resident
  • Posts: 8053
  • b = b + ...
    • View Profile
Re: Updating XE, my old file editor/viewer project
« Reply #3 on: February 15, 2021, 03:56:28 pm »
Hex files were pretty cool back in the day of the DOS.

Then you could make little com files and assembly updates to what? I forget.. ALL from the most basic of BASICs G-W
or the likes of it. You discover you have powers over the book you are reading and can alter what it says and does and shows! You could actually change the boss, DOS, mind! :)

Now? not so much I think, graphics and sound occupy many a coders heart and imagination.
« Last Edit: February 15, 2021, 03:58:15 pm by bplus »

Offline NOVARSEG

  • Forum Resident
  • Posts: 509
    • View Profile
Re: Updating XE, my old file editor/viewer project
« Reply #4 on: February 16, 2021, 03:17:51 am »
@Dav

Really nice hex editor!.

idea
GOSUB LL1

LL1:
a = 10
a = 10
a = 10
a = 10

return

find where those a = 10 are

and insert machine code and return ??

Offline Dav

  • Forum Resident
  • Posts: 792
    • View Profile
Re: Updating XE, my old file editor/viewer project
« Reply #5 on: February 16, 2021, 08:43:00 am »
Bplus@ Yeah, I agree. I mostly use them for viewing now days.

Thanks, @NOVARSEG. Well, im probably gonna let this just age as is for a while, but thanks for the suggestion.

- Dav

Offline NOVARSEG

  • Forum Resident
  • Posts: 509
    • View Profile
Re: Updating XE, my old file editor/viewer project
« Reply #6 on: February 16, 2021, 08:45:19 pm »
@Dav

I wonder if it would work.

GOSUB LL1

LL1:
b = 10
b = 10
b = 10
b = 10

return


Find where the b = 10s are in the EXE and insert something harmless like some 90h which is the machine code for No operation.

If that works then proceed to sumthin like

mov eax, 1000000

mov [A] ,eax

and then when the GOSUB returns

PRINT A



« Last Edit: February 16, 2021, 08:49:20 pm by NOVARSEG »

Offline NOVARSEG

  • Forum Resident
  • Posts: 509
    • View Profile
Re: Updating XE, my old file editor/viewer project
« Reply #7 on: February 16, 2021, 08:57:33 pm »
but how do we get the address for A

 DIM A as LONG
GOSUB LL1

LL1:
A = 10
A = 10
A = 10
A = 10
A = 10
A = 10


return

Offline Dav

  • Forum Resident
  • Posts: 792
    • View Profile
Re: Updating XE, my old file editor/viewer project
« Reply #8 on: February 16, 2021, 10:00:32 pm »
Not sure I understand - do you mean adding a search/replace function in the program?  I could add that in the future.

- Dav
« Last Edit: February 16, 2021, 10:03:25 pm by Dav »

Offline NOVARSEG

  • Forum Resident
  • Posts: 509
    • View Profile
Re: Updating XE, my old file editor/viewer project
« Reply #9 on: February 17, 2021, 03:12:07 am »
Using Dav hex editor this is how QB64 stores data in a LONG


MOV EAX,DWORD PTR [00682B4C]
MOV DWORD PTR [EAX],FFFFFFFF


Offline euklides

  • Forum Regular
  • Posts: 128
    • View Profile
Re: Updating XE, my old file editor/viewer project
« Reply #10 on: February 17, 2021, 04:51:43 am »
Very nice program !

Generally, I use Ultraedit but this app is also usefull because it's a portable program for looking inside files...

Little question: in editing mode, you don't really see where you are on the screen ?
« Last Edit: February 17, 2021, 04:56:21 am by euklides »
Why not yes ?

Offline Dav

  • Forum Resident
  • Posts: 792
    • View Profile
Re: Updating XE, my old file editor/viewer project
« Reply #11 on: February 17, 2021, 07:47:33 am »
Thanks, @euklides.  Thanks for reporting that.  The cursor is supposed to be visible and flashing in edit mode, showing the current location.  Ive only tested this in windows 7 so far, and it shows for me, but perhaps changing the cursor size behaves differently on other systems?  I dunno ....

- Dav

FellippeHeitor

  • Guest
Re: Updating XE, my old file editor/viewer project
« Reply #12 on: February 17, 2021, 08:51:20 am »
@NOVARSEG Might be interested in checking http://www.qb64.org/wiki/MKL$.

@Dav apologies for hogging your thread with other topics. Won't happen again.

Really cool editor, btw!

Offline Pete

  • Forum Resident
  • Posts: 2361
  • Cuz I sez so, varmint!
    • View Profile
Re: Updating XE, my old file editor/viewer project
« Reply #13 on: February 17, 2021, 12:38:54 pm »
Yeah Fell, try to stay on topic, or I'll report you to Odin! ;D

Wow Dav, that takes me back. I made one of those around 20+ years ago. I printed out one of my apps in machine code with it. I read it, and realized there was no way in hell I was ever going to learn how to make a program using machine code. The only thing worse to code in... FreeBASIC.

Yours is certainly prettier than mine, but mine was full screen, and like they say, size matters!

Pete
Want to learn how to write code on cave walls? https://www.tapatalk.com/groups/qbasic/qbasic-f1/