Mercurial > hg > Members > kono > nitros9-code
view scripts/os9.gdb @ 3194:2ecebda8716b
mfree.asm: Fix zero-day Block Map entry bug
Previously, code assumed that the final entry in the block map would be
used. This was true for CoCo but is not necessarily true (and is not
true for mc09). Slight mod removes that implicit assumption; the code
now works correctly on both platforms.
author | Neal Crook <foofoobedoo@gmail.com> |
---|---|
date | Tue, 30 May 2017 23:59:46 +0100 |
parents | e3e858889ab6 |
children | 11d87afc644a |
line wrap: on
line source
# gdb scripts for NitrOS-9 (or OS-9) # Copyright 2014 Tormod Volden define hook-stop printf "S=%04x X=%04x Y=%04x U=%04x A=%02x B=%02x CC=%02x PC=%04x ", $s, $x, $y, $u, $a, $b, $cc , $pc os9_mwhere end document hook-stop Pretty-print of registers on every halt, and updates external source code window. end define os9_mname set $mname = (char*)$arg0 + *((int*)$arg0 + 2) while 1 if (*$mname < 0x80) printf "%c", *$mname else printf "%c", *$mname-0x80 loop_break end set $mname += 1 end end document os9_mname Print name of module at given address end define os9_mident set $m = (int*)$arg0 set $msize = *($m + 1) set $mtype = *((char*) $m + 6) set $mexec = *(int*)((char*) $m + 9) printf "%04x %4x %2X ", $m, $msize, $mtype os9_mname $m if ($mtype & 0xf) printf "\t[exec %04x] ", (char*)$m + $mexec end printf "\n" end document os9_mident Print details of module at given address. end define os9_mdir printf "addr size ty name\n" set $mt = 0x300 while ($mt < 0x400) if ((int*)*$mt) os9_mident (int*)*$mt end set $mt += 4 end end document os9_mdir List all modules registered in module directory. end define os9_mwhich set $pc_reg = $arg0 set $mt = 0x300 while ($mt < 0x400) if ((int*)*$mt) set $mstart = (int*)*$mt set $mend = (char*)$mstart + *($mstart + 1) if ($pc_reg >= $mstart && $pc_reg < $mend) loop_break end end set $mt += 4 end if ($mt == 0x400) set $mstart = 0 end end document os9_mwhich (internal) Finds module at given address, sets $mstart quietly. end define os9_mwhere if ($argc == 1) set $pc_reg = $arg0 else set $pc_reg = $pc end os9_mwhich $pc_reg if ($mstart) printf "inside " os9_mname $mstart printf "\n" eval "!gvim --remote %02X%02X%02X.crc && gvim --remote-send \":set cursorline<CR>\" && gvim --remote-send \"/^%04X<CR>\"", *((char*)$mend-3), *((char*)$mend-2), *((char*)$mend-1), (char*)$pc_reg - (char*)$mstart else printf "no module\n" end end document os9_mwhere Look up source code line for given address. Requires assembly list files named by CRC in current directory and "gvim" to display listing and highlight line. end define b9 os9_mwhich $pc eval "hbreak *0x%x", (int)$mstart + $arg0 end document b9 Set breakpoint in current module, at given offset. end define ss set $steps = 0 if (*$pc == 0x103f) set $steps = 3 end if (*(char*)$pc == 0x8d) set $steps = 2 end if (*(char*)$pc == 0x17) set $steps = 3 end if ($steps != 0) thbreak *($pc + $steps) cont else stepi end end document ss Single step, but skips OS-9 SWI, bsr and lbsr. end