; Pascal style procedures and calls with stack parameter passing.

;------------------
; define procedure.
;------------------

macro proc name,[arg] {
common
  if used name
  name:
  virtual at bp+6
    if ~ arg eq
      forward
	local ..arg
	..arg dw ?
	arg equ ..arg
      common
    end if
    ..ret = $ - (bp+6)
  end virtual
  local ..dynamic_data, ..dynamic_size

  dynamic_data equ ..dynamic_data
  dynamic_size equ ..dynamic_size

  virtual at bp - dynamic_size
    dynamic_data:
}

;------------------------------
; begin procedure instructions.
;------------------------------

macro begin {
    dynamic_size = $ - dynamic_data
  end virtual
   enter dynamic_size,0
}

;-----------------------
; Return from procedure.
;-----------------------

macro endp
 { leave
   if ..ret = 0
     retf
   else
     retf ..ret
   end if
  end if	; for "used" check in proc macro
 }

;----------------
; Call procedure.
;----------------

macro callhere proc,[arg]
{
    if ~ arg eq
      reverse
	push arg
    end if
   common
    call proc
}


;----------------------------------------
; Make far call in the same code segment.
;----------------------------------------

macro callp proc,[arg] {
    if ~ arg eq
      reverse
	push arg
    end if
   common
    push cs
    call proc
}
