DOS Hex editor with permanent undo, QBasic + SOURCE

23. května 2011 v 19:05 | PiSoft |  PiSoft
46Kb (after download check by antivir) http://www.easy-share.com/1915621687/SETASC.EXE

Source:


DECLARE SUB ShowHelp ()
DECLARE FUNCTION sel% (keys$)
DECLARE FUNCTION wkey% ()

CONST bfile$ = "setasc.bak"
CONST nbfile$ = "setasc.$tt"
DIM x AS STRING * 1
DIM w AS STRING * 1
DIM im AS STRING, asci AS INTEGER
DIM p AS STRING, o AS STRING
DIM rec AS LONG, ky AS INTEGER
DIM col AS INTEGER, cs AS LONG
DIM buf AS INTEGER, ptd AS INTEGER
DIM show AS INTEGER
DIM iof AS INTEGER
DIM uc AS INTEGER, bff AS INTEGER, nbf AS INTEGER
rec = 1: col = 25: buf = 200
iof = FREEFILE

ON ERROR GOTO fnf
OPEN COMMAND$ FOR INPUT AS #iof
CLOSE #iof

CLS
DO
COLOR 15
LOCATE 1, 1
PRINT "Page"; INT(rec \ buf) + 1; "; x ="; rec; "[H"; HEX$(rec); "]"; CHR$(9)
PRINT
COLOR 7
OPEN COMMAND$ FOR BINARY AS #iof
ptd = 0
cs = 0
SEEK #iof, ((rec - 1) \ buf) * buf + 1
DO UNTIL EOF(iof)
GET #iof, , x
IF EOF(1) THEN EXIT DO
p = HEX$(ASC(x))
IF LEN(p) = 1 THEN p = "0" + p
cs = LOC(iof)
IF (((cs - 1) \ buf) = ((rec - 1) \ buf)) THEN
IF cs = rec THEN COLOR 15: PRINT ":"; p; ELSE PRINT " "; p;
IF cs = rec THEN COLOR 7
ptd = ptd + 1
IF (ptd MOD col) = 0 THEN PRINT ""
ELSE
IF ptd > 0 THEN EXIT DO
END IF
LOOP
ptd = ptd + 1
WHILE ptd <= buf
PRINT " ..";
IF ptd MOD col = 0 THEN PRINT ""
ptd = ptd + 1
cs = cs + 1
WEND
CALL ShowHelp
COLOR 15
SELECT CASE show
CASE 1: PRINT ASC(im); SPACE$(35)
CASE 2: PRINT CHR$(asci); SPACE$(35)
CASE 3: PRINT "Undo for this file erased"; SPACE$(30)
CASE 4: PRINT "Cancelled"; SPACE$(30)
CASE 5: PRINT "There is"; uc; "undo for this file"; SPACE$(30)
CASE 6: PRINT "No more undo"; SPACE$(30)
END SELECT
COLOR 7
show = 0
ky = wkey%
SELECT CASE ky
CASE -117: rec = LOF(iof)
CASE -119: rec = 1
CASE -77: rec = rec + 1
CASE -75: rec = rec - 1
CASE -80: rec = rec + col
CASE -72: rec = rec - col
CASE -81: rec = rec + buf
CASE -73: rec = rec - buf
CASE -71: rec = ((rec - 1) \ col) * col + 1
CASE -79: rec = ((rec \ col) + 1) * col
CASE -62
COLOR 15
GET #1, rec, x
PRINT "Char #"; rec; " ("; LTRIM$(STR$(ASC(x))); ") = "; x; SPACE$(30);
COLOR 7
CASE -67
COLOR 15
INPUT "Type character and press enter: ", im
show = 1
COLOR 7
CASE 97
COLOR 15
INPUT "Type ASCII and press enter: ", asci
show = 2
COLOR 7
CASE -32
COLOR 15
bff = FREEFILE: OPEN bfile$ FOR INPUT AS #bff
nbf = FREEFILE: OPEN nbfile$ FOR OUTPUT AS #nbf
uc = 0
WHILE NOT EOF(bff)
INPUT #bff, path$, rpos&, orig%, new%
IF path$ <> COMMAND$ THEN WRITE #nbf, path$, rpos&, orig%, new%
WEND
CLOSE #bff, #nbf
PRINT "Erase undo for this file? [y/n]"
IF sel("yn") = 121 THEN
show = 3
KILL bfile$
NAME nbfile$ AS bfile$
ELSE show = 4
END IF
COLOR 7
CASE 103
COLOR 15
INPUT "Go to (dec)> "; rec
COLOR 7
CASE 117
bff = FREEFILE
uc = 0
OPEN bfile$ FOR INPUT AS #bff
WHILE NOT EOF(bff)
INPUT #bff, path$, rpos&, orig%, new%
IF path$ = COMMAND$ THEN uc = uc + 1
WEND
CLOSE #bff
show = 5
CASE 13
COLOR 15
INPUT "Type ASCII and press enter: ", asci
GET #iof, rec, x
bff = FREEFILE
OPEN bfile$ FOR APPEND AS #bff
w = CHR$(asci)
PUT #iof, rec, w
WRITE #bff, COMMAND$, rec, ASC(x), asci
CLOSE #bff
COLOR 7
CASE 21
COLOR 15
bff = FREEFILE: OPEN bfile$ FOR INPUT AS #bff
uc = 0
WHILE NOT EOF(bff)
INPUT #bff, path$, rpos&, orig%, new%
IF path$ = COMMAND$ THEN uc = uc + 1
WEND
CLOSE #bff
IF uc = 0 THEN
show = 6
ELSE
bff = FREEFILE: OPEN bfile$ FOR INPUT AS #bff
nbf = FREEFILE: OPEN nbfile$ FOR OUTPUT AS #nbf
WHILE NOT EOF(bff)
INPUT #bff, path$, rpos&, orig%, new%
IF path$ <> COMMAND$ THEN
WRITE #nbf, path$, rpos&, orig%, new%
ELSE
uc = uc - 1
IF uc > 0 THEN
WRITE #nbf, path$, rpos&, orig%, new%
ELSE
PRINT "Undo: "; HEX$(new%); "@"; HEX$(rpos&); " -> "; HEX$(orig%); "? [y/n]"; SPACE$(35)
IF sel("yn") = 121 THEN
w = CHR$(orig%)
PUT #iof, rpos&, w
rec = rpos&
END IF
END IF
END IF
WEND
CLOSE #bff, #nbf
KILL bfile$
NAME nbfile$ AS bfile$
COLOR 7
END IF
END SELECT
IF rec > LOF(iof) THEN
rec = rec MOD col
IF rec = 0 THEN rec = 1
ELSEIF rec < 1 THEN
rec = LOF(iof)
END IF
CLOSE #iof
LOOP UNTIL ky = 27
PRINT
COLOR 15
PRINT "Thanks for using"
COLOR 7
PRINT "SetAsc hexeditor, PiSoft 2011, (c) konikula@post.cz"
END


fnf:
PRINT "File not found!"
END

FUNCTION sel% (keys$)
DIM i%
DO
i = wkey
IF i > 0 THEN
IF INSTR(keys$, CHR$(i)) > 0 THEN
sel% = i
EXIT FUNCTION
END IF
END IF
LOOP
END FUNCTION

SUB ShowHelp
COLOR 6
PRINT
COLOR 16
PRINT "";
COLOR 6
PRINT " change to byte at cursor ";
COLOR 16
PRINT "";
COLOR 6
PRINT " current byte to char "
COLOR 16
PRINT "";
COLOR 6
PRINT " custom char to ASCII ";
COLOR 16
PRINT "";
COLOR 6
PRINT " custom ASCII to char "
COLOR 16
PRINT "";
COLOR 6
PRINT " clear undo for this file ";
COLOR 16
PRINT "";
COLOR 6
PRINT " go to specified byte "
COLOR 16
PRINT "";
COLOR 6
PRINT " count undo ";
COLOR 16
PRINT "";
COLOR 6
PRINT " apply single undo ";
COLOR 16
PRINT "";
COLOR 6
PRINT " to exit program"

END SUB

FUNCTION wkey%
DIM ky AS STRING, lky AS STRING
DO
lky = ky
ky = INKEY$
IF ky <> lky AND LEN(ky) > 0 THEN
IF LEN(ky) > 1 THEN
wkey = -ASC(RIGHT$(ky, 1))
EXIT FUNCTION
ELSE
wkey = ASC(ky)
EXIT FUNCTION
END IF
END IF
LOOP

END FUNCTION
 

Nový komentář

Přihlásit se
  Ještě nemáte vlastní web? Můžete si jej zdarma založit na Blog.cz.