CONST Chunk_Size = 16
DECLARE counter, Total_Rows TYPE int
DECLARE byte TYPE unsigned char
IF ROWS > 0 THEN
Total_Rows = ROWS-2
ELSE
Total_Rows = 23
END IF
SPLIT ARGUMENT$ BY " " TO arg$ SIZE dim
IF dim < 2 THEN
PRINT "Usage: bindump [-c] <file>"
END
ENDIF
IF arg$[1] = "-c" AND dim = 3 THEN
Use_Color = TRUE
prog$ = arg$[2]
ELSE
Use_Color = FALSE
prog$ = arg$[1]
END IF
IF NOT(FILEEXISTS(prog$)) THEN
PRINT "ERROR: file not found!"
END
END IF
Mem_Block = MEMORY(Chunk_Size)
OPEN prog$ FOR READING AS file
WHILE NOT(ENDFILE(file)) DO
FOR i = 0 TO Chunk_Size - 1
POKE Mem_Block + i, 0
NEXT
SEEK file OFFSET counter*Chunk_Size
GETBYTE Mem_Block FROM file SIZE Chunk_Size
IF Use_Color THEN COLOR FG TO RED
PRINT "[";
IF Use_Color THEN COLOR FG TO YELLOW
PRINT counter * Chunk_Size FORMAT "%08x"
IF Use_Color THEN COLOR FG TO RED
PRINT "] ";
FOR i = 0 TO Chunk_Size - 1
byte = PEEK(Mem_Block + i)
IF Use_Color THEN COLOR FG TO GREEN
PRINT byte FORMAT "%02X "
NEXT
PRINT " ";
FOR i = 0 TO Chunk_Size - 1
byte = PEEK(Mem_Block + i)
IF Use_Color THEN COLOR FG TO CYAN
IF byte > 31 AND byte < 127 THEN PRINT CHR$(byte);
ELSE PRINT ".";
NEXT
PRINT:INCR counter
IF MOD(counter, Total_Rows) = 0 THEN
COLOR RESET
PRINT "<space> = next, <u> = up, <ESC> or <q> = exit"
key = GETKEY
SELECT key
CASE 113;
CASE 27
BREAK
CASE 117
IF counter > Total_Rows THEN
DECR counter, 2*Total_Rows
ELSE
counter = 0
END IF
END SELECT
END IF
WEND
IF Use_Color THEN COLOR RESET
CLOSE FILE file
FREE Mem_Block