Since Masm v8, a PROTO or EXTERNDEF for a symbol which is later defined as a PROC will make the procedure public, no matter what a possible visibility attribute of the PROC itself - or the default one set with OPTION PROC - is telling.
OTOH, with Masm v6/7, both the visibility attribute of the PROC directive and the current default setting of OPTION PROC will affect the symbol's visibility.
Masm6 Masm8 JWasm JWasm+Zv8
-------------------------------------
On,E,P x x
On,E,Pn x x
On,E,Pp x x x x
Op,E,P x x x x
Op,E,Pn x x x
Op,E,Pp x x x x
On = OPTION PROC:PRIVATE
Op = OPTION PROC:PUBLIC
E = PROTO or EXTERNDEF before PROC
P = PROC without visibility attribute
Pn = PROC with PRIVATE visibility attribute
Pp = PROC with PUBLIC visibility attribute
x = procedure will be public
As default, JWasm more or less copies the Masm v6/7 behavior. The
difference is that an explicite visibility attribute behind PROC has
the highest priority for JWasm. However, since v2.04, there's an
additional cmdline option -Zv8 which will make JWasm behave like Masm v8+.
It should be noted that without a PROTO/EXTERNDEF before PROC, there are no differences between Masm v6, v8 and JWasm, and the -Zv8 switch also has no effect then.