2020-09-30 17:12:29 +02:00

124 lines
2.2 KiB
Smarty

"/*\n\
** wrapem.s\n\
**\n\
** Copyright(C) 1994 Microsoft Corporation.\n\
** All Rights Reserved.\n\
**\n\
** HISTORY:\n\
**\t Created: 05/05/94 - MarkRi\n\
**\n\
** This is the workhorse routine in Wrapper. This routine is jumped\n\
** to by the ZAPI macros. It calls the _prelude and _postlude routines\n\
** before and after calling the real API.\n\
*/\n\
\n\
#include \"ksalpha.h\"\n\
\n\
.text\n\
\n\
\t.set\tnoreorder\t ;\n\
\n\
\t.extern _prelude\t\t;\n\
\t.extern _postlude\t ;\n\
\n\
\t.globl wrapit\t\t ;\n\
\t.ent\twrapit\t\t ;\n\
wrapit:\n\
\n\
\t// on entry t0 is the API identifier\n\
\n\
\t// See IMPORTANT NOTE in readme.txt\n\
\n\
\t// Make room to temporarily store RA and Arg regs\n\
\tlda\t sp, -112(sp)\n\
\n\
\t// Store RA\n\
\tstq\t ra, 0(sp)\n\
\n\
\t// Store arg regs continuos to anything else already on stack\n\
\tstq\t a0, 16(sp)\n\
\tstq\t a1, 32(sp)\n\
\tstq\t a2, 48(sp)\n\
\tstq\t a3, 64(sp)\n\
\tstq\t a4, 80(sp)\n\
\tstq\t a5, 96(sp)\n\
\n\
\t// Set up args for call to prelude()\n\
\tmov\t t0, a0\n\
\tmov\t sp, a1\n\
\tnop\n\
\tjsr\t _prelude\n\
\tnop\n\
\n\
\t// Skip API call if result was zero\n\
\tbeq\t v0, skipcall\n\
\tnop\n\
\n\
\t// restore the arg regs for API call\n\
\tldq\t a0, 16(sp)\n\
\tldq\t a1, 32(sp)\n\
\tldq\t a2, 48(sp)\n\
\tldq\t a3, 64(sp)\n\
\tldq\t a4, 80(sp)\n\
\tldq\t a5, 96(sp)\n\
\n\
\t// fix stack\n\
\tlda\t sp, 112(sp)\n\
\tnop\n\
\n\
\t// make API call\n\
\tjsr\t (v0)\n\
\tnop\n\
\n\
\tjmp\t callpostlude\n\
\tnop\n\
\n\
skipcall:\n\
\n\
\t// fix stack (from RA store)\n\
\tlda\tsp,112(sp)\n\
\tnop\n\
\n\
callpostlude:\n\
\n\
\t// make room for returned RA\n\
\tlda\t sp, -16(sp)\n\
\n\
\t// Set up args for postlude\n\
\tmov\tv0, a0\n\
\tmov\t sp, a1\n\
\tnop\n\
\n\
\t// call postlude\n\
\tjsr\t _postlude\n\
\tnop\n\
\n\
\t// restore RA\n\
\tldl\t ra, 0(sp)\n\
\n\
\t// fixup stack\n\
\tlda\t sp, 16(sp)\n\
\tnop\n\
\n\
\t// return to caller of API\n\
\tjmp\t (ra)\n\
\n\
\t.end wrapit\n\
\n\
#define ZAPI(id, name) \\\n\
.text ;\\\n\
\t.globl z##name\t ; \\\n\
\t.ent z##name ;\\\n\
z##name: ;\\\n\
\tldiq\tt0,id ;\\\n\
\tjmp\t wrapit ; \\\n\
\tnop ; \\\n\
\t.end\tz##name ;\n\
\n\
%a ZAPI (%i,%A) ;\n\
\n\
\tZAPI( %c, WrapperNothing ) ;\n\
\n\
.set reorder\n\
"