home *** CD-ROM | disk | FTP | other *** search
/ HomeWare 14 / HOMEWARE14.bin / utils1 / browsr10.arj / BROWSER.BAS next >
BASIC Source File  |  1993-07-11  |  8KB  |  294 lines

  1. ' ==================== Browser 1.0 =======================
  2. ' by Victor Yiu (1:106/30), July 1993.  Released into Public Domain.
  3. '
  4. '              *** LOAD WITH /AH SWITCH ***
  5. ' This program is a binary file viewer, in hex and ascii,
  6. ' made to look like Calvin French's HEXVIEW, PCTools' View,
  7. ' Norton's DiskEdit, and numerous others.  It uses my public-
  8. ' domain SuperHex library, written in optimized assembly -- so
  9. ' it is FAST!
  10. '
  11. '       BC BROWSER /O;
  12. '       LINK /FARC /PACKC:64000 BROWSER+C:\QB\NOCOM,,,C:\QB\BCOM45+SUPERHEX;
  13. '            ^ (include "/EX" if you won't use LZEXE or PKLITE)
  14. '
  15. ' Compared to Clavin's HEXVIEW:
  16. '   o  Mine can open files up to 128k
  17. '   o  Mine is 5 million times faster (faster than PCTools or Norton)
  18. '   o  Has a built-in text filter
  19. '   o  Acceptable on an 4.77 MHz XT!
  20. '   o  Compiles to only 25K with LZEXE or PKLITE!
  21. '
  22. ' Next version will include search and editing features.
  23. '
  24. ' Speed comparison (on a 10MHz XT)*:
  25. '       Calvin French's HEXVIEW:   .55 K/sec
  26. '             PCTool's 4.x Edit:     3 K/sec
  27. '         Victor's SuperHEX (!):    20 K/sec   --->  WOW!
  28. '
  29. '  * I didn't do timing on my 486 because it was too darn fast!
  30. '
  31. ' By the way -- try loading a file from the floppy -- it's fun!
  32. ' ============================================================
  33.  
  34. DEFINT A-Z      ' $DYNAMIC
  35.  
  36. CONST Block = 8192, PageSize = 16 * 21, LastDataLine = 23
  37. CONST DataFG = 7, DataBG = 1, Attrib = DataFG + DataBG * 16
  38. CONST False = 0, True = NOT False
  39.  
  40. DECLARE SUB AdjustLastBytes (Row%)
  41. DECLARE SUB CheckPointer (Num&)
  42. DECLARE SUB DrawInterface ()
  43. DECLARE SUB DrawScreen ()
  44. DECLARE SUB LoadFile (LOFile&)
  45. DECLARE SUB PrintHex (Num&)
  46. DECLARE SUB ShowHex (Posit&)
  47. DECLARE FUNCTION GetAdapterSeg% ()
  48. DECLARE FUNCTION Signed% (Num&)
  49.  
  50. DECLARE SUB Scroll (BYVAL GoUp, BYVAL Attrib)
  51. DECLARE SUB MemCopy (BYVAL SegFrom, BYVAL OffFrom, BYVAL SegTo, BYVAL OffTo, BYVAL Leng)
  52. DECLARE SUB SuperHex (BYVAL VidSeg, BYVAL Row, BYVAL OffsetHex, BYVAL OffsetASCii, BYVAL segment, BYVAL Offset, BYVAL BackColor, BYVAL FilterOn)
  53. ' VidSeg     = Video segment of adapter (B800 for color, B000 for mono)
  54. ' Row        = Row to display data (1-25)
  55. ' OffsetHex  = Column to display the hex digits (1-)
  56. ' OffsetASCii= Column to display the characters themselves (1-)
  57. ' Segment    = Segment of source data
  58. ' Offset     = Offset of source data
  59. ' BackColor  = Background color in a packed byte:
  60. '                (BackGround * 16) + ForeGround
  61.  
  62. IF LEN(COMMAND$) = 0 THEN
  63.     PRINT "Syntax:"
  64.     PRINT "   BROWSER <filename>"
  65.     END
  66. END IF
  67.  
  68. DIM SHARED VidSegment, Pointer&, LastBox, LOFile&, FilterOn
  69.  
  70. OPEN COMMAND$ FOR BINARY AS #1
  71. LOFile& = LOF(1)
  72. IF (LOFile& + 3000 > FRE(-1)) OR (LOFile& > 131000) THEN PRINT "File too big.": END
  73. IF LOFile& = 0 THEN CLOSE : PRINT COMMAND$; " does not exist.": KILL COMMAND$: END
  74.  
  75. DIM SHARED Array&(LOFile& \ 4& + 4)
  76. Pointer& = 0: LastBox = 4: Null$ = CHR$(0)
  77.  
  78. CLS
  79. VidSegment = GetAdapterSeg
  80. DrawInterface
  81. LOCATE 12, 33: COLOR 31, 3
  82. PRINT " Loading file ... "; : COLOR 7
  83.  
  84. LoadFile LOFile&
  85.  
  86. IF LOFile& - 16 < PageSize THEN
  87.     LOCATE 12, 33: COLOR , 1
  88.     PRINT SPACE$(40);
  89. END IF
  90.  
  91. DrawScreen
  92. DO
  93.     DO: I$ = INKEY$
  94.     LOOP UNTIL LEN(I$)
  95.     IF LEN(I$) = 1 THEN I$ = UCASE$(I$)
  96.  
  97.     SELECT CASE I$
  98.         CASE Null$ + "Q", CHR$(13), " "   ' PageDown
  99.             Pointer& = Pointer& + PageSize
  100.             CheckPointer Pointer&
  101.         CASE Null$ + "I"        ' PageUp
  102.             Pointer& = Pointer& - PageSize
  103.             CheckPointer Pointer&
  104.         CASE Null$ + "P"        ' Down
  105.             IF Pointer& + PageSize < LOFile& THEN
  106.                 Scroll 0, LastDataLine
  107.                 Pointer& = Pointer& + 16
  108.                 ShowHex Pointer&
  109.    
  110.                 Temp& = Pointer& + PageSize - 16
  111.                 LOCATE LastDataLine, 3: COLOR 14
  112.                 PrintHex Temp&
  113.  
  114.                 SuperHex VidSegment, LastDataLine, 10, 62, Signed(VARSEG(Array&(0)) + Temp& \ 16), VARPTR(Array&(0)), Attrib, FilterOn
  115.                 IF LOFile& - Temp& < 15 THEN AdjustLastBytes LastDataLine
  116.             END IF
  117.         CASE Null$ + "H"        ' Up
  118.             IF Pointer& >= 16 THEN
  119.                 Scroll -1, LastDataLine
  120.                 Pointer& = Pointer& - 16
  121.                 ShowHex Pointer&
  122.  
  123.                 LOCATE 3, 3: COLOR 14
  124.                 PrintHex Pointer&
  125.                 SuperHex VidSegment, 3, 10, 62, Signed(VARSEG(Array&(0)) + Pointer& \ 16), VARPTR(Array&(0)), Attrib, FilterOn
  126.             END IF
  127.         CASE Null$ + "G"        ' Home
  128.             Pointer& = 0
  129.             DrawScreen
  130.         CASE Null$ + "O"        ' End
  131.             Pointer& = LOFile&
  132.             CheckPointer Pointer&
  133.         CASE "F"                ' toggle filter
  134.             FilterOn = NOT FilterOn
  135.             DrawScreen
  136.  
  137.             LOCATE 25, 58: COLOR 4, 3
  138.             IF FilterOn THEN PRINT CHR$(251);  ELSE PRINT " ";
  139.         CASE ELSE
  140.     END SELECT
  141. LOOP UNTIL I$ = CHR$(27)
  142.  
  143. COLOR 7, 0: CLS
  144. PRINT "Thanks for trying Browser 1.0!"
  145. PRINT
  146. END
  147.  
  148. REM $STATIC
  149. SUB AdjustLastBytes (Row)
  150.  
  151.     Remov = 16 - (LOFile& AND 15)
  152.     LOCATE Row, 58 - Remov * 3
  153.     PRINT SPACE$(Remov * 3 + 1);
  154.     LOCATE , 78 - Remov
  155.     PRINT SPACE$(Remov);
  156.  
  157. END SUB
  158.  
  159. SUB CheckPointer (Num&)
  160.  
  161. IF Num& + PageSize - 15 > LOFile& THEN
  162.     Num& = LOFile& + 15 - PageSize
  163. END IF
  164.  
  165. IF Num& < 0 THEN Num& = 0
  166. DrawScreen
  167.  
  168. END SUB
  169.  
  170. SUB DrawInterface
  171.  
  172. COLOR 14, 12
  173. PRINT " Browser 1.0  ■  by Victor Yiu, July 1993  ■  Idea from Calvin French's HEXVIEW "
  174. COLOR 15, 1
  175. PRINT CHR$(218); CHR$(196); CHR$(180);
  176. COLOR 15, 3: PRINT " "; COMMAND$; " "; : COLOR 15, 1
  177. PRINT CHR$(195); STRING$(80 - POS(0), 196); CHR$(191)
  178.  
  179. FOR Lin = 3 TO LastDataLine
  180.     LOCATE Lin, 1: PRINT CHR$(179); SPACE$(78);
  181.  
  182.     IF Lin = 3 THEN
  183.         PRINT CHR$(24);
  184.     ELSEIF Lin = LastDataLine THEN
  185.         PRINT CHR$(25);
  186.     ELSE
  187.         PRINT CHR$(176);
  188.     END IF
  189. NEXT
  190.  
  191. LOCATE 4, 80, 0: PRINT CHR$(219);
  192. LOCATE 24, 1: PRINT CHR$(192); CHR$(196); CHR$(180);
  193. COLOR 13: PRINT "       (     )/"; LTRIM$(STR$(LOF(1)));
  194. COLOR 15: PRINT " "; CHR$(195); STRING$(80 - POS(1), 196); CHR$(217);
  195.  
  196. LOCATE 25, 1: COLOR 14, 3
  197. PRINT " Adjust Viewport "; : COLOR 15
  198. PRINT "[PgUp/PgDn] [Up/Down] [Home/End]         [F]=Filter [Esc]=Quit ";
  199.  
  200. END SUB
  201.  
  202. SUB DrawScreen
  203. STATIC NotOnePage, L    ' 1=True, 2=False, 0=first call
  204.  
  205. IF NotOnePage = 0 THEN
  206.     IF LOFile& - 16 < PageSize THEN
  207.         NotOnePage = 1
  208.         L = (LOFile& - 1) \ 16 + 3
  209.     ELSE
  210.         NotOnePage = 2
  211.         L = LastDataLine
  212.     END IF
  213. END IF
  214.  
  215. ShowHex Pointer&
  216. COLOR 14
  217.  
  218. Temp& = Pointer&
  219. FOR Row = 0 TO L - 3
  220.     SuperHex VidSegment, Row + 3, 10, 62, Signed(VARSEG(Array&(0)) + Temp& \ 16), VARPTR(Array&(0)), Attrib, FilterOn
  221.  
  222.     LOCATE Row + 3, 3, 0
  223.     PrintHex Temp&
  224.  
  225.     Temp& = Temp& + 16
  226. NEXT
  227.  
  228. IF Temp& > LOFile& THEN AdjustLastBytes L
  229.  
  230. END SUB
  231.  
  232. FUNCTION GetAdapterSeg
  233.     DEF SEG = 0
  234.     ColorM = (PEEK(&H410) AND 48) <> 48
  235.     DEF SEG 'Monocrome--^                       ^
  236.             'Color Graphics Adapter or better --|
  237.  
  238.     IF ColorM THEN GetAdapterSeg = &HB800 ELSE GetAdapterSeg = &HB000
  239. END FUNCTION
  240.  
  241. SUB LoadFile (LOFile&)
  242.  
  243. Dummy& = FRE("")
  244.  
  245. TempStor$ = SPACE$(Block)
  246. Start& = VARSEG(Array&(0))
  247.  
  248. FOR LoadUp = 1 TO LOFile& \ Block
  249.     GET #1, , TempStor$
  250.     MemCopy VARSEG(TempStor$), SADD(TempStor$), Signed(Start&), VARPTR(Array&(0)), Block
  251.     Start& = Start& + Block \ 16
  252.     ShowHex LoadUp * 1& * Block
  253. NEXT
  254.  
  255. TempStor$ = SPACE$(LOFile& MOD Block)
  256. GET #1, , TempStor$
  257. MemCopy VARSEG(TempStor$), SADD(TempStor$), Signed(Start&), 0, LEN(TempStor$)
  258.     ' *** SSEG to VARSEG for QB/QBASIC users!
  259. END SUB
  260.  
  261. SUB PrintHex (Num&)
  262.  
  263.     'PRINT MID$(HEX$(Num& + &H100000), 2);
  264.     PRINT RIGHT$("0000" + HEX$(Num&), 5);
  265.  
  266. END SUB
  267.  
  268. SUB ShowHex (Posit&) STATIC
  269.  
  270. COLOR 15, 1
  271. LOCATE 24, 5
  272. PRINT USING "######"; Posit&;
  273. LOCATE , 12
  274. PrintHex Posit&
  275.  
  276. LOCATE LastBox, 80
  277. PRINT CHR$(176);
  278. LastBox = Posit& * 18 \ LOFile& + 4
  279. LOCATE LastBox, 80
  280. PRINT CHR$(219);
  281.  
  282. END SUB
  283.  
  284. FUNCTION Signed (Num&)
  285.  
  286.     IF Num& > 32767 THEN
  287.         Signed = Num& - 65536
  288.     ELSE
  289.         Signed = Num&
  290.     END IF
  291.  
  292. END FUNCTION
  293.  
  294.