program VarArgsImpl,(0,0,0),(0,0,0),("VarArgsImpl.as",(0,0,0)), VarArgsT VarArgsT: type proc [] returns [] -- VarArgsImpl.ass -- NFS 16-Jul-85 16:25:10 -- MEW 18-Jul-85 20:54:52 -- NFS 2-Aug-85 17:15:03 -- Procedures for accessing parameters of functions with variable number of -- parameters. -- VaStart returns a pointer to a block containing the parameters. -- If 1 word is on the stack when function is called, then params. were passed -- in a frame (more than 12 words of parameters). Otherwise, parameters were -- passed on the stack. If they were passed on the stack, then it allocates a new -- frame and copies the contents of the stack to the new frame. export VarArgs exportproc VaStart, VarArgs VaStartT: type proc[] returns[] VaStart: entry 18, VaStartT stack: var stacktype, 224, 0 stacktype: type array indextype of CARDINAL indextype: type subrange [0,14] of CARDINAL stateword: var statetype, 16, 224 statetype: type record[(break, CARDINAL, 0, 8), (sp, CARDINAL, 8, 8)] dsk [lf+0] load 1 lea [lf+0] read.f [8:8]14 -- Get stack ptr. jumpn fp1 -- jump if params. passed on stack -- params already in frame load [lf+0] -- Get ptr. to param. frame.. jump fp2 -- params on stack fp1: af 12 -- Allocate frame for params. store [lf+16] -- Save ptr. to param. frame beyond params. lea [lf+0] -- Load ptr. to params. dumped in local frame load 12 -- Load No. of words to copy to param frame load [lf+16] -- Load ptr. to param. frame blt -- Copy params from local frame to param frame load [lf+16] -- Put ptr. to param frame on stack for efc. fp2: lp ret end -- VaEnd frees the parameter frame. exportproc VaEnd, VarArgs VaEndT: type proc[] returns [] VaEnd: entry 2, VaEndT dis ff load.d 0 ret end ret end;