Annotation of 43BSD/contrib/icon/iconx/interp.s, revision 1.1

1.1     ! root        1: #include "../h/config.h"
        !             2: /*
        !             3:  * Icon interpreter.
        !             4:  */
        !             5: 
        !             6: Global(_c_exit)                /* Exit */
        !             7: Global(_current)       /* Descriptor for current coexpression block */
        !             8: Global(_file)          /* Source file name */
        !             9: Global(_globals)       /* Pointer to first global variable */
        !            10: Global(_ident)
        !            11: Global(_line)          /* Source line number */
        !            12: Global(_k_pos)         /* &pos */
        !            13: Global(_k_subject)     /* &subject */
        !            14: Global(_statics)       /* Pointer to first static variable */
        !            15: Global(_syserr)                /* Internal system error */
        !            16: Global(_interp)                /* Main interpreter loop */
        !            17: #ifdef VAX
        !            18: /*
        !            19:  * Some defines for the interpreter.
        !            20:  */
        !            21: #define Op             r1
        !            22: #define GetOp          movl    (ipc)+,Op
        !            23: #define PushOp         pushl   Op
        !            24: #define PushNull       clrq    -(sp)
        !            25: #define Push_R(a)      pushl   a
        !            26: #define Push_S(a)      pushl   a
        !            27: #define Push_K(a)      pushl   $a
        !            28: #define PushOpSum_R(a) addl3   Op,a,-(sp)
        !            29: #define PushOpSum_S(a) addl3   Op,a,-(sp)
        !            30: #define NextInst       jmp     _interp
        !            31: #define CallN(n)       pushl   $n;\
        !            32:                        calls   $((n*2)+1),*optab(r0)
        !            33: #define CallNameN(n,f) pushl   $n;\
        !            34:                        calls   $((n*2)+1),f
        !            35: #define BitClear(m)    bicl2   $~m,Op
        !            36: #define Jump(lab)      jbr     lab
        !            37: #define LongJump(lab)  jmp     lab
        !            38: #define Label(lab)     lab:
        !            39: /*
        !            40:  * Globals for various routines.
        !            41:  */
        !            42: #define Glob4(a,b,c,d) Global(a); Global(b); Global(c); Global(d)
        !            43: Glob4(_asgn, _bang, _bscan, _cat)
        !            44: Glob4(_coact, _cofail, _compl, _coret)
        !            45: Glob4(_create, _diff, _div, _eqv)
        !            46: Glob4(_escan, _esusp, _field, _inter)
        !            47: Glob4(_invoke, _keywd, _lconcat, _lexeq)
        !            48: Glob4(_lexge, _lexgt, _lexle, _lexlt)
        !            49: Glob4(_lexne, _limit, _llist, _lsusp)
        !            50: Glob4(_minus, _mod, _mult, _neg)
        !            51: Glob4(_neqv, _nonnull, _null, _number)
        !            52: Glob4(_numeq, _numge, _numgt, _numle)
        !            53: Glob4(_numlt, _numne, _pfail, _plus)
        !            54: Glob4(_power, _pret, _psusp, _random)
        !            55: Glob4(_rasgn, _refresh, _rswap, _sect)
        !            56: Glob4(_size, _subsc, _swap, _tabmat)
        !            57: Global(_toby); Global(_unioncs); Global(_value)
        !            58: 
        !            59: Label(jumptab)
        !            60: /*
        !            61:  * The jump table, the interpreter branches to the nth label
        !            62:  *  to execute opcode n.
        !            63:  */
        !            64: /*   0 */ .long quit,          op_asgn,        op_bang,        op_cat
        !            65: /*   4 */ .long op_compl,      op_diff,        op_div,         op_eqv
        !            66: /*   8 */ .long op_inter,      op_lconcat,     op_lexeq,       op_lexge
        !            67: /*  12 */ .long op_lexgt,      op_lexle,       op_lexlt,       op_lexne
        !            68: /*  16 */ .long op_minus,      op_mod,         op_mult,        op_neg
        !            69: /*  20 */ .long op_neqv,       op_nonnull,     op_null,        op_number
        !            70: /*  24 */ .long op_numeq,      op_numge,       op_numgt,       op_numle
        !            71: /*  28 */ .long op_numlt,      op_numne,       op_plus,        op_power
        !            72: /*  32 */ .long op_random,     op_rasgn,       op_refresh,     op_rswap
        !            73: /*  36 */ .long op_sect,       op_size,        op_subsc,       op_swap
        !            74: /*  40 */ .long op_tabmat,     op_toby,        op_unioncs,     op_value
        !            75: /*  44 */ .long op_bscan,      op_ccase,       op_chfail,      op_coact
        !            76: /*  48 */ .long op_cofail,     op_coret,       op_create,      op_cset
        !            77: /*  52 */ .long op_dup,                op_efail,       op_eret,        op_escan
        !            78: /*  56 */ .long op_esusp,      op_field,       op_file,        op_goto
        !            79: /*  60 */ .long op_incres,     op_init,        op_int,         op_invoke
        !            80: /*  64 */ .long op_keywd,      err,            op_limit,       op_line
        !            81: /*  68 */ .long op_llist,      op_lsusp,       op_mark,        op_pfail
        !            82: /*  72 */ .long op_pnull,      op_pop,         op_pret,        op_psusp
        !            83: /*  76 */ .long op_push1,      op_pushn1,      op_real,        op_sdup
        !            84: /*  80 */ .long op_str,                op_unmark,      err,            err
        !            85: /*  84 */ .long op_local,      err,            err,            err
        !            86: /*  88 */ .long err,           err,            err,            err
        !            87: /*  92 */ .long op_global,     op_arg,         op_static,      op_mark0
        !            88: /*  96 */ .long err,           err,            err,            err
        !            89: /* 100 */ .long err,           err,            err,            err
        !            90: /* 104 */ .long err,           err,            err,            err
        !            91: /* 108 */ .long err,           err,            err,            err
        !            92: /* 112 */ .long op_globx,      op_globx,       op_globx,       op_globx
        !            93: /* 116 */ .long op_globx,      op_globx,       op_globx,       op_globx
        !            94: /* 120 */ .long op_globx,      op_globx,       op_globx,       op_globx
        !            95: /* 124 */ .long op_globx,      op_globx,       op_globx,       op_globx
        !            96: /* 128 */ .long op_locx,       op_locx,        op_locx,        op_locx
        !            97: /* 132 */ .long op_locx,       op_locx,        op_locx,        op_locx
        !            98: /* 136 */ .long op_locx,       op_locx,        op_locx,        op_locx
        !            99: /* 140 */ .long op_locx,       op_locx,        op_locx,        op_locx
        !           100: /* 144 */ .long op_intx,       op_intx,        op_intx,        op_intx
        !           101: /* 148 */ .long op_intx,       op_intx,        op_intx,        op_intx
        !           102: /* 152 */ .long op_intx,       op_intx,        op_intx,        op_intx
        !           103: /* 156 */ .long op_intx,       op_intx,        op_intx,        op_intx
        !           104: /* 160 */ .long op_statx,      op_statx,       op_statx,       op_statx
        !           105: /* 164 */ .long op_statx,      op_statx,       op_statx,       op_statx
        !           106: /* 168 */ .long op_argx,       op_argx,        op_argx,        op_argx
        !           107: /* 172 */ .long op_argx,       op_argx,        op_argx,        op_argx
        !           108: /* 176 */ .long op_unmk0,      op_unmk1,       op_unmk2,       op_unmk3
        !           109: /* 180 */ .long op_unmk4,      op_unmk5,       op_unmk6,       op_unmk7
        !           110: /* 184 */ .long op_invkx,      op_invkx,       op_invkx,       op_invkx
        !           111: /* 188 */ .long op_invkx,      op_invkx,       op_invkx,       op_invkx
        !           112: /* 192 */ .long op_linex,      op_linex,       op_linex,       op_linex
        !           113: /* 196 */ .long op_linex,      op_linex,       op_linex,       op_linex
        !           114: /* 200 */ .long op_linex,      op_linex,       op_linex,       op_linex
        !           115: /* 204 */ .long op_linex,      op_linex,       op_linex,       op_linex
        !           116: /* 208 */ .long op_linex,      op_linex,       op_linex,       op_linex
        !           117: /* 212 */ .long op_linex,      op_linex,       op_linex,       op_linex
        !           118: /* 216 */ .long op_linex,      op_linex,       op_linex,       op_linex
        !           119: /* 220 */ .long op_linex,      op_linex,       op_linex,       op_linex
        !           120: /* 224 */ .long op_linex,      op_linex,       op_linex,       op_linex
        !           121: /* 228 */ .long op_linex,      op_linex,       op_linex,       op_linex
        !           122: /* 232 */ .long op_linex,      op_linex,       op_linex,       op_linex
        !           123: /* 236 */ .long op_linex,      op_linex,       op_linex,       op_linex
        !           124: /* 240 */ .long op_linex,      op_linex,       op_linex,       op_linex
        !           125: /* 244 */ .long op_linex,      op_linex,       op_linex,       op_linex
        !           126: /* 248 */ .long op_linex,      op_linex,       op_linex,       op_linex
        !           127: /* 252 */ .long op_linex,      op_linex,       op_linex,       op_linex
        !           128: Label(optab)
        !           129: /*
        !           130:  * When an opcode n has a subroutine call associated with it, the
        !           131:  *  nth word here is the routine to call.
        !           132:  */
        !           133: /*   0 */ .long        err,            _asgn,          _bang,          _cat
        !           134: /*   4 */ .long        _compl,         _diff,          _div,           _eqv
        !           135: /*   8 */ .long        _inter,         _lconcat,       _lexeq,         _lexge
        !           136: /*  12 */ .long        _lexgt,         _lexle,         _lexlt,         _lexne
        !           137: /*  16 */ .long        _minus,         _mod,           _mult,          _neg
        !           138: /*  20 */ .long        _neqv,          _nonnull,       _null,          _number
        !           139: /*  24 */ .long        _numeq,         _numge,         _numgt,         _numle
        !           140: /*  28 */ .long        _numlt,         _numne,         _plus,          _power
        !           141: /*  32 */ .long        _random,        _rasgn,         _refresh,       _rswap
        !           142: /*  36 */ .long        _sect,          _size,          _subsc,         _swap
        !           143: /*  40 */ .long        _tabmat,        _toby,          _unioncs,       _value
        !           144: /*  44 */ .long        _bscan,         err,            err,            _coact
        !           145: /*  48 */ .long        _cofail,        _coret,         _create,        err
        !           146: /*  52 */ .long        err,            err,            err,            _escan
        !           147: /*  56 */ .long        _esusp,         _field,         err,            err
        !           148: /*  60 */ .long        err,            err,            err,            _invoke
        !           149: /*  64 */ .long        _keywd,         err,            _limit,         err
        !           150: /*  68 */ .long        _llist,         _lsusp,         err,            _pfail
        !           151: /*  72 */ .long        err,            err,            _pret,          _psusp
        !           152: 
        !           153:  .text
        !           154: 
        !           155:                        
        !           156: /*
        !           157:  * Interpreter main loop.
        !           158:  */
        !           159: Label(_interp)
        !           160:        movzbl  (ipc)+,r0
        !           161:        movl    r0,Op
        !           162:        ashl    $2,r0,r0
        !           163:        jmp     *jumptab(r0)
        !           164: 
        !           165: /*
        !           166:  * Ternary operators.
        !           167:  */
        !           168: 
        !           169: Label(op_toby)                         /* e1 to e2 by e3 */
        !           170: Label(op_escan)                                /* escan */
        !           171:        CallN(3)
        !           172:        NextInst        
        !           173: Label(op_sect)                         /* e1[e2:e3] */
        !           174:        PushNull
        !           175:        CallN(4)
        !           176:        NextInst
        !           177: 
        !           178: /*
        !           179:  * Binary operators.
        !           180:  */
        !           181: Label(op_asgn)                         /* e1 := e2 */
        !           182: Label(op_cat)                          /* e1 || e2 */
        !           183: Label(op_diff)                         /* e1 -- e2 */
        !           184: Label(op_div)                          /* e1 / e2 */
        !           185: Label(op_eqv)                          /* e1 === e2 */
        !           186: Label(op_inter)                                /* e1 ** e2 */
        !           187: Label(op_lconcat)                      /* e1 ||| e2 */
        !           188: Label(op_lexeq)                                /* e1 == e2 */
        !           189: Label(op_lexge)                                /* e1 >>= e2 */
        !           190: Label(op_lexgt)                                /* e1 >> e2 */
        !           191: Label(op_lexle)                                /* e1 <<= e2 */
        !           192: Label(op_lexlt)                                /* e1 << e2 */
        !           193: Label(op_lexne)                                /* e1 ~== e2 */
        !           194: Label(op_minus)                                /* e1 - e2 */
        !           195: Label(op_mod)                          /* e1 % e2 */
        !           196: Label(op_mult)                         /* e1 * e2 */
        !           197: Label(op_neqv)                         /* e1 ~==== e2 */
        !           198: Label(op_numeq)                                /* e1 = e2 */
        !           199: Label(op_numge)                                /* e1 >= e2 */
        !           200: Label(op_numgt)                                /* e1 > e2 */
        !           201: Label(op_numle)                                /* e1 <= e2 */
        !           202: Label(op_numlt)                                /* e1 < e2 */
        !           203: Label(op_numne)                                /* e1 ~= e2 */
        !           204: Label(op_plus)                         /* e1 + e2 */
        !           205: Label(op_power)                                /* e1 ^ e2 */
        !           206: Label(op_rasgn)                                /* e1 <- e2 */
        !           207: Label(op_unioncs)                      /* e1 ++ e2 */
        !           208:        CallN(2)
        !           209:        NextInst
        !           210: 
        !           211: Label(op_rswap)                                /* e1 <-> e2 */
        !           212: Label(op_subsc)                                /* e1[e2] */
        !           213: Label(op_swap)                         /* e1 :=: e2 */
        !           214:        PushNull
        !           215:        CallN(3)
        !           216:        NextInst
        !           217:        
        !           218: /*
        !           219:  * Unary operators.
        !           220:  */
        !           221: Label(op_compl)                                /* ~e */
        !           222: Label(op_neg)                          /* -e */
        !           223: Label(op_nonnull)                      /* \e */
        !           224: Label(op_null)                         /* /e */
        !           225: Label(op_number)                       /* +e */
        !           226: Label(op_refresh)                      /* ^e */
        !           227: Label(op_size)                         /* *e */
        !           228: Label(op_value)                                /* .e */
        !           229: Label(op_coact)                                /* @e */
        !           230: Label(op_esusp)                                /* esusp */
        !           231: Label(op_pret)                         /* pret */
        !           232:        CallN(1)
        !           233:        NextInst
        !           234:        
        !           235: Label(op_bang)                         /* !e */
        !           236: Label(op_random)                       /* ?e */
        !           237: Label(op_tabmat)                       /* =e */
        !           238:        PushNull
        !           239:        CallN(2)
        !           240:        NextInst
        !           241: /*
        !           242:  * Instructions.
        !           243:  */
        !           244: Label(op_bscan)                                /* bscan */
        !           245:        movq    _k_subject,-(sp)
        !           246:        Push_S(_k_pos)
        !           247:        Push_K(D_INTEGER)
        !           248:        CallN(0)
        !           249:        NextInst
        !           250: 
        !           251: Label(op_ccase)                                /* ccase */
        !           252:        PushNull
        !           253:        movq    4(efp),-(sp)
        !           254:        NextInst
        !           255: 
        !           256: Label(op_chfail)                       /* chfail */
        !           257:        GetOp
        !           258:        addl3   ipc,Op,-8(efp)
        !           259:        NextInst
        !           260:                
        !           261: Label(op_efail)                                /* efail */
        !           262:        LongJump(_efail)
        !           263:        
        !           264: Label(op_pfail)                                /* pfail */
        !           265:        LongJump(_pfail)
        !           266: 
        !           267: Label(op_cofail)                       /* cofail */
        !           268: Label(op_coret)                                /* coret */
        !           269: Label(op_limit)                                /* limit */
        !           270: Label(op_lsusp)                                /* lsusp */
        !           271: Label(op_psusp)                                /* psusp */
        !           272:        CallN(0)
        !           273:        NextInst
        !           274: 
        !           275: Label(op_create)                       /* create */
        !           276:        GetOp
        !           277:        PushOpSum_R(ipc)
        !           278:        Push_K(D_INTEGER)
        !           279:        CallNameN(0,_create)
        !           280:        NextInst
        !           281: 
        !           282: Label(op_cset)                         /* cset */
        !           283:        GetOp
        !           284:        PushOpSum_R(ipc)
        !           285:        Push_K(D_CSET)
        !           286:        NextInst
        !           287:        
        !           288: Label(op_dup)                          /* dup */
        !           289:        PushNull
        !           290:        movq    8(sp),-(sp)
        !           291:        NextInst
        !           292: 
        !           293: Label(op_field)                                /* field */
        !           294:        GetOp
        !           295:        PushOp
        !           296:        Push_K(D_INTEGER)
        !           297:        CallNameN(2,_field)
        !           298:        NextInst
        !           299:        
        !           300: Label(op_eret)                         /* eret */
        !           301:        movq    (sp)+,r0
        !           302:        movl    -4(efp),gfp
        !           303:        movl    efp,sp
        !           304:        movl    (sp)+,efp
        !           305:        movq    r0,-(sp)
        !           306:        NextInst
        !           307:        
        !           308: Label(op_file)                         /* file */
        !           309:        GetOp
        !           310:        addl3   Op,_ident,_file
        !           311:        NextInst
        !           312:        
        !           313: Label(op_goto)                         /* goto */
        !           314:        GetOp
        !           315:        addl2   Op,ipc
        !           316:        NextInst
        !           317:        
        !           318: Label(op_incres)                       /* incres */
        !           319:        movl    _current+4,r0
        !           320:        incl    28(r0)
        !           321:        NextInst
        !           322: 
        !           323: Label(op_init)                         /* init */
        !           324:        movb    $59,-(ipc)
        !           325:        addl2   $5,ipc          /* Watch out here, that 5 comes from
        !           326:                                   # bytes in op + operand, not to 
        !           327:                                   mention that the 59 is OP_GOTO */
        !           328:        NextInst
        !           329: 
        !           330: Label(op_invoke)                       /* invoke */
        !           331:        GetOp
        !           332:        Jump(invkjmp)
        !           333: Label(op_invkx)
        !           334:        BitClear(7)
        !           335: Label(invkjmp)
        !           336:        PushOp
        !           337:        ashl    $1,Op,Op
        !           338:        incl    Op
        !           339:        calls   Op,_invoke
        !           340:        NextInst        
        !           341: 
        !           342: Label(op_int)                          /* int */
        !           343:        movl    (ipc)+,Op       /* Special case here, integers come
        !           344:                                    out as a WORDSIZE value */
        !           345:        Jump(intjmp)
        !           346: Label(op_intx)
        !           347:        BitClear(15)
        !           348: Label(intjmp)
        !           349:        PushOp
        !           350:        Push_K(D_INTEGER)
        !           351:        NextInst
        !           352: 
        !           353: Label(op_keywd)                                /* keywd */
        !           354:        GetOp
        !           355:        PushOp
        !           356:        Push_K(D_INTEGER)
        !           357:        CallNameN(0,_keywd)
        !           358:        NextInst
        !           359:        
        !           360: Label(op_line)                         /* line */
        !           361:        GetOp
        !           362:        Jump(linejmp)
        !           363: Label(op_linex)
        !           364:        BitClear(63)
        !           365: Label(linejmp)
        !           366:        movl    Op,_line
        !           367:        NextInst
        !           368: 
        !           369: Label(op_llist)                                /* llist */
        !           370:        GetOp
        !           371:        PushOp
        !           372:        movl    Op,r8           /* Do a workaround to allow for more */
        !           373:        calls   $0,_llist       /*  than 256 words of arg list. */
        !           374:        ashl    $1,r8,r8        /* This assumes that we don't "reenter" */
        !           375:        incl    r8              /*  this piece of code. */
        !           376:        ashl    $2,r8,r8
        !           377:        addl2   r8,sp
        !           378:        NextInst
        !           379: 
        !           380: Label(op_mark)                         /* mark */
        !           381:        GetOp
        !           382:        addl2   ipc,Op
        !           383:        Push_R(efp)
        !           384:        movl    sp,efp
        !           385:        Push_R(gfp)
        !           386:        clrl    gfp
        !           387:        PushOp
        !           388:        NextInst
        !           389:        
        !           390: Label(op_mark0)                                /* mark0 */
        !           391:        Push_R(efp)
        !           392:        movl    sp,efp
        !           393:        Push_R(gfp)
        !           394:        clrl    gfp
        !           395:        Push_K(0)
        !           396:        NextInst
        !           397:        
        !           398: Label(op_pnull)                                /* pnull */
        !           399:        PushNull
        !           400:        NextInst
        !           401: 
        !           402: Label(op_pop)                          /* pop */
        !           403:        tstl    (sp)+
        !           404:        tstl    (sp)+
        !           405:        NextInst
        !           406: 
        !           407: Label(op_push1)                                /* push1 */
        !           408:        Push_K(1)
        !           409:        Push_K(D_INTEGER)
        !           410:        NextInst
        !           411: 
        !           412: Label(op_pushn1)                       /* pushn1 */
        !           413:        Push_K(-1)
        !           414:        Push_K(D_INTEGER)
        !           415:        NextInst
        !           416: 
        !           417: Label(op_real)                         /* real */
        !           418:        GetOp
        !           419:        PushOpSum_R(ipc)
        !           420:        Push_K(D_REAL)
        !           421:        NextInst
        !           422: 
        !           423: Label(op_sdup)                         /* sdup */
        !           424:        movq    (sp),-(sp)
        !           425:        NextInst
        !           426: 
        !           427: Label(op_str)                          /* str */
        !           428:        GetOp
        !           429:        PushOpSum_S(_ident)
        !           430:        GetOp
        !           431:        PushOp
        !           432:        NextInst
        !           433: 
        !           434: Label(op_unmark)                       /* unmark */
        !           435:        GetOp
        !           436: Label(unmkjmp)
        !           437:        movl    (efp),efp
        !           438:        sobgtr  Op,unmkjmp
        !           439:        movl    -4(efp),gfp
        !           440:        movl    efp,sp
        !           441:        movl    (sp)+,efp
        !           442:        NextInst
        !           443: Label(op_unmk7)
        !           444:        movl    (efp),efp
        !           445: Label(op_unmk6)
        !           446:        movl    (efp),efp
        !           447: Label(op_unmk5)
        !           448:        movl    (efp),efp
        !           449: Label(op_unmk4)
        !           450:        movl    (efp),efp
        !           451: Label(op_unmk3)
        !           452:        movl    (efp),efp
        !           453: Label(op_unmk2)
        !           454:        movl    (efp),efp
        !           455: Label(op_unmk1)
        !           456:        movl    -4(efp),gfp
        !           457:        movl    efp,sp
        !           458:        movl    (sp)+,efp
        !           459: Label(op_unmk0)
        !           460:        NextInst
        !           461: 
        !           462: Label(op_global)                       /* global */
        !           463:        GetOp
        !           464:        Jump(globjmp)
        !           465: Label(op_globx)
        !           466:        BitClear(15)
        !           467: Label(globjmp)
        !           468:        ashl    $3,Op,Op
        !           469:        PushOpSum_S(_globals)
        !           470:        Push_K(D_VAR)
        !           471:        NextInst
        !           472: 
        !           473: Label(op_static)                       /* static */
        !           474:        GetOp
        !           475:        Jump(statjmp)
        !           476: Label(op_statx)
        !           477:        BitClear(7)
        !           478: Label(statjmp)
        !           479:        ashl    $3,Op,Op
        !           480:        PushOpSum_S(_statics)
        !           481:        Push_K(D_VAR)
        !           482:        NextInst
        !           483: 
        !           484: Label(op_local)                                /* local */
        !           485:        GetOp
        !           486:        Jump(locjmp)
        !           487: Label(op_locx)
        !           488:        BitClear(15)
        !           489: Label(locjmp)
        !           490:        mnegl   Op,Op
        !           491:        movaq   -16(fp)[Op],-(sp)
        !           492:        Push_K(D_VAR)
        !           493:        NextInst
        !           494: 
        !           495: Label(op_arg)                          /* arg */
        !           496:        GetOp
        !           497:        Jump(argjmp)
        !           498: Label(op_argx)
        !           499:        BitClear(7)
        !           500: Label(argjmp)
        !           501:        pushaq  8(ap)[Op]
        !           502:        Push_K(D_VAR)
        !           503:        NextInst
        !           504: 
        !           505: Label(quit)                            /* quit */
        !           506:        Push_K(0)
        !           507:        calls   $1,_c_exit
        !           508: 
        !           509: Label(err)                             /* err */
        !           510:        subl3   _code,ipc,-(sp)
        !           511:        ashl    $-2,r0,-(sp)
        !           512:        Push_K(unrecog)
        !           513:        Push_K(message)
        !           514:        calls   $3,_sprintf
        !           515:        Push_K(message)
        !           516:        calls   $0,_syserr
        !           517:  .data
        !           518: Label(message)
        !           519:        .space  30
        !           520: Label(unrecog)
        !           521:        .asciz  "Unknown opcode %d, pc = %d\n"
        !           522:        halt
        !           523: #endif VAX
        !           524: #ifdef PORT
        !           525: /* Copy the code for the VAX in here and work on it */
        !           526: DummyFcn(_interp)
        !           527: #endif PORT
        !           528: 
        !           529: #ifdef PDP11
        !           530: / Icon interpreter
        !           531: 
        !           532:  .globl        _c_exit
        !           533:  .globl        _current
        !           534:  .globl        _file
        !           535:  .globl        _globals
        !           536:  .globl        _ident
        !           537:  .globl        _line
        !           538:  .globl        _k_pos
        !           539:  .globl        _k_subject
        !           540:  .globl        _statics
        !           541:  .globl        _syserr
        !           542: 
        !           543:  .globl        _interp
        !           544: 
        !           545: _interp:
        !           546:        movb    (r2)+,r0
        !           547:        bic     $!377,r0
        !           548:        mov     r0,r1
        !           549:        asl     r0
        !           550:        jmp     *jumptab(r0)
        !           551: 
        !           552:  .data
        !           553: jumptab:
        !           554:         quit;       op_asgn;    op_bang;    op_cat
        !           555:         op_compl;   op_diff;    op_div;     op_eqv
        !           556:         op_inter;   op_lconcat; op_lexeq;   op_lexge
        !           557:         op_lexgt;   op_lexle;   op_lexlt;   op_lexne
        !           558:         op_minus;   op_mod;     op_mult;    op_neg
        !           559:         op_neqv;    op_nonnull; op_null;    op_number
        !           560:         op_numeq;   op_numge;   op_numgt;   op_numle
        !           561:         op_numlt;   op_numne;   op_plus;    op_power
        !           562:         op_random;  op_rasgn;   op_refresh; op_rswap
        !           563:         op_sect;    op_size;    op_subsc;   op_swap
        !           564:         op_tabmat;  op_toby;    op_unioncs; op_value
        !           565:         op_bscan;   op_ccase;   op_chfail;  op_coact
        !           566:         op_cofail;  op_coret;   op_create;  op_cset
        !           567:         op_dup;     op_efail;   op_eret;    op_escan
        !           568:         op_esusp;   op_field;   op_file;    op_goto
        !           569:         op_incres;  op_init;    op_int;     op_invoke
        !           570:         op_keywd;   err;        op_limit;   op_line
        !           571:         op_llist;   op_lsusp;   op_mark;    op_pfail
        !           572:         op_pnull;   op_pop;     op_pret;    op_psusp
        !           573:         op_push1;   op_pushn1;  op_real;    op_sdup
        !           574:         op_str;     op_unmark;  err;        err
        !           575:         op_local;   op_long;    err;        err
        !           576:         err;        err;        err;        err
        !           577:         op_global;  op_arg;     op_static;  op_mark0
        !           578:         err;        err;        err;        err
        !           579:         err;        err;        err;        err
        !           580:         err;        err;        err;        err
        !           581:         err;        err;        err;        err
        !           582:         op_globx;   op_globx;   op_globx;   op_globx
        !           583:         op_globx;   op_globx;   op_globx;   op_globx
        !           584:         op_globx;   op_globx;   op_globx;   op_globx
        !           585:         op_globx;   op_globx;   op_globx;   op_globx
        !           586:         op_locx;    op_locx;    op_locx;    op_locx
        !           587:         op_locx;    op_locx;    op_locx;    op_locx
        !           588:         op_locx;    op_locx;    op_locx;    op_locx
        !           589:         op_locx;    op_locx;    op_locx;    op_locx
        !           590:         op_intx;    op_intx;    op_intx;    op_intx
        !           591:         op_intx;    op_intx;    op_intx;    op_intx
        !           592:         op_intx;    op_intx;    op_intx;    op_intx
        !           593:         op_intx;    op_intx;    op_intx;    op_intx
        !           594:         op_statx;   op_statx;   op_statx;   op_statx
        !           595:         op_statx;   op_statx;   op_statx;   op_statx
        !           596:         op_argx;    op_argx;    op_argx;    op_argx
        !           597:         op_argx;    op_argx;    op_argx;    op_argx
        !           598:         op_unmk0;   op_unmk1;   op_unmk2;   op_unmk3
        !           599:         op_unmk4;   op_unmk5;   op_unmk6;   op_unmk7
        !           600:         op_invkx;   op_invkx;   op_invkx;   op_invkx
        !           601:         op_invkx;   op_invkx;   op_invkx;   op_invkx
        !           602:         op_linex;   op_linex;   op_linex;   op_linex
        !           603:         op_linex;   op_linex;   op_linex;   op_linex
        !           604:         op_linex;   op_linex;   op_linex;   op_linex
        !           605:         op_linex;   op_linex;   op_linex;   op_linex
        !           606:         op_linex;   op_linex;   op_linex;   op_linex
        !           607:         op_linex;   op_linex;   op_linex;   op_linex
        !           608:         op_linex;   op_linex;   op_linex;   op_linex
        !           609:         op_linex;   op_linex;   op_linex;   op_linex
        !           610:         op_linex;   op_linex;   op_linex;   op_linex
        !           611:         op_linex;   op_linex;   op_linex;   op_linex
        !           612:         op_linex;   op_linex;   op_linex;   op_linex
        !           613:         op_linex;   op_linex;   op_linex;   op_linex
        !           614:         op_linex;   op_linex;   op_linex;   op_linex
        !           615:         op_linex;   op_linex;   op_linex;   op_linex
        !           616:         op_linex;   op_linex;   op_linex;   op_linex
        !           617:         op_linex;   op_linex;   op_linex;   op_linex
        !           618: 
        !           619:  .globl  _asgn,      _bang,      _cat
        !           620:  .globl  _compl,     _diff,            _div,       _eqv
        !           621:  .globl  _inter,     _lconcat,         _lexeq,     _lexge
        !           622:  .globl  _lexgt,     _lexle,           _lexlt,     _lexne
        !           623:  .globl  _minus,     _mod,             _mult,      _neg
        !           624:  .globl  _neqv,      _nonnull,         _null,      _number
        !           625:  .globl  _numeq,     _numge,           _numgt,     _numle
        !           626:  .globl  _numlt,     _numne,           _plus,      _power
        !           627:  .globl  _random,    _rasgn,           _refresh,   _rswap
        !           628:  .globl  _sect,      _size,            _subsc,     _swap
        !           629:  .globl  _tabmat,    _toby,            _unioncs,   _value
        !           630:  .globl  _bscan
        !           631:  .globl  _coact,     _cofail,          _coret,     _create
        !           632:  .globl  _efail
        !           633:  .globl  _escan,     _esusp,           _field
        !           634:  .globl  _invoke,    _keywd
        !           635:  .globl  _limit,     _llist,           _lsusp
        !           636:  .globl  _pfail
        !           637:  .globl  _pret,      _psusp
        !           638: 
        !           639: optab:
        !           640:         err;        _asgn;      _bang;      _cat
        !           641:         _compl;     _diff;     _div;       _eqv
        !           642:         _inter;     _lconcat;  _lexeq;     _lexge
        !           643:         _lexgt;     _lexle;    _lexlt;     _lexne
        !           644:         _minus;     _mod;      _mult;      _neg
        !           645:         _neqv;      _nonnull;  _null;      _number
        !           646:         _numeq;     _numge;    _numgt;     _numle
        !           647:         _numlt;     _numne;    _plus;      _power
        !           648:         _random;    _rasgn;    _refresh;   _rswap
        !           649:         _sect;      _size;     _subsc;     _swap
        !           650:         _tabmat;    _toby;     _unioncs;   _value
        !           651:         _bscan;     err;        err;        _coact
        !           652:         _cofail;    _coret;     _create;    err
        !           653:         err;        _efail;     err;        _escan
        !           654:         _esusp;     _field;     err;        err
        !           655:         err;        err;        err;        _invoke
        !           656:         _keywd;     err;        _limit;     err
        !           657:         _llist;     _lsusp;     err;        _pfail
        !           658:         err;        err;        _pret;      _psusp
        !           659:  .text
        !           660: 
        !           661: / ternary operators
        !           662: 
        !           663: op_toby:
        !           664: op_escan:
        !           665:        mov     $3,-(sp)
        !           666:        jsr     pc,*optab(r0)
        !           667:        jbr     _interp
        !           668: op_sect:
        !           669:        clr     -(sp)
        !           670:        clr     -(sp)
        !           671:        mov     $4,-(sp)
        !           672:        jsr     pc,*optab(r0)
        !           673:        jbr     _interp
        !           674: 
        !           675: / binary operators
        !           676: 
        !           677: op_asgn:
        !           678: op_cat:
        !           679: op_diff:
        !           680: op_div:
        !           681: op_eqv:
        !           682: op_inter:
        !           683: op_lconcat:
        !           684: op_lexeq:
        !           685: op_lexge:
        !           686: op_lexgt:
        !           687: op_lexle:
        !           688: op_lexlt:
        !           689: op_lexne:
        !           690: op_minus:
        !           691: op_mod:
        !           692: op_mult:
        !           693: op_neqv:
        !           694: op_numeq:
        !           695: op_numge:
        !           696: op_numgt:
        !           697: op_numle:
        !           698: op_numlt:
        !           699: op_numne:
        !           700: op_plus:
        !           701: op_power:
        !           702: op_rasgn:
        !           703: op_unioncs:
        !           704:        mov     $2,-(sp)
        !           705:        jsr     pc,*optab(r0)
        !           706:        jbr     _interp
        !           707: op_rswap:
        !           708: op_subsc:
        !           709: op_swap:
        !           710:        clr     -(sp)
        !           711:        clr     -(sp)
        !           712:        mov     $3,-(sp)
        !           713:        jsr     pc,*optab(r0)
        !           714:        jbr     _interp
        !           715: 
        !           716: / unary operators
        !           717: 
        !           718: op_compl:
        !           719: op_neg:
        !           720: op_nonnull:
        !           721: op_null:
        !           722: op_number:
        !           723: op_refresh:
        !           724: op_size:
        !           725: op_value:
        !           726: op_coact:
        !           727: op_esusp:
        !           728: op_pret:
        !           729:        mov     $1,-(sp)
        !           730:        jsr     pc,*optab(r0)
        !           731:        jbr     _interp
        !           732: op_bang:       
        !           733: op_random:
        !           734: op_tabmat:
        !           735:        clr     -(sp)
        !           736:        clr     -(sp)
        !           737:        mov     $2,-(sp)
        !           738:        jsr     pc,*optab(r0)
        !           739:        jbr     _interp
        !           740: 
        !           741: / instructions
        !           742: 
        !           743: op_bscan:
        !           744:        mov     _k_subject+2,-(sp)
        !           745:        mov     _k_subject,-(sp)
        !           746:        mov     _k_pos,-(sp)
        !           747:        mov     $D_INTEGER,-(sp)
        !           748:        clr     -(sp)
        !           749:        jsr     pc,*optab(r0)
        !           750:        jbr     _interp
        !           751: op_ccase:
        !           752:        clr     -(sp)
        !           753:        clr     -(sp)
        !           754:        mov     4(r4),-(sp)
        !           755:        mov     2(r4),-(sp)
        !           756:        jbr     _interp
        !           757: op_chfail:
        !           758:        movb    (r2)+,r0
        !           759:        movb    (r2)+,r1
        !           760:        bic     $!0377,r0
        !           761:        ash     $8.,r1
        !           762:        bis     r0,r1
        !           763:        add     r2,r1
        !           764:        mov     r1,-4(r4)
        !           765:        jbr     _interp
        !           766: op_cofail:
        !           767: op_coret:
        !           768: op_efail:
        !           769: op_limit:
        !           770: op_lsusp:
        !           771: op_pfail:
        !           772: op_psusp:
        !           773:        clr     -(sp)
        !           774:        jsr     pc,*optab(r0)
        !           775:        jbr     _interp
        !           776: op_create:
        !           777:        movb    (r2)+,r0
        !           778:        movb    (r2)+,r1
        !           779:        bic     $!0377,r0
        !           780:        ash     $8.,r1
        !           781:        bis     r0,r1
        !           782:        add     r2,r1
        !           783:        mov     r1,-(sp)
        !           784:        mov     $D_INTEGER,-(sp)
        !           785:        clr     -(sp)
        !           786:        jsr     pc,_create
        !           787:        jbr     _interp
        !           788: op_cset:
        !           789:        movb    (r2)+,r0
        !           790:        movb    (r2)+,r1
        !           791:        bic     $!0377,r0
        !           792:        ash     $8.,r1
        !           793:        bis     r0,r1
        !           794:        add     r2,r1
        !           795:        mov     r1,-(sp)
        !           796:        mov     $D_CSET,-(sp)
        !           797:        jbr     _interp
        !           798: op_dup:
        !           799:        clr     -(sp)
        !           800:        clr     -(sp)
        !           801:        mov     6(sp),-(sp)
        !           802:        mov     6(sp),-(sp)
        !           803:         jbr    _interp
        !           804: op_eret:
        !           805:        mov     (sp)+,r0
        !           806:        mov     (sp)+,r1
        !           807:        mov     -2(r4),r3
        !           808:        mov     r4,sp
        !           809:        mov     (sp)+,r4
        !           810:        mov     r1,-(sp)
        !           811:        mov     r0,-(sp)
        !           812:        jbr     _interp
        !           813: op_field:
        !           814:        movb    (r2)+,r0
        !           815:        movb    (r2)+,r1
        !           816:        bic     $!0377,r0
        !           817:        ash     $8.,r1
        !           818:        bis     r0,r1
        !           819:        mov     r1,-(sp)
        !           820:        mov     $D_INTEGER,-(sp)
        !           821:        mov     $2,-(sp)
        !           822:        jsr     pc,_field
        !           823:        jbr     _interp
        !           824: op_file:
        !           825:        movb    (r2)+,r0
        !           826:        movb    (r2)+,r1
        !           827:        bic     $!0377,r0
        !           828:        ash     $8.,r1
        !           829:        bis     r0,r1
        !           830:        add     _ident,r1
        !           831:        mov     r1,_file
        !           832:        jbr     _interp
        !           833: op_goto:
        !           834:        movb    (r2)+,r0
        !           835:        movb    (r2)+,r1
        !           836:        bic     $!0377,r0
        !           837:        ash     $8.,r1
        !           838:        bis     r0,r1
        !           839:        add     r1,r2
        !           840:        jbr     _interp
        !           841: op_incres:
        !           842:        mov     _current+2,r0
        !           843:        inc     14.(r0)
        !           844:        jbr     _interp
        !           845: op_init:
        !           846:        movb    $59.,-(r2)      / change the INIT to a GOTO for next time
        !           847:        add     $3,r2
        !           848:        jbr     _interp
        !           849: op_int:
        !           850:        movb    (r2)+,r0
        !           851:        movb    (r2)+,r1
        !           852:        bic     $!0377,r0
        !           853:        ash     $8.,r1
        !           854:        bis     r0,r1
        !           855:        br      1f
        !           856: op_intx:
        !           857:        bic     $!017,r1
        !           858: 1:     mov     r1,-(sp)
        !           859:        mov     $D_INTEGER,-(sp)
        !           860:        jbr     _interp
        !           861: op_invoke:
        !           862:        movb    (r2)+,r0
        !           863:        movb    (r2)+,r1
        !           864:        bic     $!0377,r0
        !           865:        ash     $8.,r1
        !           866:        bis     r0,r1
        !           867:        br      1f
        !           868: op_invkx:
        !           869:        bic     $!07,r1
        !           870: 1:     mov     r1,-(sp)
        !           871:        jsr     pc,_invoke
        !           872:        jbr     _interp
        !           873: op_keywd:
        !           874:        movb    (r2)+,r0
        !           875:        movb    (r2)+,r1
        !           876:        bic     $!0377,r0
        !           877:        ash     $8.,r1
        !           878:        bis     r0,r1
        !           879:        mov     r1,-(sp)
        !           880:        mov     $D_INTEGER,-(sp)
        !           881:        clr     -(sp)
        !           882:        jsr     pc,_keywd
        !           883:        jbr     _interp
        !           884: op_line:
        !           885:        movb    (r2)+,r0
        !           886:        movb    (r2)+,r1
        !           887:        bic     $!0377,r0
        !           888:        ash     $8.,r1
        !           889:        bis     r0,r1
        !           890:        br      1f
        !           891: op_linex:
        !           892:        bic     $!077,r1
        !           893: 1:     mov     r1,_line
        !           894:        jbr     _interp
        !           895: op_llist:
        !           896:        movb    (r2)+,r0
        !           897:        movb    (r2)+,r1
        !           898:        bic     $!0377,r0
        !           899:        ash     $8.,r1
        !           900:        bis     r0,r1
        !           901:        mov     r1,-(sp)
        !           902:        jsr     pc,_llist
        !           903:        jbr     _interp
        !           904: op_long:
        !           905:        movb    (r2)+,r0
        !           906:        movb    (r2)+,r1
        !           907:        bic     $!0377,r0
        !           908:        ash     $8.,r1
        !           909:        bis     r0,r1
        !           910:        add     r2,r1
        !           911:        mov     r1,-(sp)
        !           912:        mov     $D_LONGINT,-(sp)
        !           913:        jbr     _interp
        !           914: op_mark:
        !           915:        movb    (r2)+,r0
        !           916:        movb    (r2)+,r1
        !           917:        bic     $!0377,r0
        !           918:        ash     $8.,r1
        !           919:        bis     r0,r1
        !           920:        add     r2,r1
        !           921:        mov     r4,-(sp)
        !           922:        mov     sp,r4
        !           923:        mov     r3,-(sp)
        !           924:        clr     r3
        !           925:        mov     r1,-(sp)
        !           926:        jbr     _interp
        !           927: op_mark0:
        !           928:        mov     r4,-(sp)
        !           929:        mov     sp,r4
        !           930:        mov     r3,-(sp)
        !           931:        clr     r3
        !           932:        clr     -(sp)
        !           933:        jbr     _interp
        !           934: op_pnull:
        !           935:        clr     -(sp)
        !           936:        clr     -(sp)
        !           937:        jbr     _interp
        !           938: op_pop:
        !           939:        cmp     (sp)+,(sp)+
        !           940:        jbr     _interp
        !           941: op_push1:
        !           942:        mov     $1,-(sp)
        !           943:        mov     $D_INTEGER,-(sp)
        !           944:        jbr     _interp
        !           945: op_pushn1:
        !           946:        mov     $-1,-(sp)
        !           947:        mov     $D_INTEGER,-(sp)
        !           948:        jbr     _interp
        !           949: op_real:
        !           950:        movb    (r2)+,r0
        !           951:        movb    (r2)+,r1
        !           952:        bic     $!0377,r0
        !           953:        ash     $8.,r1
        !           954:        bis     r0,r1
        !           955:        add     r2,r1
        !           956:        mov     r1,-(sp)
        !           957:        mov     $D_REAL,-(sp)
        !           958:        jbr     _interp
        !           959: op_sdup:
        !           960:        mov     2(sp),-(sp)
        !           961:        mov     2(sp),-(sp)
        !           962:         jbr    _interp
        !           963: op_str:
        !           964:        movb    (r2)+,r0
        !           965:        movb    (r2)+,r1
        !           966:        bic     $!0377,r0
        !           967:        ash     $8.,r1
        !           968:        bis     r0,r1
        !           969:        add     _ident,r1
        !           970:        mov     r1,-(sp)
        !           971:        movb    (r2)+,r0
        !           972:        movb    (r2)+,r1
        !           973:        bic     $!0377,r0
        !           974:        ash     $8.,r1
        !           975:        bis     r0,r1
        !           976:        mov     r1,-(sp)
        !           977:        jbr     _interp
        !           978: op_unmark:
        !           979:        movb    (r2)+,r0
        !           980:        movb    (r2)+,r1
        !           981:        bic     $!0377,r0
        !           982:        ash     $8.,r1
        !           983:        bis     r0,r1
        !           984:        dec     r1
        !           985: 1:     mov     (r4),r4
        !           986:        sob     r1,1b
        !           987:        mov     -2(r4),r3
        !           988:        mov     r4,sp
        !           989:        mov     (sp)+,r4
        !           990:        jbr     _interp
        !           991: op_unmk7:
        !           992:        mov     (r4),r4
        !           993: op_unmk6:
        !           994:        mov     (r4),r4
        !           995: op_unmk5:
        !           996:        mov     (r4),r4
        !           997: op_unmk4:
        !           998:        mov     (r4),r4
        !           999: op_unmk3:
        !          1000:        mov     (r4),r4
        !          1001: op_unmk2:
        !          1002:        mov     (r4),r4
        !          1003: op_unmk1:
        !          1004:        mov     -2(r4),r3
        !          1005:        mov     r4,sp
        !          1006:        mov     (sp)+,r4
        !          1007: op_unmk0:
        !          1008:        jbr     _interp
        !          1009: op_global:
        !          1010:        movb    (r2)+,r0
        !          1011:        movb    (r2)+,r1
        !          1012:        bic     $!0377,r0
        !          1013:        ash     $8.,r1
        !          1014:        bis     r0,r1
        !          1015:        br      1f
        !          1016: op_globx:
        !          1017:        bic     $!017,r1
        !          1018: 1:     asl     r1
        !          1019:        asl     r1
        !          1020:        add     _globals,r1
        !          1021:        mov     r1,-(sp)
        !          1022:        mov     $D_VAR,-(sp)
        !          1023:        jbr     _interp
        !          1024: op_static:
        !          1025:        movb    (r2)+,r0
        !          1026:        movb    (r2)+,r1
        !          1027:        bic     $!0377,r0
        !          1028:        ash     $8.,r1
        !          1029:        bis     r0,r1
        !          1030:        br      1f
        !          1031: op_statx:
        !          1032:        bic     $!07,r1
        !          1033: 1:     asl     r1
        !          1034:        asl     r1
        !          1035:        add     _statics,r1
        !          1036:        mov     r1,-(sp)
        !          1037:        mov     $D_VAR,-(sp)
        !          1038:        jbr     _interp
        !          1039: op_local:
        !          1040:        movb    (r2)+,r0
        !          1041:        movb    (r2)+,r1
        !          1042:        bic     $!0377,r0
        !          1043:        ash     $8.,r1
        !          1044:        bis     r0,r1
        !          1045:        br      1f
        !          1046: op_locx:
        !          1047:        bic     $!017,r1
        !          1048: 1:     asl     r1
        !          1049:        asl     r1
        !          1050:        add     $14.,r1
        !          1051:        neg     r1
        !          1052:        add     r5,r1
        !          1053:        mov     r1,-(sp)
        !          1054:        mov     $D_VAR,-(sp)
        !          1055:        jbr     _interp
        !          1056: op_arg:
        !          1057:        movb    (r2)+,r0
        !          1058:        movb    (r2)+,r1
        !          1059:        bic     $!0377,r0
        !          1060:        ash     $8.,r1
        !          1061:        bis     r0,r1
        !          1062:        br      1f
        !          1063: op_argx:
        !          1064:        bic     $!07,r1
        !          1065: 1:     asl     r1
        !          1066:        asl     r1
        !          1067:        add     $6,r1
        !          1068:        add     r5,r1
        !          1069:        mov     r1,-(sp)
        !          1070:        mov     $D_VAR,-(sp)
        !          1071:        jbr     _interp
        !          1072: quit:
        !          1073:        clr     -(sp)
        !          1074:        jsr     pc,*$_c_exit
        !          1075: err:
        !          1076:        mov     $9f,-(sp)
        !          1077:        jsr     pc,_syserr
        !          1078:  .data
        !          1079: 9:     <unrecognized ucode instruction\0>
        !          1080:  .even
        !          1081: #endif PDP11

unix.superglobalmegacorp.com

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