//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)
]