|
|
1.1 ! root 1: ! 2: .asciz "@(#)qfuncl.s 34.1 10/3/80" ! 3: # opus 30 compiler call to ??? interface routines ! 4: .globl __qf0 ! 5: __qf0: ! 6: subl3 $4,r6,r7 ! 7: jbr __qfuncl ! 8: ! 9: .globl __qf1 ! 10: __qf1: ! 11: subl3 $8,r6,r7 ! 12: jbr __qfuncl ! 13: ! 14: .globl __qf2 ! 15: __qf2: ! 16: subl3 $12,r6,r7 ! 17: jbr __qfuncl ! 18: ! 19: .globl __qf3 ! 20: __qf3: ! 21: subl3 $16,r6,r7 ! 22: jbr __qfuncl ! 23: ! 24: .globl __qf4 ! 25: __qf4: ! 26: subl3 $20,r6,r7 ! 27: jbr __qfuncl ! 28: ! 29: .data ! 30: qfunbuf: .long 0 ! 31: qlinbuf: .long 0 ! 32: .text ! 33: .globl __qfuncl ! 34: __qfuncl: # quick function call ! 35: # movab qfunbuf,r0 # profiling ! 36: # jsb mcount # profiling ! 37: cmpl r6,_nplim # make sure stack ok ! 38: blss on1 ! 39: calls $0,_namerr ! 40: on1: movl (r7),r0 # bring in addr of atom ! 41: addl2 $4,r7 # inc lbot by one nament ! 42: pushl r0 # stack addr of atom of fcn to call ! 43: movl 8(r0),r0 # bring in fcn binding addr ! 44: jleq nonexf # jump if fcn non existant ! 45: tstl _rsetsw # see if in *rset mode ! 46: jeql norset # if not, call function ! 47: tstl _bcdtrsw # if (*rset t) & (sstatus bcdtrace t) ! 48: jneq hackit # then have Lfuncal do the work ! 49: norset: ! 50: ashl $-9,r0,r1 # see if bcd ! 51: cmpb $5,_typetable+1[r1] # we are calling ! 52: jeql gotbcd ! 53: hackit: ! 54: calls $1,_Lfuncal # call lisp stuff ! 55: movab -4(r7),r6 # restore np to top ! 56: rsb # return to callee ! 57: gotbcd: ! 58: calls $1,*(r0) # call code ! 59: movab -4(r7),r6 # restore np to top ! 60: rsb # return ! 61: ! 62: nonexf: # non existant function, call c function to take care of it, ! 63: # we could process it here but wish to minimize assembly language ! 64: # code. ! 65: # we should never return from this call ! 66: # the addr of the atom is already stacked ! 67: ! 68: # addl2 $4,r7 # inc lbot by one nament for evalframe ! 69: calls $1,_Undeff # call handler ! 70: clrl r0 # return nil to compiled code ! 71: rsb # if ever should return here ! 72: ! 73: ! 74: ! 75: # transfer table linkage routine ! 76: # ! 77: .globl _qlinker ! 78: _qlinker: ! 79: .word 0xfc0 # save all possible registers ! 80: # movab qlinbuf,r0 # profiling ! 81: # jsb mcount # profiling ! 82: tstl _exception # any pending exceptions ! 83: jeql noexc ! 84: tstl _sigintcnt # is it because of SIGINT ! 85: jeql noexc # if not, just leave ! 86: pushl $2 # else push SIGINT ! 87: calls $1,_sigcall ! 88: noexc: ! 89: movl 16(fp),r0 # get return pc ! 90: addl2 -4(r0),r0 # get pointer to table ! 91: movl 4(r0),r1 # get atom pointer ! 92: retry: # come here after undef func error ! 93: movl 8(r1),r2 # get function binding ! 94: jleq nonex # if none, leave ! 95: tstl _stattab+2*4 # see if linking possible (Strans) ! 96: jeql nolink # no, it isn't ! 97: ashl $-9,r2,r3 # check type of function ! 98: cmpb $5,_typetable+1[r3] ! 99: jeql linkin # bcd, link it in! ! 100: nolink: ! 101: pushl r1 # non, bcd, call interpreter ! 102: calls $1,_Lfuncal ! 103: ret ! 104: ! 105: linkin: ! 106: ashl $-9,4(r2),r3 # check type of function discipline ! 107: cmpb $0,_typetable+1[r3] # is it string? ! 108: jeql nolink # yes, it is a c call, so dont link in ! 109: movl (r2),r2 # get function addr ! 110: movl r2,(r0) # put fcn addr in table ! 111: jmp 2(r2) # enter fcn after mask ! 112: ! 113: nonex: pushl r1 # non existant fcn ! 114: calls $1,_Undeff # call processor ! 115: movl r0,r1 # back in r1 ! 116: jbr retry # for the retry. ! 117: ! 118: ! 119: .globl __erthrow # errmessage for uncaught throws ! 120: __erthrow: ! 121: .byte 'U,'n,'c,'a,'u,'g,'h,'t,' ,'t,'h,'r,'o,'w ! 122: .byte ' ,'f,'r,'o,'m,' ,'c,'o,'m,'p,'i,'l,'e,'d ! 123: .byte ' ,'c,'o,'d,'e,0 ! 124: ! 125: .globl _tynames ! 126: _tynames: ! 127: .long 0 # nothing here ! 128: .long _lispsys+20*4 # str_name ! 129: .long _lispsys+21*4 # atom_name ! 130: .long _lispsys+19*4 # int_name ! 131: .long _lispsys+23*4 # dtpr_name ! 132: .long _lispsys+22*4 # doub_name ! 133: .long _lispsys+58*4 # funct_name ! 134: .long _lispsys+83*4 # port_name ! 135: .long _lispsys+47*4 # array_name ! 136: .long 0 # nothing here ! 137: .long _lispsys+50*4 # sdot_name ! 138: .long _lispsys+53*4 # val_nam ! 139: # ! 140: # Quickly allocate small fixnums ! 141: # ! 142: .globl _qnewint ! 143: _qnewint: ! 144: cmpl r5,$1024 ! 145: jgeq alloc ! 146: cmpl r5,$-1024 ! 147: jlss alloc ! 148: moval Fixzero[r5],r0 ! 149: rsb ! 150: alloc: ! 151: movl _int_str,r0 # move next cell addr to r0 ! 152: jlss callnewi # if no space, allocate ! 153: incl *_lispsys+24*4 # inc count of ints ! 154: movl (r0),_int_str # advance free list ! 155: movl r5,(r0) # put baby to bed. ! 156: rsb ! 157: callnewi: ! 158: pushl r5 ! 159: calls $0,_newint ! 160: movl (sp)+,(r0) ! 161: rsb ! 162: .globl _qcons ! 163: ! 164: # quick cons call, the car and cdr are stacked on the namestack ! 165: # and this function is jsb'ed to. ! 166: ! 167: _qcons: ! 168: movl _dtpr_str,r0 # move next cell addr to r0 ! 169: jlss getnew # if ran out of space jump ! 170: incl *_lispsys+28*4 # inc count of dtprs ! 171: movl (r0),_dtpr_str # advance free list ! 172: storit: movl -(r6),(r0) # store in cdr ! 173: movl -(r6),4(r0) # store in car ! 174: rsb ! 175: ! 176: getnew: calls $0,_newdot # must gc to get one ! 177: jbr storit # now initialize it. ! 178: ! 179: # ! 180: # Fast equivalent of newdot, entered by jsb ! 181: # ! 182: .globl _qnewdot ! 183: _qnewdot: ! 184: movl _dtpr_str,r0 # mov next cell addr t0 r0 ! 185: jlss mustallo # if ran out of space ! 186: incl *_lispsys+28*4 # inc count of dtprs ! 187: movl (r0),_dtpr_str # advance free list ! 188: clrq (r0) ! 189: rsb ! 190: mustallo: ! 191: calls $0,_newdot ! 192: rsb ! 193: .globl _qpopnames ! 194: _qpopnames: # equivalent of C-code popnames, entered by jsb. ! 195: movl (sp)+,r0 # return address ! 196: movl (sp)+,r1 # Lower limit ! 197: movl _bnp,r2 # pointer to bind stack entry ! 198: qploop: ! 199: subl2 $8,r2 # for(; (--r2) > r1;) { ! 200: cmpl r2,r1 # test for done ! 201: jlss qpdone ! 202: movl (r2),*4(r2) # r2->atm->a.clb = r2 -> val; ! 203: brb qploop # } ! 204: qpdone: ! 205: movl r1,_bnp # restore bnp ! 206: jmp (r0) # return ! 207: ! 208: # _qget : fast get subroutine ! 209: # (get 'atom 'ind) ! 210: # called with -8(r6) equal to the atom ! 211: # -4(r6) equal to the indicator ! 212: # no assumption is made about r7 ! 213: # unfortunately, the atom may not in fact be an atom, it may ! 214: # be a list or nil, which are special cases. ! 215: # For nil, we grab the nil property list (stored in a special place) ! 216: # and for lists we punt and call the C routine since it is most likely ! 217: # and error and we havent put in error checks yet. ! 218: # ! 219: .data ! 220: qgtbf: .word 0 # for profiling ! 221: .text ! 222: ! 223: .globl _qget ! 224: _qget: ! 225: # movab qgtbf,r0 # these instructions are for profiling ! 226: # jsb mcount ! 227: movl -4(r6),r1 # put indicator in r1 ! 228: movl -8(r6),r0 # and atom into r0 ! 229: jeql nilpli # jump if atom is nil ! 230: ashl $-9,r0,r2 # check type ! 231: cmpb _typetable+1[r2],$1 # is it a symbol?? ! 232: jneq notsymb # nope ! 233: movl 4(r0),r0 # yes, put prop list in r1 to begin scan ! 234: jeql fail # if no prop list, we lose right away ! 235: lp: cmpl r1,4(r0) # is car of list eq to indicator? ! 236: jeql good # jump if so ! 237: movl *(r0),r0 # else cddr down list ! 238: jneq lp # and jump if more list to go. ! 239: ! 240: fail: subl2 $8,r6 # unstack args ! 241: rsb # return with r0 eq to nil ! 242: ! 243: good: movl (r0),r0 # return cadr of list ! 244: movl 4(r0),r0 ! 245: subl2 $8,r6 #unstack args ! 246: rsb ! 247: ! 248: nilpli: movl _lispsys+64*4,r0 # want nil prop list, get it specially ! 249: jneq lp # and process if anything there ! 250: subl2 $8,r6 #unstack args ! 251: rsb # else fail ! 252: ! 253: notsymb: ! 254: movab -8(r6),r7 # must set up r7 before calling ! 255: calls $0,_Lget # not a symbol, call C routine to error check ! 256: subl2 $8,r6 #unstack args ! 257: rsb # and return what it returned. ! 258:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.