+/*
+ * pushframe : stack a frame
+ * mess with the standard calls/callf call frame to put things in
+ * the proper order. On entry to _Pushframe we have:
+ * On entry to Pushframe: On exit:
+ * ______________ ______________
+ * | second arg | | second arg |
+ * +------------+ +------------+
+ * | first arg | | first arg |
+ * +------------+ +------------+
+ * | 'class' arg| | 'class' arg|
+ * +------------+ +------------+
+ * | saved fp | <<= fp | return addr|
+ * +------------+ +------------+
+ * |mask|removed| | old _errp |
+ * +------------+ +------------+
+ * |return addr.| <<= sp | saved _bnp |
+ * +------------+ +------------+
+ * | saved _np |
+ * +------------+
+ * | saved lbot | <<= d0
+ * +------------+
+ * | saved r13 |
+ * | ... |
+ * | saved r8 | <<= sp
+ * +------------+
+ */
+ .text
+ .globl _Pushframe
+ .globl _qpushframe
+
+_qpushframe:
+_Pushframe:
+ .word 0x0
+ movl (fp),fp # give user his fp back
+ movl (sp),r0 # put program counter in temporary
+ moval 12(sp),sp # remove pc, 'mask', 'removed', and fp
+ pushl r0 # stack the return address
+ pushl _errp
+ pushl _bnp
+ pushl r6 # save _np
+ pushl r7 # save _lbot
+ moval (sp),r0 # return addr of lbot on stack to caller
+ moval -24(sp),sp
+ storer $0x3f00,(sp) # save r13(fp), r12,r11,r10,r9,r8
+ clrl _retval # set retval to C_INITIAL
+ jmp *40(sp) # return to caller