+ }
+ }
+}
+
+/*
+ * Set a debugger variable.
+ */
+
+private set (var, exp)
+Node var, exp;
+{
+ Symbol t;
+
+ if (var == nil) {
+ defvar(nil, nil);
+ } else if (exp == nil) {
+ defvar(var->value.name, nil);
+ } else if (var->value.name == identname("$frame", true)) {
+ t = exp->nodetype;
+ if (not compatible(t, t_int) and not compatible(t, t_addr)) {
+ error("$frame must be an address");
+ }
+ eval(exp);
+ getnewregs(pop(Address));
+ } else {
+ defvar(var->value.name, unrval(exp));
+ }
+}
+
+/*
+ * Execute a list command.
+ */
+
+private list (p)
+Node p;
+{
+ Symbol f;
+ Address addr;
+ Lineno line, l1, l2;
+
+ if (p->value.arg[0]->op == O_SYM) {
+ f = p->value.arg[0]->value.sym;
+ addr = firstline(f);
+ if (addr == NOADDR) {
+ error("no source lines for \"%s\"", symname(f));
+ }
+ setsource(srcfilename(addr));
+ line = srcline(addr);
+ getsrcwindow(line, &l1, &l2);
+ } else {
+ eval(p->value.arg[0]);
+ l1 = (Lineno) (pop(long));
+ eval(p->value.arg[1]);
+ l2 = (Lineno) (pop(long));
+ }
+ printlines(l1, l2);
+}
+
+/*
+ * Execute a func command.
+ */
+
+private func (p)
+Node p;
+{
+ Symbol s, f;
+ Address addr;
+
+ if (p == nil) {
+ printname(stdout, curfunc);
+ putchar('\n');
+ } else {
+ s = p->value.sym;
+ if (isroutine(s)) {
+ setcurfunc(s);