//mgoovl.bcpl machine-independent code for Call (in overlay) // Last edited: 24 July 1979 get "mcommon.d" get "mdecl.d" external [ // OS Zero // MASM @MBlock // MSYM ChkToken; EvalAText // MIOC SimpleTexttoDVec // MTXTBUF InputTextBuffer // MCMD StartCmdOverlay; ErrorAbort // Machine dependent DefaultGoMemory // Defined here for ACTIONS StartWithArgs // Defined here CallAVec ] static [ CallAVec ] //Used in the action table to call CallM (D1) let StartWithArgs(lvProc,MBunion,nil) be [ let AV,Count = vec 5*ValSize,0 let AVal,X,TSize = vec size AVal/16,1,nil Zero(AV,5*ValSize) if X > InputTextBuffer!0 then ErrorAbort() //EvalAText consumes the "(" delimiter unless EvalAText(InputTextBuffer,lv X,AVal,true, DefaultGoMemory()) do if AVal>>AVal.TypeStorage ne MemTypeStorage then ErrorAbort() //Leave address and MemX in permanent storage for printout on return //from call MBlock(CallAVec,lv AVal>>AVal.Addr,2); CallAVec!2 = AVal>>AVal.X let TV = vec 80 for I = 0 to 4*ValSize by ValSize do [ TV!0 = 0 let Kind = nil while true do [ Kind = ChkToken(InputTextBuffer,lv X,lv TSize) switchon Kind into [ case LimitToken: case RParToken: case CommaToken: X = X+1; if TV!0 eq 0 then break //**Would like this to be SimpleTexttoDVec(TV,16*ValSize,AV+I) //**but SimpleTexttoDVec doesn't work for more than 32 bits SimpleTexttoDVec(TV,32,AV+I); Count = Count+1 break default: MBlock(TV+TV!0+1,InputTextBuffer+X,TSize) X = X+TSize; TV!0 = TV!0+TSize; loop ] ] if Kind ne CommaToken then break ] StartCmdOverlay(lvProc,MBunion,AV,Count) ]