Haciendo funcionar el TMulticastEvent <T> de Allen Bauer

He estado buscando el código de Allen Bauer para un despachador de eventos de multidifusión genérico (vea las publicaciones de su blog al respectoaquí).

Él da el código suficiente para que yo quiera usarlo y, desafortunadamente, no ha publicado la fuente completa. Me molesté en hacer que funcionara, pero mis habilidades de ensamblador no existen.

Mi problema es el método InternalSetDispatcher. El enfoque ingenuo es usar el mismo ensamblador que para los otros métodos InternalXXX:

procedure InternalSetDispatcher;
begin
   XCHG  EAX,[ESP]
   POP   EAX
   POP   EBP
   JMP   SetEventDispatcher
end;

Pero esto se usa para procedimientos con un parámetro const, como este:

procedure Add(const AMethod: T); overload;

Y SetDispatcher tiene dos parámetros, uno a var:

procedure SetEventDispatcher(var ADispatcher: T; ATypeData: PTypeData);

Entonces, asumo que la pila se corrompería. Sé lo que está haciendo el código (limpiando el marco de la pila de la llamada a InternalSetDispatcher haciendo estallar la referencia oculta a sí mismo y asumo la dirección de retorno), pero simplemente no puedo entender ese pequeño ensamblador para obtener el conjunto cosa que va

EDITAR: Solo para aclarar, lo que busco es el ensamblador que podría usar para que el método InternalSetDispatcher funcione, es decir, el ensamblador para limpiar la pila de un procedimiento con dos parámetros, uno a var.

EDIT2: He modificado un poco la pregunta, gracias a Mason por sus respuestas hasta ahora. Debo mencionar que el código anterior no funciona, y cuando SetEventDispatcher regresa, se genera un AV.

Respuestas a la pregunta(2)

Su respuesta a la pregunta