// MICRO Builtins // last edited July 7, 1980 9:21 AM // Copyright Xerox Corporation 1979, 1980 get "micdecl.d" external [ // MICBIX xinsert; xfield; xdefmac; xmemory; xlst; xbuiltin; xcchar; xbittable; xfindbit mement entarg; looktype; checkbtx; valsize // defined here for MICBIX minbi; maxbi // O.S. MoveBlock; Zero Usc ] static [ minbi = 1 maxbi = 44 ] // Structure for BIAC table of indices, maxs and mins. structure bdt: [ setup bit 8 // Setup inst index minna bit 4 // Minimum number of args maxna bit 4 // Maximum number of args ] // Literals for building structure BIAC table manifest [ // Minna values min0=0; min1=16; min2=32; min3=48; min4=64; min5=80; min6=96; min7=112 // Maxna values max0=0; max1=1; max2=2; max3=3; max4=4; max5=5; max6=6; max7=7; nomax = 15 // Setup values s = #400 // setup field position ev1 = 1*s // eval 1st arg ev2 = 2*s // eval 2nd arg ev12 = 3*s // eval 1st and 2nd args ev23 = 4*s // eval 2nd and 3rd args look1 = 5*s // lookup 1st arg mem1 = 6*s // lookup 1st arg as memory bt1ev2 = 7*s // lookup 1st arg as bittable, eval 2nd arg ev3 = 8*s // eval 3rd arg fld1 = 9*s // lookup 1st arg as field name exp1 = 10*s // expand 1st arg // Empty entry empty = min0+nomax ] let dobi(bep,na,ac) be // Do builtin [ let biac = table [ min0+max0; // filler min2+max2+ev2; // builtin min2+max2+exp1; // m (macro) min1+max1+exp1; // n (neutral) min5+max5+ev23; // memory min1+max1+look1; // target min2+max2+mem1; // default min3+max3+ev23; // f (field) min2+max2+fld1; // pf (preassign) min2+max2+ev2; // set min0+nomax; // add min1+max1+look1; // ip (integer part) min3+max4+exp1; // ifse (if string eq) min2+max3+fld1; // ifset (if any bits of field) min3+max4+ev12; // ife (if integers equal) min3+max4+ev12; // ifg (if int 1 > int 2) min2+max3+look1; // ifdef (if sym in symtab and not unbound address) min3+max4+look1; // ifme (if mem part = string) min1+max3+exp1; // er min2+max2+ev2; // set list mode for memory min1+max1+exp1; // insert file min1+max1+ev1; // 1's complement min2+max2+ev1; // repeat text #2 #1 times min1+nomax; // logical or min1+nomax; // logical xor min1+nomax; // logical and min1+max1+exp1; // set comment char min2+max2+ev2; // bittable min2+max2+bt1ev2; // get bit min2+max5+bt1ev2; // set bit(s) min2+max6+bt1ev2; // find bit(s) empty; // ** unused min2+max2+ev12; // lshift min2+max2+ev12; // rshift min1+max1+fld1; // get field value min1+nomax; // select min2+max2+mem1; // set postmacro min2+max2+mem1; // set tag macro min2+max2+mem1; // set listing fields min1+max1+exp1; // set binary output extension min1+nomax; // subtract min2+max2+exp1; // equate min1+max1+ev1; // set ignore mode min2+max2+ev12; // set trace mode min2+max2 // while #1 repeat #2 ] let v1,v2,v3,v4,v5,v6,v7 = nil,nil,nil,nil,nil,nil,nil // *** Don't reorder the next line *** let ap1,l1, ap2,l2, ap3,l3, ap4,l4, ap5,l5, ap6,l6, ap7,l7 = nil,nil, nil,nil, nil,nil, nil,nil, nil,nil, nil,nil, nil,nil let no = bep!bsno let k = biac!no let m = k << bdt.maxna if (na gr m) % (na ls k<