Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 'NDebug v1.0.2. Is Not a Debugger.
- 'https://pastebin.com/u/jcunews
- 'https://www.reddit.com/user/jcunews1
- '
- 'DOS DEBUG clone mainly for binary file editing (as a hex editor).
- '
- 'Differences:
- '- No disassembler and assembler functions.
- '- No executable program/code.
- '- No disk sector, I/O port, and expanded memory (EMS).
- '- No CPU flag register, and CPU/FPU mode.
- '- Memory is simulated using zero filled buffer.
- '- CPU registers are simulated.
- '- Default segment for loading file is 0000.
- '- E command's list parameter is required.
- '- L command accepts file name as third parameter.
- '- Support file size up to 256MB.
- '
- 'Effective CPU registers:
- '- CS:IP = Starting address of file for L & W commands
- '- BX:CX = Size of file for L & W commands
- '- DS = Default segment for C, D, E, F, M, and S commands.
- '- SI = Number of 1MB memory storages. From 2 up to 256. Default is 2.
- '- DI = Index of memory storage. Default is 0. i.e.:
- ' DI:DS:AX = 001 1234:5678 = 1 179B8 = linear address 1179B8.
- '
- 'Usage: NDebug.vbs [file]
- '
- 'For a list of commands, run script and type ? at the prompt.
- 'Debug help screen
- 'compare C range address
- 'dump D [range]
- 'enter E address list
- 'fill F range list
- 'hex add/sub H value1 value2
- 'load file L [address [[path]filename]]
- 'move M range address
- 'set name N [path]filename
- 'quit Q
- 'register R [register [value]]
- 'search S range list
- 'write file W [address]
- 'range: address [l length | offset]
- 'address: [segment:]offset
- 'list: byte[,byte..] | "string"[ "string"...]
- 'value: word
- function hexb(n)
- a = "0" & hex(n)
- hexb = right(a, 2)
- end function
- function hexw(n)
- a = "000" & hex(n)
- hexw = right(a, 4)
- end function
- function loadfile(seg, ofs, fn)
- on error resume next
- a = clng(int(((seg * 65536) + ofs + fs.getfile(fn).size + 65535) / 65536))
- loadfile = err.number = 0
- if not loadfile then exit function
- if a > (ubound(mem) + 1) then
- if not resizemem(a) then
- writeln "Insufficient memory"
- loadfile = false
- exit function
- end if
- end if
- st.type = 2
- st.charset = "x-user-defined"
- st.open
- st.loadfromfile fn
- if err.number = 0 then
- a = st.readtext
- writemems seg, ofs, a
- bx = clng(int(len(a) / 65536))
- cx = len(a) and 65535
- loadfile = true
- end if
- st.close
- end function
- function parseaddr(byref ms, mi, reqofs, defseg, defofs, byref seg, byref ofs)
- parseaddr = true
- if ms(mi) <> "" then 'number: segment
- seg = str2intw(ms(mi))
- elseif ms(mi + 1) <> "" then 'register: segment
- seg = eval(ms(mi + 1))
- else
- seg = defseg
- end if
- if ms(mi + 2) <> "" then 'number: offset
- ofs = str2intw(ms(mi + 2))
- elseif ms(mi + 3) <> "" then 'register: offset
- ofs = eval(ms(mi + 3))
- elseif reqofs then
- parseaddr = false
- else
- ofs = defofs
- end if
- end function
- function parselist(ofs, s, byref data)
- if s = "" then
- parselist = true
- exit function
- end if
- parselist = true
- set y = new regexp
- y.pattern = "\s*([0-9a-f]{1,2}|""[^""]+"")"
- c = s
- data = ""
- f = ofs
- do while c <> ""
- set m = y.execute(c)
- if m.count = 0 then
- parselist = false
- exit function
- end if
- e = m(0).submatches(0)
- if left(e, 1) <> """" then
- data = data & chr(str2intb(e)) 'byte
- f = f + 1
- else
- g = mid(e, 2, len(e) - 2)
- data = data & g 'string
- f = f + len(g)
- end if
- if f > 65535 then
- parselist = false
- exit function
- end if
- c = mid(c, m(0).length + 1)
- loop
- end function
- function parserange(byref ms, mi, reqofs, reqlen, clip, defseg, defofs, _
- deflen, byref seg, byref ofs, byref last)
- parserange = parseaddr(ms, mi, reqofs, defseg, defofs, seg, ofs)
- if not parserange then exit function
- if ms(mi + 4) <> "" then 'number: length
- last = ofs + str2intw(ms(mi + 4)) - 1
- elseif ms(mi + 5) <> "" then 'register: length
- last = ofs + eval(ms(mi + 5)) - 1
- elseif ms(mi + 6) <> "" then 'number: end offset
- last = str2intw(ms(mi + 6))
- elseif ms(mi + 7) <> "" then 'register: end offset
- last = eval(ms(mi + 7))
- elseif reqlen then
- parserange = false
- exit function
- else
- last = ofs + deflen - 1
- end if
- if clip then
- if last > 65535 then last = 65535
- else
- parserange = last <= 65535
- end if
- end function
- function readln
- on error resume next
- do while true
- readln = wscript.stdin.readline
- if err.number = 0 then exit do
- err.clear
- loop
- end function
- function readmemb(cs, ip)
- a = segofs2memadr(cs, ip)
- readmemb = mid(mem((di * 16) + a(0)), a(1) + 1, 1)
- end function
- function readmems(seg, ofs, length)
- a = (di * 16) + clng(int(seg / 4096))
- b = ((seg and &Hfff) * &H10) + ofs
- i = 0
- r = ""
- do while i < length
- c = length - i
- if (b + c) > 65536 then c = 65536 - b
- r = r & mid(mem(a), b + 1, c)
- a = a + 1
- b = 0
- i = i + c
- loop
- readmems = r
- end function
- function resizemem(n)
- resizemem = (n * 65536) <= maxmem
- if not resizemem then exit function
- a = ubound(mem)
- redim preserve mem(n)
- if n > a then
- for i = a + 1 to ubound(mem)
- mem(i) = string(65536, chr(0))
- next
- end if
- end function
- function segofs(a, b)
- segofs = hexw(a) & ":" & hexw(b)
- end function
- function segofs2memadr(seg, ofs)
- a = (seg * &H10) + ofs
- segofs2memadr = array(clng(int(a / 65536)), a and 65535)
- end function
- function str2intb(a)
- str2intb = eval("&H" & a) and 255
- end function
- function str2intw(a)
- str2intw = eval("&H" & a) and 65535
- end function
- sub write(s)
- wscript.stdout.write s
- end sub
- sub writeln(s)
- wscript.stdout.writeline s
- end sub
- sub writememb(seg, ofs, n)
- a = (di * 16) + clng(int(seg / 4096))
- b = ((seg and &Hfff) * &H10) + ofs
- mem(a) = mid(mem(a), 1, b) & chr(n) & mid(mem(a), b + 2)
- end sub
- sub writemems(seg, ofs, data)
- a = (di * 16) + clng(int(seg / 4096))
- b = ((seg and &Hfff) * &H10) + ofs
- i = 0
- do while i <= (len(data) - 1)
- c = len(data) - i
- if (b + c) > 65536 then c = 65536 - b
- mem(a) = mid(mem(a), 1, b) & mid(data, i + 1, c) & mid(mem(a), b + c + 1)
- a = a + 1
- b = 0
- i = i + c
- loop
- end sub
- '--------------------------------------------------------------------
- sub compare
- x.pattern = "^c\s*" & xrng & "\s+" & xaddr & "\s*$" '8+4
- set m = x.execute(cl)
- if m.count > 0 then
- set m = m(0).submatches
- if not parserange(m, 0, true, true, false, ds, 0, 0, a, b, c) then
- writeln "Error"
- exit sub
- end if
- d = (c + 1) - b 'length
- parseaddr m, 8, true, ds, 0, e, f
- if (c < b) or ((65536 - f) < d) then
- writeln "Error"
- exit sub
- end if
- do while d > 0
- g = 65536 - b
- h = 65536 - f
- if h < g then g = h
- h = readmems(a, b, g)
- i = readmems(e, f, g)
- for j = 1 to len(h)
- k = mid(h, j, 1)
- l = mid(i, j, 1)
- if k <> l then
- writeln segofs(a, b + j - 1) & " " & hexb(asc(k)) & " " & _
- hexb(asc(l)) & " " & segofs(e, f + j - 1)
- end if
- next
- b = b + g
- if b = 0 then a = a + &H1000
- f = f + g
- if f = 0 then e = e + &H1000
- d = d - g
- loop
- else
- writeln "Error"
- end if
- end sub
- sub dump
- x.pattern = "^d\s*(?:" & xrng & "?)?\s*$" '8
- set m = x.execute(cl)
- if m.count > 0 then
- set m = m(0).submatches
- parserange m, 0, false, false, true, dg, df, &H80, k, a, b
- if (b < a) or (b > 65535) then
- writeln "Error"
- exit sub
- end if
- j = b and &Hfff0
- c = a and &Hfff0
- d = a and &Hf
- do while c <= b
- write segofs(k, c) & " "
- e = " "
- if c <> j then
- f = &Hf
- else
- f = b and &Hf
- end if
- for i = 0 to &Hf
- if (i >= d) and (i <= f) then
- g = readmemb(k, c + i)
- h = asc(g)
- if (h < &H20) or (h > &H7e) then g = "."
- write hexb(h)
- else
- g = " "
- write " "
- end if
- e = e & g
- if i = 7 then
- write "-"
- else
- write " "
- end if
- next
- writeln e
- d = 0
- c = c + 16
- loop
- dg = k
- df = (b + 1) and 65535
- else
- writeln "Error"
- end if
- end sub
- sub enter
- x.pattern = "^e\s*" & xaddr & "(.*?)\s*$" '4+1
- set m = x.execute(cl)
- if m.count > 0 then
- set m = m(0).submatches
- parseaddr m, 0, true, ds, 0, a, b
- if not parselist(b, m(4), d) then
- writeln "Error"
- exit sub
- end if
- writemems a, b, d
- else
- writeln "Error"
- end if
- end sub
- sub fill
- x.pattern = "^f\s*" & xrng & "(.*?)\s*$" '8+1
- set m = x.execute(cl)
- if m.count > 0 then
- set m = m(0).submatches
- if not parserange(m, 0, true, true, false, ds, 0, 0, a, b, c) then
- writeln "Error"
- exit sub
- end if
- if not parselist(b, m(8), d) then
- writeln "Error"
- exit sub
- end if
- do while b < c
- if (b + len(d)) > c then d = left(d, c - b)
- writemems a, b, d
- b = b + len(d)
- loop
- else
- writeln "Error"
- end if
- end sub
- sub help
- set sf = fs.opentextfile(wscript.scriptfullname)
- s = " "
- do while s <> ""
- s = sf.readline
- loop
- i = 0
- do while true
- s = sf.readline
- if s = "" then exit sub
- writeln mid(s, 2)
- i = i + 1
- if i = 23 then
- i = 0
- write "[press ENTER for more]"
- readln
- write chr(13) & space(22) & chr(13)
- end if
- loop
- end sub
- sub hexCalc
- x.pattern = "^h\s*" & xval & "\s+" & xval & "\s*$" '1+1
- set m = x.execute(cl)
- if m.count > 0 then
- set m = m(0).submatches
- a = str2intw(m(0))
- b = str2intw(m(1))
- writeln hexw(a + b) & " " & hexw(a - b)
- else
- writeln "Error"
- end if
- end sub
- sub load
- x.pattern = "^l\s*(?:" & xaddr & "(?:\s*(.*?))?)?\s*$" '4+1
- set m = x.execute(cl)
- if m.count > 0 then
- set m = m(0).submatches
- parseaddr m, 0, false, 0, &H100, a, b
- if m(4) <> "" then 'file
- c = m(4)
- if left(c, 1) = """" then
- if right(c, 1) = """" then
- c = trim(mid(c, 2, len(c) - 2))
- else
- c = ltrim(mid(c, 2))
- end if
- end if
- else
- c = fp
- end if
- if loadfile(a, b, c) then
- fp = c
- else
- writeln "File not found"
- end if
- else
- writeln "Error"
- end if
- end sub
- sub move
- x.pattern = "^m\s*" & xrng & "\s+" & xaddr & "\s*$" '8+4
- set m = x.execute(cl)
- if m.count > 0 then
- set m = m(0).submatches
- if not parserange(m, 0, true, true, false, ds, 0, 0, a, b, c) then
- writeln "Error"
- exit sub
- end if
- d = (c + 1) - b 'length
- parseaddr m, 8, true, ds, 0, e, f
- if (c < b) or ((65536 - f) < d) then
- writeln "Error"
- exit sub
- end if
- writemems e, f, readmems(a, b, c - b + 1)
- else
- writeln "Error"
- end if
- end sub
- sub name
- a = ltrim(mid(cl, 2))
- if left(a, 1) = """" then
- if right(a, 1) = """" then
- a = trim(mid(a, 2, len(a) - 2))
- else
- a = ltrim(mid(a, 2))
- end if
- end if
- fp = a
- end sub
- sub register
- x.pattern = "^r\s*(?:" & xregs & "(?:\s+" & xvlrg & ")?)?\s*$" '1+2
- set m = x.execute(cl)
- if m.count > 0 then
- set m = m(0).submatches
- if m(0) <> "" then 'set registers
- a = ucase(m(0))
- if a = "SI" then
- tsi = si
- elseif a = "DI" then
- tdi = di
- end if
- if m(1) <> "" then 'immediate number
- b = str2intw(m(1))
- if isempty(b) then
- writeln "Error"
- exit sub
- end if
- executeglobal a & "=" & b
- elseif m(2) <> "" then 'immediate register
- b = eval(m(2))
- if isempty(b) then
- writeln "Error"
- exit sub
- end if
- executeglobal a & "=" & b
- else 'prompt
- b = eval(a)
- write a & " " & hexw(b) & " :"
- b = trim(readln)
- if b = "" then exit sub
- y.pattern = "^" & xvlrg & "$"
- set m = y.execute(b)
- if m.count > 0 then
- set m = m(0).submatches
- if m(0) <> "" then 'number
- b = str2intw(b)
- else 'register
- b = eval(b)
- end if
- else
- writeln "Error"
- exit sub
- end if
- executeglobal a & "=" & b
- end if
- if a = "SI" then
- if si <> tsi then
- if (si > 0) and (si <= int(maxmem / 1048576)) then
- resizemem si
- else
- si = tsi
- writeln "Error"
- end if
- end if
- elseif a = "DI" then
- if di <> tdi then
- if di > (int((ubound(mem) + 1) / 16) - 1) then
- di = tdi
- writeln "Error"
- end if
- end if
- end if
- else 'display registers
- writeln "AX=" & hexw(ax) & " BX=" & hexw(bx) & " CX=" & hexw(cx) & _
- " DX=" & hexw(dx) & " SP=" & hexw(sp) & " BP=" & hexw(bp) & _
- " SI=" & hexw(si) & " DI=" & hexw(di) & vbcrlf & "DS=" & hexw(ds) & _
- " ES=" & hexw(es) & " SS=" & hexw(ss) & " CS=" & hexw(cs) & _
- " IP=" & hexw(ip)
- end if
- else
- writeln "Error"
- end if
- end sub
- sub search
- x.pattern = "^s\s*" & xrng & "(.*?)\s*$" '8+1
- set m = x.execute(cl)
- if m.count > 0 then
- set m = m(0).submatches
- if not parserange(m, 0, true, true, false, ds, 0, 0, a, b, c) then
- writeln "Error"
- exit sub
- end if
- if not parselist(b, m(8), d) then
- writeln "Error"
- exit sub
- end if
- c = c - len(d) + 1
- do while b < c
- if readmems(a, b, len(d)) = d then
- writeln segofs(a, b)
- end if
- b = b + 1
- loop
- else
- writeln "Error"
- end if
- end sub
- sub writefile
- x.pattern = "^w\s*(?:" & xaddr & "(?:\s*(.*?))?)?\s*$" '4+1
- set m = x.execute(cl)
- if m.count > 0 then
- set m = m(0).submatches
- parseaddr m, 0, false, 0, &H100, a, b
- c = (bx * 65536) + cx
- d = (a * &H10) + b + c
- if d > ((ubound(mem) + 1) * 65536) then
- writeln "Error"
- exit sub
- end if
- st.type = 2
- st.charset = "x-user-defined"
- st.open
- st.writetext readmems(a, b, c)
- on error resume next
- st.savetofile fp, 2
- if err.number = 0 then
- d = hex(c)
- if len(d) < 4 then d = string(4 - len(d), "0") & d
- writeln "Writing " & d & " bytes"
- else
- writeln "File not found"
- end if
- st.close
- else
- writeln "Error"
- end if
- end sub
- '====================================================================
- if wscript.arguments.count > 0 then
- fp = wscript.arguments(0)
- else
- fp = ""
- end if
- set fs = createobject("scripting.filesystemobject")
- if fp <> "" then
- if left(fp, 1) = "/" then
- if fp = "/?" then
- set sf = fs.opentextfile(wscript.scriptfullname)
- do while true
- s = sf.readline
- if s = "" then wscript.quit
- writeln mid(s, 2)
- loop
- else
- writeln "Invalid switch - " & mid(fp, 2, 1)
- end if
- wscript.quit
- end if
- end if
- set st = createobject("adodb.stream")
- ax = 0
- bx = 0 'file write length high
- cx = 0 'file write length low
- dx = 0
- sp = 0
- bp = 0
- si = 2 'memory bank size. 1mb each
- di = 0 'memory bank index
- ds = 0 'data segment
- es = 0
- ss = 0
- cs = 0 'file segment
- ip = &H100 'file offset
- dg = ds 'dump segment context
- df = ip 'dump offset context
- maxmem = 256 * 1048576 'max memory storage in bytes
- redim mem(-1)
- resizemem si * 16 - 1 'memory storage in 64kb blocks. min & default is 1mb+64k
- if fp <> "" then
- if fs.fileexists(fp) then
- loadfile cs, ip, fp
- else
- writeln "File not found"
- end if
- end if
- set x = new regexp
- x.ignorecase = true
- set y = new regexp
- y.ignorecase = true
- set z = new regexp
- z.ignorecase = true
- xval = "([0-9a-f]{1,4})" '1
- xregs = "(ax|bx|cx|dx|sp|bp|si|di|ds|es|ss|cs|ip)" '1
- xvlrg = "(?:" & xval & "|" & xregs & ")" '2
- xaddr = "(?:" & xvlrg & ":)?" & xvlrg '4=2+2
- xrng = xaddr & "(?:\s*l\s*" & xvlrg & "|\s*" & xvlrg & ")" '8=4+2+2
- do while true
- write "-"
- t = timer
- cl = trim(readln)
- u = timer 'use input speed to determine input redirection
- if (u - t) < 0.03 then writeln "" 'fast = input redirected
- on error goto 0
- select case ucase(left(cl, 1))
- case "C" compare
- case "D" dump
- case "E" enter
- case "F" fill
- case "H" hexCalc
- case "L" load
- case "M" move
- case "N" name
- case "Q" wscript.quit
- case "R" register
- case "S" search
- case "W" writefile
- case "?" help
- case else if cl <> "" then writeln "Error"
- end select
- loop
Add Comment
Please, Sign In to add comment