Annotation of researchv9/jtools/src/pi/asm.c, revision 1.1

1.1     ! root        1: #include "asm.pri"
        !             2: #include "core.pub"
        !             3: #include "format.pub"
        !             4: #include "parse.h"
        !             5: #include "expr.pub"
        !             6: #include "frame.pub"
        !             7: #include "process.pub"
        !             8: #include "symtab.pub"
        !             9: #include "symbol.h"
        !            10: #include "bpts.pub"
        !            11: SRCFILE("asm.c")
        !            12: 
        !            13: char *Instr::arg(int)                  { return "<arg>";       }
        !            14: char *Instr::mnemonic()                        { return sf("0x%X?", opcode&0xFF); }
        !            15: int Instr::argtype(int)                        { return 0;             }
        !            16: int Instr::nargs()                     { return 0;             }
        !            17: char *Asm::literaldelimiter()          { return "<literal>"; }
        !            18: Instr *Asm::newInstr(long)             { return 0; }
        !            19: 
        !            20: Asm::Asm(Core *c)
        !            21: {
        !            22:        trace( "%d.Asm(%d)", this, c );         VOK;
        !            23:        core = c;
        !            24:        fmt = F_SYMBOLIC|F_HEX;
        !            25: }
        !            26: 
        !            27: void Asm::userclose()
        !            28: {
        !            29:        trace( "%d.userclose()", this );        VOK;
        !            30:        delete pad;
        !            31:        pad = 0;
        !            32:        Instr *instrsetsib;
        !            33:        for( ; instrset; instrset = instrsetsib ){
        !            34:                instrsetsib = instrset->sib;            // new malloc
        !            35:                delete instrset;
        !            36:        }
        !            37: }
        !            38: 
        !            39: void Asm::banner()
        !            40: {
        !            41:        trace( "%d.banner()", this );   VOK;
        !            42:        if( pad ){
        !            43:                pad->banner("Assembler: %s", core->procpath());
        !            44:                pad->name("Asm %s", basename(core->procpath()));
        !            45:        }
        !            46: }
        !            47: 
        !            48: void Asm::open(long a)
        !            49: {
        !            50:        trace("%d.open(%d)", this, a);  VOK;
        !            51:        if( !pad ){
        !            52:                Menu m;
        !            53:                pad = new Pad( (PadRcv*) this );
        !            54:                banner();
        !            55:                m.last( "display pc",     (Action)&Asm::displaypc        );
        !            56:                if( core->online() ){
        !            57:                        m.first( "run",           (Action)&Asm::go               );
        !            58:                        m.last( "step  1 instr ", (Action)&Asm::instrstep,  1 );
        !            59:                        m.last( "step  4 instrs", (Action)&Asm::instrstep,  4 );
        !            60:                        m.last( "step 16 instrs", (Action)&Asm::instrstep, 16 );
        !            61:                        m.last( "step 64 instrs", (Action)&Asm::instrstep, 64 );
        !            62:                        m.last( "step over call", (Action)&Asm::stepover         );
        !            63:                }
        !            64:                pad->menu(m);
        !            65:        }
        !            66:        pad->makecurrent();
        !            67:        if( a ) newInstr(a);
        !            68: }
        !            69: 
        !            70: void Asm::go()
        !            71: {
        !            72:        trace( "%d.go()", this ); VOK;
        !            73:        core->process()->go();
        !            74: }
        !            75: 
        !            76: void Asm::displaypc()
        !            77: {
        !            78:        trace("%d.displaypc()", this);  VOK;
        !            79:        open(core->pc());
        !            80: }
        !            81: 
        !            82: char *Asm::help()
        !            83: {
        !            84:        trace( "%d.help()", this );
        !            85:        return ".=<expr> {display instruction at address}";
        !            86: }
        !            87: 
        !            88: char *Asm::kbd(char *s)
        !            89: {
        !            90:        Parse y(G_DOTEQ_CONEX,0);
        !            91:        Expr *e;
        !            92:        Bls error;
        !            93: 
        !            94:        trace( "%d.kbd(%s)", this, s );         OK("kbd");
        !            95:        if( !(e = (Expr*)y.parse(s)) )
        !            96:                return sf("%s: %s", y.error, s);
        !            97:        e->evaltext(core->process()->globals, error);
        !            98:        if( e->evalerr )
        !            99:                return sf("%s: %s", s, error.text);
        !           100:        newInstr(e->val.lng);
        !           101:        return 0;
        !           102: }
        !           103: 
        !           104: char *Instr::literal(long f)                   /* is Format right? */
        !           105: {
        !           106:        static char t[128];
        !           107: 
        !           108:        trace( "%d.literal(0x%X) 0x%X %g", this, f, m.lng, m.flt ); OK("literal");
        !           109:        sprintf( t, "%s%s", _asm->literaldelimiter(),
        !           110:                        Format(f&~F_SYMBOLIC).f(m.lng,m.dbl) );
        !           111:        return t;
        !           112: }
        !           113: 
        !           114: char *Instr::symbolic(char *prefix)            /* is Format right? */
        !           115: {
        !           116:        static char t[128];
        !           117: 
        !           118:        trace( "%d.symbolic(%s) 0x%X", this, prefix, m.lng ); OK("symbolic");
        !           119:        strcpy(t, prefix);
        !           120:        strcat(t, Format(fmt, _asm->core->symtab()).f(m.lng));
        !           121:        return t;
        !           122: }
        !           123: 
        !           124: Var *Instr::local(UDisc d, long a)             /* VAX */
        !           125: {
        !           126:        Func *f;
        !           127:        Block *b;
        !           128: 
        !           129:        trace("%d.local(0x%X,%d)", this, d, a); OK(0);
        !           130:        if( !(f = (Func*)_asm->core->symtab()->loctosym(U_FUNC, addr)) ) return 0;
        !           131:        if( !(b = f->blk(addr)) ) return 0;
        !           132:        BlkVars bv(b);
        !           133:        Var *v;
        !           134:        while( v = bv.gen() )
        !           135:                if( v->disc() == d && v->range.lo == a )
        !           136:                        break;
        !           137:        return v;
        !           138: }
        !           139: 
        !           140: Var *Instr::field(Var *v, long a)
        !           141: {
        !           142:        trace( "%d.field(%d,%d)", this, v, a ); OK(0);
        !           143:        if( !v->type.isptr() ) return 0;
        !           144:        DType *d = v->type.decref();
        !           145:        if( !d->isstrun() ) return 0;
        !           146:        TypMems tm(d->utype());
        !           147:        while( v = tm.gen() )
        !           148:                if( v->range.lo == a ) break;
        !           149:        return v;
        !           150: }
        !           151: 
        !           152: char *Instr::regarg(char *lay, long f)         /* is Format right? */
        !           153: {
        !           154:        static char t[128];
        !           155:        char *o, *r;
        !           156:        Var *v;
        !           157: 
        !           158:        trace("%d.regarg(%s,0x%X) %d 0x%X", this, lay, f, reg, m.lng); OK("regarg");
        !           159:        r = _asm->core->regname(reg);
        !           160:        o = Format(f&~F_SYMBOLIC).f(m.lng);
        !           161:        if( f&F_SYMBOLIC ){
        !           162:                if( reg == _asm->core->REG_AP() ){
        !           163:                        if( v = local(U_ARG, m.lng) )
        !           164:                                o = v->text();
        !           165:                } else if( reg == _asm->core->REG_FP() ){
        !           166:                        if( v = local(U_AUT, m.lng) )
        !           167:                                o = v->text();
        !           168:                } else {
        !           169:                        if( v = local(U_REG, reg) ){
        !           170:                                r = sf("%s=%s", v->text(), r);
        !           171:                                if( v = field(v, m.lng) )
        !           172:                                        o = v->text();
        !           173:                        }
        !           174:                }
        !           175:        }
        !           176:        sprintf(t, lay, o, r);
        !           177:        return t;
        !           178: }
        !           179: 
        !           180: void Instr::dobpt(int setorclr)
        !           181: {
        !           182:        trace( "%d.dobpt(%d)", this, setorclr ); VOK;
        !           183:        Stmt *stmt = new Stmt(0,0,0);
        !           184:        stmt->range.lo = addr;
        !           185:        stmt->process = _asm->core->process();
        !           186:        stmt->dobpt(setorclr);
        !           187: }
        !           188: 
        !           189: Instr::Instr(Asm *a, long l)
        !           190: {
        !           191:        trace( "%d.Instr(%d,%d)", this, a, l ); VOK;
        !           192:        if( !l ) return;
        !           193:        addr = l;
        !           194:        _asm = a;
        !           195:        sib = _asm->instrset;
        !           196:        _asm->instrset = this;
        !           197:        _asm->banner();                                 /* why here? */
        !           198:        fmt = _asm->fmt;
        !           199:        bpt = _asm->core->process()->bpts()->isasmbpt(addr);
        !           200: }
        !           201: 
        !           202: void Instr::display()
        !           203: {
        !           204:        int     i;
        !           205:        Bls     t;
        !           206: 
        !           207:        trace( "%d.display()", this );  VOK;
        !           208:        if( !addr ) return;
        !           209:        t.af("%s%s", bpt?">>>":"", Format(fmt,_asm->core->symtab()).f(addr));
        !           210:        opcode = _asm->core->peekcode(addr)->chr;
        !           211:        next = addr+1;
        !           212:        char *mnem = mnemonic();
        !           213:        if( mnem ){
        !           214:                t.af(": %s ", mnem);
        !           215:                int n = nargs();
        !           216:                for( i = 0; i < n; ++i )
        !           217:                        t.af("%s%s", i?",":"", arg(i));
        !           218:        }
        !           219:        _asm->pad->insert(addr, SELECTLINE, (PadRcv*)this, carte(), "%s", t.text);
        !           220: }
        !           221: 
        !           222: void Instr::showsrc()
        !           223: {
        !           224:        trace( "%d.showsrc()", this );  ok();
        !           225:        Stmt *stmt = (Stmt*) _asm->core->symtab()->loctosym(U_STMT, addr);
        !           226:        if( stmt ) stmt->select();
        !           227: }
        !           228: 
        !           229: long AF[] = { F_OCTAL, F_SIGNED, F_HEX, F_SYMBOLIC, 0 };
        !           230: 
        !           231: Index Instr::carte()
        !           232: {
        !           233:        Menu m, f;
        !           234: 
        !           235:        trace( "%d.carte()", this );    ok();
        !           236:        if( _asm->core->online() ){
        !           237:                if( bpt )
        !           238:                        m.last( "clr bpt", (Action)&Instr::dobpt, 0 );
        !           239:                else
        !           240:                        m.last( "set bpt", (Action)&Instr::dobpt, 1 );
        !           241:        }
        !           242:        if( _asm->core->symtab()->loctosym(U_STMT, addr) )
        !           243:                m.last( "src text", (Action)&Instr::showsrc, 0 );
        !           244:        m.last( "open frame",   (Action)&Instr::openframe );
        !           245:        m.last( "next  1",      (Action)&Instr::succ,           1 );
        !           246:        m.last( "next  5",      (Action)&Instr::succ,           5 );
        !           247:        m.last( "next 10",      (Action)&Instr::succ,           10 );
        !           248:        for( int i = 0; AF[i]; ++i ){
        !           249:                long b = AF[i];
        !           250:                if( fmt&b ) b |= F_TURNOFF;
        !           251:                f.last(FmtName(b), (Action)&Instr::reformat, b);
        !           252:        }
        !           253:        m.last(f.index("format"));
        !           254:        m.last( "refresh",      (Action)&Instr::succ,           -1 );
        !           255:        m.last( "raw mem",      (Action)&Instr::memory, 0 );
        !           256:        return m.index();
        !           257: }
        !           258: 
        !           259: void Instr::openframe()
        !           260: {
        !           261:        trace( "%d.openframe()", this ); VOK;
        !           262:        _asm->core->process()->openframe(addr);
        !           263: }
        !           264: 
        !           265: void Instr::reformat(int f)
        !           266: {
        !           267:        trace( "%d.reformat(0x%X) 0x%X", this, f, fmt ); VOK;
        !           268:        if( f&F_TURNOFF)
        !           269:                fmt &= ~f;
        !           270:        else
        !           271:                fmt |= f;
        !           272:        if( !fmt ) fmt = F_HEX;
        !           273:        _asm->fmt = fmt;
        !           274:        _asm->newInstr(addr);
        !           275: }
        !           276: 
        !           277: void Instr::succ(int n)                /* think about it! */
        !           278: {
        !           279:        trace( "%d.succ(%d)", this, n );        VOK;
        !           280:        _asm->fmt = fmt;
        !           281:        if( n>0 ) _asm->newInstr(next)->succ(n-1);
        !           282:        else if( n<0 ) _asm->newInstr(addr);
        !           283: }
        !           284: 
        !           285: void Instr::memory()
        !           286: {
        !           287:        trace( "%d.memory()" ); VOK;
        !           288:        _asm->core->process()->openmemory(addr);
        !           289: }
        !           290: 
        !           291: void Asm::instrstep(long i)
        !           292: {
        !           293:        trace( "%d.instrstep(%d)", this, i );   VOK;
        !           294:        core->process()->instrstep(i);
        !           295: }
        !           296: 
        !           297: void Asm::stepover()
        !           298: {
        !           299:        trace( "%d.stepover()", this ); VOK;
        !           300:        core->process()->
        !           301:                stepover( core->pc(), newInstr(core->pc())->next );
        !           302: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.